Skip to content

Commit 9cd7e59

Browse files
add another session expire test case
1 parent 3510ea4 commit 9cd7e59

1 file changed

Lines changed: 210 additions & 1 deletion

File tree

tests/api.c

Lines changed: 210 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41422,7 +41422,215 @@ static int test_wolfSSL_SESSION(void)
4142241422
return EXPECT_RESULT();
4142341423
}
4142441424

41425-
#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \
41425+
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \
41426+
!defined(NO_RSA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \
41427+
!defined(NO_SESSION_CACHE)
41428+
static void set_ctx_timeout(WOLFSSL_CTX* ctx)
41429+
{
41430+
#ifdef WOLFSSL_ERROR_CODE_OPENSSL
41431+
/* returns previous timeout value */
41432+
AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 1), 500);
41433+
#else
41434+
AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 1), WOLFSSL_SUCCESS);
41435+
#endif
41436+
}
41437+
#endif
41438+
41439+
static int test_wolfSSL_SESSION_expire_downgrade(void)
41440+
{
41441+
int res = TEST_SKIPPED;
41442+
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \
41443+
!defined(NO_RSA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \
41444+
!defined(NO_SESSION_CACHE)
41445+
41446+
WOLFSSL* ssl;
41447+
WOLFSSL_CTX* ctx;
41448+
WOLFSSL_SESSION* sess;
41449+
int ret, err;
41450+
SOCKET_T sockfd;
41451+
tcp_ready ready;
41452+
func_args server_args;
41453+
THREAD_TYPE serverThread;
41454+
char msg[80];
41455+
const char* sendGET = "GET";
41456+
callback_functions server_cbf;
41457+
41458+
AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()));
41459+
AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, cliCertFile,
41460+
WOLFSSL_FILETYPE_PEM));
41461+
AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile,
41462+
WOLFSSL_FILETYPE_PEM));
41463+
AssertIntEQ(wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0),
41464+
WOLFSSL_SUCCESS);
41465+
41466+
XMEMSET(&server_args, 0, sizeof(func_args));
41467+
XMEMSET(&server_cbf, 0, sizeof(callback_functions));
41468+
#ifdef WOLFSSL_TIRTOS
41469+
fdOpenSession(Task_self());
41470+
#endif
41471+
41472+
StartTCP();
41473+
InitTcpReady(&ready);
41474+
41475+
#if defined(USE_WINDOWS_API)
41476+
/* use RNG to get random port if using windows */
41477+
ready.port = GetRandomPort();
41478+
#endif
41479+
41480+
/* force server side to use TLS 1.2 */
41481+
server_cbf.method = wolfTLSv1_2_server_method;
41482+
server_cbf.ctx_ready = set_ctx_timeout;
41483+
server_args.callbacks = &server_cbf;
41484+
server_args.argc = 2;
41485+
41486+
server_args.signal = &ready;
41487+
start_thread(test_server_loop, &server_args, &serverThread);
41488+
wait_tcp_ready(&server_args);
41489+
41490+
/* client connection */
41491+
ssl = wolfSSL_new(ctx);
41492+
tcp_connect(&sockfd, wolfSSLIP, ready.port, 0, 0, ssl);
41493+
AssertIntEQ(wolfSSL_set_fd(ssl, sockfd), WOLFSSL_SUCCESS);
41494+
AssertIntEQ(wolfSSL_set_timeout(ssl, 1), 1);
41495+
41496+
#ifdef WOLFSSL_ASYNC_CRYPT
41497+
err = 0; /* Reset error */
41498+
#endif
41499+
do {
41500+
#ifdef WOLFSSL_ASYNC_CRYPT
41501+
if (err == WC_PENDING_E) {
41502+
ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
41503+
if (ret < 0) { break; } else if (ret == 0) { continue; }
41504+
}
41505+
#endif
41506+
ret = wolfSSL_connect(ssl);
41507+
err = wolfSSL_get_error(ssl, 0);
41508+
} while (err == WC_PENDING_E);
41509+
AssertIntEQ(ret, WOLFSSL_SUCCESS);
41510+
41511+
#ifdef WOLFSSL_ASYNC_CRYPT
41512+
err = 0; /* Reset error */
41513+
#endif
41514+
do {
41515+
#ifdef WOLFSSL_ASYNC_CRYPT
41516+
if (err == WC_PENDING_E) {
41517+
ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
41518+
if (ret < 0) { break; } else if (ret == 0) { continue; }
41519+
}
41520+
#endif
41521+
ret = wolfSSL_write(ssl, sendGET, (int)XSTRLEN(sendGET));
41522+
err = wolfSSL_get_error(ssl, 0);
41523+
} while (err == WC_PENDING_E);
41524+
AssertIntEQ(ret, (int)XSTRLEN(sendGET));
41525+
41526+
#ifdef WOLFSSL_ASYNC_CRYPT
41527+
err = 0; /* Reset error */
41528+
#endif
41529+
do {
41530+
#ifdef WOLFSSL_ASYNC_CRYPT
41531+
if (err == WC_PENDING_E) {
41532+
ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
41533+
if (ret < 0) { break; } else if (ret == 0) { continue; }
41534+
}
41535+
#endif
41536+
ret = wolfSSL_read(ssl, msg, sizeof(msg));
41537+
err = wolfSSL_get_error(ssl, 0);
41538+
} while (err == WC_PENDING_E);
41539+
AssertIntEQ(ret, 23);
41540+
41541+
AssertPtrNE((sess = wolfSSL_get1_session(ssl)), NULL); /* ref count 1 */
41542+
41543+
wolfSSL_shutdown(ssl);
41544+
wolfSSL_free(ssl);
41545+
CloseSocket(sockfd);
41546+
41547+
#ifdef WOLFSSL_TIRTOS
41548+
fdOpenSession(Task_self());
41549+
#endif
41550+
41551+
/* successful set session test */
41552+
AssertNotNull(ssl = wolfSSL_new(ctx));
41553+
XSLEEP_MS(1200); /* wait a second for session to expire */
41554+
41555+
/* set the expired session, call to set session fails but continuing on
41556+
after failure should be handled here */
41557+
#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL)
41558+
AssertIntEQ(wolfSSL_set_session(ssl, sess), WOLFSSL_SUCCESS);
41559+
#else
41560+
AssertIntNE(wolfSSL_set_session(ssl, sess), WOLFSSL_SUCCESS);
41561+
#endif
41562+
41563+
/* test resuming connection with expired session and downgrade */
41564+
StartTCP();
41565+
41566+
/* client connection */
41567+
wait_tcp_ready(&server_args);
41568+
tcp_connect(&sockfd, wolfSSLIP, ready.port, 0, 0, ssl);
41569+
AssertIntEQ(wolfSSL_set_fd(ssl, sockfd), WOLFSSL_SUCCESS);
41570+
41571+
#ifdef WOLFSSL_ASYNC_CRYPT
41572+
err = 0; /* Reset error */
41573+
#endif
41574+
do {
41575+
#ifdef WOLFSSL_ASYNC_CRYPT
41576+
if (err == WC_PENDING_E) {
41577+
ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
41578+
if (ret < 0) { break; } else if (ret == 0) { continue; }
41579+
}
41580+
#endif
41581+
ret = wolfSSL_connect(ssl);
41582+
err = wolfSSL_get_error(ssl, 0);
41583+
} while (err == WC_PENDING_E);
41584+
AssertIntEQ(ret, WOLFSSL_SUCCESS);
41585+
41586+
#ifdef WOLFSSL_ASYNC_CRYPT
41587+
err = 0; /* Reset error */
41588+
#endif
41589+
do {
41590+
#ifdef WOLFSSL_ASYNC_CRYPT
41591+
if (err == WC_PENDING_E) {
41592+
ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
41593+
if (ret < 0) { break; } else if (ret == 0) { continue; }
41594+
}
41595+
#endif
41596+
ret = wolfSSL_write(ssl, sendGET, (int)XSTRLEN(sendGET));
41597+
err = wolfSSL_get_error(ssl, 0);
41598+
} while (err == WC_PENDING_E);
41599+
AssertIntEQ(ret, (int)XSTRLEN(sendGET));
41600+
41601+
#ifdef WOLFSSL_ASYNC_CRYPT
41602+
err = 0; /* Reset error */
41603+
#endif
41604+
do {
41605+
#ifdef WOLFSSL_ASYNC_CRYPT
41606+
if (err == WC_PENDING_E) {
41607+
ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
41608+
if (ret < 0) { break; } else if (ret == 0) { continue; }
41609+
}
41610+
#endif
41611+
ret = wolfSSL_read(ssl, msg, sizeof(msg));
41612+
err = wolfSSL_get_error(ssl, 0);
41613+
} while (err == WC_PENDING_E);
41614+
AssertIntEQ(ret, 23);
41615+
41616+
/* since the session has expired it should not have been reused */
41617+
AssertIntEQ(wolfSSL_session_reused(ssl), 0);
41618+
41619+
wolfSSL_shutdown(ssl);
41620+
wolfSSL_free(ssl);
41621+
41622+
FreeTcpReady(&ready);
41623+
41624+
wolfSSL_SESSION_free(sess);
41625+
wolfSSL_CTX_free(ctx);
41626+
join_thread(serverThread);
41627+
41628+
res = TEST_RES_CHECK(1);
41629+
#endif
41630+
return res;
41631+
}
41632+
41633+
#if defined(OPENSSL_EXTRA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \
4142641634
defined(HAVE_EX_DATA) && !defined(NO_SESSION_CACHE)
4142741635
static int clientSessRemCountMalloc = 0;
4142841636
static int serverSessRemCountMalloc = 0;
@@ -63902,6 +64110,7 @@ TEST_CASE testCases[] = {
6390264110
TEST_DECL(test_wolfSSL_cert_cb),
6390364111
/* Can't memory test as tcp_connect aborts. */
6390464112
TEST_DECL(test_wolfSSL_SESSION),
64113+
TEST_DECL(test_wolfSSL_SESSION_expire_downgrade),
6390564114
TEST_DECL(test_wolfSSL_CTX_sess_set_remove_cb),
6390664115
TEST_DECL(test_wolfSSL_ticket_keys),
6390764116
TEST_DECL(test_wolfSSL_sk_GENERAL_NAME),

0 commit comments

Comments
 (0)