Skip to content

Commit b16e7fd

Browse files
use Expect with test
fix for session expire check better name for test function rewrite test case make new session also timeout in 1 second
1 parent 9cd7e59 commit b16e7fd

3 files changed

Lines changed: 91 additions & 175 deletions

File tree

src/internal.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34402,14 +34402,13 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
3440234402
ssl->options.resuming = 0;
3440334403
return ret;
3440434404
}
34405-
#if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_TICKET_EXPIRE) && \
34406-
!defined(NO_ASN_TIME)
34405+
#if !defined(WOLFSSL_NO_TICKET_EXPIRE) && !defined(NO_ASN_TIME)
3440734406
/* check if the ticket is valid */
3440834407
if (LowResTimer() > session->bornOn + ssl->timeout) {
34409-
WOLFSSL_MSG("Expired session ticket, fall back to full handshake.");
34408+
WOLFSSL_MSG("Expired session, fall back to full handshake.");
3441034409
ssl->options.resuming = 0;
3441134410
}
34412-
#endif /* HAVE_SESSION_TICKET && !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
34411+
#endif /* !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
3441334412

3441434413
else if (session->haveEMS != ssl->options.haveEMS) {
3441534414
/* RFC 7627, 5.3, server-side */

src/ssl.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13755,7 +13755,6 @@ int wolfSSL_GetSessionFromCache(WOLFSSL* ssl, WOLFSSL_SESSION* output)
1375513755
TlsSessionCacheUnlockRow(row);
1375613756
error = WOLFSSL_FAILURE;
1375713757
}
13758-
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
1375913758
else if (LowResTimer() >= (sess->bornOn + sess->timeout)) {
1376013759
WOLFSSL_SESSION* wrSess = NULL;
1376113760
WOLFSSL_MSG("Invalid session: timed out");
@@ -13770,7 +13769,6 @@ int wolfSSL_GetSessionFromCache(WOLFSSL* ssl, WOLFSSL_SESSION* output)
1377013769
}
1377113770
error = WOLFSSL_FAILURE;
1377213771
}
13773-
#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */
1377413772
}
1377513773

1377613774
/* mollify confused cppcheck nullPointer warning. */

tests/api.c

Lines changed: 88 additions & 169 deletions
Original file line numberDiff line numberDiff line change
@@ -41424,8 +41424,11 @@ static int test_wolfSSL_SESSION(void)
4142441424

4142541425
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \
4142641426
!defined(NO_RSA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \
41427-
!defined(NO_SESSION_CACHE)
41428-
static void set_ctx_timeout(WOLFSSL_CTX* ctx)
41427+
!defined(NO_SESSION_CACHE) && defined(OPENSSL_EXTRA) && \
41428+
!defined(WOLFSSL_NO_TLS12)
41429+
static WOLFSSL_SESSION* test_wolfSSL_SESSION_expire_sess = NULL;
41430+
41431+
static void test_wolfSSL_SESSION_expire_downgrade_ctx_ready(WOLFSSL_CTX* ctx)
4142941432
{
4143041433
#ifdef WOLFSSL_ERROR_CODE_OPENSSL
4143141434
/* returns previous timeout value */
@@ -41434,203 +41437,119 @@ static void set_ctx_timeout(WOLFSSL_CTX* ctx)
4143441437
AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 1), WOLFSSL_SUCCESS);
4143541438
#endif
4143641439
}
41437-
#endif
4143841440

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)
4144541441

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);
41442+
/* set the session to timeout in a second */
41443+
static void test_wolfSSL_SESSION_expire_downgrade_ssl_ready(WOLFSSL* ssl)
41444+
{
4149441445
AssertIntEQ(wolfSSL_set_timeout(ssl, 1), 1);
41446+
}
4149541447

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));
4152541448

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);
41449+
/* store the client side session from the first successful connection */
41450+
static void test_wolfSSL_SESSION_expire_downgrade_ssl_result(WOLFSSL* ssl)
41451+
{
41452+
AssertPtrNE((test_wolfSSL_SESSION_expire_sess = wolfSSL_get1_session(ssl)),
41453+
NULL); /* ref count 1 */
41454+
}
4154041455

41541-
AssertPtrNE((sess = wolfSSL_get1_session(ssl)), NULL); /* ref count 1 */
4154241456

41543-
wolfSSL_shutdown(ssl);
41544-
wolfSSL_free(ssl);
41545-
CloseSocket(sockfd);
41457+
/* wait till session is expired then set it in the WOLFSSL struct for use */
41458+
static void test_wolfSSL_SESSION_expire_downgrade_ssl_ready_wait(WOLFSSL* ssl)
41459+
{
41460+
AssertIntEQ(wolfSSL_set_timeout(ssl, 1), 1);
41461+
AssertIntEQ(wolfSSL_set_session(ssl, test_wolfSSL_SESSION_expire_sess),
41462+
WOLFSSL_SUCCESS);
41463+
XSLEEP_MS(1200); /* wait a second for session to expire */
41464+
}
4154641465

41547-
#ifdef WOLFSSL_TIRTOS
41548-
fdOpenSession(Task_self());
41549-
#endif
4155041466

41551-
/* successful set session test */
41552-
AssertNotNull(ssl = wolfSSL_new(ctx));
41467+
/* set expired session in the WOLFSSL struct for use */
41468+
static void test_wolfSSL_SESSION_expire_downgrade_ssl_ready_set(WOLFSSL* ssl)
41469+
{
4155341470
XSLEEP_MS(1200); /* wait a second for session to expire */
4155441471

4155541472
/* set the expired session, call to set session fails but continuing on
4155641473
after failure should be handled here */
4155741474
#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL)
41558-
AssertIntEQ(wolfSSL_set_session(ssl, sess), WOLFSSL_SUCCESS);
41475+
AssertIntEQ(wolfSSL_set_session(ssl, test_wolfSSL_SESSION_expire_sess),
41476+
WOLFSSL_SUCCESS);
4155941477
#else
41560-
AssertIntNE(wolfSSL_set_session(ssl, sess), WOLFSSL_SUCCESS);
41478+
AssertIntNE(wolfSSL_set_session(ssl, test_wolfSSL_SESSION_expire_sess),
41479+
WOLFSSL_SUCCESS);
4156141480
#endif
41481+
}
4156241482

41563-
/* test resuming connection with expired session and downgrade */
41564-
StartTCP();
4156541483

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);
41484+
/* check that the expired session was not reused */
41485+
static void test_wolfSSL_SESSION_expire_downgrade_ssl_result_reuse(WOLFSSL* ssl)
41486+
{
41487+
/* since the session has expired it should not have been reused */
41488+
AssertIntEQ(wolfSSL_session_reused(ssl), 0);
41489+
}
41490+
#endif
4157041491

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);
41492+
static int test_wolfSSL_SESSION_expire_downgrade(void)
41493+
{
41494+
EXPECT_DECLS;
41495+
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \
41496+
!defined(NO_RSA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \
41497+
!defined(NO_SESSION_CACHE) && defined(OPENSSL_EXTRA) && \
41498+
!defined(WOLFSSL_NO_TLS12)
4158541499

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));
41500+
WOLFSSL_CTX* ctx = NULL;
41501+
callback_functions server_cbf, client_cbf;
4160041502

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);
41503+
XMEMSET(&server_cbf, 0, sizeof(callback_functions));
41504+
XMEMSET(&client_cbf, 0, sizeof(callback_functions));
4161541505

41616-
/* since the session has expired it should not have been reused */
41617-
AssertIntEQ(wolfSSL_session_reused(ssl), 0);
41506+
/* force server side to use TLS 1.2 */
41507+
server_cbf.ctx = ctx;
41508+
server_cbf.method = wolfTLSv1_2_server_method;
4161841509

41619-
wolfSSL_shutdown(ssl);
41620-
wolfSSL_free(ssl);
41510+
client_cbf.method = wolfSSLv23_client_method;
41511+
server_cbf.ctx_ready = test_wolfSSL_SESSION_expire_downgrade_ctx_ready;
41512+
client_cbf.ssl_ready = test_wolfSSL_SESSION_expire_downgrade_ssl_ready;
41513+
client_cbf.on_result = test_wolfSSL_SESSION_expire_downgrade_ssl_result;
4162141514

41622-
FreeTcpReady(&ready);
41515+
test_wolfSSL_client_server_nofail(&client_cbf, &server_cbf);
41516+
ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS);
41517+
ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS);
4162341518

41624-
wolfSSL_SESSION_free(sess);
41519+
/* set the previously created session and wait till expired */
41520+
server_cbf.ctx = ctx;
41521+
41522+
client_cbf.method = wolfSSLv23_client_method;
41523+
server_cbf.ctx_ready = test_wolfSSL_SESSION_expire_downgrade_ctx_ready;
41524+
client_cbf.ssl_ready = test_wolfSSL_SESSION_expire_downgrade_ssl_ready_wait;
41525+
client_cbf.on_result =
41526+
test_wolfSSL_SESSION_expire_downgrade_ssl_result_reuse;
41527+
41528+
test_wolfSSL_client_server_nofail(&client_cbf, &server_cbf);
41529+
ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS);
41530+
ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS);
41531+
41532+
/* set the previously created expired session */
41533+
server_cbf.ctx = ctx;
41534+
41535+
client_cbf.method = wolfSSLv23_client_method;
41536+
server_cbf.ctx_ready = test_wolfSSL_SESSION_expire_downgrade_ctx_ready;
41537+
client_cbf.ssl_ready = test_wolfSSL_SESSION_expire_downgrade_ssl_ready_set;
41538+
client_cbf.on_result =
41539+
test_wolfSSL_SESSION_expire_downgrade_ssl_result_reuse;
41540+
41541+
test_wolfSSL_client_server_nofail(&client_cbf, &server_cbf);
41542+
ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS);
41543+
ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS);
41544+
41545+
wolfSSL_SESSION_free(test_wolfSSL_SESSION_expire_sess);
4162541546
wolfSSL_CTX_free(ctx);
41626-
join_thread(serverThread);
4162741547

41628-
res = TEST_RES_CHECK(1);
4162941548
#endif
41630-
return res;
41549+
return EXPECT_RESULT();
4163141550
}
4163241551

41633-
#if defined(OPENSSL_EXTRA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \
41552+
#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \
4163441553
defined(HAVE_EX_DATA) && !defined(NO_SESSION_CACHE)
4163541554
static int clientSessRemCountMalloc = 0;
4163641555
static int serverSessRemCountMalloc = 0;

0 commit comments

Comments
 (0)