From 20894622729c9cfbde2fb1f6fcbfead473ef843b Mon Sep 17 00:00:00 2001 From: Matteo Brichese Date: Tue, 6 Jun 2017 11:10:33 -0700 Subject: adding aes256 aes192 options --- aes.c | 36 ++++++++-------------- aes.h | 7 ++--- test.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 101 insertions(+), 48 deletions(-) diff --git a/aes.c b/aes.c index bb026fd..3171cdc 100644 --- a/aes.c +++ b/aes.c @@ -448,16 +448,6 @@ static void InvCipher(void) AddRoundKey(0); } -static void BlockCopy(uint8_t* output, const uint8_t* input) -{ - uint8_t i; - for (i=0;i Date: Tue, 6 Jun 2017 11:36:11 -0700 Subject: Encrypt CBC works --- aes.c | 40 ++++++++++++++++++++-------------------- aes.h | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/aes.c b/aes.c index 3171cdc..6a2a531 100644 --- a/aes.c +++ b/aes.c @@ -503,9 +503,9 @@ static void XorWithIv(uint8_t* buf) void AES_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv) { uintptr_t i; - uint8_t remainders = length % KEYLEN; /* Remaining bytes in the last non-full block */ + uint8_t extra = length % 16; /* Remaining bytes in the last non-full block */ - memcpy(output, input, KEYLEN); + memcpy(output, input, 16); state = (state_t*)output; // Skip the key expansion if key is passed as 0 @@ -520,21 +520,22 @@ void AES_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, co Iv = (uint8_t*)iv; } - for(i = 0; i < length-remainders; i += KEYLEN) + for(i = 0; i < length; i += 16) { XorWithIv(input); - memcpy(output, input, KEYLEN); + memcpy(output, input, 16); state = (state_t*)output; Cipher(); Iv = output; - input += KEYLEN; - output += KEYLEN; + input += 16; + output += 16; + //printf("Step %d - %d", i/16, i); } - if(remainders) + if(extra) { - memcpy(output, input, remainders); - //memset(output + remainders, 0, KEYLEN - remainders); /* add 0-padding */ + printf("NONO\n"); + memcpy(output, input, extra); state = (state_t*)output; Cipher(); } @@ -543,11 +544,11 @@ void AES_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, co void AES_CBC_decrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv) { uintptr_t i; - uint8_t remainders = length % KEYLEN; /* Remaining bytes in the last non-full block */ - - memcpy(output, input, KEYLEN); - state = (state_t*)output; + uint8_t extra = length % 16; /* Remaining bytes in the last non-full block */ + memcpy(output, input, 16); + state = (state_t*)output; + // Skip the key expansion if key is passed as 0 if(0 != key) { @@ -561,21 +562,20 @@ void AES_CBC_decrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, co Iv = (uint8_t*)iv; } - for(i = 0; i < length; i += KEYLEN) + for(i = 0; i < length; i += 16) { - memcpy(output, input, KEYLEN); + memcpy(output, input, 16); state = (state_t*)output; InvCipher(); XorWithIv(output); Iv = input; - input += KEYLEN; - output += KEYLEN; + input += 16; + output += 16; } - if(remainders) + if(extra) { - memcpy(output, input, KEYLEN); - memset(output+remainders, 0, KEYLEN - remainders); /* add 0-padding */ + memcpy(output, input, extra); state = (state_t*)output; InvCipher(); } diff --git a/aes.h b/aes.h index 1c8af6c..15b504e 100644 --- a/aes.h +++ b/aes.h @@ -18,7 +18,7 @@ #define ECB 1 #endif -#define AES256 +#define AES128 #if defined(ECB) && ECB -- cgit v1.2.3 From c1c5fb1974203abf974d6ad359f22dd64b203e45 Mon Sep 17 00:00:00 2001 From: Matteo Brichese Date: Tue, 6 Jun 2017 13:33:36 -0700 Subject: added AES192 and 256 --- aes.c | 30 +++++++++++++++--------------- aes.h | 2 +- test.c | 20 +++++++++++++------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/aes.c b/aes.c index 6a2a531..e58498f 100644 --- a/aes.c +++ b/aes.c @@ -42,6 +42,7 @@ NOTE: String length must be evenly divisible by 16byte (str_len % 16 == 0) /*****************************************************************************/ // The number of columns comprising a state in AES. This is a constant in AES. Value=4 #define Nb 4 +#define BLOCKLEN 16 //Block length in bytes AES is 128b block only #ifdef AES256 #define Nk 8 @@ -177,7 +178,7 @@ static void KeyExpansion(void) // All other round keys are found from the previous round keys. //i == Nk - for(i = Nk; i < Nb * (Nr + 1); ++i) + for(; i < Nb * (Nr + 1); ++i) { { tempa[0]=RoundKey[(i-1) * 4 + 0]; @@ -494,7 +495,7 @@ void AES_ECB_decrypt(const uint8_t* input, const uint8_t* key, uint8_t *output, static void XorWithIv(uint8_t* buf) { uint8_t i; - for(i = 0; i < 16; ++i) //WAS for(i = 0; i < KEYLEN; ++i) but the block in AES is always 128bit so 16 bytes! + for(i = 0; i < BLOCKLEN; ++i) //WAS for(i = 0; i < KEYLEN; ++i) but the block in AES is always 128bit so 16 bytes! { buf[i] ^= Iv[i]; } @@ -503,9 +504,9 @@ static void XorWithIv(uint8_t* buf) void AES_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv) { uintptr_t i; - uint8_t extra = length % 16; /* Remaining bytes in the last non-full block */ + uint8_t extra = length % BLOCKLEN; /* Remaining bytes in the last non-full block */ - memcpy(output, input, 16); + memcpy(output, input, BLOCKLEN); state = (state_t*)output; // Skip the key expansion if key is passed as 0 @@ -520,21 +521,20 @@ void AES_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, co Iv = (uint8_t*)iv; } - for(i = 0; i < length; i += 16) + for(i = 0; i < length; i += BLOCKLEN) { XorWithIv(input); - memcpy(output, input, 16); + memcpy(output, input, BLOCKLEN); state = (state_t*)output; Cipher(); Iv = output; - input += 16; - output += 16; + input += BLOCKLEN; + output += BLOCKLEN; //printf("Step %d - %d", i/16, i); } if(extra) { - printf("NONO\n"); memcpy(output, input, extra); state = (state_t*)output; Cipher(); @@ -544,9 +544,9 @@ void AES_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, co void AES_CBC_decrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv) { uintptr_t i; - uint8_t extra = length % 16; /* Remaining bytes in the last non-full block */ + uint8_t extra = length % BLOCKLEN; /* Remaining bytes in the last non-full block */ - memcpy(output, input, 16); + memcpy(output, input, BLOCKLEN); state = (state_t*)output; // Skip the key expansion if key is passed as 0 @@ -562,15 +562,15 @@ void AES_CBC_decrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, co Iv = (uint8_t*)iv; } - for(i = 0; i < length; i += 16) + for(i = 0; i < length; i += BLOCKLEN) { - memcpy(output, input, 16); + memcpy(output, input, BLOCKLEN); state = (state_t*)output; InvCipher(); XorWithIv(output); Iv = input; - input += 16; - output += 16; + input += BLOCKLEN; + output += BLOCKLEN; } if(extra) diff --git a/aes.h b/aes.h index 15b504e..624b4ab 100644 --- a/aes.h +++ b/aes.h @@ -6,7 +6,7 @@ // #define the macros below to 1/0 to enable/disable the mode of operation. // -// CBC enables AES128 encryption in CBC-mode of operation and handles 0-padding. +// CBC enables AES encryption in CBC-mode of operation. // ECB enables the basic ECB 16-byte block algorithm. Both can be enabled simultaneously. // The #ifndef-guard allows it to be configured before #include'ing or at compile time. diff --git a/test.c b/test.c index baf2219..8900e91 100644 --- a/test.c +++ b/test.c @@ -20,13 +20,18 @@ static void test_decrypt_cbc(void); int main(void) { + #ifdef AES128 - printf("\nAES128\n\n"); + printf("\nTesting AES128\n\n"); #elif defined(AES192) - printf("\nAES192\n\n"); + printf("\nTesting AES192\n\n"); #elif defined(AES256) - printf("\nAES256\n\n"); + printf("\nTesting AES256\n\n"); +#else + printf("You need to specify a symbol between AES128, AES192 or AES256. Exiting"); + return 0; #endif + test_encrypt_cbc(); test_decrypt_cbc(); test_decrypt_ecb(); @@ -151,12 +156,13 @@ static void test_decrypt_cbc(void) 0x39, 0xf2, 0x33, 0x69, 0xa9, 0xd9, 0xba, 0xcf, 0xa5, 0x30, 0xe2, 0x63, 0x04, 0x23, 0x14, 0x61, 0xb2, 0xeb, 0x05, 0xe2, 0xc3, 0x9b, 0xe9, 0xfc, 0xda, 0x6c, 0x19, 0x07, 0x8c, 0x6a, 0x9d, 0x1b }; #endif - uint8_t iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; + uint8_t iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; uint8_t out[] = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, - 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, - 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, - 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }; + 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, + 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, + 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }; uint8_t buffer[64]; + uint8_t buffer2[64]; AES_CBC_decrypt_buffer(buffer, in, 64, key, iv); -- cgit v1.2.3