diff --git a/src/ssl.c b/src/ssl.c index 07cfe7f34..2e04c5141 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -16548,563 +16548,6 @@ int wolfSSL_set_compression(WOLFSSL* ssl) #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */ -#ifdef OPENSSL_EXTRA -#ifndef NO_BIO - WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void) - { - static WOLFSSL_BIO_METHOD meth; - - WOLFSSL_ENTER("wolfSSL_BIO_f_md"); - meth.type = WOLFSSL_BIO_MD; - - return &meth; - } - - /* return the context and initialize the BIO state */ - int wolfSSL_BIO_get_md_ctx(WOLFSSL_BIO *bio, WOLFSSL_EVP_MD_CTX **mdcp) - { - int ret = WOLFSSL_FAILURE; - - if ((bio != NULL) && (mdcp != NULL)) { - *mdcp = (WOLFSSL_EVP_MD_CTX*)bio->ptr; - ret = WOLFSSL_SUCCESS; - } - - return ret; - } - - WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void) - { - static WOLFSSL_BIO_METHOD meth; - - WOLFSSL_ENTER("BIO_f_buffer"); - meth.type = WOLFSSL_BIO_BUFFER; - - return &meth; - } - - #ifndef NO_WOLFSSL_STUB - long wolfSSL_BIO_set_write_buffer_size(WOLFSSL_BIO* bio, long size) - { - /* wolfSSL has internal buffer, compatibility only */ - WOLFSSL_ENTER("BIO_set_write_buffer_size"); - WOLFSSL_MSG("Buffer resize failed"); - WOLFSSL_STUB("BIO_set_write_buffer_size"); - (void)bio; - (void) size; - - /* Even though this is only a STUB at the moment many user applications - * may attempt to use this. OpenSSL documentation specifies the return - * "return 1 if the buffer was successfully resized or 0 for failure." - * since wolfSSL does not resize the buffer will always return failure - * by default due to memory concerns until this stub is promoted to - * a non-stub function */ - return WOLFSSL_FAILURE; /* 0, no resize happened */ - } - #endif - - WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_bio(void) - { - static WOLFSSL_BIO_METHOD bio_meth; - - WOLFSSL_ENTER("wolfSSL_BIO_s_bio"); - bio_meth.type = WOLFSSL_BIO_BIO; - - return &bio_meth; - } - - -#ifndef NO_FILESYSTEM - WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_file(void) - { - static WOLFSSL_BIO_METHOD file_meth; - - WOLFSSL_ENTER("wolfSSL_BIO_s_file"); - file_meth.type = WOLFSSL_BIO_FILE; - - return &file_meth; - } -#endif - - - WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_ssl(void) - { - static WOLFSSL_BIO_METHOD meth; - - WOLFSSL_ENTER("wolfSSL_BIO_f_ssl"); - meth.type = WOLFSSL_BIO_SSL; - - return &meth; - } - - - WOLFSSL_BIO_METHOD *wolfSSL_BIO_s_socket(void) - { - static WOLFSSL_BIO_METHOD meth; - - WOLFSSL_ENTER("wolfSSL_BIO_s_socket"); - meth.type = WOLFSSL_BIO_SOCKET; - - return &meth; - } - - - WOLFSSL_BIO* wolfSSL_BIO_new_socket(int sfd, int closeF) - { - WOLFSSL_BIO* bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket()); - - WOLFSSL_ENTER("BIO_new_socket"); - if (bio) { - bio->type = WOLFSSL_BIO_SOCKET; - bio->shutdown = (byte)closeF; - bio->num = sfd; - } - return bio; - } - - /** - * Create new socket BIO object. This is a pure TCP connection with - * no SSL or TLS protection. - * @param str IP address to connect to - * @return New BIO object or NULL on failure - */ - WOLFSSL_BIO *wolfSSL_BIO_new_connect(const char *str) - { - WOLFSSL_BIO *bio; - const char* port; - WOLFSSL_ENTER("wolfSSL_BIO_new_connect"); - bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket()); - if (bio) { - port = XSTRSTR(str, ":"); - - if (port != NULL) - bio->port = XATOI(port + 1); - else - port = str + XSTRLEN(str); /* point to null terminator */ - - bio->ip = (char*)XMALLOC(1 + port - str, bio->heap, - DYNAMIC_TYPE_OPENSSL); - XMEMCPY(bio->ip, str, port - str); - bio->ip[port - str] = '\0'; - bio->type = WOLFSSL_BIO_SOCKET; - } - return bio; - } - - /** - * Create new socket BIO object. This is a pure TCP connection with - * no SSL or TLS protection. - * @param str IP address to connect to - * @return New BIO object or NULL on failure - */ - WOLFSSL_BIO *wolfSSL_BIO_new_accept(const char *port) - { - WOLFSSL_BIO *bio; - WOLFSSL_ENTER("wolfSSL_BIO_new_accept"); - bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket()); - if (bio) { - bio->port = XATOI(port); - bio->type = WOLFSSL_BIO_SOCKET; - } - return bio; - } - - /** - * Set the port to connect to in the BIO object - * @param b BIO object - * @param port destination port - * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure - */ - long wolfSSL_BIO_set_conn_port(WOLFSSL_BIO *b, char* port) - { - int p; - WOLFSSL_ENTER("wolfSSL_BIO_set_conn_port"); - - if (!b || !port) { - WOLFSSL_ENTER("Bad parameter"); - return WOLFSSL_FAILURE; - } - - p = XATOI(port); - if (!p || p < 0) { - WOLFSSL_ENTER("Port parsing error"); - return WOLFSSL_FAILURE; - } - - b->port = (word16)p; - return WOLFSSL_SUCCESS; - } - -#ifdef HAVE_HTTP_CLIENT - /** - * Attempt to connect to the destination address and port - * @param b BIO object - * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure - */ - long wolfSSL_BIO_do_connect(WOLFSSL_BIO *b) - { - SOCKET_T sfd = SOCKET_INVALID; - WOLFSSL_ENTER("wolfSSL_BIO_do_connect"); - - if (!b) { - WOLFSSL_ENTER("Bad parameter"); - return WOLFSSL_FAILURE; - } - - while (b && b->type != WOLFSSL_BIO_SOCKET) - b = b->next; - - if (!b) { - WOLFSSL_ENTER("No socket BIO in chain"); - return WOLFSSL_FAILURE; - } - - if (wolfIO_TcpConnect(&sfd, b->ip, b->port, 0) < 0 ) { - WOLFSSL_ENTER("wolfIO_TcpConnect error"); - return WOLFSSL_FAILURE; - } - - b->num = sfd; - b->shutdown = BIO_CLOSE; - return WOLFSSL_SUCCESS; - } - - int wolfSSL_BIO_do_accept(WOLFSSL_BIO *b) - { - SOCKET_T sfd = SOCKET_INVALID; - WOLFSSL_ENTER("wolfSSL_BIO_do_accept"); - - if (!b) { - WOLFSSL_ENTER("Bad parameter"); - return WOLFSSL_FAILURE; - } - - while (b && b->type != WOLFSSL_BIO_SOCKET) - b = b->next; - - if (!b) { - WOLFSSL_ENTER("No socket BIO in chain"); - return WOLFSSL_FAILURE; - } - - if (b->num == SOCKET_INVALID) { - if (wolfIO_TcpBind(&sfd, b->port) < 0) { - WOLFSSL_ENTER("wolfIO_TcpBind error"); - return WOLFSSL_FAILURE; - } - b->num = sfd; - b->shutdown = BIO_CLOSE; - } - else { - WOLFSSL_BIO* new_bio; - int newfd = wolfIO_TcpAccept(b->num, NULL, NULL); - if (newfd < 0) { - WOLFSSL_ENTER("wolfIO_TcpBind error"); - return WOLFSSL_FAILURE; - } - /* Create a socket BIO for using the accept'ed connection */ - new_bio = wolfSSL_BIO_new_socket(newfd, BIO_CLOSE); - if (new_bio == NULL) { - WOLFSSL_ENTER("wolfSSL_BIO_new_socket error"); - CloseSocket(newfd); - return WOLFSSL_FAILURE; - } - wolfSSL_BIO_set_callback(new_bio, - wolfSSL_BIO_get_callback(b)); - wolfSSL_BIO_set_callback_arg(new_bio, - wolfSSL_BIO_get_callback_arg(b)); - /* Push onto bio chain for user retrieval */ - if (wolfSSL_BIO_push(b, new_bio) == NULL) { - WOLFSSL_ENTER("wolfSSL_BIO_push error"); - CloseSocket(newfd); - return WOLFSSL_FAILURE; - } - } - - return WOLFSSL_SUCCESS; - } -#endif /* HAVE_HTTP_CLIENT */ - - int wolfSSL_BIO_eof(WOLFSSL_BIO* b) - { - WOLFSSL_ENTER("BIO_eof"); - if ((b != NULL) && (b->eof)) - return 1; - - return 0; - } - - long wolfSSL_BIO_do_handshake(WOLFSSL_BIO *b) - { - WOLFSSL_ENTER("wolfSSL_BIO_do_handshake"); - if (b == NULL) { - WOLFSSL_MSG("Bad parameter"); - return WOLFSSL_FAILURE; - } - if (b->type == WOLFSSL_BIO_SSL && b->ptr != NULL) { - return wolfSSL_negotiate((WOLFSSL*)b->ptr); - } - else { - WOLFSSL_MSG("Not SSL BIO or no SSL object set"); - return WOLFSSL_FAILURE; - } - } - - long wolfSSL_BIO_set_ssl(WOLFSSL_BIO* b, WOLFSSL* ssl, int closeF) - { - long ret = WOLFSSL_FAILURE; - - WOLFSSL_ENTER("wolfSSL_BIO_set_ssl"); - - if (b != NULL) { - b->ptr = ssl; - b->shutdown = (byte)closeF; - if (b->next != NULL) - wolfSSL_set_bio(ssl, b->next, b->next); - /* add to ssl for bio free if SSL_free called before/instead of free_all? */ - ret = WOLFSSL_SUCCESS; - } - - return ret; - } - -#ifndef NO_FILESYSTEM - long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int closeF) - { - WOLFSSL_ENTER("wolfSSL_BIO_set_fd"); - - if (b != NULL) { - b->num = fd; - b->shutdown = (byte)closeF; - } - - return WOLFSSL_SUCCESS; - } -#endif - - /* Sets the close flag */ - int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag) - { - WOLFSSL_ENTER("wolfSSL_BIO_set_close"); - if (b != NULL) { - b->shutdown = (byte)flag; - } - - return WOLFSSL_SUCCESS; - } - -#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L - WOLFSSL_BIO* wolfSSL_BIO_new(const WOLFSSL_BIO_METHOD* method) -#else - WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD* method) -#endif - { - WOLFSSL_BIO* bio; - - WOLFSSL_ENTER("wolfSSL_BIO_new"); - if (method == NULL) { - WOLFSSL_MSG("Bad method pointer passed in"); - return NULL; - } - - bio = (WOLFSSL_BIO*) XMALLOC(sizeof(WOLFSSL_BIO), 0, - DYNAMIC_TYPE_OPENSSL); - if (bio) { - XMEMSET(bio, 0, sizeof(WOLFSSL_BIO)); - bio->type = (byte)method->type; -#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L - bio->method = (WOLFSSL_BIO_METHOD*)method; -#else - bio->method = method; -#endif - bio->shutdown = BIO_CLOSE; /* default to close things */ - bio->num = SOCKET_INVALID; /* Default to invalid socket */ - bio->init = 1; - if (method->type != WOLFSSL_BIO_FILE && - method->type != WOLFSSL_BIO_SOCKET && - method->type != WOLFSSL_BIO_MD) { - bio->mem_buf =(WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM), - 0, DYNAMIC_TYPE_OPENSSL); - if (bio->mem_buf == NULL) { - WOLFSSL_MSG("Memory error"); - wolfSSL_BIO_free(bio); - return NULL; - } - bio->mem_buf->data = (char*)bio->ptr; - } - - if (method->type == WOLFSSL_BIO_MD) { - bio->ptr = wolfSSL_EVP_MD_CTX_new(); - if (bio->ptr == NULL) { - WOLFSSL_MSG("Memory error"); - wolfSSL_BIO_free(bio); - return NULL; - } - } - - /* check if is custom method */ - if (method->createCb) { - method->createCb(bio); - } - } - return bio; - } - - WOLFSSL_BIO* wolfSSL_BIO_new_mem_buf(const void* buf, int len) - { - WOLFSSL_BIO* bio = NULL; - - if (buf == NULL) { - return bio; - } - - bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem()); - if (bio == NULL) { - return bio; - } - - if (len < 0) { - /* The length of the string including terminating null. */ - len = (int)XSTRLEN((const char*)buf) + 1; - } - bio->num = bio->wrSz = len; - bio->ptr = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL); - if (bio->ptr == NULL) { - wolfSSL_BIO_free(bio); - return NULL; - } - if (bio->mem_buf != NULL) { - bio->mem_buf->data = (char*)bio->ptr; - bio->mem_buf->length = bio->num; - } - - XMEMCPY(bio->ptr, buf, len); - - return bio; - } - - /* - * Note : If the flag BIO_NOCLOSE is set then freeing memory buffers is up - * to the application. - * Returns 1 on success, 0 on failure - */ - int wolfSSL_BIO_free(WOLFSSL_BIO* bio) - { - int ret; - - /* unchain?, doesn't matter in goahead since from free all */ - WOLFSSL_ENTER("wolfSSL_BIO_free"); - if (bio) { -#ifdef HAVE_EX_DATA_CLEANUP_HOOKS - wolfSSL_CRYPTO_cleanup_ex_data(&bio->ex_data); -#endif - if (bio->infoCb) { - /* info callback is called before free */ - ret = (int)bio->infoCb(bio, WOLFSSL_BIO_CB_FREE, NULL, 0, 0, 1); - if (ret <= 0) { - return ret; - } - } - - /* call custom set free callback */ - if (bio->method && bio->method->freeCb) { - bio->method->freeCb(bio); - } - - /* remove from pair by setting the paired bios pair to NULL */ - if (bio->pair != NULL) { - bio->pair->pair = NULL; - } - - if (bio->ip != NULL) { - XFREE(bio->ip, bio->heap, DYNAMIC_TYPE_OPENSSL); - } - - if (bio->shutdown) { - if (bio->type == WOLFSSL_BIO_SSL && bio->ptr) - wolfSSL_free((WOLFSSL*)bio->ptr); - #ifdef CloseSocket - if (bio->type == WOLFSSL_BIO_SOCKET && bio->num) - CloseSocket(bio->num); - #endif - } - - #ifndef NO_FILESYSTEM - if (bio->type == WOLFSSL_BIO_FILE && bio->shutdown == BIO_CLOSE) { - if (bio->ptr) { - XFCLOSE((XFILE)bio->ptr); - } - #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR)\ - && !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2) - else if (bio->num != SOCKET_INVALID) { - XCLOSE(bio->num); - } - #endif - } - #endif - - if (bio->shutdown != BIO_NOCLOSE) { - if (bio->type == WOLFSSL_BIO_MEMORY && bio->ptr != NULL) { - if (bio->mem_buf != NULL) { - if (bio->mem_buf->data != (char*)bio->ptr) { - XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL); - bio->ptr = NULL; - } - } - else { - XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL); - bio->ptr = NULL; - } - } - if (bio->mem_buf != NULL) { - wolfSSL_BUF_MEM_free(bio->mem_buf); - bio->mem_buf = NULL; - } - } - - if (bio->type == WOLFSSL_BIO_MD) { - wolfSSL_EVP_MD_CTX_free((WOLFSSL_EVP_MD_CTX*)bio->ptr); - } - - XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL); - return WOLFSSL_SUCCESS; - } - return WOLFSSL_FAILURE; - } - - /* like BIO_free, but no return value */ - void wolfSSL_BIO_vfree(WOLFSSL_BIO* bio) - { - wolfSSL_BIO_free(bio); - } - - - void wolfSSL_BIO_free_all(WOLFSSL_BIO* bio) - { - WOLFSSL_ENTER("BIO_free_all"); - while (bio) { - WOLFSSL_BIO* next = bio->next; - wolfSSL_BIO_free(bio); - bio = next; - } - } - - - WOLFSSL_BIO* wolfSSL_BIO_push(WOLFSSL_BIO* top, WOLFSSL_BIO* append) - { - WOLFSSL_ENTER("BIO_push"); - top->next = append; - append->prev = top; - - /* SSL BIO's should use the next object in the chain for IO */ - if (top->type == WOLFSSL_BIO_SSL && top->ptr) - wolfSSL_set_bio((WOLFSSL*)top->ptr, append, append); - - return top; - } -#endif /* !NO_BIO */ -#endif /* OPENSSL_EXTRA */ - #ifdef WOLFSSL_ENCRYPTED_KEYS void wolfSSL_CTX_set_default_passwd_cb_userdata(WOLFSSL_CTX* ctx, @@ -24405,164 +23848,6 @@ void wolfSSL_MD4_Final(unsigned char* digest, WOLFSSL_MD4_CTX* md4) #endif /* NO_MD4 */ - -#ifndef NO_BIO - -/* Removes a WOLFSSL_BIO struct from the WOLFSSL_BIO linked list. - * - * bio is the WOLFSSL_BIO struct in the list and removed. - * - * The return WOLFSSL_BIO struct is the next WOLFSSL_BIO in the list or NULL if - * there is none. - */ -WOLFSSL_BIO* wolfSSL_BIO_pop(WOLFSSL_BIO* bio) -{ - if (bio == NULL) { - WOLFSSL_MSG("Bad argument passed in"); - return NULL; - } - - if (bio->prev != NULL) { - bio->prev->next = bio->next; - } - - if (bio->next != NULL) { - bio->next->prev = bio->prev; - } - - return bio->next; -} - - - -WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_mem(void) -{ - static WOLFSSL_BIO_METHOD meth; - - WOLFSSL_ENTER("wolfSSL_BIO_s_mem"); - meth.type = WOLFSSL_BIO_MEMORY; - - return &meth; -} - - -WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_base64(void) -{ - static WOLFSSL_BIO_METHOD meth; - - WOLFSSL_ENTER("wolfSSL_BIO_f_base64"); - meth.type = WOLFSSL_BIO_BASE64; - - return &meth; -} - - -/* Set the flag for the bio. - * - * bio the structure to set the flag in - * flags the flag to use - */ -void wolfSSL_BIO_set_flags(WOLFSSL_BIO* bio, int flags) -{ - WOLFSSL_ENTER("wolfSSL_BIO_set_flags"); - - if (bio != NULL) { - bio->flags |= flags; - } -} - -void wolfSSL_BIO_clear_flags(WOLFSSL_BIO *bio, int flags) -{ - WOLFSSL_ENTER("wolfSSL_BIO_clear_flags"); - if (bio != NULL) { - bio->flags &= ~flags; - } -} - -/* Set ex_data for WOLFSSL_BIO - * - * bio : BIO structure to set ex_data in - * idx : Index of ex_data to set - * data : Data to set in ex_data - * - * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure - */ -int wolfSSL_BIO_set_ex_data(WOLFSSL_BIO *bio, int idx, void *data) -{ - WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data"); -#ifdef HAVE_EX_DATA - if (bio != NULL && idx < MAX_EX_DATA) { - return wolfSSL_CRYPTO_set_ex_data(&bio->ex_data, idx, data); - } -#else - (void)bio; - (void)idx; - (void)data; -#endif - return WOLFSSL_FAILURE; -} - -int wolfSSL_BIO_get_fd(WOLFSSL_BIO *bio, int* fd) -{ - WOLFSSL_ENTER("wolfSSL_BIO_get_fd"); - - if (bio != NULL) { - if (fd != NULL) - *fd = bio->num; - return bio->num; - } - - return SOCKET_INVALID; -} - -#ifdef HAVE_EX_DATA_CLEANUP_HOOKS -/* Set ex_data for WOLFSSL_BIO - * - * bio : BIO structure to set ex_data in - * idx : Index of ex_data to set - * data : Data to set in ex_data - * cleanup_routine : Function pointer to clean up data - * - * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure - */ -int wolfSSL_BIO_set_ex_data_with_cleanup( - WOLFSSL_BIO *bio, - int idx, - void *data, - wolfSSL_ex_data_cleanup_routine_t cleanup_routine) -{ - WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data_with_cleanup"); - if (bio != NULL && idx < MAX_EX_DATA) { - return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&bio->ex_data, idx, data, - cleanup_routine); - } - return WOLFSSL_FAILURE; -} -#endif /* HAVE_EX_DATA_CLEANUP_HOOKS */ - -/* Get ex_data in WOLFSSL_BIO at given index - * - * bio : BIO structure to get ex_data from - * idx : Index of ex_data to get data from - * - * Returns void pointer to ex_data on success or NULL on failure - */ -void *wolfSSL_BIO_get_ex_data(WOLFSSL_BIO *bio, int idx) -{ - WOLFSSL_ENTER("wolfSSL_BIO_get_ex_data"); -#ifdef HAVE_EX_DATA - if (bio != NULL && idx < MAX_EX_DATA && idx >= 0) { - return wolfSSL_CRYPTO_get_ex_data(&bio->ex_data, idx); - } -#else - (void)bio; - (void)idx; -#endif - return NULL; -} - -#endif /* !NO_BIO */ - #ifndef NO_WOLFSSL_STUB void wolfSSL_RAND_screen(void) { @@ -55671,15 +54956,45 @@ int wolfSSL_CONF_cmd(WOLFSSL_CONF_CTX* cctx, const char* cmd, const char* value) WOLFSSL_BIO *wolfSSL_BIO_new_connect(const char *str) { WOLFSSL_BIO *bio; + const char* port; WOLFSSL_ENTER("wolfSSL_BIO_new_connect"); bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket()); if (bio) { - bio->ip = str; + port = XSTRSTR(str, ":"); + + if (port != NULL) + bio->port = XATOI(port + 1); + else + port = str + XSTRLEN(str); /* point to null terminator */ + + bio->ip = (char*)XMALLOC(1 + port - str, bio->heap, + DYNAMIC_TYPE_OPENSSL); + XMEMCPY(bio->ip, str, port - str); + bio->ip[port - str] = '\0'; bio->type = WOLFSSL_BIO_SOCKET; } return bio; } + /** + * Create new socket BIO object. This is a pure TCP connection with + * no SSL or TLS protection. + * @param str IP address to connect to + * @return New BIO object or NULL on failure + */ + WOLFSSL_BIO *wolfSSL_BIO_new_accept(const char *port) + { + WOLFSSL_BIO *bio; + WOLFSSL_ENTER("wolfSSL_BIO_new_accept"); + bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket()); + if (bio) { + bio->port = XATOI(port); + bio->type = WOLFSSL_BIO_SOCKET; + } + return bio; + } + + /** * Set the port to connect to in the BIO object * @param b BIO object @@ -55739,6 +55054,61 @@ int wolfSSL_CONF_cmd(WOLFSSL_CONF_CTX* cctx, const char* cmd, const char* value) b->shutdown = BIO_CLOSE; return WOLFSSL_SUCCESS; } + + int wolfSSL_BIO_do_accept(WOLFSSL_BIO *b) + { + SOCKET_T sfd = SOCKET_INVALID; + WOLFSSL_ENTER("wolfSSL_BIO_do_accept"); + + if (!b) { + WOLFSSL_ENTER("Bad parameter"); + return WOLFSSL_FAILURE; + } + + while (b && b->type != WOLFSSL_BIO_SOCKET) + b = b->next; + + if (!b) { + WOLFSSL_ENTER("No socket BIO in chain"); + return WOLFSSL_FAILURE; + } + + if (b->num == SOCKET_INVALID) { + if (wolfIO_TcpBind(&sfd, b->port) < 0) { + WOLFSSL_ENTER("wolfIO_TcpBind error"); + return WOLFSSL_FAILURE; + } + b->num = sfd; + b->shutdown = BIO_CLOSE; + } + else { + WOLFSSL_BIO* new_bio; + int newfd = wolfIO_TcpAccept(b->num, NULL, NULL); + if (newfd < 0) { + WOLFSSL_ENTER("wolfIO_TcpBind error"); + return WOLFSSL_FAILURE; + } + /* Create a socket BIO for using the accept'ed connection */ + new_bio = wolfSSL_BIO_new_socket(newfd, BIO_CLOSE); + if (new_bio == NULL) { + WOLFSSL_ENTER("wolfSSL_BIO_new_socket error"); + CloseSocket(newfd); + return WOLFSSL_FAILURE; + } + wolfSSL_BIO_set_callback(new_bio, + wolfSSL_BIO_get_callback(b)); + wolfSSL_BIO_set_callback_arg(new_bio, + wolfSSL_BIO_get_callback_arg(b)); + /* Push onto bio chain for user retrieval */ + if (wolfSSL_BIO_push(b, new_bio) == NULL) { + WOLFSSL_ENTER("wolfSSL_BIO_push error"); + CloseSocket(newfd); + return WOLFSSL_FAILURE; + } + } + + return WOLFSSL_SUCCESS; + } #endif /* HAVE_HTTP_CLIENT */ int wolfSSL_BIO_eof(WOLFSSL_BIO* b) @@ -55834,7 +55204,7 @@ int wolfSSL_CONF_cmd(WOLFSSL_CONF_CTX* cctx, const char* cmd, const char* value) bio->method = method; #endif bio->shutdown = BIO_CLOSE; /* default to close things */ - bio->num = -1; /* Default to invalid socket */ + bio->num = SOCKET_INVALID; /* Default to invalid socket */ bio->init = 1; if (method->type != WOLFSSL_BIO_FILE && method->type != WOLFSSL_BIO_SOCKET && @@ -55932,6 +55302,10 @@ int wolfSSL_CONF_cmd(WOLFSSL_CONF_CTX* cctx, const char* cmd, const char* value) bio->pair->pair = NULL; } + if (bio->ip != NULL) { + XFREE(bio->ip, bio->heap, DYNAMIC_TYPE_OPENSSL); + } + if (bio->shutdown) { if (bio->type == WOLFSSL_BIO_SSL && bio->ptr) wolfSSL_free((WOLFSSL*)bio->ptr); @@ -55948,7 +55322,7 @@ int wolfSSL_CONF_cmd(WOLFSSL_CONF_CTX* cctx, const char* cmd, const char* value) } #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR)\ && !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2) - else if (bio->num != -1) { + else if (bio->num != SOCKET_INVALID) { XCLOSE(bio->num); } #endif @@ -56109,6 +55483,19 @@ int wolfSSL_BIO_set_ex_data(WOLFSSL_BIO *bio, int idx, void *data) return WOLFSSL_FAILURE; } +int wolfSSL_BIO_get_fd(WOLFSSL_BIO *bio, int* fd) +{ + WOLFSSL_ENTER("wolfSSL_BIO_get_fd"); + + if (bio != NULL) { + if (fd != NULL) + *fd = bio->num; + return bio->num; + } + + return SOCKET_INVALID; +} + #ifdef HAVE_EX_DATA_CLEANUP_HOOKS /* Set ex_data for WOLFSSL_BIO *