@@ -124,9 +124,10 @@ static void wc_xmss_digest_free(XmssState* state)
124124 * @return Other negative when digest algorithm initialization failed.
125125 */
126126static WC_INLINE int wc_xmss_state_init (XmssState * state ,
127- const XmssParams * params )
127+ const XmssParams * params , void * heap )
128128{
129129 state -> params = params ;
130+ state -> heap = heap ;
130131 state -> ret = 0 ;
131132 return wc_xmss_digest_init (state );
132133}
@@ -681,7 +682,7 @@ static int wc_xmsskey_alloc_sk(XmssKey* key)
681682 }
682683 if (ret == 0 ) {
683684 /* Allocate a buffer to hold secret key. */
684- key -> sk = (unsigned char * )XMALLOC (key -> sk_len , NULL ,
685+ key -> sk = (unsigned char * )XMALLOC (key -> sk_len , key -> heap ,
685686 DYNAMIC_TYPE_TMP_BUFFER );
686687 if (key -> sk == NULL ) {
687688 WOLFSSL_MSG ("error: malloc XMSS key->sk failed" );
@@ -733,12 +734,12 @@ static WC_INLINE int wc_xmsskey_signupdate(XmssKey* key, byte* sig,
733734 if (ret == 0 ) {
734735 WC_DECLARE_VAR (state , XmssState , 1 , 0 );
735736
736- WC_ALLOC_VAR_EX (state , XmssState , 1 , NULL , DYNAMIC_TYPE_TMP_BUFFER ,
737- ret = MEMORY_E );
737+ WC_ALLOC_VAR_EX (state , XmssState , 1 , key -> heap ,
738+ DYNAMIC_TYPE_TMP_BUFFER , ret = MEMORY_E );
738739 if (WC_VAR_OK (state ))
739740 {
740741 /* Initialize state for use in signing. */
741- ret = wc_xmss_state_init (state , key -> params );
742+ ret = wc_xmss_state_init (state , key -> params , key -> heap );
742743 if (ret == 0 ) {
743744 /* Read was good. Now sign and update the secret key in memory.
744745 */
@@ -766,7 +767,7 @@ static WC_INLINE int wc_xmsskey_signupdate(XmssKey* key, byte* sig,
766767 /* Free state after use. */
767768 wc_xmss_state_free (state );
768769 }
769- WC_FREE_VAR_EX (state , NULL , DYNAMIC_TYPE_TMP_BUFFER );
770+ WC_FREE_VAR_EX (state , key -> heap , DYNAMIC_TYPE_TMP_BUFFER );
770771 }
771772 }
772773
@@ -814,7 +815,6 @@ int wc_XmssKey_Init(XmssKey* key, void* heap, int devId)
814815{
815816 int ret = 0 ;
816817
817- (void ) heap ;
818818 (void ) devId ;
819819
820820 /* Validate parameters. */
@@ -825,6 +825,7 @@ int wc_XmssKey_Init(XmssKey* key, void* heap, int devId)
825825 if (ret == 0 ) {
826826 /* Zeroize key and set state to initialized. */
827827 ForceZero (key , sizeof (XmssKey ));
828+ key -> heap = heap ;
828829 key -> state = WC_XMSS_STATE_INITED ;
829830 }
830831
@@ -906,7 +907,7 @@ void wc_XmssKey_Free(XmssKey* key)
906907 if (key -> sk != NULL ) {
907908 /* Zeroize private key. */
908909 ForceZero (key -> sk , key -> sk_len );
909- XFREE (key -> sk , NULL , DYNAMIC_TYPE_TMP_BUFFER );
910+ XFREE (key -> sk , key -> heap , DYNAMIC_TYPE_TMP_BUFFER );
910911 key -> sk = NULL ;
911912 key -> sk_len = 0 ;
912913 }
@@ -1078,7 +1079,7 @@ int wc_XmssKey_MakeKey(XmssKey* key, WC_RNG* rng)
10781079 }
10791080#ifdef WOLFSSL_SMALL_STACK
10801081 if (ret == 0 ) {
1081- seed = (unsigned char * )XMALLOC (3 * key -> params -> n , NULL ,
1082+ seed = (unsigned char * )XMALLOC (3 * key -> params -> n , key -> heap ,
10821083 DYNAMIC_TYPE_TMP_BUFFER );
10831084 if (seed == NULL ) {
10841085 ret = MEMORY_E ;
@@ -1094,12 +1095,12 @@ int wc_XmssKey_MakeKey(XmssKey* key, WC_RNG* rng)
10941095 if (ret == 0 ) {
10951096 WC_DECLARE_VAR (state , XmssState , 1 , 0 );
10961097
1097- WC_ALLOC_VAR_EX (state , XmssState , 1 , NULL , DYNAMIC_TYPE_TMP_BUFFER ,
1098- ret = MEMORY_E );
1098+ WC_ALLOC_VAR_EX (state , XmssState , 1 , key -> heap ,
1099+ DYNAMIC_TYPE_TMP_BUFFER , ret = MEMORY_E );
10991100 if (WC_VAR_OK (state ))
11001101 {
11011102 /* Initialize state for use in key generation. */
1102- ret = wc_xmss_state_init (state , key -> params );
1103+ ret = wc_xmss_state_init (state , key -> params , key -> heap );
11031104 if (ret == 0 ) {
11041105 /* Finally make the private/public key pair. Immediately write
11051106 * it to NV storage and then clear from memory. */
@@ -1120,7 +1121,7 @@ int wc_XmssKey_MakeKey(XmssKey* key, WC_RNG* rng)
11201121 /* Free state after use. */
11211122 wc_xmss_state_free (state );
11221123 }
1123- WC_FREE_VAR_EX (state , NULL , DYNAMIC_TYPE_TMP_BUFFER );
1124+ WC_FREE_VAR_EX (state , key -> heap , DYNAMIC_TYPE_TMP_BUFFER );
11241125 }
11251126 }
11261127
@@ -1141,7 +1142,7 @@ int wc_XmssKey_MakeKey(XmssKey* key, WC_RNG* rng)
11411142 key -> state = WC_XMSS_STATE_OK ;
11421143 }
11431144
1144- WC_FREE_VAR_EX (seed , NULL , DYNAMIC_TYPE_TMP_BUFFER );
1145+ WC_FREE_VAR_EX (seed , key -> heap , DYNAMIC_TYPE_TMP_BUFFER );
11451146 return ret ;
11461147}
11471148
@@ -1618,19 +1619,19 @@ int wc_XmssKey_Verify(XmssKey* key, const byte* sig, word32 sigLen,
16181619 if (ret == 0 ) {
16191620 WC_DECLARE_VAR (state , XmssState , 1 , 0 );
16201621
1621- WC_ALLOC_VAR_EX (state , XmssState , 1 , NULL , DYNAMIC_TYPE_TMP_BUFFER ,
1622- ret = MEMORY_E );
1622+ WC_ALLOC_VAR_EX (state , XmssState , 1 , key -> heap ,
1623+ DYNAMIC_TYPE_TMP_BUFFER , ret = MEMORY_E );
16231624 if (WC_VAR_OK (state ))
16241625 {
16251626 /* Initialize state for use in verification. */
1626- ret = wc_xmss_state_init (state , key -> params );
1627+ ret = wc_xmss_state_init (state , key -> params , key -> heap );
16271628 if (ret == 0 ) {
16281629 /* Verify using either XMSS^MT function as it works for both. */
16291630 ret = wc_xmssmt_verify (state , m , mLen , sig , key -> pk );
16301631 /* Free state after use. */
16311632 wc_xmss_state_free (state );
16321633 }
1633- WC_FREE_VAR_EX (state , NULL , DYNAMIC_TYPE_TMP_BUFFER );
1634+ WC_FREE_VAR_EX (state , key -> heap , DYNAMIC_TYPE_TMP_BUFFER );
16341635 }
16351636 }
16361637
0 commit comments