adding CTR-mode

This commit is contained in:
kokke 2017-12-01 01:00:07 +01:00 committed by GitHub
parent 835777b96f
commit 4b91b70c35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 40 additions and 1 deletions

41
aes.c
View File

@ -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)