Merge pull request #126 from torfinnberset/master

Const-qualify all read-only pointers
This commit is contained in:
kokke 2019-02-22 09:23:16 +01:00 committed by GitHub
commit 4b4b04b8fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 17 deletions

View File

@ -15,8 +15,8 @@ void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, const uint8_t* iv)
void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv); void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv);
/* Then start encrypting and decrypting with the functions below: */ /* Then start encrypting and decrypting with the functions below: */
void AES_ECB_encrypt(struct AES_ctx* ctx, uint8_t* buf); void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf);
void AES_ECB_decrypt(struct AES_ctx* ctx, uint8_t* buf); void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf);
void AES_CBC_encrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length); void AES_CBC_encrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length);
void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length); void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length);
@ -47,21 +47,21 @@ GCC size output when only CTR mode is compiled for ARM:
$ arm-none-eabi-gcc -Os -DCBC=0 -DECB=0 -DCTR=1 -c aes.c $ arm-none-eabi-gcc -Os -DCBC=0 -DECB=0 -DCTR=1 -c aes.c
$ size aes.o $ size aes.o
text data bss dec hex filename text data bss dec hex filename
1203 0 0 1203 4b3 aes.o 1343 0 0 1343 53f aes.o
.. and when compiling for the THUMB instruction set, we end up just below 1K in code size. .. and when compiling for the THUMB instruction set, we end up just below 1K in code size.
$ arm-none-eabi-gcc -Os -mthumb -DCBC=0 -DECB=0 -DCTR=1 -c aes.c $ arm-none-eabi-gcc -Os -mthumb -DCBC=0 -DECB=0 -DCTR=1 -c aes.c
$ size aes.o $ size aes.o
text data bss dec hex filename text data bss dec hex filename
955 0 0 955 3bb aes.o 979 0 0 979 3d3 aes.o
I am using the Free Software Foundation, ARM GCC compiler: I am using the Free Software Foundation, ARM GCC compiler:
$ arm-none-eabi-gcc --version $ arm-none-eabi-gcc --version
arm-none-eabi-gcc (4.8.4-1+11-1) 4.8.4 20141219 (release) arm-none-eabi-gcc (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 8.2.1 20181213 (release)
Copyright (C) 2013 Free Software Foundation, Inc. Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

18
aes.c
View File

@ -240,7 +240,7 @@ void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv)
// This function adds the round key to state. // This function adds the round key to state.
// The round key is added to the state by an XOR function. // The round key is added to the state by an XOR function.
static void AddRoundKey(uint8_t round,state_t* state,uint8_t* RoundKey) static void AddRoundKey(uint8_t round, state_t* state, const uint8_t* RoundKey)
{ {
uint8_t i,j; uint8_t i,j;
for (i = 0; i < 4; ++i) for (i = 0; i < 4; ++i)
@ -408,7 +408,7 @@ static void InvShiftRows(state_t* state)
#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) #endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)
// Cipher is the main function that encrypts the PlainText. // Cipher is the main function that encrypts the PlainText.
static void Cipher(state_t* state, uint8_t* RoundKey) static void Cipher(state_t* state, const uint8_t* RoundKey)
{ {
uint8_t round = 0; uint8_t round = 0;
@ -434,7 +434,7 @@ static void Cipher(state_t* state, uint8_t* RoundKey)
} }
#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)
static void InvCipher(state_t* state,uint8_t* RoundKey) static void InvCipher(state_t* state, const uint8_t* RoundKey)
{ {
uint8_t round = 0; uint8_t round = 0;
@ -466,13 +466,13 @@ static void InvCipher(state_t* state,uint8_t* RoundKey)
#if defined(ECB) && (ECB == 1) #if defined(ECB) && (ECB == 1)
void AES_ECB_encrypt(struct AES_ctx *ctx, uint8_t* buf) void AES_ECB_encrypt(const struct AES_ctx *ctx, uint8_t* buf)
{ {
// The next function call encrypts the PlainText with the Key using AES algorithm. // The next function call encrypts the PlainText with the Key using AES algorithm.
Cipher((state_t*)buf, ctx->RoundKey); Cipher((state_t*)buf, ctx->RoundKey);
} }
void AES_ECB_decrypt(struct AES_ctx* ctx, uint8_t* buf) void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf)
{ {
// The next function call decrypts the PlainText with the Key using AES algorithm. // The next function call decrypts the PlainText with the Key using AES algorithm.
InvCipher((state_t*)buf, ctx->RoundKey); InvCipher((state_t*)buf, ctx->RoundKey);
@ -488,7 +488,7 @@ void AES_ECB_decrypt(struct AES_ctx* ctx, uint8_t* buf)
#if defined(CBC) && (CBC == 1) #if defined(CBC) && (CBC == 1)
static void XorWithIv(uint8_t* buf, uint8_t* Iv) static void XorWithIv(uint8_t* buf, const uint8_t* Iv)
{ {
uint8_t i; uint8_t i;
for (i = 0; i < AES_BLOCKLEN; ++i) // The block in AES is always 128bit no matter the key size for (i = 0; i < AES_BLOCKLEN; ++i) // The block in AES is always 128bit no matter the key size
@ -497,7 +497,7 @@ static void XorWithIv(uint8_t* buf, uint8_t* Iv)
} }
} }
void AES_CBC_encrypt_buffer(struct AES_ctx *ctx,uint8_t* buf, uint32_t length) void AES_CBC_encrypt_buffer(struct AES_ctx *ctx, uint8_t* buf, uint32_t length)
{ {
uintptr_t i; uintptr_t i;
uint8_t *Iv = ctx->Iv; uint8_t *Iv = ctx->Iv;
@ -552,9 +552,9 @@ void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length)
/* Increment Iv and handle overflow */ /* Increment Iv and handle overflow */
for (bi = (AES_BLOCKLEN - 1); bi >= 0; --bi) for (bi = (AES_BLOCKLEN - 1); bi >= 0; --bi)
{ {
/* inc will owerflow */ /* inc will overflow */
if (ctx->Iv[bi] == 255) if (ctx->Iv[bi] == 255)
{ {
ctx->Iv[bi] = 0; ctx->Iv[bi] = 0;
continue; continue;
} }

4
aes.h
View File

@ -58,8 +58,8 @@ void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv);
// buffer size is exactly AES_BLOCKLEN bytes; // buffer size is exactly AES_BLOCKLEN bytes;
// you need only AES_init_ctx as IV is not used in ECB // you need only AES_init_ctx as IV is not used in ECB
// NB: ECB is considered insecure for most uses // NB: ECB is considered insecure for most uses
void AES_ECB_encrypt(struct AES_ctx* ctx, uint8_t* buf); void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf);
void AES_ECB_decrypt(struct AES_ctx* ctx, uint8_t* buf); void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf);
#endif // #if defined(ECB) && (ECB == !) #endif // #if defined(ECB) && (ECB == !)