From fb7d74c19761a0a00b54f1c8c22ede63c027547f Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Fri, 25 May 2018 09:01:44 +1000 Subject: [PATCH] FinalRaw parameter hash may not be aligned. --- wolfcrypt/src/sha.c | 10 ++++++++-- wolfcrypt/src/sha256.c | 11 +++++++++-- wolfcrypt/src/sha512.c | 22 ++++++++++++++++++---- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index 15fc5e9a3..d800e2d9b 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -433,13 +433,19 @@ int wc_ShaUpdate(wc_Sha* sha, const byte* data, word32 len) int wc_ShaFinalRaw(wc_Sha* sha, byte* hash) { +#ifdef LITTLE_ENDIAN_ORDER + word32 digest[WC_SHA_DIGEST_SIZE / sizeof(word32)]; +#endif + if (sha == NULL || hash == NULL) { return BAD_FUNC_ARG; } - XMEMCPY(hash, sha->digest, WC_SHA_DIGEST_SIZE); #ifdef LITTLE_ENDIAN_ORDER - ByteReverseWords((word32*)hash, (word32*)hash, WC_SHA_DIGEST_SIZE); + ByteReverseWords((word32*)digest, (word32*)sha->digest, WC_SHA_DIGEST_SIZE); + XMEMCPY(hash, digest, WC_SHA_DIGEST_SIZE); +#else + XMEMCPY(hash, sha->digest, WC_SHA_DIGEST_SIZE); #endif return 0; diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index c6be6a40e..bd234c4f0 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -767,13 +767,20 @@ static int InitSha256(wc_Sha256* sha256) int wc_Sha256FinalRaw(wc_Sha256* sha256, byte* hash) { + #ifdef LITTLE_ENDIAN_ORDER + word32 digest[WC_SHA256_DIGEST_SIZE / sizeof(word32)]; + #endif + if (sha256 == NULL || hash == NULL) { return BAD_FUNC_ARG; } + #ifdef LITTLE_ENDIAN_ORDER + ByteReverseWords((word32*)digest, (word32*)sha256->digest, + WC_SHA256_DIGEST_SIZE); + XMEMCPY(hash, digest, WC_SHA256_DIGEST_SIZE); + #else XMEMCPY(hash, sha256->digest, WC_SHA256_DIGEST_SIZE); - #if defined(LITTLE_ENDIAN_ORDER) - ByteReverseWords((word32*)hash, (word32*)hash, WC_SHA256_DIGEST_SIZE); #endif return 0; diff --git a/wolfcrypt/src/sha512.c b/wolfcrypt/src/sha512.c index 7b14a59eb..a39bd8379 100644 --- a/wolfcrypt/src/sha512.c +++ b/wolfcrypt/src/sha512.c @@ -697,13 +697,20 @@ static INLINE int Sha512Final(wc_Sha512* sha512) int wc_Sha512FinalRaw(wc_Sha512* sha512, byte* hash) { +#ifdef LITTLE_ENDIAN_ORDER + word64 digest[WC_SHA512_DIGEST_SIZE / sizeof(word64)]; +#endif + if (sha512 == NULL || hash == NULL) { return BAD_FUNC_ARG; } +#ifdef LITTLE_ENDIAN_ORDER + ByteReverseWords64((word64*)digest, (word64*)sha512->digest, + WC_SHA512_DIGEST_SIZE); + XMEMCPY(hash, digest, WC_SHA512_DIGEST_SIZE); +#else XMEMCPY(hash, sha512->digest, WC_SHA512_DIGEST_SIZE); -#if defined(LITTLE_ENDIAN_ORDER) - ByteReverseWords64((word64*)hash, (word64*)hash, WC_SHA512_DIGEST_SIZE); #endif return 0; @@ -2604,13 +2611,20 @@ int wc_Sha384Update(wc_Sha384* sha384, const byte* data, word32 len) int wc_Sha384FinalRaw(wc_Sha384* sha384, byte* hash) { +#ifdef LITTLE_ENDIAN_ORDER + word64 digest[WC_SHA384_DIGEST_SIZE / sizeof(word64)]; +#endif + if (sha384 == NULL || hash == NULL) { return BAD_FUNC_ARG; } +#ifdef LITTLE_ENDIAN_ORDER + ByteReverseWords64((word64*)digest, (word64*)sha384->digest, + WC_SHA384_DIGEST_SIZE); + XMEMCPY(hash, digest, WC_SHA384_DIGEST_SIZE); +#else XMEMCPY(hash, sha384->digest, WC_SHA384_DIGEST_SIZE); -#if defined(LITTLE_ENDIAN_ORDER) - ByteReverseWords64((word64*)hash, (word64*)hash, WC_SHA384_DIGEST_SIZE); #endif return 0;