From d274c80789201219ee9423a1c3bb0d07f9bbbafd Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 19 Apr 2021 16:47:34 +1000 Subject: [PATCH] ARMv8 ASM AES-CBC: Fix parameter validation --- wolfcrypt/src/port/arm/armv8-aes.c | 54 ++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/wolfcrypt/src/port/arm/armv8-aes.c b/wolfcrypt/src/port/arm/armv8-aes.c index 5f92cbe6f..bdb075eb0 100644 --- a/wolfcrypt/src/port/arm/armv8-aes.c +++ b/wolfcrypt/src/port/arm/armv8-aes.c @@ -461,10 +461,20 @@ int wc_AesSetIV(Aes* aes, const byte* iv) { word32 numBlocks = sz / AES_BLOCK_SIZE; - if (aes == NULL || out == NULL || (in == NULL && sz > 0)) { + if (aes == NULL || out == NULL || in == NULL) { return BAD_FUNC_ARG; } + if (sz == 0) { + return 0; + } + +#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS + if (sz % AES_BLOCK_SIZE) { + return BAD_LENGTH_E; + } +#endif + /* do as many block size ops as possible */ if (numBlocks > 0) { word32* key = aes->key; @@ -665,11 +675,22 @@ int wc_AesSetIV(Aes* aes, const byte* iv) { word32 numBlocks = sz / AES_BLOCK_SIZE; - if (aes == NULL || out == NULL || (in == NULL && sz > 0) - || sz % AES_BLOCK_SIZE != 0) { + if (aes == NULL || out == NULL || in == NULL) { return BAD_FUNC_ARG; } + if (sz == 0) { + return 0; + } + + if (sz % AES_BLOCK_SIZE) { +#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS + return BAD_LENGTH_E; +#else + return BAD_FUNC_ARG; +#endif + } + /* do as many block size ops as possible */ if (numBlocks > 0) { word32* key = aes->key; @@ -3043,10 +3064,20 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, { word32 numBlocks = sz / AES_BLOCK_SIZE; - if (aes == NULL || out == NULL || (in == NULL && sz > 0)) { + if (aes == NULL || out == NULL || in == NULL) { return BAD_FUNC_ARG; } + if (sz == 0) { + return 0; + } + +#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS + if (sz % AES_BLOCK_SIZE) { + return BAD_LENGTH_E; + } +#endif + /* do as many block size ops as possible */ if (numBlocks > 0) { word32* keyPt = aes->key; @@ -3275,11 +3306,22 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, { word32 numBlocks = sz / AES_BLOCK_SIZE; - if (aes == NULL || out == NULL || (in == NULL && sz > 0) - || sz % AES_BLOCK_SIZE != 0) { + if (aes == NULL || out == NULL || in == NULL) { return BAD_FUNC_ARG; } + if (sz == 0) { + return 0; + } + + if (sz % AES_BLOCK_SIZE) { +#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS + return BAD_LENGTH_E; +#else + return BAD_FUNC_ARG; +#endif + } + /* do as many block size ops as possible */ if (numBlocks > 0) { word32* keyPt = aes->key;