2016-06-06 11:26:08 -04:00
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "aes.h"
|
|
|
|
#include "block.h"
|
|
|
|
|
|
|
|
static uint8_t g_counter[16];
|
|
|
|
|
|
|
|
void aes128_ctr_init(uint8_t *key, uint8_t *counter) {
|
2016-06-07 12:42:08 -04:00
|
|
|
if (counter != NULL) {
|
|
|
|
memcpy(g_counter, counter, 16);
|
|
|
|
}
|
2016-06-06 11:26:08 -04:00
|
|
|
aes128_init(key);
|
|
|
|
}
|
|
|
|
|
2016-06-07 12:42:08 -04:00
|
|
|
void aes128_ctr_evolve_counter(void) {
|
2016-06-06 11:26:08 -04:00
|
|
|
block_incr(g_counter);
|
2016-06-07 12:42:08 -04:00
|
|
|
return;
|
2016-06-06 11:26:08 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void aes128_ctr(uint8_t *dest, uint8_t *msg, uint32_t msg_len) {
|
2016-06-07 12:42:08 -04:00
|
|
|
uint8_t buffer[16];
|
|
|
|
uint32_t num_blocks = msg_len / 16;
|
2016-06-06 11:26:08 -04:00
|
|
|
for (uint32_t i = 0; i < num_blocks; i++) {
|
2016-06-07 12:42:08 -04:00
|
|
|
aes128_ecb(buffer, g_counter);
|
|
|
|
aes128_ctr_evolve_counter();
|
|
|
|
block_xor(dest+(i*16), msg+(i*16), buffer);
|
|
|
|
}
|
|
|
|
if (msg_len % 16) {
|
|
|
|
aes128_ecb(buffer, g_counter);
|
|
|
|
for (uint8_t i = 0; i < msg_len % 16; i++) {
|
|
|
|
dest[num_blocks*16+i] = msg[num_blocks*16+i] ^ buffer[i];
|
|
|
|
}
|
2016-06-06 11:26:08 -04:00
|
|
|
}
|
|
|
|
}
|