Skip to content

Commit a3a7012

Browse files
authored
Merge pull request #7136 from jpbland1/x509-new-ex
add heap hint support for a few of the x509 functions
2 parents ac81d9d + 66f0495 commit a3a7012

7 files changed

Lines changed: 69 additions & 48 deletions

File tree

src/ssl.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19031,7 +19031,7 @@ WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
1903119031
sk = wolfSSL_sk_X509_new_null();
1903219032
i = ssl->session->chain.count-1;
1903319033
for (; i >= 0; i--) {
19034-
x509 = wolfSSL_X509_new();
19034+
x509 = wolfSSL_X509_new_ex(ssl->heap);
1903519035
if (x509 == NULL) {
1903619036
WOLFSSL_MSG("Error Creating X509");
1903719037
wolfSSL_sk_X509_pop_free(sk, NULL);
@@ -19399,9 +19399,10 @@ WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
1939919399
return NULL;
1940019400
}
1940119401
#ifndef WOLFSSL_X509_STORE_CERTS
19402-
ssl->ourCert = wolfSSL_X509_d2i(NULL,
19402+
ssl->ourCert = wolfSSL_X509_d2i_ex(NULL,
1940319403
ssl->buffers.certificate->buffer,
19404-
ssl->buffers.certificate->length);
19404+
ssl->buffers.certificate->length,
19405+
ssl->heap);
1940519406
#endif
1940619407
}
1940719408
return ssl->ourCert;
@@ -19414,9 +19415,10 @@ WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
1941419415
return NULL;
1941519416
}
1941619417
#ifndef WOLFSSL_X509_STORE_CERTS
19417-
ssl->ctx->ourCert = wolfSSL_X509_d2i(NULL,
19418+
ssl->ctx->ourCert = wolfSSL_X509_d2i_ex(NULL,
1941819419
ssl->ctx->certificate->buffer,
19419-
ssl->ctx->certificate->length);
19420+
ssl->ctx->certificate->length,
19421+
ssl->heap);
1942019422
#endif
1942119423
ssl->ctx->ownOurCert = 1;
1942219424
}
@@ -19436,9 +19438,9 @@ WOLFSSL_X509* wolfSSL_CTX_get0_certificate(WOLFSSL_CTX* ctx)
1943619438
return NULL;
1943719439
}
1943819440
#ifndef WOLFSSL_X509_STORE_CERTS
19439-
ctx->ourCert = wolfSSL_X509_d2i(NULL,
19441+
ctx->ourCert = wolfSSL_X509_d2i_ex(NULL,
1944019442
ctx->certificate->buffer,
19441-
ctx->certificate->length);
19443+
ctx->certificate->length, ctx->heap);
1944219444
#endif
1944319445
ctx->ownOurCert = 1;
1944419446
}
@@ -26396,7 +26398,8 @@ void* wolfSSL_GetHKDFExtractCtx(WOLFSSL* ssl)
2639626398
return WOLFSSL_FAILURE;
2639726399
}
2639826400
#else
26399-
ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length);
26401+
ctx->ourCert = wolfSSL_X509_d2i_ex(NULL, x->derCert->buffer,
26402+
x->derCert->length, ctx->heap);
2640026403
if(ctx->ourCert == NULL){
2640126404
return WOLFSSL_FAILURE;
2640226405
}
@@ -30242,8 +30245,8 @@ int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** ch
3024230245
idx += 3;
3024330246

3024430247
/* Create a new X509 from DER encoded data. */
30245-
node->data.x509 = wolfSSL_X509_d2i(NULL, ctx->certChain->buffer + idx,
30246-
length);
30248+
node->data.x509 = wolfSSL_X509_d2i_ex(NULL,
30249+
ctx->certChain->buffer + idx, length, ctx->heap);
3024730250
if (node->data.x509 == NULL) {
3024830251
XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
3024930252
/* Return as much of the chain as we created. */
@@ -33969,8 +33972,8 @@ WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7)
3396933972
return p7->certs;
3397033973

3397133974
for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) {
33972-
WOLFSSL_X509* x509 = wolfSSL_X509_d2i(NULL, p7->pkcs7.cert[i],
33973-
p7->pkcs7.certSz[i]);
33975+
WOLFSSL_X509* x509 = wolfSSL_X509_d2i_ex(NULL, p7->pkcs7.cert[i],
33976+
p7->pkcs7.certSz[i], pkcs7->heap);
3397433977
if (!ret)
3397533978
ret = wolfSSL_sk_X509_new_null();
3397633979
if (x509) {

src/ssl_certman.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,33 +42,33 @@
4242
* @return A TLS method on success.
4343
* @return NULL when no TLS method built into wolfSSL.
4444
*/
45-
static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void)
45+
static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void* heap)
4646
{
4747
#ifndef NO_WOLFSSL_CLIENT
4848
#if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
49-
return wolfSSLv3_client_method();
49+
return wolfSSLv3_client_method_ex(heap);
5050
#elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
51-
return wolfTLSv1_client_method();
51+
return wolfTLSv1_client_method_ex(heap);
5252
#elif !defined(NO_OLD_TLS)
53-
return wolfTLSv1_1_client_method();
53+
return wolfTLSv1_1_client_method_ex(heap);
5454
#elif !defined(WOLFSSL_NO_TLS12)
55-
return wolfTLSv1_2_client_method();
55+
return wolfTLSv1_2_client_method_ex(heap);
5656
#elif defined(WOLFSSL_TLS13)
57-
return wolfTLSv1_3_client_method();
57+
return wolfTLSv1_3_client_method_ex(heap);
5858
#else
5959
return NULL;
6060
#endif
6161
#elif !defined(NO_WOLFSSL_SERVER)
6262
#if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
63-
return wolfSSLv3_server_method();
63+
return wolfSSLv3_server_method_ex(heap);
6464
#elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
65-
return wolfTLSv1_server_method();
65+
return wolfTLSv1_server_method_ex(heap);
6666
#elif !defined(NO_OLD_TLS)
67-
return wolfTLSv1_1_server_method();
67+
return wolfTLSv1_1_server_method_ex(heap);
6868
#elif !defined(WOLFSSL_NO_TLS12)
69-
return wolfTLSv1_2_server_method();
69+
return wolfTLSv1_2_server_method_ex(heap);
7070
#elif defined(WOLFSSL_TLS13)
71-
return wolfTLSv1_3_server_method();
71+
return wolfTLSv1_3_server_method_ex(heap);
7272
#else
7373
return NULL;
7474
#endif
@@ -513,8 +513,8 @@ int wolfSSL_CertManagerLoadCABuffer_ex(WOLFSSL_CERT_MANAGER* cm,
513513
ret = WOLFSSL_FATAL_ERROR;
514514
}
515515
/* Allocate a temporary WOLFSSL_CTX to load with. */
516-
if ((ret == WOLFSSL_SUCCESS) && ((tmp = wolfSSL_CTX_new(cm_pick_method()))
517-
== NULL)) {
516+
if ((ret == WOLFSSL_SUCCESS) && ((tmp =
517+
wolfSSL_CTX_new_ex(cm_pick_method(cm->heap), cm->heap)) == NULL)) {
518518
WOLFSSL_MSG("CTX new failed");
519519
ret = WOLFSSL_FATAL_ERROR;
520520
}
@@ -876,8 +876,8 @@ int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file,
876876
ret = WOLFSSL_FATAL_ERROR;
877877
}
878878
/* Create temporary WOLFSSL_CTX. */
879-
if ((ret == WOLFSSL_SUCCESS) && ((tmp = wolfSSL_CTX_new(cm_pick_method()))
880-
== NULL)) {
879+
if ((ret == WOLFSSL_SUCCESS) && ((tmp =
880+
wolfSSL_CTX_new_ex(cm_pick_method(cm->heap), cm->heap)) == NULL)) {
881881
WOLFSSL_MSG("CTX new failed");
882882
ret = WOLFSSL_FATAL_ERROR;
883883
}

src/x509.c

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3593,7 +3593,7 @@ WOLFSSL_X509* wolfSSL_d2i_X509(WOLFSSL_X509** x509, const unsigned char** in,
35933593
}
35943594

35953595
static WOLFSSL_X509* d2i_X509orX509REQ(WOLFSSL_X509** x509,
3596-
const byte* in, int len, int req)
3596+
const byte* in, int len, int req, void* heap)
35973597
{
35983598
WOLFSSL_X509 *newX509 = NULL;
35993599
int type = req ? CERTREQ_TYPE : CERT_TYPE;
@@ -3620,12 +3620,12 @@ static WOLFSSL_X509* d2i_X509orX509REQ(WOLFSSL_X509** x509,
36203620
return NULL;
36213621
#endif
36223622

3623-
InitDecodedCert(cert, (byte*)in, len, NULL);
3623+
InitDecodedCert(cert, (byte*)in, len, heap);
36243624
#ifdef WOLFSSL_CERT_REQ
36253625
cert->isCSR = (byte)req;
36263626
#endif
36273627
if (ParseCertRelative(cert, type, 0, NULL) == 0) {
3628-
newX509 = wolfSSL_X509_new();
3628+
newX509 = wolfSSL_X509_new_ex(heap);
36293629
if (newX509 != NULL) {
36303630
if (CopyDecodedToX509(newX509, cert) != 0) {
36313631
wolfSSL_X509_free(newX509);
@@ -3659,16 +3659,22 @@ int wolfSSL_X509_get_isCA(WOLFSSL_X509* x509)
36593659
return isCA;
36603660
}
36613661

3662+
WOLFSSL_X509* wolfSSL_X509_d2i_ex(WOLFSSL_X509** x509, const byte* in, int len,
3663+
void* heap)
3664+
{
3665+
return d2i_X509orX509REQ(x509, in, len, 0, heap);
3666+
}
3667+
36623668
WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len)
36633669
{
3664-
return d2i_X509orX509REQ(x509, in, len, 0);
3670+
return wolfSSL_X509_d2i_ex(x509, in, len, NULL);
36653671
}
36663672

36673673
#ifdef WOLFSSL_CERT_REQ
36683674
WOLFSSL_X509* wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509,
36693675
const unsigned char* in, int len)
36703676
{
3671-
return d2i_X509orX509REQ(x509, in, len, 1);
3677+
return d2i_X509orX509REQ(x509, in, len, 1, NULL);
36723678
}
36733679
#endif
36743680

@@ -5319,19 +5325,24 @@ WOLFSSL_X509* wolfSSL_X509_REQ_load_certificate_buffer(
53195325
/* returns a pointer to a new WOLFSSL_X509 structure on success and NULL on
53205326
* fail
53215327
*/
5322-
WOLFSSL_X509* wolfSSL_X509_new(void)
5328+
WOLFSSL_X509* wolfSSL_X509_new_ex(void* heap)
53235329
{
53245330
WOLFSSL_X509* x509;
53255331

5326-
x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
5332+
x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
53275333
DYNAMIC_TYPE_X509);
53285334
if (x509 != NULL) {
5329-
InitX509(x509, 1, NULL);
5335+
InitX509(x509, 1, heap);
53305336
}
53315337

53325338
return x509;
53335339
}
53345340

5341+
WOLFSSL_X509* wolfSSL_X509_new(void)
5342+
{
5343+
return wolfSSL_X509_new_ex(NULL);
5344+
}
5345+
53355346
WOLFSSL_ABI
53365347
WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert)
53375348
{
@@ -7610,7 +7621,7 @@ static WOLFSSL_X509* d2i_X509orX509REQ_bio(WOLFSSL_BIO* bio,
76107621
#endif
76117622
}
76127623
else {
7613-
localX509 = wolfSSL_X509_d2i(NULL, mem, size);
7624+
localX509 = wolfSSL_X509_d2i_ex(NULL, mem, size, bio->heap);
76147625
}
76157626
if (localX509 == NULL) {
76167627
WOLFSSL_MSG("wolfSSL_X509_d2i error");
@@ -13353,7 +13364,7 @@ static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
1335313364
#endif
1335413365

1335513366
/* Use existing CA retrieval APIs that use DecodedCert. */
13356-
InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, NULL);
13367+
InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, cm->heap);
1335713368
if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0
1335813369
&& !cert->selfSigned) {
1335913370
#ifndef NO_SKID
@@ -13375,8 +13386,8 @@ static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
1337513386

1337613387
#ifdef WOLFSSL_SIGNER_DER_CERT
1337713388
/* populate issuer with Signer DER */
13378-
if (wolfSSL_X509_d2i(issuer, ca->derCert->buffer,
13379-
ca->derCert->length) == NULL)
13389+
if (wolfSSL_X509_d2i_ex(issuer, ca->derCert->buffer,
13390+
ca->derCert->length, cm->heap) == NULL)
1338013391
return WOLFSSL_FAILURE;
1338113392
#else
1338213393
/* Create an empty certificate as CA doesn't have a certificate. */
@@ -13471,7 +13482,8 @@ WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
1347113482
return NULL;
1347213483
}
1347313484

13474-
return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length);
13485+
return wolfSSL_X509_d2i_ex(NULL, x->derCert->buffer, x->derCert->length,
13486+
x->heap);
1347513487
}
1347613488
#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
1347713489

@@ -13841,7 +13853,7 @@ void wolfSSL_X509V3_set_ctx(WOLFSSL_X509V3_CTX* ctx, WOLFSSL_X509* issuer,
1384113853

1384213854
/* not checking ctx->x509 for null first since app won't have initialized
1384313855
* this X509V3_CTX before this function call */
13844-
ctx->x509 = wolfSSL_X509_new();
13856+
ctx->x509 = wolfSSL_X509_new_ex(issuer->heap);
1384513857
if (!ctx->x509)
1384613858
return;
1384713859

src/x509_str.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new(void)
6363

6464

6565
int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx,
66-
WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509, WOLF_STACK_OF(WOLFSSL_X509)* sk)
66+
WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509,
67+
WOLF_STACK_OF(WOLFSSL_X509)* sk)
6768
{
6869
int ret = 0;
6970
(void)sk;
@@ -75,8 +76,8 @@ int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx,
7576
ctx->current_cert = x509;
7677
#else
7778
if(x509 != NULL){
78-
ctx->current_cert = wolfSSL_X509_d2i(NULL, x509->derCert->buffer,
79-
x509->derCert->length);
79+
ctx->current_cert = wolfSSL_X509_d2i_ex(NULL, x509->derCert->buffer,
80+
x509->derCert->length, x509->heap);
8081
if(ctx->current_cert == NULL)
8182
return WOLFSSL_FAILURE;
8283
} else
@@ -1035,7 +1036,7 @@ WOLFSSL_API int wolfSSL_X509_STORE_load_locations(WOLFSSL_X509_STORE *str,
10351036
return WOLFSSL_FAILURE;
10361037

10371038
/* tmp ctx for setting our cert manager */
1038-
ctx = wolfSSL_CTX_new(cm_pick_method());
1039+
ctx = wolfSSL_CTX_new_ex(cm_pick_method(str->cm->heap), str->cm->heap);
10391040
if (ctx == NULL)
10401041
return WOLFSSL_FAILURE;
10411042

tests/api.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32048,7 +32048,7 @@ static int test_wolfSSL_X509_NAME(void)
3204832048
XFCLOSE(f);
3204932049

3205032050
c = buf;
32051-
ExpectNotNull(x509 = wolfSSL_X509_d2i(NULL, c, bytes));
32051+
ExpectNotNull(x509 = wolfSSL_X509_d2i_ex(NULL, c, bytes, HEAP_HINT));
3205232052

3205332053
/* test cmp function */
3205432054
ExpectNotNull(a = X509_get_issuer_name(x509));
@@ -37177,8 +37177,8 @@ static int test_wolfSSL_X509_NID(void)
3717737177
/* ------ PARSE ORIGINAL SELF-SIGNED CERTIFICATE ------ */
3717837178

3717937179
/* convert cert from DER to internal WOLFSSL_X509 struct */
37180-
ExpectNotNull(cert = wolfSSL_X509_d2i(&cert, client_cert_der_2048,
37181-
sizeof_client_cert_der_2048));
37180+
ExpectNotNull(cert = wolfSSL_X509_d2i_ex(&cert, client_cert_der_2048,
37181+
sizeof_client_cert_der_2048, HEAP_HINT));
3718237182

3718337183
/* ------ EXTRACT CERTIFICATE ELEMENTS ------ */
3718437184

wolfcrypt/src/ecc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6071,6 +6071,7 @@ int wc_ecc_init_ex(ecc_key* key, void* heap, int devId)
60716071
#endif
60726072

60736073
#ifdef WOLFSSL_HEAP_TEST
6074+
(void)heap;
60746075
key->heap = (void*)WOLFSSL_HEAP_TEST;
60756076
#else
60766077
key->heap = heap;

wolfssl/ssl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1684,6 +1684,7 @@ WOLFSSL_API void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk);
16841684
WOLFSSL_API WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl);
16851685

16861686
WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_new(void);
1687+
WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_new_ex(void* heap);
16871688
WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509* x);
16881689
#if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
16891690
WOLFSSL_API int wolfSSL_RSA_up_ref(WOLFSSL_RSA* rsa);
@@ -2888,6 +2889,9 @@ WOLFSSL_API WOLFSSL_X509* wolfSSL_d2i_X509(WOLFSSL_X509** x509,
28882889
const unsigned char** in, int len);
28892890
WOLFSSL_API WOLFSSL_X509*
28902891
wolfSSL_X509_d2i(WOLFSSL_X509** x509, const unsigned char* in, int len);
2892+
WOLFSSL_API WOLFSSL_X509*
2893+
wolfSSL_X509_d2i_ex(WOLFSSL_X509** x509, const unsigned char* in, int len,
2894+
void* heap);
28912895
#ifdef WOLFSSL_CERT_REQ
28922896
WOLFSSL_API WOLFSSL_X509*
28932897
wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509, const unsigned char* in, int len);

0 commit comments

Comments
 (0)