@@ -870,7 +870,10 @@ static int InitSha512_Family(wc_Sha512* sha512, void* heap, int devId,
870870
871871 sha512 -> heap = heap ;
872872#ifdef WOLFSSL_SMALL_STACK_CACHE
873- sha512 -> W = NULL ;
873+ sha512 -> W = (word64 * )XMALLOC ((sizeof (word64 ) * 16 ) + WC_SHA512_BLOCK_SIZE ,
874+ sha512 -> heap , DYNAMIC_TYPE_DIGEST );
875+ if (sha512 -> W == NULL )
876+ return MEMORY_E ;
874877#endif
875878#ifdef WOLF_CRYPTO_CB
876879 sha512 -> devId = devId ;
@@ -1031,14 +1034,10 @@ static int _Transform_Sha512(wc_Sha512* sha512)
10311034 word32 j ;
10321035 word64 T [8 ];
10331036
1034- #ifdef WOLFSSL_SMALL_STACK_CACHE
1037+ #if defined( WOLFSSL_SMALL_STACK_CACHE )
10351038 word64 * W = sha512 -> W ;
1036- if (W == NULL ) {
1037- W = (word64 * )XMALLOC (sizeof (word64 ) * 16 , sha512 -> heap , DYNAMIC_TYPE_TMP_BUFFER );
1038- if (W == NULL )
1039- return MEMORY_E ;
1040- sha512 -> W = W ;
1041- }
1039+ if (W == NULL )
1040+ return BAD_FUNC_ARG ;
10421041#elif defined(WOLFSSL_SMALL_STACK )
10431042 word64 * W ;
10441043 W = (word64 * ) XMALLOC (sizeof (word64 ) * 16 , sha512 -> heap , DYNAMIC_TYPE_TMP_BUFFER );
@@ -1646,7 +1645,7 @@ void wc_Sha512Free(wc_Sha512* sha512)
16461645
16471646#ifdef WOLFSSL_SMALL_STACK_CACHE
16481647 if (sha512 -> W != NULL ) {
1649- ForceZero (sha512 -> W , sizeof (word64 ) * 16 );
1648+ ForceZero (sha512 -> W , ( sizeof (word64 ) * 16 ) + WC_SHA512_BLOCK_SIZE );
16501649 XFREE (sha512 -> W , sha512 -> heap , DYNAMIC_TYPE_TMP_BUFFER );
16511650 sha512 -> W = NULL ;
16521651 }
@@ -1699,7 +1698,12 @@ int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data)
16991698 return BAD_FUNC_ARG ;
17001699 }
17011700
1702- #ifdef WOLFSSL_SMALL_STACK
1701+
1702+ #if defined(WOLFSSL_SMALL_STACK_CACHE )
1703+ if (sha -> W == NULL )
1704+ return BAD_FUNC_ARG ;
1705+ buffer = sha -> W + 16 ;
1706+ #elif defined(WOLFSSL_SMALL_STACK )
17031707 buffer = (word64 * )XMALLOC (WC_SHA512_BLOCK_SIZE , sha -> heap ,
17041708 DYNAMIC_TYPE_TMP_BUFFER );
17051709 if (buffer == NULL )
@@ -1733,7 +1737,7 @@ int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data)
17331737
17341738 XMEMCPY (sha -> buffer , buffer , WC_SHA512_BLOCK_SIZE );
17351739#endif
1736- #ifdef WOLFSSL_SMALL_STACK
1740+ #if defined( WOLFSSL_SMALL_STACK ) && !defined( WOLFSSL_SMALL_STACK_CACHE )
17371741 ForceZero (buffer , WC_SHA512_BLOCK_SIZE );
17381742 XFREE (buffer , sha -> heap , DYNAMIC_TYPE_TMP_BUFFER );
17391743#endif
@@ -1867,6 +1871,15 @@ static int InitSha384(wc_Sha384* sha384)
18671871 return BAD_FUNC_ARG ;
18681872 }
18691873
1874+ #ifdef WOLFSSL_SMALL_STACK_CACHE
1875+ if (sha384 -> W == NULL ) {
1876+ sha384 -> W = (word64 * )XMALLOC ((sizeof (word64 ) * 16 ) + WC_SHA512_BLOCK_SIZE ,
1877+ sha384 -> heap , DYNAMIC_TYPE_DIGEST );
1878+ if (sha384 -> W == NULL )
1879+ return MEMORY_E ;
1880+ }
1881+ #endif
1882+
18701883 sha384 -> digest [0 ] = W64LIT (0xcbbb9d5dc1059ed8 );
18711884 sha384 -> digest [1 ] = W64LIT (0x629a292a367cd507 );
18721885 sha384 -> digest [2 ] = W64LIT (0x9159015a3070dd17 );
@@ -2106,7 +2119,7 @@ void wc_Sha384Free(wc_Sha384* sha384)
21062119
21072120#ifdef WOLFSSL_SMALL_STACK_CACHE
21082121 if (sha384 -> W != NULL ) {
2109- ForceZero (sha384 -> W , sizeof (word64 ) * 16 );
2122+ ForceZero (sha384 -> W , ( sizeof (word64 ) * 16 ) + WC_SHA512_BLOCK_SIZE );
21102123 XFREE (sha384 -> W , sha384 -> heap , DYNAMIC_TYPE_TMP_BUFFER );
21112124 sha384 -> W = NULL ;
21122125 }
@@ -2219,7 +2232,12 @@ int wc_Sha512Copy(wc_Sha512* src, wc_Sha512* dst)
22192232
22202233 XMEMCPY (dst , src , sizeof (wc_Sha512 ));
22212234#ifdef WOLFSSL_SMALL_STACK_CACHE
2222- dst -> W = NULL ;
2235+ dst -> W = (word64 * )XMALLOC ((sizeof (word64 ) * 16 ) + WC_SHA512_BLOCK_SIZE ,
2236+ dst -> heap , DYNAMIC_TYPE_DIGEST );
2237+ if (dst -> W == NULL ) {
2238+ XMEMSET (dst , 0 , sizeof (wc_Sha512 ));
2239+ return MEMORY_E ;
2240+ }
22232241#endif
22242242
22252243#if defined(WOLFSSL_SILABS_SE_ACCEL ) && defined(WOLFSSL_SILABS_SE_ACCEL_3 ) && \
@@ -2649,7 +2667,12 @@ int wc_Sha384Copy(wc_Sha384* src, wc_Sha384* dst)
26492667 XMEMCPY (dst , src , sizeof (wc_Sha384 ));
26502668
26512669#ifdef WOLFSSL_SMALL_STACK_CACHE
2652- dst -> W = NULL ;
2670+ dst -> W = (word64 * )XMALLOC ((sizeof (word64 ) * 16 ) + WC_SHA384_BLOCK_SIZE ,
2671+ dst -> heap , DYNAMIC_TYPE_DIGEST );
2672+ if (dst -> W == NULL ) {
2673+ XMEMSET (dst , 0 , sizeof (wc_Sha384 ));
2674+ return MEMORY_E ;
2675+ }
26532676#endif
26542677
26552678#if defined(WOLFSSL_SILABS_SE_ACCEL ) && defined(WOLFSSL_SILABS_SE_ACCEL_3 ) && \
0 commit comments