Skip to content

Commit

Permalink
Merge pull request #8350 from embhorn/zd19220
Browse files Browse the repository at this point in the history
Check r and s len before copying
  • Loading branch information
dgarske authored Jan 21, 2025
2 parents a4c5861 + 9c4ef7c commit 5df6989
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
9 changes: 9 additions & 0 deletions tests/api.c
Original file line number Diff line number Diff line change
Expand Up @@ -26492,6 +26492,9 @@ static int test_wc_ecc_rs_to_sig(void)
byte s[KEY24];
word32 rlen = (word32)sizeof(r);
word32 slen = (word32)sizeof(s);
#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
word32 zeroLen = 0;
#endif

/* Init stack variables. */
XMEMSET(sig, 0, ECC_MAX_SIG_SIZE);
Expand All @@ -26517,6 +26520,12 @@ static int test_wc_ecc_rs_to_sig(void)
WC_NO_ERR_TRACE(ECC_BAD_ARG_E));
ExpectIntEQ(wc_ecc_sig_to_rs(sig, siglen, r, &rlen, s, NULL),
WC_NO_ERR_TRACE(ECC_BAD_ARG_E));
#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
ExpectIntEQ(wc_ecc_sig_to_rs(sig, siglen, r, &zeroLen, s, &slen),
WC_NO_ERR_TRACE(BUFFER_E));
ExpectIntEQ(wc_ecc_sig_to_rs(sig, siglen, r, &rlen, s, &zeroLen),
WC_NO_ERR_TRACE(BUFFER_E));
#endif
#endif
return EXPECT_RESULT();
} /* END test_wc_ecc_rs_to_sig */
Expand Down
22 changes: 17 additions & 5 deletions wolfcrypt/src/asn.c
Original file line number Diff line number Diff line change
Expand Up @@ -1300,7 +1300,7 @@ static int GetASN_StoreData(const ASNItem* asn, ASNGetData* data,
WOLFSSL_MSG_VSNPRINTF("Buffer too small for data: %d %d", len,
*data->data.buffer.length);
#endif
return ASN_PARSE_E;
return BUFFER_E;
}
/* Copy in data and record actual length seen. */
XMEMCPY(data->data.buffer.data, input + idx, (size_t)len);
Expand Down Expand Up @@ -33786,17 +33786,29 @@ int DecodeECC_DSA_Sig_Bin(const byte* sig, word32 sigLen, byte* r, word32* rLen,
ret = GetASNInt(sig, &idx, &len, sigLen);
if (ret != 0)
return ret;
if (rLen)
*rLen = (word32)len;
if (rLen) {
if (*rLen >= (word32)len)
*rLen = (word32)len;
else {
/* Buffer too small to hold r value */
return BUFFER_E;
}
}
if (r)
XMEMCPY(r, (byte*)sig + idx, (size_t)len);
idx += (word32)len;

ret = GetASNInt(sig, &idx, &len, sigLen);
if (ret != 0)
return ret;
if (sLen)
*sLen = (word32)len;
if (sLen) {
if (*sLen >= (word32)len)
*sLen = (word32)len;
else {
/* Buffer too small to hold s value */
return BUFFER_E;
}
}
if (s)
XMEMCPY(s, (byte*)sig + idx, (size_t)len);

Expand Down

0 comments on commit 5df6989

Please sign in to comment.