12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- To realize the AES-CCM functionality using the aes.c interface herewith, pull the files aes-ccm.c and aes.h from the repo: https://github.com/wi-fi-analyzer/crackle, and make the following updates -
- ** Update the 'xor_aes_block()' function implementation as below and use.
- static void xor_aes_block(u8 *dst, const u8 *src)
- {
- #ifdef HAVE_ALIGNED_MEM_OPERATION
- u32 *d = (u32 *) dst;
- u32 *s = (u32 *) src;
- *d++ ^= *s++;
- *d++ ^= *s++;
- *d++ ^= *s++;
- *d++ ^= *s++;
- #else /* HAVE_ALIGNED_MEM_OPERATION */
- u32 i;
- for (i = 0; i < 16; i++)
- {
- *dst++ ^= *src++;
- }
- #endif /* HAVE_ALIGNED_MEM_OPERATION */
- }
- ** Update the 'aes_ccm_encr()' function implementation as below and use.
- static void aes_ccm_encr(void *aes, size_t L, const u8 *in, size_t len, u8 *out,
- u8 *a)
- {
- size_t last = len % AES_BLOCK_SIZE;
- size_t i;
- /* crypt = msg XOR (S_1 | S_2 | ... | S_n) */
- for (i = 1; i <= len / AES_BLOCK_SIZE; i++) {
- PUT_BE16(&a[AES_BLOCK_SIZE - 2], i);
- /* S_i = E(K, A_i) */
- aes_encrypt(aes, a, out);
- xor_aes_block(out, in);
- out += AES_BLOCK_SIZE;
- in += AES_BLOCK_SIZE;
- }
- #if 0
- if (last) {
- PUT_BE16(&a[AES_BLOCK_SIZE - 2], i);
- aes_encrypt(aes, a, out);
- /* XOR zero-padded last block */
- for (i = 0; i < last; i++)
- *out++ ^= *in++;
- }
- #else /* 0 */
- if (last) {
- u8 tout[AES_BLOCK_SIZE];
- PUT_BE16(&a[AES_BLOCK_SIZE - 2], i);
- aes_encrypt(aes, a, tout);
- /* XOR zero-padded last block */
- for (i = 0; i < last; i++)
- *out++ = tout[i] ^ *in++;
- }
- #endif /* 0 */
- }
|