diff --git a/src/ssl.c b/src/ssl.c index 46d2cb9aa..77fd26684 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -25826,7 +25826,7 @@ void wolfSSL_ASN1_GENERALIZEDTIME_free(WOLFSSL_ASN1_TIME* asn1Time) XMEMSET(asn1Time->data, 0, sizeof(asn1Time->data)); } -int wolfSSL_sk_num(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk) +int wolfSSL_sk_num(WOLFSSL_STACK* sk) { WOLFSSL_ENTER("wolfSSL_sk_num"); if (sk == NULL) @@ -25834,13 +25834,55 @@ int wolfSSL_sk_num(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk) return (int)sk->num; } -void* wolfSSL_sk_value(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk, int i) +void* wolfSSL_sk_value(WOLFSSL_STACK* sk, int i) { + #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) + int offset = i; + WOLFSSL_GENERAL_NAME* gn; + #endif + WOLFSSL_ENTER("wolfSSL_sk_value"); + for (; sk != NULL && i > 0; i--) sk = sk->next; if (sk == NULL) return NULL; - return (void*)sk->data.obj; + + switch (sk->type) { + case STACK_TYPE_X509: + return (void*)sk->data.x509; + #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) + case STACK_TYPE_CIPHER: + sk->data.cipher.offset = offset; + return (void*)&sk->data.cipher; + case STACK_TYPE_GEN_NAME: + gn = (WOLFSSL_GENERAL_NAME*)sk->data.obj; + if (gn == NULL) + return NULL; + gn->type = sk->data.obj->type; + gn->d.ia5 = sk->data.obj->d.ia5; + gn->d.iPAddress = sk->data.obj->d.iPAddress; + gn->d.dNSName = sk->data.obj->d.dNSName; + gn->d.uniformResourceIdentifier = + sk->data.obj->d.uniformResourceIdentifier; + return (void*)gn; + case STACK_TYPE_ACCESS_DESCRIPTION: + return (void*)sk->data.access; + #endif + case STACK_TYPE_OBJ: + return (void*)sk->data.obj; + break; + case STACK_TYPE_NULL: + return (void*)sk->data.generic; + break; + #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) + case STACK_TYPE_X509_EXT: + return (void*)sk->data.ext; + #endif + case STACK_TYPE_CONF_VALUE: + return (void*)sk->data.conf->value; + default: + return (void*)sk->data.obj; + } } /* Free the structure for ASN1_OBJECT stack */ @@ -25876,6 +25918,9 @@ void wolfSSL_sk_free(WOLFSSL_STACK* sk) case STACK_TYPE_X509_NAME: wolfSSL_sk_X509_NAME_free(sk); break; + case STACK_TYPE_CONF_VALUE: + wolfSSL_sk_CONF_VALUE_free(sk); + break; #endif default: wolfSSL_sk_ASN1_OBJECT_free(sk); @@ -25941,6 +25986,33 @@ void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk, } } +#if defined(OPENSSL_ALL) +/* Free the structure for WOLFSSL_CONF_VALUE stack + * + * sk stack to free nodes in + */ +void wolfSSL_sk_CONF_VALUE_free(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk) +{ + WOLFSSL_STACK* node; + WOLFSSL_STACK* tmp; + WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_free"); + + if (sk == NULL) + return; + + /* parse through stack freeing each node */ + node = sk->next; + while (node) { + tmp = node; + node = node->next; + XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL); + } + + /* free head of stack */ + XFREE(sk, NULL, DYNAMIC_TYPE_ASN1); +} +#endif + /* Creates and returns a new null stack. */ WOLFSSL_STACK* wolfSSL_sk_new_null(void) { diff --git a/wolfssl/internal.h b/wolfssl/internal.h index fd29d8303..c2cc5e97f 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -1816,6 +1816,12 @@ struct WOLFSSL_CIPHER { byte cipherSuite0; byte cipherSuite; WOLFSSL* ssl; +#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) + char description[MAX_CIPHERNAME_SZ]; + unsigned long offset; + unsigned int in_stack; /* TRUE if added to stack in wolfSSL_get_ciphers_compat */ + int bits; +#endif }; @@ -3443,6 +3449,7 @@ typedef struct Arrays { #define STACK_TYPE_X509_EXT 7 #define STACK_TYPE_NULL 8 #define STACK_TYPE_X509_NAME 9 +#define STACK_TYPE_CONF_VALUE 10 struct WOLFSSL_STACK { unsigned long num; /* number of nodes in stack @@ -3459,6 +3466,7 @@ struct WOLFSSL_STACK { WOLFSSL_CIPHER cipher; WOLFSSL_ACCESS_DESCRIPTION* access; WOLFSSL_X509_EXTENSION* ext; + WOLFSSL_CONF_VALUE* conf; void* generic; char* string; WOLFSSL_GENERAL_NAME* gn; diff --git a/wolfssl/openssl/conf.h b/wolfssl/openssl/conf.h index 1e328cf47..12a20c8cf 100644 --- a/wolfssl/openssl/conf.h +++ b/wolfssl/openssl/conf.h @@ -1,2 +1,48 @@ -/* conf.h for openssl */ +/* conf.h + * + * Copyright (C) 2006-2019 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +/* conf.h for openSSL */ + +#ifndef WOLFSSL_conf_H_ +#define WOLFSSL_conf_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +struct WOLFSSL_CONF_VALUE { + char *section; + char *name; + char *value; +}; + +struct WOLFSSL_INIT_SETTINGS { + char* appname; +}; + +typedef struct WOLFSSL_CONF_VALUE CONF_VALUE; +typedef struct WOLFSSL_INIT_SETTINGS OPENSSL_INIT_SETTINGS; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* WOLFSSL_conf_H_ */ diff --git a/wolfssl/openssl/stack.h b/wolfssl/openssl/stack.h index d92baa820..394047050 100644 --- a/wolfssl/openssl/stack.h +++ b/wolfssl/openssl/stack.h @@ -34,6 +34,8 @@ WOLFSSL_API void wolfSSL_sk_free(WOLFSSL_STACK *); WOLFSSL_API void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK *); WOLFSSL_API int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK *sk, void *data); WOLFSSL_API void wolfSSL_sk_pop_free(WOLFSSL_STACK *st, void (*func) (void *)); +WOLFSSL_API +void wolfSSL_sk_CONF_VALUE_free(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk); WOLFSSL_API WOLFSSL_STACK *wolfSSL_sk_new_null(void); WOLFSSL_API int wolfSSL_sk_push(WOLFSSL_STACK *st, const void *data); diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 4e508f0dd..3b66a279b 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -175,6 +175,7 @@ typedef struct WOLFSSL_X509_VERIFY_PARAM WOLFSSL_X509_VERIFY_PARAM; typedef struct WOLFSSL_BIO WOLFSSL_BIO; typedef struct WOLFSSL_BIO_METHOD WOLFSSL_BIO_METHOD; typedef struct WOLFSSL_X509_EXTENSION WOLFSSL_X509_EXTENSION; +typedef struct WOLFSSL_CONF_VALUE WOLFSSL_CONF_VALUE; typedef struct WOLFSSL_ASN1_TIME WOLFSSL_ASN1_TIME; typedef struct WOLFSSL_ASN1_OBJECT WOLFSSL_ASN1_OBJECT; typedef struct WOLFSSL_ASN1_OTHERNAME WOLFSSL_ASN1_OTHERNAME; @@ -1919,8 +1920,8 @@ WOLFSSL_API int wolfSSL_ASN1_TIME_diff(int *pday, int *psec, const WOLFSSL_ASN1_TIME *from, const WOLFSSL_ASN1_TIME *to); WOLFSSL_API WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t); -WOLFSSL_API int wolfSSL_sk_num(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)*); -WOLFSSL_API void* wolfSSL_sk_value(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)*, int); +WOLFSSL_API int wolfSSL_sk_num(WOLFSSL_STACK* sk); +WOLFSSL_API void* wolfSSL_sk_value(WOLFSSL_STACK* sk, int i); /* stunnel 4.28 needs */ WOLFSSL_API void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX*, int);