From 793df114f376a01bdbccab2e312521fcbd92169c Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Mon, 9 Sep 2019 17:02:57 -0500 Subject: [PATCH] Adding stack object type support to sk_value --- src/ssl.c | 42 +++++++++++++++++++++++++++++++++++++++++- wolfssl/internal.h | 9 +++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/ssl.c b/src/ssl.c index 3615b431b..999a16d7e 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -25760,11 +25760,51 @@ int wolfSSL_sk_num(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk) void* wolfSSL_sk_value(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* 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) { + #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) + case STACK_TYPE_X509: + return (void*)sk->data.x509; + case STACK_TYPE_CIPHER: + if (sk->data.cipher == NULL) + return NULL; + 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; + case STACK_TYPE_OBJ: + return (void*)sk->data.obj; + break; + case STACK_TYPE_NULL: + return (void*)sk->data.generic; + break; + case STACK_TYPE_X509_EXT: + return (void*)sk->data.ext; + #endif + default: + return (void*)sk->data.obj; + } } /* Free the structure for ASN1_OBJECT stack */ diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 56509903e..7d3da06b1 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -1865,11 +1865,20 @@ WOLFSSL_LOCAL int SetCipherList(WOLFSSL_CTX*, Suites*, const char* list); #endif /* WOLFSSL_DTLS_EXPORT_TYPES */ +#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) +#define UINT8_SZ 255 +#endif /* wolfSSL Cipher type just points back to SSL */ struct WOLFSSL_CIPHER { byte cipherSuite0; byte cipherSuite; WOLFSSL* ssl; +#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) + char description[UINT8_SZ]; + unsigned long offset; + unsigned int in_stack; /* TRUE if added to stack in wolfSSL_get_ciphers_compat */ + int bits; +#endif };