forked from wolfSSL/wolfssl
Fixes to support larger H5 save/restore and larger digest result (for SHA2-512).
This commit is contained in:
@@ -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) {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user