From d111d7da1bf080fbfe2f5e29ef6aa4c538f8d0d8 Mon Sep 17 00:00:00 2001 From: jordan Date: Fri, 2 Feb 2024 19:50:22 -0600 Subject: [PATCH 1/2] Fix MD5 and SHA buffer overrun. --- wolfcrypt/src/md5.c | 4 +++- wolfcrypt/src/sha256.c | 7 +++++-- wolfcrypt/src/sha512.c | 6 +++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index 1f6130264..6700fdc94 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -461,7 +461,9 @@ int wc_Md5Final(wc_Md5* md5, byte* hash) /* pad with zeros */ if (md5->buffLen > WC_MD5_PAD_SIZE) { - XMEMSET(&local[md5->buffLen], 0, WC_MD5_BLOCK_SIZE - md5->buffLen); + if (md5->buffLen < WC_MD5_BLOCK_SIZE) { + XMEMSET(&local[md5->buffLen], 0, WC_MD5_BLOCK_SIZE - md5->buffLen); + } md5->buffLen += WC_MD5_BLOCK_SIZE - md5->buffLen; #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index bbaad7fab..e4e1ddf93 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -1321,8 +1321,11 @@ static int InitSha256(wc_Sha256* sha256) /* pad with zeros */ if (sha256->buffLen > WC_SHA256_PAD_SIZE) { - XMEMSET(&local[sha256->buffLen], 0, - WC_SHA256_BLOCK_SIZE - sha256->buffLen); + if (sha256->buffLen < WC_SHA256_BLOCK_SIZE) { + XMEMSET(&local[sha256->buffLen], 0, + WC_SHA256_BLOCK_SIZE - sha256->buffLen); + } + sha256->buffLen += WC_SHA256_BLOCK_SIZE - sha256->buffLen; #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ diff --git a/wolfcrypt/src/sha512.c b/wolfcrypt/src/sha512.c index 263971729..3cc2d5f43 100644 --- a/wolfcrypt/src/sha512.c +++ b/wolfcrypt/src/sha512.c @@ -942,7 +942,11 @@ static WC_INLINE int Sha512Final(wc_Sha512* sha512) /* pad with zeros */ if (sha512->buffLen > WC_SHA512_PAD_SIZE) { - XMEMSET(&local[sha512->buffLen], 0, WC_SHA512_BLOCK_SIZE - sha512->buffLen); + if (sha512->buffLen < WC_SHA512_BLOCK_SIZE ) { + XMEMSET(&local[sha512->buffLen], 0, + WC_SHA512_BLOCK_SIZE - sha512->buffLen); + } + sha512->buffLen += WC_SHA512_BLOCK_SIZE - sha512->buffLen; #if defined(LITTLE_ENDIAN_ORDER) #if defined(USE_INTEL_SPEEDUP) && \ From 83169f91e9f0db88633ac1d1cfb60d1b71c0c68e Mon Sep 17 00:00:00 2001 From: jordan Date: Sat, 3 Feb 2024 17:36:26 -0600 Subject: [PATCH 2/2] Fix ShaFinal overrun. --- wolfcrypt/src/sha.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index 1f4439f0f..69990791f 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -841,7 +841,10 @@ int wc_ShaFinal(wc_Sha* sha, byte* hash) /* pad with zeros */ if (sha->buffLen > WC_SHA_PAD_SIZE) { - XMEMSET(&local[sha->buffLen], 0, WC_SHA_BLOCK_SIZE - sha->buffLen); + if (sha->buffLen < WC_SHA_BLOCK_SIZE) { + XMEMSET(&local[sha->buffLen], 0, WC_SHA_BLOCK_SIZE - sha->buffLen); + } + sha->buffLen += WC_SHA_BLOCK_SIZE - sha->buffLen; #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW)