mirror of https://github.com/kokke/tiny-AES-c
adding CTR-mode
This commit is contained in:
parent
835777b96f
commit
4b91b70c35
41
aes.c
41
aes.c
|
@ -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.
|
Block size can be chosen in aes.h - available choices are AES128, AES192, AES256.
|
||||||
|
|
||||||
The implementation is verified against the test vectors in:
|
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)
|
#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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue