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)
{
word32 digest[HASH_MAX_DIGEST/sizeof(word32)];
int i = 0, sz;
/* get digest result */
digest[0] = HASH->HR[0];
digest[1] = HASH->HR[1];
digest[2] = HASH->HR[2];
digest[3] = HASH->HR[3];
if (digestSize >= 20) {
digest[4] = HASH->HR[4];
if (digestSize > HASH_MAX_DIGEST)
digestSize = HASH_MAX_DIGEST;
sz = digestSize;
while (sz > 0) {
/* first 20 bytes come from instance HR */
if (i < 5) {
digest[i] = HASH->HR[i];
}
#ifdef HASH_DIGEST
if (digestSize >= 28) {
digest[5] = HASH_DIGEST->HR[5];
digest[6] = HASH_DIGEST->HR[6];
if (digestSize == 32)
digest[7] = HASH_DIGEST->HR[7];
/* reset comes from HASH_DIGEST */
else {
digest[i] = HASH_DIGEST->HR[i];
}
#endif
i++;
sz -= 4;
}
ByteReverseWords(digest, digest, digestSize);
@@ -202,11 +205,14 @@ static int wc_Stm32_Hash_WaitDone(STM32_HASH_Context* stmCtx)
int timeout = 0;
(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) &&
#ifdef HASH_IMR_DCIE
(HASH->SR & HASH_SR_DCIS) == 0 &&
#endif
#ifdef HASH_IMR_DINIE
(HASH->SR & HASH_SR_DINIS) == 0 &&
#endif
++timeout < STM32_HASH_TIMEOUT) {
};

View File

@@ -35,10 +35,15 @@
#ifdef HASH_DIGEST
/* The HASH_DIGEST register indicates SHA224/SHA256 support */
#define STM32_HASH_SHA2
#define HASH_CR_SIZE 54
#define HASH_MAX_DIGEST 32
#if defined(WOLFSSL_STM32H5)
#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
#define HASH_CR_SIZE 50
#define HASH_CR_SIZE 50
#define HASH_MAX_DIGEST 20
#endif