fixes for issues introduced in #5384:

added numerous missing _SMALL_STACK code paths (PK objects on the stack);

in settings.h, enable WOLFSSL_SMALL_STACK_STATIC by default when WOLFSSL_SMALL_STACK is defined (NO_WOLFSSL_SMALL_STACK_STATIC to override);

fixes for unsafe strcat()s in tests/quic.c;

fix for unsafe macro WOLFSSL_IS_QUIC();

fix to exclude quic from enable-all when enable-linuxkm (quic needs opensslextra, and opensslextra currently only works in-kernel in cryptonly builds);

fix for signed/unsigned clash in wolfSSL_quic_receive().
pull/5449/head
Daniel Pouzzner 2022-08-09 18:39:49 -05:00
parent b46693f8c8
commit f771181e1a
13 changed files with 543 additions and 232 deletions

View File

@ -664,7 +664,6 @@ then
test "$enable_tls13" = "" && enable_tls13=yes
test "$enable_rsapss" = "" && enable_rsapss=yes
fi
test "$enable_quic" = "" && enable_quic=yes
# this set is also enabled by enable-all-crypto:
test "$enable_atomicuser" = "" && enable_atomicuser=yes
@ -744,6 +743,7 @@ then
if test "$ENABLED_LINUXKM_DEFAULTS" != "yes"
then
test "$enable_compkey" = "" && enable_compkey=yes
test "$enable_quic" = "" && enable_quic=yes
AM_CFLAGS="$AM_CFLAGS -DHAVE_CRL_IO -DHAVE_IO_TIMEOUT"
fi

View File

@ -25903,33 +25903,48 @@ static int HashSkeData(WOLFSSL* ssl, enum wc_HashType hashType,
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
{
WOLFSSL_X509_NAME* name = NULL;
/* Use a DecodedCert struct to get access to GetName to
* parse DN name */
DecodedCert cert;
WOLFSSL_X509_NAME* name;
#ifdef WOLFSSL_SMALL_STACK
DecodedCert *cert = (DecodedCert *)XMALLOC(
sizeof(*cert), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
if (cert == NULL)
return MEMORY_ERROR;
#else
DecodedCert cert[1];
#endif
InitDecodedCert(&cert, input + *inOutIdx, dnSz, ssl->heap);
InitDecodedCert(cert, input + *inOutIdx, dnSz, ssl->heap);
if ((ret = GetName(&cert, SUBJECT, dnSz)) != 0) {
FreeDecodedCert(&cert);
do {
if ((ret = GetName(cert, SUBJECT, dnSz)) != 0) {
break;
}
if ((name = wolfSSL_X509_NAME_new()) == NULL) {
ret = MEMORY_ERROR;
break;
}
CopyDecodedName(name, cert, SUBJECT);
if (wolfSSL_sk_X509_NAME_push(ssl->ca_names, name)
== WOLFSSL_FAILURE)
{
ret = MEMORY_ERROR;
break;
}
} while (0);
FreeDecodedCert(cert);
#ifdef WOLFSSL_SMALL_STACK
XFREE(cert, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
if (ret != 0) {
if (name != NULL)
wolfSSL_X509_NAME_free(name);
return ret;
}
if ((name = wolfSSL_X509_NAME_new()) == NULL) {
FreeDecodedCert(&cert);
return MEMORY_ERROR;
}
CopyDecodedName(name, &cert, SUBJECT);
if (wolfSSL_sk_X509_NAME_push(ssl->ca_names, name)
== WOLFSSL_FAILURE) {
FreeDecodedCert(&cert);
wolfSSL_X509_NAME_free(name);
return MEMORY_ERROR;
}
FreeDecodedCert(&cert);
}
#endif

View File

@ -593,12 +593,19 @@ WOLFSSL_OCSP_CERTID* wolfSSL_OCSP_cert_to_id(
const WOLFSSL_EVP_MD *dgst, const WOLFSSL_X509 *subject,
const WOLFSSL_X509 *issuer)
{
WOLFSSL_OCSP_CERTID* certId;
CertStatus* certStatus;
DecodedCert cert;
WOLFSSL_CERT_MANAGER* cm;
int ret;
WOLFSSL_OCSP_CERTID* certId = NULL;
CertStatus* certStatus = NULL;
WOLFSSL_CERT_MANAGER* cm = NULL;
int ret = -1;
DerBuffer* derCert = NULL;
#ifdef WOLFSSL_SMALL_STACK
DecodedCert *cert = (DecodedCert *)XMALLOC(sizeof(*cert), NULL,
DYNAMIC_TYPE_TMP_BUFFER);
if (cert == NULL)
return NULL;
#else
DecodedCert cert[1];
#endif
(void)dgst;
@ -606,7 +613,7 @@ WOLFSSL_OCSP_CERTID* wolfSSL_OCSP_cert_to_id(
if (cm == NULL
|| subject == NULL || subject->derCert == NULL
|| issuer == NULL || issuer->derCert == NULL)
return NULL;
goto out;
ret = AllocDer(&derCert, issuer->derCert->length,
issuer->derCert->type, NULL);
@ -616,50 +623,60 @@ WOLFSSL_OCSP_CERTID* wolfSSL_OCSP_cert_to_id(
issuer->derCert->length);
ret = AddCA(cm, &derCert, WOLFSSL_USER_CA, 1);
if (ret != WOLFSSL_SUCCESS) {
wolfSSL_CertManagerFree(cm);
return NULL;
goto out;
}
}
ret = -1;
certId = (WOLFSSL_OCSP_CERTID*)XMALLOC(sizeof(WOLFSSL_OCSP_CERTID), NULL,
DYNAMIC_TYPE_OPENSSL);
if (certId == NULL)
goto out;
certStatus = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL,
DYNAMIC_TYPE_OPENSSL);
if (certStatus == NULL)
goto out;
if (certId == NULL || certStatus == NULL) {
if (certId)
XMEMSET(certId, 0, sizeof(WOLFSSL_OCSP_CERTID));
XMEMSET(certStatus, 0, sizeof(CertStatus));
certId->status = certStatus;
certId->ownStatus = 1;
InitDecodedCert(cert, subject->derCert->buffer,
subject->derCert->length, NULL);
if (ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm) != 0) {
goto out;
}
else {
XMEMCPY(certId->issuerHash, cert->issuerHash, OCSP_DIGEST_SIZE);
XMEMCPY(certId->issuerKeyHash, cert->issuerKeyHash, OCSP_DIGEST_SIZE);
XMEMCPY(certId->status->serial, cert->serial, cert->serialSz);
certId->status->serialSz = cert->serialSz;
FreeDecodedCert(cert);
}
ret = 0;
out:
if (cm != NULL)
wolfSSL_CertManagerFree(cm);
#ifdef WOLFSSL_SMALL_STACK
XFREE(cert, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif
if (ret != 0) {
if (certId != NULL)
XFREE(certId, NULL, DYNAMIC_TYPE_OPENSSL);
if (certStatus)
XFREE(certStatus, NULL, DYNAMIC_TYPE_OPENSSL);
certId = NULL;
}
if (certId != NULL) {
XMEMSET(certId, 0, sizeof(WOLFSSL_OCSP_CERTID));
XMEMSET(certStatus, 0, sizeof(CertStatus));
certId->status = certStatus;
certId->ownStatus = 1;
InitDecodedCert(&cert, subject->derCert->buffer,
subject->derCert->length, NULL);
if (ParseCertRelative(&cert, CERT_TYPE, VERIFY_OCSP, cm) != 0) {
XFREE(certId, NULL, DYNAMIC_TYPE_OPENSSL);
certId = NULL;
}
else {
XMEMCPY(certId->issuerHash, cert.issuerHash, OCSP_DIGEST_SIZE);
XMEMCPY(certId->issuerKeyHash, cert.issuerKeyHash, OCSP_DIGEST_SIZE);
XMEMCPY(certId->status->serial, cert.serial, cert.serialSz);
certId->status->serialSz = cert.serialSz;
}
FreeDecodedCert(&cert);
}
wolfSSL_CertManagerFree(cm);
return certId;
return NULL;
} else
return certId;
}
void wolfSSL_OCSP_BASICRESP_free(WOLFSSL_OCSP_BASICRESP* basicResponse)
@ -672,23 +689,41 @@ void wolfSSL_OCSP_BASICRESP_free(WOLFSSL_OCSP_BASICRESP* basicResponse)
int wolfSSL_OCSP_basic_verify(WOLFSSL_OCSP_BASICRESP *bs,
WOLF_STACK_OF(WOLFSSL_X509) *certs, WOLFSSL_X509_STORE *st, unsigned long flags)
{
DecodedCert cert;
int ret = WOLFSSL_SUCCESS;
int ret;
#ifdef WOLFSSL_SMALL_STACK
DecodedCert *cert = (DecodedCert *)XMALLOC(sizeof(*cert), NULL,
DYNAMIC_TYPE_TMP_BUFFER);
if (cert == NULL)
return WOLFSSL_FAILURE;
#else
DecodedCert cert[1];
#endif
(void)certs;
if (flags & OCSP_NOVERIFY)
return WOLFSSL_SUCCESS;
if (flags & OCSP_NOVERIFY) {
ret = WOLFSSL_SUCCESS;
goto out;
}
#ifdef OPENSSL_EXTRA
if (bs->verifyError != OCSP_VERIFY_ERROR_NONE)
return WOLFSSL_FAILURE;
if (bs->verifyError != OCSP_VERIFY_ERROR_NONE) {
ret = WOLFSSL_FAILURE;
goto out;
}
#endif
InitDecodedCert(&cert, bs->cert, bs->certSz, NULL);
if (ParseCertRelative(&cert, CERT_TYPE, VERIFY, st->cm) < 0)
ret = WOLFSSL_SUCCESS;
InitDecodedCert(cert, bs->cert, bs->certSz, NULL);
if (ParseCertRelative(cert, CERT_TYPE, VERIFY, st->cm) < 0)
ret = WOLFSSL_FAILURE;
FreeDecodedCert(&cert);
FreeDecodedCert(cert);
out:
#ifdef WOLFSSL_SMALL_STACK
XFREE(cert, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return ret;
}

View File

@ -4106,8 +4106,17 @@ int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
{
int ret = 1;
int err;
mp_int tmp;
mp_int* t = NULL;
#ifdef WOLFSSL_SMALL_STACK
mp_int *tmp = (mp_int *)XMALLOC(sizeof(*tmp), rsa->heap,
DYNAMIC_TYPE_TMP_BUFFER);
if (tmp == NULL) {
WOLFSSL_MSG("out of memory");
return -1;
}
#else
mp_int tmp[1];
#endif
WOLFSSL_ENTER("wolfSSL_RsaGenAdd");
@ -4120,17 +4129,17 @@ int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
if (ret == 1) {
/* Initialize temp MP integer. */
if (mp_init(&tmp) != MP_OKAY) {
if (mp_init(tmp) != MP_OKAY) {
WOLFSSL_MSG("mp_init error");
ret = -1;
}
}
if (ret == 1) {
t = &tmp;
t = tmp;
/* Sub 1 from p into temp. */
err = mp_sub_d((mp_int*)rsa->p->internal, 1, &tmp);
err = mp_sub_d((mp_int*)rsa->p->internal, 1, tmp);
if (err != MP_OKAY) {
WOLFSSL_MSG("mp_sub_d error");
ret = -1;
@ -4138,7 +4147,7 @@ int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
}
if (ret == 1) {
/* Calculate d mod (p - 1) into dmp1 MP integer of BN. */
err = mp_mod((mp_int*)rsa->d->internal, &tmp,
err = mp_mod((mp_int*)rsa->d->internal, tmp,
(mp_int*)rsa->dmp1->internal);
if (err != MP_OKAY) {
WOLFSSL_MSG("mp_mod error");
@ -4147,7 +4156,7 @@ int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
}
if (ret == 1) {
/* Sub 1 from q into temp. */
err = mp_sub_d((mp_int*)rsa->q->internal, 1, &tmp);
err = mp_sub_d((mp_int*)rsa->q->internal, 1, tmp);
if (err != MP_OKAY) {
WOLFSSL_MSG("mp_sub_d error");
ret = -1;
@ -4155,7 +4164,7 @@ int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
}
if (ret == 1) {
/* Calculate d mod (q - 1) into dmq1 MP integer of BN. */
err = mp_mod((mp_int*)rsa->d->internal, &tmp,
err = mp_mod((mp_int*)rsa->d->internal, tmp,
(mp_int*)rsa->dmq1->internal);
if (err != MP_OKAY) {
WOLFSSL_MSG("mp_mod error");
@ -4165,6 +4174,10 @@ int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
mp_clear(t);
#ifdef WOLFSSL_SMALL_STACK
XFREE(tmp, rsa->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return ret;
}
@ -6789,7 +6802,7 @@ WOLFSSL_BIGNUM* wolfSSL_DH_6144_prime(WOLFSSL_BIGNUM* bn)
*/
WOLFSSL_BIGNUM* wolfSSL_DH_8192_prime(WOLFSSL_BIGNUM* bn)
{
const char prm[] = {
static const char prm[] = {
"FFFFFFFFFFFFFFFFC90FDAA22168C234"
"C4C6628B80DC1CD129024E088A67CC74"
"020BBEA63B139B22514A08798E3404DD"
@ -9100,23 +9113,39 @@ int NIDToEccEnum(int n)
int wolfSSL_EC_GROUP_order_bits(const WOLFSSL_EC_GROUP *group)
{
int ret;
mp_int order;
int ret = 0;
#ifdef WOLFSSL_SMALL_STACK
mp_int *order = (mp_int *)XMALLOC(sizeof(*order), NULL,
DYNAMIC_TYPE_TMP_BUFFER);
if (order == NULL)
return 0;
#else
mp_int order[1];
#endif
if (group == NULL || group->curve_idx < 0) {
WOLFSSL_MSG("wolfSSL_EC_GROUP_order_bits NULL error");
return 0;
ret = -1;
}
ret = mp_init(&order);
if (ret == 0)
ret = mp_init(order);
if (ret == 0) {
ret = mp_read_radix(&order, ecc_sets[group->curve_idx].order,
ret = mp_read_radix(order, ecc_sets[group->curve_idx].order,
MP_RADIX_HEX);
if (ret == 0)
ret = mp_count_bits(&order);
mp_clear(&order);
ret = mp_count_bits(order);
mp_clear(order);
}
#ifdef WOLFSSL_SMALL_STACK
XFREE(order, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif
if (ret == -1)
ret = 0;
return ret;
}
#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */

View File

@ -692,7 +692,8 @@ cleanup:
/* Called internally when SSL wants a certain amount of input. */
int wolfSSL_quic_receive(WOLFSSL* ssl, byte* buf, word32 sz)
{
word32 n, transferred = 0;
word32 n = 0;
int transferred = 0;
WOLFSSL_ENTER("wolfSSL_quic_receive");
while (sz > 0) {
@ -975,14 +976,29 @@ const WOLFSSL_EVP_CIPHER* wolfSSL_quic_get_hp(WOLFSSL* ssl)
size_t wolfSSL_quic_get_aead_tag_len(const WOLFSSL_EVP_CIPHER* aead_cipher)
{
WOLFSSL_EVP_CIPHER_CTX ctx;
XMEMSET(&ctx, 0, sizeof(ctx));
if (wolfSSL_EVP_CipherInit(&ctx, aead_cipher, NULL, NULL, 0)
!= WOLFSSL_SUCCESS) {
size_t ret;
#ifdef WOLFSSL_SMALL_STACK
WOLFSSL_EVP_CIPHER_CTX *ctx = (WOLFSSL_EVP_CIPHER_CTX *)XMALLOC(
sizeof(*ctx), NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (ctx == NULL)
return 0;
#else
WOLFSSL_EVP_CIPHER_CTX ctx[1];
#endif
XMEMSET(ctx, 0, sizeof(*ctx));
if (wolfSSL_EVP_CipherInit(ctx, aead_cipher, NULL, NULL, 0)
== WOLFSSL_SUCCESS) {
ret = ctx->authTagSz;
} else {
ret = 0;
}
return ctx.authTagSz;
#ifdef WOLFSSL_SMALL_STACK
XFREE(ctx, NULL, DYNAMIC_TYPE_TMP_BUF);
#endif
return ret;
}
int wolfSSL_quic_aead_is_gcm(const WOLFSSL_EVP_CIPHER* aead_cipher)

126
src/ssl.c
View File

@ -32965,7 +32965,11 @@ static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
int encTicketLen, int* encLen, void* ctx)
{
byte digest[WC_MAX_DIGEST_SIZE];
WOLFSSL_EVP_CIPHER_CTX evpCtx;
#ifdef WOLFSSL_SMALL_STACK
WOLFSSL_EVP_CIPHER_CTX *evpCtx;
#else
WOLFSSL_EVP_CIPHER_CTX evpCtx[1];
#endif
WOLFSSL_HMAC_CTX hmacCtx;
unsigned int mdSz = 0;
int len = 0;
@ -32981,14 +32985,26 @@ static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
return WOLFSSL_TICKET_RET_FATAL;
}
#ifdef WOLFSSL_SMALL_STACK
evpCtx = (WOLFSSL_EVP_CIPHER_CTX *)XMALLOC(sizeof(*evpCtx), ssl->heap,
DYNAMIC_TYPE_TMP_BUFFER);
if (evpCtx == NULL) {
WOLFSSL_MSG("out of memory");
return WOLFSSL_TICKET_RET_FATAL;
}
#endif
/* Initialize the cipher and HMAC. */
wolfSSL_EVP_CIPHER_CTX_init(&evpCtx);
wolfSSL_EVP_CIPHER_CTX_init(evpCtx);
if (wolfSSL_HMAC_CTX_Init(&hmacCtx) != WOLFSSL_SUCCESS) {
WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init error");
#ifdef WOLFSSL_SMALL_STACK
XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return WOLFSSL_TICKET_RET_FATAL;
}
res = ssl->ctx->ticketEncWrapCb(ssl, keyName,
iv, &evpCtx, &hmacCtx, enc);
iv, evpCtx, &hmacCtx, enc);
if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) {
WOLFSSL_MSG("Ticket callback error");
ret = WOLFSSL_TICKET_RET_FATAL;
@ -32998,11 +33014,11 @@ static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
if (enc)
{
/* Encrypt in place. */
if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
if (!wolfSSL_EVP_CipherUpdate(evpCtx, encTicket, &len,
encTicket, encTicketLen))
goto end;
encTicketLen = len;
if (!wolfSSL_EVP_EncryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
if (!wolfSSL_EVP_EncryptFinal(evpCtx, &encTicket[encTicketLen], &len))
goto end;
/* Total length of encrypted data. */
encTicketLen += len;
@ -33030,11 +33046,11 @@ static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
goto end;
/* Decrypt the ticket data in place. */
if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
if (!wolfSSL_EVP_CipherUpdate(evpCtx, encTicket, &len,
encTicket, encTicketLen))
goto end;
encTicketLen = len;
if (!wolfSSL_EVP_DecryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
if (!wolfSSL_EVP_DecryptFinal(evpCtx, &encTicket[encTicketLen], &len))
goto end;
/* Total length of decrypted data. */
*encLen = encTicketLen + len;
@ -33048,6 +33064,9 @@ static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
end:
(void)wc_HmacFree(&hmacCtx.hmac);
#ifdef WOLFSSL_SMALL_STACK
XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return ret;
}
@ -35659,9 +35678,16 @@ static int wolfSSL_BN_add_word_int(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w,
{
int ret = WOLFSSL_SUCCESS;
int rc = 0;
mp_int w_mp;
#ifdef WOLFSSL_SMALL_STACK
mp_int *w_mp = (mp_int *)XMALLOC(sizeof(*w_mp), NULL,
DYNAMIC_TYPE_TMP_BUFFER);
if (w_mp == NULL)
return WOLFSSL_FAILURE;
#else
mp_int w_mp[1];
#endif
XMEMSET(&w_mp, 0, sizeof(mp_int));
XMEMSET(w_mp, 0, sizeof(*w_mp));
if (bn == NULL || bn->internal == NULL) {
WOLFSSL_MSG("bn NULL error");
@ -35684,21 +35710,21 @@ static int wolfSSL_BN_add_word_int(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w,
}
}
else {
if (mp_init(&w_mp) != MP_OKAY) {
if (mp_init(w_mp) != MP_OKAY) {
ret = WOLFSSL_FAILURE;
}
if (ret == WOLFSSL_SUCCESS) {
if (mp_set_int(&w_mp, w) != MP_OKAY) {
if (mp_set_int(w_mp, w) != MP_OKAY) {
ret = WOLFSSL_FAILURE;
}
}
if (ret == WOLFSSL_SUCCESS) {
if (sub == 1) {
rc = mp_sub((mp_int *)bn->internal, &w_mp,
rc = mp_sub((mp_int *)bn->internal, w_mp,
(mp_int *)bn->internal);
}
else {
rc = mp_add((mp_int *)bn->internal, &w_mp,
rc = mp_add((mp_int *)bn->internal, w_mp,
(mp_int *)bn->internal);
}
if (rc != MP_OKAY) {
@ -35709,7 +35735,11 @@ static int wolfSSL_BN_add_word_int(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w,
}
}
mp_free(&w_mp);
mp_free(w_mp);
#ifdef WOLFSSL_SMALL_STACK
XFREE(w_mp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return ret;
}
@ -40455,7 +40485,6 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert,
WOLF_STACK_OF(WOLFSSL_X509)** ca)
{
DecodedCert DeCert;
void* heap = NULL;
int ret;
byte* certData = NULL;
@ -40463,6 +40492,11 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
byte* pk = NULL;
word32 pkSz;
WC_DerCertList* certList = NULL;
#ifdef WOLFSSL_SMALL_STACK
DecodedCert *DeCert;
#else
DecodedCert DeCert[1];
#endif
WOLFSSL_ENTER("wolfSSL_PKCS12_parse");
@ -40491,6 +40525,15 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
return WOLFSSL_FAILURE;
}
#ifdef WOLFSSL_SMALL_STACK
DeCert = (DecodedCert *)XMALLOC(sizeof(*DeCert), heap,
DYNAMIC_TYPE_TMP_BUFFER);
if (DeCert == NULL) {
WOLFSSL_MSG("out of memory");
return WOLFSSL_FAILURE;
}
#endif
/* Decode cert and place in X509 stack struct */
if (certList != NULL) {
WC_DerCertList* current = certList;
@ -40512,7 +40555,8 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
XFREE(current, heap, DYNAMIC_TYPE_PKCS);
current = next;
}
return WOLFSSL_FAILURE;
ret = WOLFSSL_FAILURE;
goto out;
}
XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509)));
@ -40524,16 +40568,16 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
DYNAMIC_TYPE_X509);
InitX509(x509, 1, heap);
InitDecodedCert(&DeCert, current->buffer, current->bufferSz, heap);
if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
InitDecodedCert(DeCert, current->buffer, current->bufferSz, heap);
if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
WOLFSSL_MSG("Issue with parsing certificate");
FreeDecodedCert(&DeCert);
FreeDecodedCert(DeCert);
wolfSSL_X509_free(x509);
}
else {
if (CopyDecodedToX509(x509, &DeCert) != 0) {
if (CopyDecodedToX509(x509, DeCert) != 0) {
WOLFSSL_MSG("Failed to copy decoded cert");
FreeDecodedCert(&DeCert);
FreeDecodedCert(DeCert);
wolfSSL_X509_free(x509);
wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
if (pk != NULL) {
@ -40550,9 +40594,10 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
XFREE(current, heap, DYNAMIC_TYPE_PKCS);
current = next;
}
return WOLFSSL_FAILURE;
ret = WOLFSSL_FAILURE;
goto out;
}
FreeDecodedCert(&DeCert);
FreeDecodedCert(DeCert);
if (wolfSSL_sk_X509_push(*ca, x509) != 1) {
WOLFSSL_MSG("Failed to push x509 onto stack");
@ -40573,7 +40618,8 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
XFREE(current, heap, DYNAMIC_TYPE_PKCS);
current = next;
}
return WOLFSSL_FAILURE;
ret = WOLFSSL_FAILURE;
goto out;
}
}
current = current->next;
@ -40595,16 +40641,17 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
}
XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
return WOLFSSL_FAILURE;
ret = WOLFSSL_FAILURE;
goto out;
}
InitX509(*cert, 1, heap);
InitDecodedCert(&DeCert, certData, certDataSz, heap);
if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
InitDecodedCert(DeCert, certData, certDataSz, heap);
if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
WOLFSSL_MSG("Issue with parsing certificate");
}
if (CopyDecodedToX509(*cert, &DeCert) != 0) {
if (CopyDecodedToX509(*cert, DeCert) != 0) {
WOLFSSL_MSG("Failed to copy decoded cert");
FreeDecodedCert(&DeCert);
FreeDecodedCert(DeCert);
if (pk != NULL) {
XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
}
@ -40612,9 +40659,10 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
}
wolfSSL_X509_free(*cert); *cert = NULL;
return WOLFSSL_FAILURE;
ret = WOLFSSL_FAILURE;
goto out;
}
FreeDecodedCert(&DeCert);
FreeDecodedCert(DeCert);
XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
}
@ -40629,7 +40677,8 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
}
XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
return WOLFSSL_FAILURE;
ret = WOLFSSL_FAILURE;
goto out;
}
#ifndef NO_RSA
@ -40660,7 +40709,8 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
}
wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
WOLFSSL_MSG("Bad PKCS12 key format");
return WOLFSSL_FAILURE;
ret = WOLFSSL_FAILURE;
goto out;
}
if (pkey != NULL && *pkey != NULL) {
@ -40671,7 +40721,15 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
(void)ret;
(void)ca;
return WOLFSSL_SUCCESS;
ret = WOLFSSL_SUCCESS;
out:
#ifdef WOLFSSL_SMALL_STACK
XFREE(DeCert, heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return ret;
}
int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw,

View File

@ -115,14 +115,18 @@ unsigned int wolfSSL_X509_get_extended_key_usage(WOLFSSL_X509* x509)
/* Returns the number of X509V3 extensions in X509 object, or 0 on failure */
int wolfSSL_X509_get_ext_count(const WOLFSSL_X509* passedCert)
{
int extCount = 0;
int extCount = WOLFSSL_FAILURE;
int length = 0;
int outSz = 0;
const byte* rawCert;
int sz = 0;
word32 idx = 0;
DecodedCert cert;
const byte* input;
#ifdef WOLFSSL_SMALL_STACK
DecodedCert *cert;
#else
DecodedCert cert[1];
#endif
WOLFSSL_ENTER("wolfSSL_X509_get_ext_count()");
if (passedCert == NULL) {
@ -135,26 +139,33 @@ int wolfSSL_X509_get_ext_count(const WOLFSSL_X509* passedCert)
WOLFSSL_MSG("\tpassedCert has no internal DerBuffer set.");
return WOLFSSL_FAILURE;
}
InitDecodedCert(&cert, rawCert, (word32)outSz, 0);
if (ParseCert(&cert,
#ifdef WOLFSSL_SMALL_STACK
cert = (DecodedCert *)XMALLOC(sizeof(*cert), NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (cert == NULL) {
WOLFSSL_MSG("out of memory");
return WOLFSSL_FAILURE;
}
#endif
InitDecodedCert(cert, rawCert, (word32)outSz, 0);
if (ParseCert(cert,
#ifdef WOLFSSL_CERT_REQ
passedCert->isCSR ? CERTREQ_TYPE :
#endif
CA_TYPE,
NO_VERIFY, NULL) < 0) {
WOLFSSL_MSG("\tCertificate parsing failed");
FreeDecodedCert(&cert);
return WOLFSSL_FAILURE;
goto out;
}
input = cert.extensions;
sz = cert.extensionsSz;
input = cert->extensions;
sz = cert->extensionsSz;
if (input == NULL || sz == 0) {
WOLFSSL_MSG("\tsz or input NULL error");
FreeDecodedCert(&cert);
return WOLFSSL_FAILURE;
goto out;
}
#ifdef WOLFSSL_CERT_REQ
@ -163,33 +174,37 @@ int wolfSSL_X509_get_ext_count(const WOLFSSL_X509* passedCert)
{
if (input[idx++] != ASN_EXTENSIONS) {
WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
FreeDecodedCert(&cert);
return WOLFSSL_FAILURE;
goto out;
}
if (GetLength(input, &idx, &length, sz) < 0) {
WOLFSSL_MSG("\tfail: invalid length");
FreeDecodedCert(&cert);
return WOLFSSL_FAILURE;
goto out;
}
}
if (GetSequence(input, &idx, &length, sz) < 0) {
WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
FreeDecodedCert(&cert);
return WOLFSSL_FAILURE;
goto out;
}
extCount = 0;
while (idx < (word32)sz) {
if (GetSequence(input, &idx, &length, sz) < 0) {
WOLFSSL_MSG("\tfail: should be a SEQUENCE");
FreeDecodedCert(&cert);
FreeDecodedCert(cert);
return WOLFSSL_FAILURE;
}
idx += length;
extCount++;
}
FreeDecodedCert(&cert);
out:
FreeDecodedCert(cert);
#ifdef WOLFSSL_SMALL_STACK
XFREE(cert, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return extCount;
}
@ -1709,7 +1724,11 @@ int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
const byte* rawCert;
const byte* input;
word32 oid, idx = 0, tmpIdx = 0, foundNID;
DecodedCert cert;
#ifdef WOLFSSL_SMALL_STACK
DecodedCert *cert;
#else
DecodedCert cert[1];
#endif
WOLFSSL_ENTER("wolfSSL_X509_get_ext_by_NID");
@ -1731,26 +1750,33 @@ int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
return WOLFSSL_FATAL_ERROR;
}
InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
#ifdef WOLFSSL_SMALL_STACK
cert = (DecodedCert *)XMALLOC(sizeof(*cert), x509->heap,
DYNAMIC_TYPE_TMP_BUFFER);
if (cert == NULL) {
WOLFSSL_MSG("\tout of memory");
return WOLFSSL_FATAL_ERROR;
}
#endif
if (ParseCert(&cert,
InitDecodedCert( cert, rawCert, (word32)outSz, 0);
if (ParseCert(cert,
#ifdef WOLFSSL_CERT_REQ
x509->isCSR ? CERTREQ_TYPE :
#endif
CA_TYPE,
NO_VERIFY, NULL) < 0) {
WOLFSSL_MSG("\tCertificate parsing failed");
FreeDecodedCert(&cert);
return WOLFSSL_FATAL_ERROR;
goto out;
}
input = cert.extensions;
sz = cert.extensionsSz;
input = cert->extensions;
sz = cert->extensionsSz;
if (input == NULL || sz == 0) {
WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
FreeDecodedCert(&cert);
return WOLFSSL_FATAL_ERROR;
goto out;
}
#ifdef WOLFSSL_CERT_REQ
@ -1759,21 +1785,18 @@ int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
{
if (input[idx++] != ASN_EXTENSIONS) {
WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
FreeDecodedCert(&cert);
return WOLFSSL_FATAL_ERROR;
goto out;
}
if (GetLength(input, &idx, &length, sz) < 0) {
WOLFSSL_MSG("\tfail: invalid length");
FreeDecodedCert(&cert);
return WOLFSSL_FATAL_ERROR;
goto out;
}
}
if (GetSequence(input, &idx, &length, sz) < 0) {
WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
FreeDecodedCert(&cert);
return WOLFSSL_FATAL_ERROR;
goto out;
}
while (idx < (word32)sz) {
@ -1781,16 +1804,14 @@ int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
if (GetSequence(input, &idx, &length, sz) < 0) {
WOLFSSL_MSG("\tfail: should be a SEQUENCE");
FreeDecodedCert(&cert);
return WOLFSSL_FATAL_ERROR;
goto out;
}
tmpIdx = idx;
ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
if (ret < 0) {
WOLFSSL_MSG("\tfail: OBJECT ID");
FreeDecodedCert(&cert);
return WOLFSSL_FATAL_ERROR;
goto out;
}
idx = tmpIdx;
foundNID = (word32)oid2nid(oid, oidCertExtType);
@ -1809,7 +1830,12 @@ int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
extCount++;
} /* while(idx < sz) */
FreeDecodedCert(&cert);
out:
FreeDecodedCert(cert);
#ifdef WOLFSSL_SMALL_STACK
XFREE(cert, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return found ? extCount : WOLFSSL_FATAL_ERROR;
}
@ -11807,7 +11833,11 @@ int wolfSSL_X509_check_host(WOLFSSL_X509 *x, const char *chk, size_t chklen,
unsigned int flags, char **peername)
{
int ret;
DecodedCert dCert;
#ifdef WOLFSSL_SMALL_STACK
DecodedCert *dCert;
#else
DecodedCert dCert[1];
#endif
WOLFSSL_ENTER("wolfSSL_X509_check_host");
@ -11829,15 +11859,30 @@ int wolfSSL_X509_check_host(WOLFSSL_X509 *x, const char *chk, size_t chklen,
return WOLFSSL_FAILURE;
}
InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
#ifdef WOLFSSL_SMALL_STACK
dCert = (DecodedCert *)XMALLOC(sizeof(*dCert), x->heap,
DYNAMIC_TYPE_TMP_BUFFER);
if (dCert == NULL) {
WOLFSSL_MSG("\tout of memory");
return WOLFSSL_FATAL_ERROR;
}
#endif
InitDecodedCert(dCert, x->derCert->buffer, x->derCert->length, NULL);
ret = ParseCertRelative(dCert, CERT_TYPE, 0, NULL);
if (ret != 0) {
FreeDecodedCert(&dCert);
return WOLFSSL_FAILURE;
goto out;
}
ret = CheckHostName(&dCert, (char *)chk, chklen);
FreeDecodedCert(&dCert);
ret = CheckHostName(dCert, (char *)chk, chklen);
out:
FreeDecodedCert(dCert);
#ifdef WOLFSSL_SMALL_STACK
XFREE(dCert, x->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
if (ret != 0)
return WOLFSSL_FAILURE;
return WOLFSSL_SUCCESS;
@ -11848,7 +11893,11 @@ int wolfSSL_X509_check_ip_asc(WOLFSSL_X509 *x, const char *ipasc,
unsigned int flags)
{
int ret = WOLFSSL_FAILURE;
DecodedCert dCert;
#ifdef WOLFSSL_SMALL_STACK
DecodedCert *dCert = NULL;
#else
DecodedCert dCert[1];
#endif
WOLFSSL_ENTER("wolfSSL_X509_check_ip_asc");
@ -11862,14 +11911,25 @@ int wolfSSL_X509_check_ip_asc(WOLFSSL_X509 *x, const char *ipasc,
ret = WOLFSSL_SUCCESS;
}
#ifdef WOLFSSL_SMALL_STACK
if (ret == WOLFSSL_SUCCESS) {
InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
dCert = (DecodedCert *)XMALLOC(sizeof(*dCert), x->heap,
DYNAMIC_TYPE_TMP_BUFFER);
if (dCert == NULL) {
WOLFSSL_MSG("\tout of memory");
ret = WOLFSSL_FAILURE;
}
}
#endif
if (ret == WOLFSSL_SUCCESS) {
InitDecodedCert(dCert, x->derCert->buffer, x->derCert->length, NULL);
ret = ParseCertRelative(dCert, CERT_TYPE, 0, NULL);
if (ret != 0) {
ret = WOLFSSL_FAILURE;
}
else {
ret = CheckIPAddr(&dCert, ipasc);
ret = CheckIPAddr(dCert, ipasc);
if (ret != 0) {
ret = WOLFSSL_FAILURE;
}
@ -11877,9 +11937,14 @@ int wolfSSL_X509_check_ip_asc(WOLFSSL_X509 *x, const char *ipasc,
ret = WOLFSSL_SUCCESS;
}
}
FreeDecodedCert(&dCert);
FreeDecodedCert(dCert);
}
#ifdef WOLFSSL_SMALL_STACK
if (dCert != NULL)
XFREE(dCert, x->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return ret;
}
#endif

View File

@ -413,7 +413,7 @@ static int ctx_set_encryption_secrets(WOLFSSL *ssl, WOLFSSL_ENCRYPTION_LEVEL lev
static int ctx_add_handshake_data(WOLFSSL *ssl, WOLFSSL_ENCRYPTION_LEVEL level,
const uint8_t *data, size_t len);
static int ctx_flush_flight(WOLFSSL *ssl);
static int ctx_send_alert(WOLFSSL *ssl, WOLFSSL_ENCRYPTION_LEVEL level, uint8_t alert);
static int ctx_send_alert(WOLFSSL *ssl, WOLFSSL_ENCRYPTION_LEVEL level, uint8_t err);
#ifdef HAVE_SESSION_TICKET
static int ctx_session_ticket_cb(WOLFSSL* ssl,
const unsigned char* ticket, int ticketSz,
@ -793,7 +793,7 @@ static void check_crypto_rec(const byte *data, size_t data_len, int verbose, int
}
}
static void check_crypto_records(QuicTestContext *from, OutputBuffer *out, int indent, char *rec_log)
static void check_crypto_records(QuicTestContext *from, OutputBuffer *out, int indent, char *rec_log, size_t rec_log_size)
{
const byte *data = out->data;
size_t data_len = out->len;
@ -843,8 +843,8 @@ static void check_crypto_records(QuicTestContext *from, OutputBuffer *out, int i
}
if (rec_log) {
if (*rec_log) strcat(rec_log, ":");
strcat(rec_log, rec_name);
if (*rec_log) XSTRLCAT(rec_log, ":", rec_log_size);
XSTRLCAT(rec_log, rec_name, rec_log_size);
}
if (from->verbose) printf("%*sCRYPTO[%s]: ", indent, " ", rec_name);
check_rec(data, rec_len, from->verbose, indent);
@ -854,7 +854,7 @@ static void check_crypto_records(QuicTestContext *from, OutputBuffer *out, int i
}
}
static void QuicTestContext_forward(QuicTestContext *from, QuicTestContext *to, char *rec_log)
static void QuicTestContext_forward(QuicTestContext *from, QuicTestContext *to, char *rec_log, size_t rec_log_size)
{
int ret;
OutputBuffer *out, *old;
@ -869,7 +869,7 @@ static void QuicTestContext_forward(QuicTestContext *from, QuicTestContext *to,
if (from->verbose) dump_buffer("EarlyData", out->data, out->len, 4);
}
else {
check_crypto_records(from, out, 4, rec_log);
check_crypto_records(from, out, 4, rec_log, rec_log_size);
}
ret = wolfSSL_provide_quic_data(to->ssl, out->level, out->data, out->len);
out->len = 0;
@ -951,7 +951,7 @@ static int QuicConversation_step(QuicConversation *conv)
conv->started = 1;
}
if (conv->server->output.len > 0) {
QuicTestContext_forward(conv->server, conv->client, conv->rec_log);
QuicTestContext_forward(conv->server, conv->client, conv->rec_log, sizeof conv->rec_log);
n = wolfSSL_quic_read_write(conv->client->ssl);
if (n != WOLFSSL_SUCCESS) {
AssertIntEQ(wolfSSL_get_error(conv->client->ssl, 0), SSL_ERROR_WANT_READ);
@ -959,7 +959,7 @@ static int QuicConversation_step(QuicConversation *conv)
return 1;
}
else if (conv->client->output.len > 0) {
QuicTestContext_forward(conv->client, conv->server, conv->rec_log);
QuicTestContext_forward(conv->client, conv->server, conv->rec_log, sizeof conv->rec_log);
#ifdef WOLFSSL_EARLY_DATA
if (conv->accept_early_data) {
int written;

View File

@ -7111,7 +7111,7 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
#endif
{
#ifdef WOLFSSL_SMALL_STACK_CACHE
ecc_key key;
ecc_key *key = NULL;
#endif
#ifdef WOLFSSL_SMALL_STACK
ecc_point** precomp = NULL;
@ -7152,24 +7152,35 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
#endif
#ifdef WOLFSSL_SMALL_STACK
#ifdef WOLFSSL_SMALL_STACK_CACHE
key = (ecc_key *)XMALLOC(sizeof(*key), heap, DYNAMIC_TYPE_ECC_BUFFER);
if (key == NULL) {
XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
return GEN_MEM_ERR;
}
#endif
precomp = (ecc_point**)XMALLOC(sizeof(ecc_point*) * SHAMIR_PRECOMP_SZ, heap,
DYNAMIC_TYPE_ECC_BUFFER);
if (precomp == NULL) {
XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
#ifdef WOLFSSL_SMALL_STACK_CACHE
XFREE(key, heap, DYNAMIC_TYPE_ECC_BUFFER);
#endif
return GEN_MEM_ERR;
}
#endif
#ifdef WOLFSSL_SMALL_STACK_CACHE
key.t1 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
key.t2 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
key->t1 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
key->t2 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
#ifdef ALT_ECC_SIZE
key.x = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
key.y = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
key.z = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
#endif
if (key.t1 == NULL || key.t2 == NULL
if (key->t1 == NULL || key->t2 == NULL
#ifdef ALT_ECC_SIZE
|| key.x == NULL || key.y == NULL || key.z == NULL
#endif
@ -7179,14 +7190,15 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
XFREE(key.y, heap, DYNAMIC_TYPE_ECC);
XFREE(key.x, heap, DYNAMIC_TYPE_ECC);
#endif
XFREE(key.t2, heap, DYNAMIC_TYPE_ECC);
XFREE(key.t1, heap, DYNAMIC_TYPE_ECC);
XFREE(key->t2, heap, DYNAMIC_TYPE_ECC);
XFREE(key->t1, heap, DYNAMIC_TYPE_ECC);
XFREE(precomp, heap, DYNAMIC_TYPE_ECC_BUFFER);
XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
XFREE(key, heap, DYNAMIC_TYPE_ECC_BUFFER);
return MEMORY_E;
}
C->key = &key;
C->key = key;
#endif /* WOLFSSL_SMALL_STACK_CACHE */
/* init variables */
@ -7230,7 +7242,7 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
if (err != MP_OKAY)
break;
#ifdef WOLFSSL_SMALL_STACK_CACHE
precomp[x]->key = &key;
precomp[x]->key = key;
#endif
}
}
@ -7399,8 +7411,9 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
XFREE(key.y, heap, DYNAMIC_TYPE_ECC);
XFREE(key.x, heap, DYNAMIC_TYPE_ECC);
#endif
XFREE(key.t2, heap, DYNAMIC_TYPE_ECC);
XFREE(key.t1, heap, DYNAMIC_TYPE_ECC);
XFREE(key->t2, heap, DYNAMIC_TYPE_ECC);
XFREE(key->t1, heap, DYNAMIC_TYPE_ECC);
XFREE(key, heap, DYNAMIC_TYPE_ECC);
C->key = NULL;
#endif
#ifdef WOLFSSL_SMALL_STACK

View File

@ -1885,15 +1885,27 @@ static int sakke_accumulate_line_add_one(mp_proj* v, mp_int* prime, mp_digit mp,
static int sakke_accumulate_line_dbl(mp_proj* v, ecc_point* p, ecc_point* q,
mp_int* prime, mp_digit mp, mp_proj* r, mp_int** t)
{
int err;
int err = 0;
mp_int* t1 = t[0];
mp_int* t2 = r->z;
mp_int* z2 = t[1];
#ifdef WOLFSSL_SMALL_STACK
mp_int* l = NULL;
mp_int* ty = NULL;
l = (mp_int *)XMALLOC(sizeof(*l), NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (l == NULL)
err = 1;
ty = (mp_int *)XMALLOC(sizeof(*ty), NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (ty == NULL)
err = 1;
#else
mp_int tmp[2];
mp_int* l = &tmp[0];
mp_int* ty = &tmp[1];
#endif
err = mp_init(l);
if (err == 0)
err = mp_init(l);
if (err == 0) {
err = mp_init(ty);
}
@ -1985,8 +1997,19 @@ static int sakke_accumulate_line_dbl(mp_proj* v, ecc_point* p, ecc_point* q,
err = sakke_submod(p->y, t2, prime, p->y);
}
#ifdef WOLFSSL_SMALL_STACK
if (ty != NULL) {
mp_free(ty);
XFREE(ty, NULL, DYNAMIC_TYPE_TMP_BUFFER);
}
if (l != NULL) {
mp_free(l);
XFREE(l, NULL, DYNAMIC_TYPE_TMP_BUFFER);
}
#else
mp_free(ty);
mp_free(l);
#endif
return err;
}
@ -2018,16 +2041,36 @@ static int sakke_accumulate_line_dbl(mp_proj* v, ecc_point* p, ecc_point* q,
static int sakke_accumulate_line_add_one(mp_proj* v, mp_int* prime, mp_digit mp,
ecc_point* p, ecc_point* q, ecc_point* c, mp_proj* r, mp_int** t)
{
int err;
int err = 0;
mp_int* t1 = t[0];
mp_int* t2 = t[1];
#ifdef WOLFSSL_SMALL_STACK
mp_int* h = NULL;
mp_int* ty = NULL;
mp_int* tz = NULL;
mp_int* t3 = NULL;
h = (mp_int *)XMALLOC(sizeof(*h), NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (h == NULL)
err = 1;
ty = (mp_int *)XMALLOC(sizeof(*ty), NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (ty == NULL)
err = 1;
tz = (mp_int *)XMALLOC(sizeof(*tz), NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (tz == NULL)
err = 1;
t3 = (mp_int *)XMALLOC(sizeof(*t3), NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (t3 == NULL)
err = 1;
#else
mp_int tmp[4];
mp_int* h = &tmp[0];
mp_int* ty = &tmp[1];
mp_int* tz = &tmp[2];
mp_int* t3 = &tmp[3];
#endif
err = mp_init_multi(h, ty, tz, t3, NULL, NULL);
if (err == 0)
err = mp_init_multi(h, ty, tz, t3, NULL, NULL);
/* r.x = (q.x + p.x) * c.y */
if (err == 0) {
@ -2135,10 +2178,29 @@ static int sakke_accumulate_line_add_one(mp_proj* v, mp_int* prime, mp_digit mp,
err = sakke_addmod(t3, t2, prime, c->y);
}
#ifdef WOLFSSL_SMALL_STACK
if (t3 != NULL) {
mp_free(t3);
XFREE(t3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
}
if (tz != NULL) {
mp_free(tz);
XFREE(tz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
}
if (ty != NULL) {
mp_free(ty);
XFREE(ty, NULL, DYNAMIC_TYPE_TMP_BUFFER);
}
if (h != NULL) {
mp_free(h);
XFREE(h, NULL, DYNAMIC_TYPE_TMP_BUFFER);
}
#else
mp_free(t3);
mp_free(tz);
mp_free(ty);
mp_free(h);
#endif
return err;
}

View File

@ -29532,82 +29532,95 @@ static int eccsi_enc_dec_pair_test(EccsiKey* priv, mp_int* ssk, ecc_point* pvt)
int ret;
byte data[32 * 3];
word32 sz;
mp_int decSsk;
ecc_point* decPvt = NULL;
#ifdef WOLFSSL_SMALL_STACK
mp_int *decSsk = (mp_int *)XMALLOC(sizeof(*decSsk), HEAP_HINT,
DYNAMIC_TYPE_TMP_BUFFER);
if (decSsk == NULL)
return -10173;
#else
mp_int decSsk[1];
#endif
ret = mp_init(&decSsk);
ret = mp_init(decSsk);
if (ret != 0)
return -10117;
ERROR_OUT(-10117, out);
decPvt = wc_ecc_new_point();
if (decPvt == NULL)
return -10118;
ERROR_OUT(-10118, out);
ret = wc_EncodeEccsiPair(priv, ssk, pvt, NULL, &sz);
if (ret != LENGTH_ONLY_E)
return -10119;
ERROR_OUT(-10119, out);
if (sz != 32 * 3)
return -10120;
ERROR_OUT(-10120, out);
ret = wc_EncodeEccsiPair(priv, ssk, pvt, data, &sz);
if (ret != 0)
return -10121;
ERROR_OUT(-10121, out);
if (sz != 32* 3)
return -10122;
ret = wc_DecodeEccsiPair(priv, data, sz, &decSsk, decPvt);
ERROR_OUT(-10122, out);
ret = wc_DecodeEccsiPair(priv, data, sz, decSsk, decPvt);
if (ret != 0)
return -10123;
if (mp_cmp(ssk, &decSsk) != MP_EQ)
return -10124;
ERROR_OUT(-10123, out);
if (mp_cmp(ssk, decSsk) != MP_EQ)
ERROR_OUT(-10124, out);
if (wc_ecc_cmp_point(pvt, decPvt) != MP_EQ)
return -10125;
ERROR_OUT(-10125, out);
ret = wc_EncodeEccsiSsk(priv, ssk, NULL, &sz);
if (ret != LENGTH_ONLY_E)
return -10119;
ERROR_OUT(-10119, out);
if (sz != 32)
return -10120;
ERROR_OUT(-10120, out);
ret = wc_EncodeEccsiSsk(priv, ssk, data, &sz);
if (ret != 0)
return -10121;
ERROR_OUT(-10121, out);
if (sz != 32)
return -10122;
ret = wc_DecodeEccsiSsk(priv, data, sz, &decSsk);
ERROR_OUT(-10122, out);
ret = wc_DecodeEccsiSsk(priv, data, sz, decSsk);
if (ret != 0)
return -10123;
if (mp_cmp(ssk, &decSsk) != MP_EQ)
return -10124;
ERROR_OUT(-10123, out);
if (mp_cmp(ssk, decSsk) != MP_EQ)
ERROR_OUT(-10124, out);
ret = wc_EncodeEccsiPvt(priv, pvt, NULL, &sz, 1);
if (ret != LENGTH_ONLY_E)
return -10126;
ERROR_OUT(-10126, out);
if (sz != 32 * 2)
return -10127;
ERROR_OUT(-10127, out);
ret = wc_EncodeEccsiPvt(priv, pvt, data, &sz, 1);
if (ret != 0)
return -10128;
ERROR_OUT(-10128, out);
if (sz != 32 * 2)
return -10129;
ERROR_OUT(-10129, out);
ret = wc_DecodeEccsiPvt(priv, data, sz, decPvt);
if (ret != 0)
return -10130;
ERROR_OUT(-10130, out);
if (wc_ecc_cmp_point(pvt, decPvt) != MP_EQ)
return -10131;
ERROR_OUT(-10131, out);
sz = sizeof(data);
ret = wc_EncodeEccsiPvt(priv, pvt, data, &sz, 0);
if (ret != 0)
return -10128;
ERROR_OUT(-10128, out);
if (sz != 32 * 2 + 1)
return -10129;
ERROR_OUT(-10129, out);
ret = wc_DecodeEccsiPvt(priv, data, sz, decPvt);
if (ret != 0)
return -10130;
ERROR_OUT(-10130, out);
if (wc_ecc_cmp_point(pvt, decPvt) != MP_EQ)
return -10131;
ERROR_OUT(-10131, out);
wc_ecc_del_point(decPvt);
mp_free(&decSsk);
return 0;
out:
mp_free(decSsk);
#ifdef WOLFSSL_SMALL_STACK
XFREE(decSsk, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return ret;
}
static int eccsi_imp_exp_key_test(EccsiKey* priv)

View File

@ -5632,7 +5632,7 @@ WOLFSSL_LOCAL int wolfSSL_RSA_To_Der(WOLFSSL_RSA* rsa, byte** outBuf,
#endif
#ifdef WOLFSSL_QUIC
#define WOLFSSL_IS_QUIC(s) (s && s->quic.method != NULL)
#define WOLFSSL_IS_QUIC(s) (((s) != NULL) && ((s)->quic.method != NULL))
WOLFSSL_LOCAL int wolfSSL_quic_receive(WOLFSSL* ssl, byte* buf, word32 sz);
WOLFSSL_LOCAL int wolfSSL_quic_send(WOLFSSL* ssl);
WOLFSSL_LOCAL void wolfSSL_quic_clear(WOLFSSL* ssl);

View File

@ -2607,6 +2607,11 @@ extern void uITRON4_free(void *p) ;
#undef WOLFSSL_SMALL_STACK
#endif
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SMALL_STACK_STATIC) && \
!defined(NO_WOLFSSL_SMALL_STACK_STATIC)
#define WOLFSSL_SMALL_STACK_STATIC
#endif
#ifdef WOLFSSL_SMALL_STACK_STATIC
#undef WOLFSSL_SMALL_STACK_STATIC
#define WOLFSSL_SMALL_STACK_STATIC static