Fixes to support larger H5 save/restore and larger digest result (for SHA2-512).

This commit is contained in:
David Garske
2023-03-28 16:15:47 -07:00
parent d99514a41c
commit c7a76365f0
2 changed files with 27 additions and 16 deletions

View File

@@ -164,22 +164,25 @@ static void wc_Stm32_Hash_RestoreContext(STM32_HASH_Context* ctx, int algo)
static void wc_Stm32_Hash_GetDigest(byte* hash, int digestSize) static void wc_Stm32_Hash_GetDigest(byte* hash, int digestSize)
{ {
word32 digest[HASH_MAX_DIGEST/sizeof(word32)]; word32 digest[HASH_MAX_DIGEST/sizeof(word32)];
int i = 0, sz;
/* get digest result */ if (digestSize > HASH_MAX_DIGEST)
digest[0] = HASH->HR[0]; digestSize = HASH_MAX_DIGEST;
digest[1] = HASH->HR[1];
digest[2] = HASH->HR[2]; sz = digestSize;
digest[3] = HASH->HR[3]; while (sz > 0) {
if (digestSize >= 20) { /* first 20 bytes come from instance HR */
digest[4] = HASH->HR[4]; if (i < 5) {
digest[i] = HASH->HR[i];
}
#ifdef HASH_DIGEST #ifdef HASH_DIGEST
if (digestSize >= 28) { /* reset comes from HASH_DIGEST */
digest[5] = HASH_DIGEST->HR[5]; else {
digest[6] = HASH_DIGEST->HR[6]; digest[i] = HASH_DIGEST->HR[i];
if (digestSize == 32)
digest[7] = HASH_DIGEST->HR[7];
} }
#endif #endif
i++;
sz -= 4;
} }
ByteReverseWords(digest, digest, digestSize); ByteReverseWords(digest, digest, digestSize);
@@ -202,11 +205,14 @@ static int wc_Stm32_Hash_WaitDone(STM32_HASH_Context* stmCtx)
int timeout = 0; int timeout = 0;
(void)stmCtx; (void)stmCtx;
/* wait until hash digest is complete */ /* wait until not busy and hash digest / input block are complete */
while ((HASH->SR & HASH_SR_BUSY) && while ((HASH->SR & HASH_SR_BUSY) &&
#ifdef HASH_IMR_DCIE #ifdef HASH_IMR_DCIE
(HASH->SR & HASH_SR_DCIS) == 0 && (HASH->SR & HASH_SR_DCIS) == 0 &&
#endif #endif
#ifdef HASH_IMR_DINIE
(HASH->SR & HASH_SR_DINIS) == 0 &&
#endif
++timeout < STM32_HASH_TIMEOUT) { ++timeout < STM32_HASH_TIMEOUT) {
}; };

View File

@@ -35,10 +35,15 @@
#ifdef HASH_DIGEST #ifdef HASH_DIGEST
/* The HASH_DIGEST register indicates SHA224/SHA256 support */ /* The HASH_DIGEST register indicates SHA224/SHA256 support */
#define STM32_HASH_SHA2 #define STM32_HASH_SHA2
#define HASH_CR_SIZE 54 #if defined(WOLFSSL_STM32H5)
#define HASH_MAX_DIGEST 32 #define HASH_CR_SIZE 103
#define HASH_MAX_DIGEST 64 /* Up to SHA512 */
#else
#define HASH_CR_SIZE 54
#define HASH_MAX_DIGEST 32
#endif
#else #else
#define HASH_CR_SIZE 50 #define HASH_CR_SIZE 50
#define HASH_MAX_DIGEST 20 #define HASH_MAX_DIGEST 20
#endif #endif