diff options
-rw-r--r-- | aes.c | 41 |
1 files changed, 40 insertions, 1 deletions
@@ -1,6 +1,6 @@ /* -This is an implementation of the AES algorithm, specifically ECB and CBC mode. +This is an implementation of the AES algorithm, specifically ECB, CTR and CBC mode. Block size can be chosen in aes.h - available choices are AES128, AES192, AES256. The implementation is verified against the test vectors in: @@ -595,3 +595,42 @@ void AES_CBC_decrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, co } #endif // #if defined(CBC) && (CBC == 1) + + + +#if defined(CTR) && (CTR == 1) + +void AES_CTR_xcrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv) +{ + uint8_t buffer[BLOCKLEN], counter[BLOCKLEN]; + + memcpy(counter, iv, BLOCKLEN); + Key = key; + KeyExpansion(); + + int i, j; + for (i = 0; i < length; ++i) + { + if ((i & 0x0F) == 0) + { + memcpy(buffer, counter, BLOCKLEN); + state = (state_t *) buffer; + Cipher(); + + for (j = (BLOCKLEN - 1); j >= 0; --j) + { + counter[j] += 1; + + if (counter[j] != 0) + { + break; + } + } + } + + output[i] = (input[i]) ^ (buffer[i & 0x0F]); + } +} + +#endif // #if defined(CTR) && (CTR == 1) + |