From 84368eed3f19ea24054a6c59ce8bb9095c93e9e6 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 11 Mar 2021 16:51:36 +0900 Subject: [PATCH] addressed review comment part 2 moving BY_DIR_xxx functions to internal --- src/internal.c | 387 +++++++++++++++++++++++++++++++++++++++++++++ src/ssl.c | 386 -------------------------------------------- tests/api.c | 153 +----------------- wolfssl/internal.h | 31 ++++ wolfssl/ssl.h | 32 ---- 5 files changed, 419 insertions(+), 570 deletions(-) diff --git a/src/internal.c b/src/internal.c index 01e905de7..74e0dd2f2 100644 --- a/src/internal.c +++ b/src/internal.c @@ -31601,6 +31601,393 @@ int wolfSSL_GetMaxRecordSize(WOLFSSL* ssl, int maxFragment) return maxFragment; } +#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) +/* create an instance of WOLFSSL_BY_DIR_HASH structure */ +WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void) +{ + WOLFSSL_BY_DIR_HASH* dir_hash; + + WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new"); + + dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL, + DYNAMIC_TYPE_OPENSSL); + if (dir_hash) { + XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH)); + } + return dir_hash; +} +/* release a WOLFSSL_BY_DIR_HASH resource */ +void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash) +{ + if (dir_hash == NULL) + return; + + XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL); +} +/* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */ +WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void) +{ + WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL); + + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null"); + + if (sk) { + sk->type = STACK_TYPE_BY_DIR_hash; + } + return sk; +} + +/* returns value less than 0 on fail to match + * On a successful match the priority level found is returned + */ +int wolfSSL_sk_BY_DIR_HASH_find( + WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind) +{ + WOLFSSL_STACK* next; + int i, sz; + + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find"); + + if (sk == NULL || toFind == NULL) { + return WOLFSSL_FAILURE; + } + + sz = wolfSSL_sk_BY_DIR_HASH_num(sk); + next = sk; + for (i = 0; i < sz && next != NULL; i++) { + if (next->data.dir_hash->hash_value == toFind->hash_value) { + return sz - i; /* reverse because stack pushed highest on first */ + } + next = next->next; + } + return -1; +} +/* return a number of WOLFSSL_BY_DIR_HASH in stack */ +int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk) +{ + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num"); + + if (sk == NULL) + return -1; + return (int)sk->num; +} +/* return WOLFSSL_BY_DIR_HASH instance at i */ +WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value( + const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i) +{ + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value"); + + for (; sk != NULL && i > 0; i--) + sk = sk->next; + + if (i != 0 || sk == NULL) + return NULL; + return sk->data.dir_hash; +} +/* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */ +WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop( + WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk) +{ + WOLFSSL_STACK* node; + WOLFSSL_BY_DIR_HASH* hash; + + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop"); + + if (sk == NULL) { + return NULL; + } + + node = sk->next; + hash = sk->data.dir_hash; + + if (node != NULL) { /* update sk and remove node from stack */ + sk->data.dir_hash = node->data.dir_hash; + sk->next = node->next; + wolfSSL_sk_free_node(node); + } + else { /* last x509 in stack */ + sk->data.dir_hash = NULL; + } + + if (sk->num > 0) { + sk->num -= 1; + } + + return hash; +} +/* release all contents in stack, and then release stack itself. */ +/* Second argument is a function pointer to release resouces. */ +/* It calls the function to release resouces when t is passed */ +/* instead of wolfSSL_BY_DIR_HASH_free(). */ +void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk, + void (*f) (WOLFSSL_BY_DIR_HASH*)) +{ + WOLFSSL_STACK* node; + + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free"); + + if (sk == NULL) { + return; + } + + /* parse through stack freeing each node */ + node = sk->next; + while (node && sk->num > 1) { + WOLFSSL_STACK* tmp = node; + node = node->next; + + if (f) + f(tmp->data.dir_hash); + else + wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash); + tmp->data.dir_hash = NULL; + XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL); + sk->num -= 1; + } + + /* free head of stack */ + if (sk->num == 1) { + if (f) + f(sk->data.dir_hash); + else + wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash); + sk->data.dir_hash = NULL; + } + XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL); +} +/* release all contents in stack, and then release stack itself */ +void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk) +{ + wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL); +} +/* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and + * tries to free it when the stack is free'd. + * + * return 1 on success 0 on fail + */ +int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, + WOLFSSL_BY_DIR_HASH* in) +{ + WOLFSSL_STACK* node; + + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push"); + + if (sk == NULL || in == NULL) { + return WOLFSSL_FAILURE; + } + + /* no previous values in stack */ + if (sk->data.dir_hash == NULL) { + sk->data.dir_hash = in; + sk->num += 1; + return WOLFSSL_SUCCESS; + } + + /* stack already has value(s) create a new node and add more */ + node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL, + DYNAMIC_TYPE_OPENSSL); + if (node == NULL) { + WOLFSSL_MSG("Memory error"); + return WOLFSSL_FAILURE; + } + XMEMSET(node, 0, sizeof(WOLFSSL_STACK)); + + /* push new obj onto head of stack */ + node->data.dir_hash = sk->data.dir_hash; + node->next = sk->next; + node->type = sk->type; + sk->next = node; + sk->data.dir_hash = in; + sk->num += 1; + + return WOLFSSL_SUCCESS; +} +/* create an instance of WOLFSSL_BY_DIR_entry structure */ +WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void) +{ + WOLFSSL_BY_DIR_entry* entry; + + WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new"); + + entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL, + DYNAMIC_TYPE_OPENSSL); + + if (entry) { + XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry)); + } + return entry; +} +/* release a WOLFSSL_BY_DIR_entry resource */ +void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry) +{ + WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free"); + + if (entry == NULL) + return; + + if (entry->hashes) { + wolfSSL_sk_BY_DIR_HASH_free(entry->hashes); + } + + if (entry->dir_name != NULL) { + XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL); + } + + XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL); +} + +WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void) +{ + WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL); + + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null"); + + if (sk) { + sk->type = STACK_TYPE_BY_DIR_entry; + } + return sk; +} +/* return a number of WOLFSSL_BY_DIR_entry in stack */ +int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk) +{ + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num"); + + if (sk == NULL) + return -1; + return (int)sk->num; +} +/* return WOLFSSL_BY_DIR_entry instance at i */ +WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value( + const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i) +{ + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value"); + + for (; sk != NULL && i > 0; i--) + sk = sk->next; + + if (i != 0 || sk == NULL) + return NULL; + return sk->data.dir_entry; +} +/* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */ +WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop( + WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk) +{ + WOLFSSL_STACK* node; + WOLFSSL_BY_DIR_entry* entry; + + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop"); + + if (sk == NULL) { + return NULL; + } + + node = sk->next; + entry = sk->data.dir_entry; + + if (node != NULL) { /* update sk and remove node from stack */ + sk->data.dir_entry = node->data.dir_entry; + sk->next = node->next; + wolfSSL_sk_free_node(node); + } + else { /* last x509 in stack */ + sk->data.dir_entry = NULL; + } + + if (sk->num > 0) { + sk->num -= 1; + } + + return entry; +} +/* release all contents in stack, and then release stack itself. */ +/* Second argument is a function pointer to release resouces. */ +/* It calls the function to release resouces when t is passed */ +/* instead of wolfSSL_BY_DIR_entry_free(). */ +void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk, + void (*f) (WOLFSSL_BY_DIR_entry*)) +{ + WOLFSSL_STACK* node; + + WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free"); + + if (sk == NULL) { + return; + } + + /* parse through stack freeing each node */ + node = sk->next; + while (node && sk->num > 1) { + WOLFSSL_STACK* tmp = node; + node = node->next; + + if (f) + f(tmp->data.dir_entry); + else + wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry); + tmp->data.dir_entry = NULL; + XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL); + sk->num -= 1; + } + + /* free head of stack */ + if (sk->num == 1) { + if (f) + f(sk->data.dir_entry); + else + wolfSSL_BY_DIR_entry_free(sk->data.dir_entry); + sk->data.dir_entry = NULL; + } + XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL); +} +/* release all contents in stack, and then release stack itself */ +void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk) +{ + wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL); +} + +/* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and + * tries to free it when the stack is free'd. + * + * return 1 on success 0 on fail + */ +int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk, + WOLFSSL_BY_DIR_entry* in) +{ + WOLFSSL_STACK* node; + + if (sk == NULL || in == NULL) { + return WOLFSSL_FAILURE; + } + + /* no previous values in stack */ + if (sk->data.dir_entry == NULL) { + sk->data.dir_entry = in; + sk->num += 1; + return WOLFSSL_SUCCESS; + } + + /* stack already has value(s) create a new node and add more */ + node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL, + DYNAMIC_TYPE_OPENSSL); + if (node == NULL) { + WOLFSSL_MSG("Memory error"); + return WOLFSSL_FAILURE; + } + XMEMSET(node, 0, sizeof(WOLFSSL_STACK)); + + /* push new obj onto head of stack */ + node->data.dir_entry = sk->data.dir_entry; + node->next = sk->next; + node->type = sk->type; + sk->next = node; + sk->data.dir_entry = in; + sk->num += 1; + + return WOLFSSL_SUCCESS; +} + +#endif /* OPENSSL_ALL */ #undef ERROR_OUT diff --git a/src/ssl.c b/src/ssl.c index ac8cef9fb..0b73fe825 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -46360,392 +46360,6 @@ void wolfSSL_sk_SSL_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk) } } -#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) -/* create an instance of WOLFSSL_BY_DIR_HASH structure */ -WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void) -{ - WOLFSSL_BY_DIR_HASH* dir_hash; - - WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new"); - - dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL, - DYNAMIC_TYPE_OPENSSL); - if (dir_hash) { - XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH)); - } - return dir_hash; -} -/* release a WOLFSSL_BY_DIR_HASH resource */ -void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash) -{ - if (dir_hash == NULL) - return; - - XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL); -} -/* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */ -WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void) -{ - WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL); - - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null"); - - if (sk) { - sk->type = STACK_TYPE_BY_DIR_hash; - } - return sk; -} - -/* returns value less than 0 on fail to match - * On a successful match the priority level found is returned - */ -int wolfSSL_sk_BY_DIR_HASH_find( - WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind) -{ - WOLFSSL_STACK* next; - int i, sz; - - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find"); - - if (sk == NULL || toFind == NULL) { - return WOLFSSL_FAILURE; - } - - sz = wolfSSL_sk_BY_DIR_HASH_num(sk); - next = sk; - for (i = 0; i < sz && next != NULL; i++) { - if (next->data.dir_hash->hash_value == toFind->hash_value) { - return sz - i; /* reverse because stack pushed highest on first */ - } - next = next->next; - } - return -1; -} -/* return a number of WOLFSSL_BY_DIR_HASH in stack */ -int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk) -{ - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num"); - - if (sk == NULL) - return -1; - return (int)sk->num; -} -/* return WOLFSSL_BY_DIR_HASH instance at i */ -WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value( - const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i) -{ - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value"); - - for (; sk != NULL && i > 0; i--) - sk = sk->next; - - if (i != 0 || sk == NULL) - return NULL; - return sk->data.dir_hash; -} -/* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */ -WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop( - WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk) -{ - WOLFSSL_STACK* node; - WOLFSSL_BY_DIR_HASH* hash; - - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop"); - - if (sk == NULL) { - return NULL; - } - - node = sk->next; - hash = sk->data.dir_hash; - - if (node != NULL) { /* update sk and remove node from stack */ - sk->data.dir_hash = node->data.dir_hash; - sk->next = node->next; - wolfSSL_sk_free_node(node); - } - else { /* last x509 in stack */ - sk->data.dir_hash = NULL; - } - - if (sk->num > 0) { - sk->num -= 1; - } - - return hash; -} -/* release all contents in stack, and then release stack itself. */ -/* Second argument is a function pointer to release resouces. */ -/* It calls the function to release resouces when t is passed */ -/* instead of wolfSSL_BY_DIR_HASH_free(). */ -void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk, - void (*f) (WOLFSSL_BY_DIR_HASH*)) -{ - WOLFSSL_STACK* node; - - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free"); - - if (sk == NULL) { - return; - } - - /* parse through stack freeing each node */ - node = sk->next; - while (node && sk->num > 1) { - WOLFSSL_STACK* tmp = node; - node = node->next; - - if (f) - f(tmp->data.dir_hash); - else - wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash); - tmp->data.dir_hash = NULL; - XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL); - sk->num -= 1; - } - - /* free head of stack */ - if (sk->num == 1) { - if (f) - f(sk->data.dir_hash); - else - wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash); - sk->data.dir_hash = NULL; - } - XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL); -} -/* release all contents in stack, and then release stack itself */ -void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk) -{ - wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL); -} -/* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and - * tries to free it when the stack is free'd. - * - * return 1 on success 0 on fail - */ -int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, - WOLFSSL_BY_DIR_HASH* in) -{ - WOLFSSL_STACK* node; - - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push"); - - if (sk == NULL || in == NULL) { - return WOLFSSL_FAILURE; - } - - /* no previous values in stack */ - if (sk->data.dir_hash == NULL) { - sk->data.dir_hash = in; - sk->num += 1; - return WOLFSSL_SUCCESS; - } - - /* stack already has value(s) create a new node and add more */ - node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL, - DYNAMIC_TYPE_OPENSSL); - if (node == NULL) { - WOLFSSL_MSG("Memory error"); - return WOLFSSL_FAILURE; - } - XMEMSET(node, 0, sizeof(WOLFSSL_STACK)); - - /* push new obj onto head of stack */ - node->data.dir_hash = sk->data.dir_hash; - node->next = sk->next; - node->type = sk->type; - sk->next = node; - sk->data.dir_hash = in; - sk->num += 1; - - return WOLFSSL_SUCCESS; -} -/* create an instance of WOLFSSL_BY_DIR_entry structure */ -WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void) -{ - WOLFSSL_BY_DIR_entry* entry; - - WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new"); - - entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL, - DYNAMIC_TYPE_OPENSSL); - - if (entry) { - XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry)); - } - return entry; -} -/* release a WOLFSSL_BY_DIR_entry resource */ -void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry) -{ - WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free"); - - if (entry == NULL) - return; - - if (entry->hashes) { - wolfSSL_sk_BY_DIR_HASH_free(entry->hashes); - } - - if (entry->dir_name != NULL) { - XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL); - } - - XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL); -} - -WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void) -{ - WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL); - - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null"); - - if (sk) { - sk->type = STACK_TYPE_BY_DIR_entry; - } - return sk; -} -/* return a number of WOLFSSL_BY_DIR_entry in stack */ -int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk) -{ - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num"); - - if (sk == NULL) - return -1; - return (int)sk->num; -} -/* return WOLFSSL_BY_DIR_entry instance at i */ -WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value( - const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i) -{ - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value"); - - for (; sk != NULL && i > 0; i--) - sk = sk->next; - - if (i != 0 || sk == NULL) - return NULL; - return sk->data.dir_entry; -} -/* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */ -WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop( - WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk) -{ - WOLFSSL_STACK* node; - WOLFSSL_BY_DIR_entry* entry; - - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop"); - - if (sk == NULL) { - return NULL; - } - - node = sk->next; - entry = sk->data.dir_entry; - - if (node != NULL) { /* update sk and remove node from stack */ - sk->data.dir_entry = node->data.dir_entry; - sk->next = node->next; - wolfSSL_sk_free_node(node); - } - else { /* last x509 in stack */ - sk->data.dir_entry = NULL; - } - - if (sk->num > 0) { - sk->num -= 1; - } - - return entry; -} -/* release all contents in stack, and then release stack itself */ -/* it uses function when it is passed */ -void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk, - void (*f) (WOLFSSL_BY_DIR_entry*)) -{ - WOLFSSL_STACK* node; - - WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free"); - - if (sk == NULL) { - return; - } - - /* parse through stack freeing each node */ - node = sk->next; - while (node && sk->num > 1) { - WOLFSSL_STACK* tmp = node; - node = node->next; - - if (f) - f(tmp->data.dir_entry); - else - wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry); - tmp->data.dir_entry = NULL; - XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL); - sk->num -= 1; - } - - /* free head of stack */ - if (sk->num == 1) { - if (f) - f(sk->data.dir_entry); - else - wolfSSL_BY_DIR_entry_free(sk->data.dir_entry); - sk->data.dir_entry = NULL; - } - XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL); -} -/* release all contents in stack, and then release stack itself */ -void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk) -{ - wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL); -} - -/* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and - * tries to free it when the stack is free'd. - * - * return 1 on success 0 on fail - */ -int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk, - WOLFSSL_BY_DIR_entry* in) -{ - WOLFSSL_STACK* node; - - if (sk == NULL || in == NULL) { - return WOLFSSL_FAILURE; - } - - /* no previous values in stack */ - if (sk->data.dir_entry == NULL) { - sk->data.dir_entry = in; - sk->num += 1; - return WOLFSSL_SUCCESS; - } - - /* stack already has value(s) create a new node and add more */ - node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL, - DYNAMIC_TYPE_OPENSSL); - if (node == NULL) { - WOLFSSL_MSG("Memory error"); - return WOLFSSL_FAILURE; - } - XMEMSET(node, 0, sizeof(WOLFSSL_STACK)); - - /* push new obj onto head of stack */ - node->data.dir_entry = sk->data.dir_entry; - node->next = sk->next; - node->type = sk->type; - sk->next = node; - sk->data.dir_entry = in; - sk->num += 1; - - return WOLFSSL_SUCCESS; -} - -#endif /* OPENSSL_ALL */ - int wolfSSL_sk_X509_INFO_num(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk) { WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_num"); diff --git a/tests/api.c b/tests/api.c index 8f7b7121b..5f38b6446 100644 --- a/tests/api.c +++ b/tests/api.c @@ -25732,138 +25732,6 @@ static void test_wolfSSL_X509_NAME(void) #endif /* defined(OPENSSL_EXTRA) && !defined(NO_DES3) */ } -static void test_wolfSSL_sk_X509_BY_DIR_HASH(void) -{ -#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) - STACK_OF(WOLFSSL_BY_DIR_HASH) *hash_stack; - WOLFSSL_BY_DIR_HASH *hash1; - WOLFSSL_BY_DIR_HASH *hash2; - WOLFSSL_BY_DIR_HASH *h; - const unsigned long dummy_hash[2] = { - 0x12345678, - 0x9abcdef0 - }; - int i, num; - - printf(testingFmt, "test_wolfSSL_sk_X509_BY_DIR_HASH"); - - /* new */ - AssertNotNull(hash1 = wolfSSL_BY_DIR_HASH_new()); - hash1->hash_value = dummy_hash[0]; - - AssertNotNull(hash2 = wolfSSL_BY_DIR_HASH_new()); - hash2->hash_value = dummy_hash[1]; - - AssertNotNull(hash_stack = wolfSSL_sk_BY_DIR_HASH_new_null()); - - /* push */ - AssertIntEQ(wolfSSL_sk_BY_DIR_HASH_push(NULL, NULL), - WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_sk_BY_DIR_HASH_push(NULL, hash1), - WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_sk_BY_DIR_HASH_push(hash_stack, NULL), - WOLFSSL_FAILURE); - - AssertIntEQ(wolfSSL_sk_BY_DIR_HASH_push(hash_stack, hash1), - WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_sk_BY_DIR_HASH_push(hash_stack, - hash2), WOLFSSL_SUCCESS); - /* num and value */ - AssertIntEQ((num = wolfSSL_sk_BY_DIR_HASH_num(hash_stack)), 2); - for (i = 0; i < num; i++) { - AssertNotNull(h = wolfSSL_sk_BY_DIR_HASH_value(hash_stack, i)); - AssertTrue(h->hash_value == dummy_hash[num - i - 1]); - } - - /* pop */ - AssertNotNull(h = wolfSSL_sk_BY_DIR_HASH_pop(hash_stack)); - AssertIntEQ((num = wolfSSL_sk_BY_DIR_HASH_num(hash_stack)), 1); - - /* find */ - AssertIntEQ(wolfSSL_sk_BY_DIR_HASH_find(NULL, NULL), - WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_sk_BY_DIR_HASH_find(NULL, hash1), - WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_sk_BY_DIR_HASH_find(hash_stack, NULL), - WOLFSSL_FAILURE); - - AssertIntEQ(wolfSSL_sk_BY_DIR_HASH_push(hash_stack, hash2), - 1); - - /* free */ - wolfSSL_sk_BY_DIR_HASH_free(hash_stack); - - printf(resultFmt, passed); -#endif -} - - -static void test_wolfSSL_sk_X509_BY_DIR(void) -{ -#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) - STACK_OF(WOLFSSL_BY_DIR_entry) *entry_stack; - WOLFSSL_BY_DIR_entry *entry1; - WOLFSSL_BY_DIR_entry *entry2; - WOLFSSL_BY_DIR_entry *ent; - const char* dummy_dir[2] = { - "/hoge/hoge/foo/foo", - "/foo1/hoge2/abc/defg" - }; - int i, num; - size_t len; - - printf(testingFmt, "test_wolfSSL_X509_sk_BY_DIR"); - - /* new */ - AssertNotNull(entry1 = wolfSSL_BY_DIR_entry_new()); - len = XSTRLEN(dummy_dir[0]); - entry1->dir_name = (char*)XMALLOC(len + 1, NULL, DYNAMIC_TYPE_OPENSSL); - AssertNotNull(entry1->dir_name); - XMEMSET(entry1->dir_name, 0, len + 1); - XSTRNCPY(entry1->dir_name, dummy_dir[0], len + 1); - - AssertNotNull(entry2 = wolfSSL_BY_DIR_entry_new()); - len = XSTRLEN(dummy_dir[1]); - entry2->dir_name = (char*)XMALLOC(len + 1, NULL, DYNAMIC_TYPE_OPENSSL); - AssertNotNull(entry2->dir_name); - XMEMSET(entry2->dir_name, 0, len + 1); - XSTRNCPY(entry2->dir_name, dummy_dir[1], len + 1); - - AssertNotNull(entry_stack = wolfSSL_sk_BY_DIR_entry_new_null()); - - /* push */ - AssertIntEQ(wolfSSL_sk_BY_DIR_entry_push(NULL, NULL), - WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_sk_BY_DIR_entry_push(NULL, entry1), - WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_sk_BY_DIR_entry_push(entry_stack, NULL), - WOLFSSL_FAILURE); - - AssertIntEQ(wolfSSL_sk_BY_DIR_entry_push(entry_stack, entry1), - WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_sk_BY_DIR_entry_push(entry_stack, - entry2), WOLFSSL_SUCCESS); - /* num and value */ - AssertIntEQ((num = wolfSSL_sk_BY_DIR_entry_num(entry_stack)), 2); - for (i = 0; i < num; i++) { - AssertNotNull(ent = wolfSSL_sk_BY_DIR_entry_value(entry_stack, i)); - len = XSTRLEN(dummy_dir[num - i - 1]); - AssertTrue(XSTRLEN(ent->dir_name) == len); - AssertIntEQ(XSTRNCMP(ent->dir_name, dummy_dir[num - i - 1], len), 0); - } - - /* pop */ - AssertNotNull(ent = wolfSSL_sk_BY_DIR_entry_pop(entry_stack)); - AssertIntEQ((len = wolfSSL_sk_BY_DIR_entry_num(entry_stack)), 1); - wolfSSL_BY_DIR_entry_free(ent); - - /* free */ - wolfSSL_sk_BY_DIR_entry_free(entry_stack); - - printf(resultFmt, passed); -#endif -} - #ifndef NO_BIO static void test_wolfSSL_X509_INFO(void) { @@ -28177,12 +28045,10 @@ static void test_wolfSSL_X509_LOOKUP_ctrl_hash_dir(void) char *p; X509_STORE* str; X509_LOOKUP* lookup; - WOLFSSL_BY_DIR_entry *dir; WOLFSSL_STACK* sk = NULL; - int num = 0, len, total_len, i; + int len, total_len, i; (void) sk; - (void) num; printf(testingFmt, "test_wolfSSL_X509_LOOKUP_ctrl_hash_dir()"); @@ -28203,13 +28069,6 @@ static void test_wolfSSL_X509_LOOKUP_ctrl_hash_dir(void) AssertIntEQ(X509_LOOKUP_ctrl(lookup, X509_L_ADD_DIR, "./", SSL_FILETYPE_PEM,NULL), 1); AssertNotNull(sk = lookup->dirs->dir_entry); - AssertIntEQ((num = wolfSSL_sk_BY_DIR_entry_num(sk)), 1); - - dir = wolfSSL_sk_BY_DIR_entry_value(sk, 0); - AssertIntEQ(XSTRLEN((const char*)dir->dir_name), XSTRLEN("./")); - AssertIntEQ(XMEMCMP(dir->dir_name, "./", - XSTRLEN((const char*)dir->dir_name)), 0); - /* free store */ X509_STORE_free(str); @@ -28230,14 +28089,6 @@ static void test_wolfSSL_X509_LOOKUP_ctrl_hash_dir(void) AssertIntEQ(X509_LOOKUP_ctrl(lookup, X509_L_ADD_DIR, CertCrl_path, SSL_FILETYPE_PEM,NULL), 1); AssertNotNull(sk = lookup->dirs->dir_entry); - AssertIntEQ((num = wolfSSL_sk_BY_DIR_entry_num(sk)), MAX_DIR); - - for(i = 0; idir_name), XSTRLEN(paths[i])); - AssertIntEQ(XMEMCMP(dir->dir_name, paths[i], - XSTRLEN((const char*)dir->dir_name)), 0); - } X509_STORE_free(str); @@ -42057,8 +41908,6 @@ void ApiTest(void) #ifndef NO_BIO test_wolfSSL_X509_INFO(); #endif - test_wolfSSL_sk_X509_BY_DIR_HASH(); - test_wolfSSL_sk_X509_BY_DIR(); test_wolfSSL_X509_subject_name_hash(); test_wolfSSL_X509_issuer_name_hash(); test_wolfSSL_X509_check_host(); diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 14a95d165..2ac3904b6 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4824,6 +4824,37 @@ WOLFSSL_LOCAL void FreeKey(WOLFSSL* ssl, int type, void** pKey); WOLFSSL_LOCAL int LoadCrlCertByIssuer(WOLFSSL_X509_STORE* store, X509_NAME* issuer, int Type); #endif +#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) +WOLFSSL_LOCAL WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void); +WOLFSSL_LOCAL void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash); +WOLFSSL_LOCAL WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void); +WOLFSSL_LOCAL int wolfSSL_sk_BY_DIR_HASH_find( + WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind); +WOLFSSL_LOCAL int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk); +WOLFSSL_LOCAL WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value( + const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i); +WOLFSSL_LOCAL WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop( + WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk); +WOLFSSL_LOCAL void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, + void (*f) (WOLFSSL_BY_DIR_HASH*)); +WOLFSSL_LOCAL void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk); +WOLFSSL_LOCAL int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, + WOLFSSL_BY_DIR_HASH* in); +/* WOLFSSL_BY_DIR_entry stuff */ +WOLFSSL_LOCAL WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void); +WOLFSSL_LOCAL void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry); +WOLFSSL_LOCAL WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void); +WOLFSSL_LOCAL int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk); +WOLFSSL_LOCAL WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value( + const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i); +WOLFSSL_LOCAL WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop( + WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk); +WOLFSSL_LOCAL void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry)* sk, + void (*f) (WOLFSSL_BY_DIR_entry*)); +WOLFSSL_LOCAL void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk); +WOLFSSL_LOCAL int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(wolfSSL_BY_DIR_entry)* sk, + WOLFSSL_BY_DIR_entry* in); +#endif /* OPENSSL_ALL && !NO_FILESYSTEM && !NO_WOLFSSL_DIR */ #ifdef __cplusplus } /* extern "C" */ diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 22ea2f5a4..961b1fb1a 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -3851,38 +3851,6 @@ WOLFSSL_API int wolfSSL_sk_CONF_VALUE_push(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk WOLFSSL_CONF_VALUE* val); #endif /* OPENSSL_ALL || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || HAVE_LIGHTY */ -#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) -WOLFSSL_API WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void); -WOLFSSL_API void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash); -WOLFSSL_API WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void); -WOLFSSL_API int wolfSSL_sk_BY_DIR_HASH_find( - WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind); -WOLFSSL_API int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk); -WOLFSSL_API WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value( - const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i); -WOLFSSL_API WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop( - WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk); -WOLFSSL_API void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, - void (*f) (WOLFSSL_BY_DIR_HASH*)); -WOLFSSL_API void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk); -WOLFSSL_API int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, - WOLFSSL_BY_DIR_HASH* in); -/* WOLFSSL_BY_DIR_entry stuff */ -WOLFSSL_API WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void); -WOLFSSL_API void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry); -WOLFSSL_API WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void); -WOLFSSL_API int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk); -WOLFSSL_API WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value( - const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i); -WOLFSSL_API WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop( - WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk); -WOLFSSL_API void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry)* sk, - void (*f) (WOLFSSL_BY_DIR_entry*)); -WOLFSSL_API void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk); -WOLFSSL_API int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(wolfSSL_BY_DIR_entry)* sk, - WOLFSSL_BY_DIR_entry* in); -#endif /* OPENSSL_ALL && !NO_FILESYSTEM && !NO_WOLFSSL_DIR */ - #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) WOLFSSL_API WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void); WOLFSSL_API void wolfSSL_ASN1_BIT_STRING_free(WOLFSSL_ASN1_BIT_STRING*);