forked from wolfSSL/wolfssl
Improve the hash wait logic by separating the data input ready from the digest calculation complete.
This commit is contained in:
@ -252,16 +252,37 @@ static void wc_Stm32_Hash_GetDigest(byte* hash, int digestSize)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wc_Stm32_Hash_WaitDone(STM32_HASH_Context* stmCtx)
|
static int wc_Stm32_Hash_WaitDataReady(STM32_HASH_Context* stmCtx)
|
||||||
{
|
{
|
||||||
int timeout = 0;
|
int timeout = 0;
|
||||||
(void)stmCtx;
|
(void)stmCtx;
|
||||||
|
|
||||||
/* wait until not busy and hash digest / input block are complete */
|
/* wait until not busy and data input buffer ready */
|
||||||
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
|
||||||
|
&& ++timeout < STM32_HASH_TIMEOUT) {
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef DEBUG_STM32_HASH
|
||||||
|
printf("STM Wait Data %d, HASH->SR %lx\n", timeout, HASH->SR);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* verify timeout did not occur */
|
||||||
|
if (timeout >= STM32_HASH_TIMEOUT) {
|
||||||
|
return WC_TIMEOUT_E;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int wc_Stm32_Hash_WaitCalcComp(STM32_HASH_Context* stmCtx)
|
||||||
|
{
|
||||||
|
int timeout = 0;
|
||||||
|
(void)stmCtx;
|
||||||
|
|
||||||
|
/* wait until not busy and hash digest calculation complete */
|
||||||
|
while (((HASH->SR & HASH_SR_BUSY)
|
||||||
#ifdef HASH_IMR_DINIE
|
#ifdef HASH_IMR_DINIE
|
||||||
|| (HASH->SR & HASH_SR_DINIS) == 0
|
|| (HASH->SR & HASH_SR_DINIS) == 0
|
||||||
#endif
|
#endif
|
||||||
@ -269,7 +290,7 @@ static int wc_Stm32_Hash_WaitDone(STM32_HASH_Context* stmCtx)
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef DEBUG_STM32_HASH
|
#ifdef DEBUG_STM32_HASH
|
||||||
printf("STM Wait done %d, HASH->SR %lx\n", timeout, HASH->SR);
|
printf("STM Wait Calc %d, HASH->SR %lx\n", timeout, HASH->SR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* verify timeout did not occur */
|
/* verify timeout did not occur */
|
||||||
@ -364,7 +385,7 @@ int wc_Stm32_Hash_Update(STM32_HASH_Context* stmCtx, word32 algo,
|
|||||||
|
|
||||||
if (wroteToFifo) {
|
if (wroteToFifo) {
|
||||||
/* make sure hash operation is done */
|
/* make sure hash operation is done */
|
||||||
ret = wc_Stm32_Hash_WaitDone(stmCtx);
|
ret = wc_Stm32_Hash_WaitDataReady(stmCtx);
|
||||||
|
|
||||||
/* save hash state for next operation */
|
/* save hash state for next operation */
|
||||||
wc_Stm32_Hash_SaveContext(stmCtx);
|
wc_Stm32_Hash_SaveContext(stmCtx);
|
||||||
@ -405,7 +426,7 @@ int wc_Stm32_Hash_Final(STM32_HASH_Context* stmCtx, word32 algo,
|
|||||||
HASH->STR |= HASH_STR_DCAL;
|
HASH->STR |= HASH_STR_DCAL;
|
||||||
|
|
||||||
/* wait for hash done */
|
/* wait for hash done */
|
||||||
ret = wc_Stm32_Hash_WaitDone(stmCtx);
|
ret = wc_Stm32_Hash_WaitCalcComp(stmCtx);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
/* read message digest */
|
/* read message digest */
|
||||||
wc_Stm32_Hash_GetDigest(hash, digestSize);
|
wc_Stm32_Hash_GetDigest(hash, digestSize);
|
||||||
|
Reference in New Issue
Block a user