Add aes_cmac() function

... actually unused here.
This commit is contained in:
d0k3 2016-09-06 23:43:36 +02:00
parent 2628082192
commit d00eabe9e4
2 changed files with 11 additions and 7 deletions

View File

@ -154,8 +154,8 @@ void aes_decrypt(void* inbuf, void* outbuf, size_t size, uint32_t mode)
void aes_cmac(void* inbuf, void* outbuf, size_t size) void aes_cmac(void* inbuf, void* outbuf, size_t size)
{ {
// only works for full blocks // only works for full blocks
uint32_t zeroes[4] = { 0 }; uint32_t zeroes[4] __attribute__((aligned(32))) = { 0 };
uint32_t xorpad[4] = { 0 }; uint32_t xorpad[4] __attribute__((aligned(32))) = { 0 };
uint32_t mode = AES_CBC_ENCRYPT_MODE | AES_CNT_INPUT_ORDER | AES_CNT_OUTPUT_ORDER | uint32_t mode = AES_CBC_ENCRYPT_MODE | AES_CNT_INPUT_ORDER | AES_CNT_OUTPUT_ORDER |
AES_CNT_INPUT_ENDIAN | AES_CNT_OUTPUT_ENDIAN; AES_CNT_INPUT_ENDIAN | AES_CNT_OUTPUT_ENDIAN;
uint32_t* out = (uint32_t*) outbuf; uint32_t* out = (uint32_t*) outbuf;
@ -164,11 +164,14 @@ void aes_cmac(void* inbuf, void* outbuf, size_t size)
// create xorpad for last block // create xorpad for last block
set_ctr(zeroes); set_ctr(zeroes);
aes_decrypt(xorpad, xorpad, 1, mode); aes_decrypt(xorpad, xorpad, 1, mode);
for (uint32_t i = 0; i < 4; i++) { char* xorpadb = (void*) xorpad;
if (i && (xorpad[i] >> 31)) char finalxor = (xorpadb[0] & 0x80) ? 0x87 : 0x00;
xorpad[i-i] |= 1; for (uint32_t i = 0; i < 15; i++) {
xorpad[i] <<= 1; xorpadb[i] <<= 1;
xorpadb[i] |= xorpadb[i+1] >> 7;
} }
xorpadb[15] <<= 1;
xorpadb[15] ^= finalxor;
// process blocks // process blocks
for (uint32_t i = 0; i < 4; i++) for (uint32_t i = 0; i < 4; i++)

View File

@ -54,6 +54,7 @@ void set_ctr(void* iv);
void add_ctr(void* ctr, uint32_t carry); void add_ctr(void* ctr, uint32_t carry);
void aes_decrypt(void* inbuf, void* outbuf, size_t size, uint32_t mode); void aes_decrypt(void* inbuf, void* outbuf, size_t size, uint32_t mode);
void ctr_decrypt(void* inbuf, void* outbuf, size_t size, uint32_t mode, uint8_t *ctr); void ctr_decrypt(void* inbuf, void* outbuf, size_t size, uint32_t mode, uint8_t *ctr);
void aes_cmac(void* inbuf, void* outbuf, size_t size);
void aes_fifos(void* inbuf, void* outbuf, size_t blocks); void aes_fifos(void* inbuf, void* outbuf, size_t blocks);
void set_aeswrfifo(uint32_t value); void set_aeswrfifo(uint32_t value);
uint32_t read_aesrdfifo(void); uint32_t read_aesrdfifo(void);