forked from wolfSSL/wolfssl
add bio retry and set close tests
This commit is contained in:
committed by
Eric Blankenhorn
parent
3137312911
commit
65732c2269
14
src/bio.c
14
src/bio.c
@@ -141,14 +141,19 @@ static int wolfSSL_BIO_SSL_read(WOLFSSL_BIO* bio, void* buf,
|
|||||||
if ((front == NULL) || front->eof)
|
if ((front == NULL) || front->eof)
|
||||||
return WOLFSSL_FATAL_ERROR;
|
return WOLFSSL_FATAL_ERROR;
|
||||||
|
|
||||||
|
bio->flags &= ~(WOLFSSL_BIO_FLAG_RETRY); /* default no retry */
|
||||||
ret = wolfSSL_read((WOLFSSL*)bio->ptr, buf, len);
|
ret = wolfSSL_read((WOLFSSL*)bio->ptr, buf, len);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
front->eof = 1;
|
front->eof = 1;
|
||||||
else if (ret < 0) {
|
else if (ret < 0) {
|
||||||
int err = wolfSSL_get_error((WOLFSSL*)bio->ptr, 0);
|
int err = wolfSSL_get_error((WOLFSSL*)bio->ptr, 0);
|
||||||
if ( !(err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) )
|
if ( !(err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) ) {
|
||||||
front->eof = 1;
|
front->eof = 1;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
bio->flags |= WOLFSSL_BIO_FLAG_RETRY; /* should retry */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -335,14 +340,19 @@ static int wolfSSL_BIO_SSL_write(WOLFSSL_BIO* bio, const void* data,
|
|||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bio->flags &= ~(WOLFSSL_BIO_FLAG_RETRY); /* default no retry */
|
||||||
ret = wolfSSL_write((WOLFSSL*)bio->ptr, data, len);
|
ret = wolfSSL_write((WOLFSSL*)bio->ptr, data, len);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
front->eof = 1;
|
front->eof = 1;
|
||||||
else if (ret < 0) {
|
else if (ret < 0) {
|
||||||
int err = wolfSSL_get_error((WOLFSSL*)bio->ptr, 0);
|
int err = wolfSSL_get_error((WOLFSSL*)bio->ptr, 0);
|
||||||
if ( !(err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) )
|
if ( !(err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) ) {
|
||||||
front->eof = 1;
|
front->eof = 1;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
bio->flags |= WOLFSSL_BIO_FLAG_RETRY; /* should retry */
|
||||||
|
}
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* WOLFCRYPT_ONLY */
|
#endif /* WOLFCRYPT_ONLY */
|
||||||
|
102
tests/api.c
102
tests/api.c
@@ -22065,7 +22065,9 @@ static void test_wolfSSL_PEM_read_bio(void)
|
|||||||
AssertNull(x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL));
|
AssertNull(x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL));
|
||||||
AssertNotNull(bio = BIO_new_mem_buf((void*)buff, bytes));
|
AssertNotNull(bio = BIO_new_mem_buf((void*)buff, bytes));
|
||||||
AssertNotNull(x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL));
|
AssertNotNull(x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL));
|
||||||
AssertIntEQ((int)BIO_set_fd(bio, 0, BIO_NOCLOSE), 1);
|
AssertIntEQ((int)BIO_set_fd(bio, 0, BIO_CLOSE), 1);
|
||||||
|
AssertIntEQ(BIO_set_close(bio, BIO_NOCLOSE), 1);
|
||||||
|
AssertIntEQ(BIO_set_close(NULL, BIO_NOCLOSE), 1);
|
||||||
AssertIntEQ(SSL_SUCCESS, BIO_get_mem_ptr(bio, &buf));
|
AssertIntEQ(SSL_SUCCESS, BIO_get_mem_ptr(bio, &buf));
|
||||||
|
|
||||||
BIO_free(bio);
|
BIO_free(bio);
|
||||||
@@ -23923,6 +23925,103 @@ static void test_wolfSSL_BIO_puts(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \
|
||||||
|
!defined(NO_RSA) && defined(HAVE_EXT_CACHE) && \
|
||||||
|
defined(HAVE_IO_TESTS_DEPENDENCIES)
|
||||||
|
static int forceWantRead(WOLFSSL *ssl, char *buf, int sz, void *ctx)
|
||||||
|
{
|
||||||
|
(void)ssl;
|
||||||
|
(void)buf;
|
||||||
|
(void)sz;
|
||||||
|
(void)ctx;
|
||||||
|
return WOLFSSL_CBIO_ERR_WANT_READ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void test_wolfSSL_BIO_should_retry(void)
|
||||||
|
{
|
||||||
|
#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \
|
||||||
|
!defined(NO_RSA) && defined(HAVE_EXT_CACHE) && \
|
||||||
|
defined(HAVE_IO_TESTS_DEPENDENCIES)
|
||||||
|
tcp_ready ready;
|
||||||
|
func_args server_args;
|
||||||
|
THREAD_TYPE serverThread;
|
||||||
|
SOCKET_T sockfd = 0;
|
||||||
|
WOLFSSL_CTX* ctx;
|
||||||
|
WOLFSSL* ssl;
|
||||||
|
char msg[64] = "hello wolfssl!";
|
||||||
|
char reply[1024];
|
||||||
|
int msgSz = (int)XSTRLEN(msg);
|
||||||
|
int ret;
|
||||||
|
BIO* bio;
|
||||||
|
|
||||||
|
printf(testingFmt, "wolfSSL_BIO_should_retry()");
|
||||||
|
|
||||||
|
XMEMSET(&server_args, 0, sizeof(func_args));
|
||||||
|
#ifdef WOLFSSL_TIRTOS
|
||||||
|
fdOpenSession(Task_self());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
StartTCP();
|
||||||
|
InitTcpReady(&ready);
|
||||||
|
|
||||||
|
#if defined(USE_WINDOWS_API)
|
||||||
|
/* use RNG to get random port if using windows */
|
||||||
|
ready.port = GetRandomPort();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
server_args.signal = &ready;
|
||||||
|
start_thread(test_server_nofail, &server_args, &serverThread);
|
||||||
|
wait_tcp_ready(&server_args);
|
||||||
|
|
||||||
|
|
||||||
|
AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()));
|
||||||
|
AssertIntEQ(WOLFSSL_SUCCESS,
|
||||||
|
wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0));
|
||||||
|
AssertIntEQ(WOLFSSL_SUCCESS,
|
||||||
|
wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, SSL_FILETYPE_PEM));
|
||||||
|
AssertIntEQ(WOLFSSL_SUCCESS,
|
||||||
|
wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, SSL_FILETYPE_PEM));
|
||||||
|
tcp_connect(&sockfd, wolfSSLIP, server_args.signal->port, 0, 0, NULL);
|
||||||
|
|
||||||
|
/* force retry */
|
||||||
|
AssertNotNull(ssl = wolfSSL_new(ctx));
|
||||||
|
AssertIntEQ(wolfSSL_set_fd(ssl, sockfd), WOLFSSL_SUCCESS);
|
||||||
|
wolfSSL_SSLSetIORecv(ssl, forceWantRead);
|
||||||
|
|
||||||
|
AssertNotNull(bio = BIO_new(BIO_f_ssl()));
|
||||||
|
BIO_set_ssl(bio, ssl, BIO_NOCLOSE);
|
||||||
|
|
||||||
|
AssertIntLE(BIO_write(bio, msg, msgSz), 0);
|
||||||
|
AssertIntNE(BIO_should_retry(bio), 0);
|
||||||
|
|
||||||
|
|
||||||
|
/* now perform successful connection */
|
||||||
|
wolfSSL_SSLSetIORecv(ssl, EmbedReceive);
|
||||||
|
AssertIntEQ(BIO_write(bio, msg, msgSz), msgSz);
|
||||||
|
BIO_read(bio, reply, sizeof(reply));
|
||||||
|
ret = wolfSSL_get_error(ssl, -1);
|
||||||
|
if (ret == WOLFSSL_ERROR_WANT_READ || ret == WOLFSSL_ERROR_WANT_WRITE) {
|
||||||
|
AssertIntNE(BIO_should_retry(bio), 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AssertIntEQ(BIO_should_retry(bio), 0);
|
||||||
|
}
|
||||||
|
AssertIntEQ(XMEMCMP(reply, "I hear you fa shizzle!",
|
||||||
|
XSTRLEN("I hear you fa shizzle!")), 0);
|
||||||
|
BIO_free(bio);
|
||||||
|
|
||||||
|
join_thread(serverThread);
|
||||||
|
FreeTcpReady(&ready);
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_TIRTOS
|
||||||
|
fdOpenSession(Task_self());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printf(resultFmt, passed);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static void test_wolfSSL_BIO_write(void)
|
static void test_wolfSSL_BIO_write(void)
|
||||||
{
|
{
|
||||||
#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_ENCODE)
|
#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_ENCODE)
|
||||||
@@ -30577,6 +30676,7 @@ void ApiTest(void)
|
|||||||
test_wolfSSL_X509_set_version();
|
test_wolfSSL_X509_set_version();
|
||||||
test_wolfSSL_BIO_gets();
|
test_wolfSSL_BIO_gets();
|
||||||
test_wolfSSL_BIO_puts();
|
test_wolfSSL_BIO_puts();
|
||||||
|
test_wolfSSL_BIO_should_retry();
|
||||||
test_wolfSSL_d2i_PUBKEY();
|
test_wolfSSL_d2i_PUBKEY();
|
||||||
test_wolfSSL_BIO_write();
|
test_wolfSSL_BIO_write();
|
||||||
test_wolfSSL_BIO_printf();
|
test_wolfSSL_BIO_printf();
|
||||||
|
Reference in New Issue
Block a user