From be7592fb4357366c5eb6f1da8789958b0e84cab9 Mon Sep 17 00:00:00 2001 From: Glenn Strauss Date: Fri, 3 Jul 2020 14:40:48 -0400 Subject: [PATCH] implement wolfSSL_dup_CA_list() wolfSSL_dup_CA_list() duplicates a WOLF_STACK_OF(WOLFSSL_X509_NAME) (replaces stub function) --- src/internal.c | 6 +++--- src/ssl.c | 42 ++++++++++++++++++++++++++++++++---------- wolfssl/internal.h | 2 +- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/internal.c b/src/internal.c index a2e856542..338ab2ae8 100644 --- a/src/internal.c +++ b/src/internal.c @@ -17187,7 +17187,7 @@ int SendCertificateRequest(WOLFSSL* ssl) int sendSz; word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ; word32 dnLen = 0; -#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) WOLF_STACK_OF(WOLFSSL_X509_NAME)* names; #endif @@ -17200,7 +17200,7 @@ int SendCertificateRequest(WOLFSSL* ssl) if (IsAtLeastTLSv1_2(ssl)) reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz; -#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) /* Certificate Authorities */ names = ssl->ctx->ca_names; while (names != NULL) { @@ -17269,7 +17269,7 @@ int SendCertificateRequest(WOLFSSL* ssl) /* Certificate Authorities */ c16toa((word16)dnLen, &output[i]); /* auth's */ i += REQ_HEADER_SZ; -#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) names = ssl->ctx->ca_names; while (names != NULL) { byte seq[MAX_SEQ_SZ]; diff --git a/src/ssl.c b/src/ssl.c index 63cd94b15..c140d62d3 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -39855,16 +39855,6 @@ err: return WOLFSSL_SUCCESS; } - - WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list( - WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk) - { - (void) sk; - WOLFSSL_ENTER("wolfSSL_dup_CA_list"); - WOLFSSL_STUB("SSL_dup_CA_list"); - - return NULL; - } #endif /* wolfSSL uses negative values for error states. This function returns an @@ -41996,6 +41986,38 @@ WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new(wolf_sk_compare_cb cb return sk; } + +/* Creates a duplicate of WOLF_STACK_OF(WOLFSSL_X509_NAME). + * Returns a new WOLF_STACK_OF(WOLFSSL_X509_NAME) or NULL on failure */ +WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list( + WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk) +{ + int i; + const int num = wolfSSL_sk_X509_NAME_num(sk); + WOLF_STACK_OF(WOLFSSL_X509_NAME) *copy; + WOLFSSL_X509_NAME *name; + + WOLFSSL_ENTER("wolfSSL_dup_CA_list"); + + copy = wolfSSL_sk_X509_NAME_new(NULL); + if (copy == NULL) { + WOLFSSL_MSG("Memory error"); + return NULL; + } + + for (i = 0; i < num; i++) { + name = wolfSSL_X509_NAME_dup(wolfSSL_sk_X509_NAME_value(sk, i)); + if (name == NULL || 0 != wolfSSL_sk_X509_NAME_push(copy, name)) { + WOLFSSL_MSG("Memory error"); + wolfSSL_sk_X509_NAME_pop_free(copy, wolfSSL_X509_NAME_free); + return NULL; + } + } + + return copy; +} + + int wolfSSL_sk_X509_NAME_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, WOLFSSL_X509_NAME* name) { diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 16e0e94c4..6e3f5298f 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -3633,7 +3633,7 @@ struct WOLFSSL_X509_NAME { WOLFSSL_X509_NAME_ENTRY entry[MAX_NAME_ENTRIES]; /* all entries i.e. CN */ WOLFSSL_X509* x509; /* x509 that struct belongs to */ #endif /* OPENSSL_EXTRA */ -#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) byte raw[ASN_NAME_MAX]; int rawLen; #endif