forked from Mirror/GodMode9
Add aes_cmac() function
... actually unused here.
This commit is contained in:
parent
2628082192
commit
d00eabe9e4
@ -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++)
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user