@@ -303,12 +303,11 @@ int wc_Stm32_Hash_Update(STM32_HASH_Context* stmCtx, word32 algo,
303303 int ret = 0 ;
304304 byte * local = (byte * )stmCtx -> buffer ;
305305 int wroteToFifo = 0 ;
306- const word32 fifoSz = (STM32_HASH_FIFO_SIZE * STM32_HASH_REG_SIZE );
307306 word32 chunkSz ;
308307
309308#ifdef DEBUG_STM32_HASH
310- printf ("STM Hash Update: algo %x, len %d, blockSz %d\n" ,
311- algo , len , blockSize );
309+ printf ("STM Hash Update: algo %x, len %d, buffLen %d, fifoBytes %d\n" ,
310+ algo , len , stmCtx -> buffLen , stmCtx -> fifoBytes );
312311#endif
313312 (void )blockSize ;
314313
@@ -323,40 +322,27 @@ int wc_Stm32_Hash_Update(STM32_HASH_Context* stmCtx, word32 algo,
323322 /* restore hash context or init as new hash */
324323 wc_Stm32_Hash_RestoreContext (stmCtx , algo );
325324
326- chunkSz = fifoSz ;
327- #ifdef STM32_HASH_FIFO_WORKAROUND
328- /* if FIFO already has bytes written then fill remainder first */
329- if (stmCtx -> fifoBytes > 0 ) {
330- chunkSz -= stmCtx -> fifoBytes ;
331- stmCtx -> fifoBytes = 0 ;
332- }
333- #endif
334-
335325 /* write blocks to FIFO */
336326 while (len ) {
337- word32 add = min (len , chunkSz - stmCtx -> buffLen );
327+ word32 add ;
328+
329+ /* fill the FIFO plus one additional to flush the block */
330+ chunkSz = ((STM32_HASH_FIFO_SIZE + 1 ) * STM32_HASH_REG_SIZE );
331+ /* account for extra bytes in the FIFO (use mask 0x3F to get remain) */
332+ chunkSz -= (stmCtx -> fifoBytes &
333+ ((STM32_HASH_FIFO_SIZE * STM32_HASH_REG_SIZE )- 1 ));
334+
335+ add = min (len , chunkSz - stmCtx -> buffLen );
338336 XMEMCPY (& local [stmCtx -> buffLen ], data , add );
339337
340338 stmCtx -> buffLen += add ;
341339 data += add ;
342340 len -= add ;
343341
344- #ifdef STM32_HASH_FIFO_WORKAROUND
345- /* We cannot leave the FIFO full and do save/restore
346- * the last must be large enough to flush block from FIFO */
347- if (stmCtx -> buffLen + len <= fifoSz * 2 ) {
348- chunkSz = fifoSz + STM32_HASH_REG_SIZE ;
349- }
350- #endif
351-
352342 if (stmCtx -> buffLen == chunkSz ) {
353343 wc_Stm32_Hash_Data (stmCtx , stmCtx -> buffLen );
354344 wroteToFifo = 1 ;
355- #ifdef STM32_HASH_FIFO_WORKAROUND
356- if (chunkSz > fifoSz )
357- stmCtx -> fifoBytes = chunkSz - fifoSz ;
358- chunkSz = fifoSz ;
359- #endif
345+ stmCtx -> fifoBytes += chunkSz ;
360346 }
361347 }
362348
@@ -380,7 +366,8 @@ int wc_Stm32_Hash_Final(STM32_HASH_Context* stmCtx, word32 algo,
380366 int ret = 0 ;
381367
382368#ifdef DEBUG_STM32_HASH
383- printf ("STM Hash Final: algo %x, digestSz %d\n" , algo , digestSize );
369+ printf ("STM Hash Final: algo %x, digestSz %d, buffLen %d, fifoBytes %d\n" ,
370+ algo , digestSize , stmCtx -> buffLen , stmCtx -> fifoBytes );
384371#endif
385372
386373 /* turn on hash clock */
0 commit comments