Skip to content

Commit 7a3a8d4

Browse files
Fix r/s in BuildUserAuthRequestEcc and refactor function for small stack support.
1 parent 578f3c9 commit 7a3a8d4

1 file changed

Lines changed: 37 additions & 16 deletions

File tree

src/internal.c

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)