@@ -7497,7 +7497,7 @@ int SendKexDhReply(WOLFSSH* ssh)
74977497#ifdef WOLFSSH_SMALL_STACK
74987498 r_ptr = (byte * )WMALLOC (rSz , heap , DYNTYPE_BUFFER );
74997499 s_ptr = (byte * )WMALLOC (sSz , heap , DYNTYPE_BUFFER );
7500- if (r_ptr == NULL || r_ptr == NULL )
7500+ if (r_ptr == NULL || s_ptr == NULL )
75017501 ret = WS_MEMORY_E ;
75027502#else
75037503 byte r_s [MAX_ECC_BYTES + ECC_MAX_PAD_SZ ];
@@ -8635,10 +8635,26 @@ static int BuildUserAuthRequestEcc(WOLFSSH* ssh,
86358635 word32 begin ;
86368636 enum wc_HashType hashId = WC_HASH_TYPE_SHA ;
86378637 int ret = WS_SUCCESS ;
8638- byte * r ;
8639- byte * s ;
8640- byte sig [139 ]; /* wc_ecc_sig_size() for a prime521 key. */
8641- word32 sigSz = sizeof (sig ), rSz , sSz ;
8638+ byte * r_ptr ;
8639+ byte * s_ptr ;
8640+ byte * sig_ptr ;
8641+ word32 rSz = ECC_MAX_SIG_SIZE / 2 ;
8642+ word32 sSz = ECC_MAX_SIG_SIZE / 2 ;
8643+ word32 sigSz = ECC_MAX_SIG_SIZE ;
8644+ #ifdef WOLFSSH_SMALL_STACK
8645+ r_ptr = (byte * )WMALLOC (rSz , heap , DYNTYPE_BUFFER );
8646+ s_ptr = (byte * )WMALLOC (sSz , heap , DYNTYPE_BUFFER );
8647+ sig_ptr = (byte * )WMALLOC (sigSz , heap , DYNTYPE_BUFFER );
8648+ if (r_ptr == NULL || s_ptr == NULL || sig_ptr == NULL )
8649+ ret = WS_MEMORY_E ;
8650+ #else
8651+ byte r_s [ECC_MAX_SIG_SIZE / 2 ];
8652+ byte s_s [ECC_MAX_SIG_SIZE / 2 ];
8653+ byte sig_s [ECC_MAX_SIG_SIZE ];
8654+ r_ptr = r_s ;
8655+ s_ptr = s_s ;
8656+ sig_ptr = sig_s ;
8657+ #endif
86428658 byte * checkData = NULL ;
86438659 word32 checkDataSz = 0 ;
86448660
@@ -8674,13 +8690,13 @@ static int BuildUserAuthRequestEcc(WOLFSSH* ssh,
86748690 if (ssh -> agentEnabled ) {
86758691 if (ret == WS_SUCCESS )
86768692 ret = wolfSSH_AGENT_SignRequest (ssh , checkData , checkDataSz ,
8677- sig , & sigSz ,
8693+ sig_ptr , & sigSz ,
86788694 authData -> sf .publicKey .publicKey ,
86798695 authData -> sf .publicKey .publicKeySz , 0 );
86808696 if (ret == WS_SUCCESS ) {
86818697 c32toa (sigSz , output + begin );
86828698 begin += LENGTH_SZ ;
8683- XMEMCPY (output + begin , sig , sigSz );
8699+ XMEMCPY (output + begin , sig_ptr , sigSz );
86848700 begin += sigSz ;
86858701 }
86868702 }
@@ -8695,7 +8711,7 @@ static int BuildUserAuthRequestEcc(WOLFSSH* ssh,
86958711 if (ret == WS_SUCCESS )
86968712 ret = wc_HashFinal (& hash , hashId , digest );
86978713 if (ret == WS_SUCCESS )
8698- ret = wc_ecc_sign_hash (digest , digestSz , sig , & sigSz ,
8714+ ret = wc_ecc_sign_hash (digest , digestSz , sig_ptr , & sigSz ,
86998715 ssh -> rng , & keySig -> ks .ecc .key );
87008716 if (ret != WS_SUCCESS ) {
87018717 WLOG (WS_LOG_DEBUG , "SUAR: Bad ECC Sign" );
@@ -8704,19 +8720,16 @@ static int BuildUserAuthRequestEcc(WOLFSSH* ssh,
87048720 }
87058721
87068722 if (ret == WS_SUCCESS ) {
8707- rSz = sSz = sizeof (sig ) / 2 ;
8708- r = sig ;
8709- s = sig + rSz ;
8710- ret = wc_ecc_sig_to_rs (sig , sigSz , r , & rSz , s , & sSz );
8723+ ret = wc_ecc_sig_to_rs (sig_ptr , sigSz , r_ptr , & rSz , s_ptr , & sSz );
87118724 }
87128725
87138726 if (ret == WS_SUCCESS ) {
87148727 byte rPad ;
87158728 byte sPad ;
87168729
87178730 /* adds a byte of padding if needed to avoid negative values */
8718- rPad = (r [0 ] & 0x80 ) ? 1 : 0 ;
8719- sPad = (s [0 ] & 0x80 ) ? 1 : 0 ;
8731+ rPad = (r_ptr [0 ] & 0x80 ) ? 1 : 0 ;
8732+ sPad = (s_ptr [0 ] & 0x80 ) ? 1 : 0 ;
87208733 c32toa (rSz + rPad + sSz + sPad +
87218734 cannedKeyAlgoEcc256NamesSz + LENGTH_SZ * 4 ,
87228735 output + begin );
@@ -8738,7 +8751,7 @@ static int BuildUserAuthRequestEcc(WOLFSSH* ssh,
87388751 if (rPad )
87398752 output [begin ++ ] = 0 ;
87408753
8741- WMEMCPY (output + begin , r , rSz );
8754+ WMEMCPY (output + begin , r_ptr , rSz );
87428755 begin += rSz ;
87438756
87448757 c32toa (sSz + sPad , output + begin );
@@ -8747,7 +8760,7 @@ static int BuildUserAuthRequestEcc(WOLFSSH* ssh,
87478760 if (sPad )
87488761 output [begin ++ ] = 0 ;
87498762
8750- WMEMCPY (output + begin , s , sSz );
8763+ WMEMCPY (output + begin , s_ptr , sSz );
87518764 begin += sSz ;
87528765 }
87538766 }
@@ -8760,6 +8773,14 @@ static int BuildUserAuthRequestEcc(WOLFSSH* ssh,
87608773 WFREE (checkData , ssh -> ctx -> heap , DYNTYPE_TEMP );
87618774 }
87628775
8776+ #ifdef WOLFSSH_SMALL_STACK
8777+ if (r_ptr )
8778+ WFREE (r_ptr , heap , DYNTYPE_BUFFER );
8779+ if (s_ptr )
8780+ WFREE (s_ptr , heap , DYNTYPE_BUFFER );
8781+ if (sig_ptr )
8782+ WFREE (sig_ptr , heap , DYNTYPE_BUFFER );
8783+ #endif
87638784 return ret ;
87648785}
87658786#endif
0 commit comments