From 7f42b7157133a936cfd270c20cd0a37f5ace1431 Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 29 Oct 2019 13:41:28 -0700 Subject: [PATCH] Fix NXP MMCAU when data pointer is not aligned. --- wolfcrypt/src/md5.c | 24 ++++++++++++++++++++++++ wolfcrypt/src/sha.c | 28 ++++++++++++++++++++++++++-- wolfcrypt/src/sha256.c | 24 ++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index 243a997e4..062122442 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -115,6 +115,10 @@ int wc_Md5Final(wc_Md5* md5, byte* hash) #define XTRANSFORM(S,B) Transform((S), (B)) #define XTRANSFORM_LEN(S,B,L) Transform_Len((S), (B), (L)) +#if !defined(WC_HASH_DATA_ALIGNMENT) && defined(WOLFSSL_MMCAU_ALIGNMENT) + #define WC_HASH_DATA_ALIGNMENT WOLFSSL_MMCAU_ALIGNMENT +#endif + static int Transform(wc_Md5* md5, const byte* data) { int ret = wolfSSL_CryptHwMutexLock(); @@ -133,6 +137,25 @@ static int Transform_Len(wc_Md5* md5, const byte* data, word32 len) { int ret = wolfSSL_CryptHwMutexLock(); if (ret == 0) { + #if defined(WC_HASH_DATA_ALIGNMENT) && WC_HASH_DATA_ALIGNMENT > 0 + if ((size_t)data % WC_HASH_DATA_ALIGNMENT) { + /* data pointer is NOT aligned, + * so copy and perform one block at a time */ + byte* local = (byte*)md5->buffer; + while (len >= WC_MD5_BLOCK_SIZE) { + XMEMCPY(local, data, WC_MD5_BLOCK_SIZE); + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_md5_hash_n(local, 1, (unsigned char*)md5->digest); + #else + MMCAU_MD5_HashN(local, 1, (uint32_t*)md5->digest); + #endif + data += WC_MD5_BLOCK_SIZE; + len -= WC_MD5_BLOCK_SIZE; + } + } + else + #endif + { #ifdef FREESCALE_MMCAU_CLASSIC_SHA cau_md5_hash_n((byte*)data, len / WC_MD5_BLOCK_SIZE, (unsigned char*)md5->digest); @@ -140,6 +163,7 @@ static int Transform_Len(wc_Md5* md5, const byte* data, word32 len) MMCAU_MD5_HashN((byte*)data, len / WC_MD5_BLOCK_SIZE, (uint32_t*)md5->digest); #endif + } wolfSSL_CryptHwMutexUnLock(); } return ret; diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index cdd7146c3..40ac18e5f 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -209,6 +209,10 @@ #define XTRANSFORM(S,B) Transform((S),(B)) #define XTRANSFORM_LEN(S,B,L) Transform_Len((S),(B),(L)) + #if !defined(WC_HASH_DATA_ALIGNMENT) && defined(WOLFSSL_MMCAU_ALIGNMENT) + #define WC_HASH_DATA_ALIGNMENT WOLFSSL_MMCAU_ALIGNMENT + #endif + static int InitSha(wc_Sha* sha) { int ret = 0; @@ -233,7 +237,7 @@ static int Transform(wc_Sha* sha, const byte* data) { int ret = wolfSSL_CryptHwMutexLock(); - if(ret == 0) { + if (ret == 0) { #ifdef FREESCALE_MMCAU_CLASSIC_SHA cau_sha1_hash_n((byte*)data, 1, sha->digest); #else @@ -247,13 +251,33 @@ static int Transform_Len(wc_Sha* sha, const byte* data, word32 len) { int ret = wolfSSL_CryptHwMutexLock(); - if(ret == 0) { + if (ret == 0) { + #if defined(WC_HASH_DATA_ALIGNMENT) && WC_HASH_DATA_ALIGNMENT > 0 + if ((size_t)data % WC_HASH_DATA_ALIGNMENT) { + /* data pointer is NOT aligned, + * so copy and perform one block at a time */ + byte* local = (byte*)sha->buffer; + while (len >= WC_SHA_BLOCK_SIZE) { + XMEMCPY(local, data, WC_SHA_BLOCK_SIZE); + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_sha1_hash_n(local, 1, sha->digest); + #else + MMCAU_SHA1_HashN(local, 1, sha->digest); + #endif + data += WC_SHA_BLOCK_SIZE; + len -= WC_SHA_BLOCK_SIZE; + } + } + else + #endif + { #ifdef FREESCALE_MMCAU_CLASSIC_SHA cau_sha1_hash_n((byte*)data, len/WC_SHA_BLOCK_SIZE, sha->digest); #else MMCAU_SHA1_HashN((byte*)data, len/WC_SHA_BLOCK_SIZE, (uint32_t*)sha->digest); #endif + } wolfSSL_CryptHwMutexUnLock(); } return ret; diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 2ef6f49d4..14baf4151 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -394,6 +394,10 @@ static int InitSha256(wc_Sha256* sha256) #define XTRANSFORM(S, D) Transform_Sha256((S),(D)) #define XTRANSFORM_LEN(S, D, L) Transform_Sha256_Len((S),(D),(L)) + #if !defined(WC_HASH_DATA_ALIGNMENT) && defined(WOLFSSL_MMCAU_ALIGNMENT) + #define WC_HASH_DATA_ALIGNMENT WOLFSSL_MMCAU_ALIGNMENT + #endif + int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId) { int ret = 0; @@ -438,6 +442,25 @@ static int InitSha256(wc_Sha256* sha256) { int ret = wolfSSL_CryptHwMutexLock(); if (ret == 0) { + #if defined(WC_HASH_DATA_ALIGNMENT) && WC_HASH_DATA_ALIGNMENT > 0 + if ((size_t)data % WC_HASH_DATA_ALIGNMENT) { + /* data pointer is NOT aligned, + * so copy and perform one block at a time */ + byte* local = (byte*)sha256->buffer; + while (len >= WC_SHA256_BLOCK_SIZE) { + XMEMCPY(local, data, WC_SHA256_BLOCK_SIZE); + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_sha256_hash_n(local, 1, sha256->digest); + #else + MMCAU_SHA256_HashN(local, 1, sha256->digest); + #endif + data += WC_SHA256_BLOCK_SIZE; + len -= WC_SHA256_BLOCK_SIZE; + } + } + else + #endif + { #ifdef FREESCALE_MMCAU_CLASSIC_SHA cau_sha256_hash_n((byte*)data, len/WC_SHA256_BLOCK_SIZE, sha256->digest); @@ -445,6 +468,7 @@ static int InitSha256(wc_Sha256* sha256) MMCAU_SHA256_HashN((byte*)data, len/WC_SHA256_BLOCK_SIZE, sha256->digest); #endif + } wolfSSL_CryptHwMutexUnLock(); } return ret;