Skip to content

Commit 90a6a14

Browse files
Merge pull request #6446 from JacobBarthelmeh/session
2 parents ae90a9b + daa54f3 commit 90a6a14

3 files changed

Lines changed: 131 additions & 6 deletions

File tree

src/internal.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34412,14 +34412,13 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
3441234412
ssl->options.resuming = 0;
3441334413
return ret;
3441434414
}
34415-
#if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_TICKET_EXPIRE) && \
34416-
!defined(NO_ASN_TIME)
34415+
#if !defined(WOLFSSL_NO_TICKET_EXPIRE) && !defined(NO_ASN_TIME)
3441734416
/* check if the ticket is valid */
3441834417
if (LowResTimer() > session->bornOn + ssl->timeout) {
34419-
WOLFSSL_MSG("Expired session ticket, fall back to full handshake.");
34418+
WOLFSSL_MSG("Expired session, fall back to full handshake.");
3442034419
ssl->options.resuming = 0;
3442134420
}
34422-
#endif /* HAVE_SESSION_TICKET && !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
34421+
#endif /* !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
3442334422

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

src/ssl.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13759,7 +13759,6 @@ int wolfSSL_GetSessionFromCache(WOLFSSL* ssl, WOLFSSL_SESSION* output)
1375913759
TlsSessionCacheUnlockRow(row);
1376013760
error = WOLFSSL_FAILURE;
1376113761
}
13762-
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
1376313762
else if (LowResTimer() >= (sess->bornOn + sess->timeout)) {
1376413763
WOLFSSL_SESSION* wrSess = NULL;
1376513764
WOLFSSL_MSG("Invalid session: timed out");
@@ -13774,7 +13773,6 @@ int wolfSSL_GetSessionFromCache(WOLFSSL* ssl, WOLFSSL_SESSION* output)
1377413773
}
1377513774
error = WOLFSSL_FAILURE;
1377613775
}
13777-
#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */
1377813776
}
1377913777

1378013778
/* mollify confused cppcheck nullPointer warning. */

tests/api.c

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41431,6 +41431,133 @@ static int test_wolfSSL_SESSION(void)
4143141431
return EXPECT_RESULT();
4143241432
}
4143341433

41434+
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \
41435+
!defined(NO_RSA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \
41436+
!defined(NO_SESSION_CACHE) && defined(OPENSSL_EXTRA) && \
41437+
!defined(WOLFSSL_NO_TLS12)
41438+
static WOLFSSL_SESSION* test_wolfSSL_SESSION_expire_sess = NULL;
41439+
41440+
static void test_wolfSSL_SESSION_expire_downgrade_ctx_ready(WOLFSSL_CTX* ctx)
41441+
{
41442+
#ifdef WOLFSSL_ERROR_CODE_OPENSSL
41443+
/* returns previous timeout value */
41444+
AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 1), 500);
41445+
#else
41446+
AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 1), WOLFSSL_SUCCESS);
41447+
#endif
41448+
}
41449+
41450+
41451+
/* set the session to timeout in a second */
41452+
static void test_wolfSSL_SESSION_expire_downgrade_ssl_ready(WOLFSSL* ssl)
41453+
{
41454+
AssertIntEQ(wolfSSL_set_timeout(ssl, 2), 1);
41455+
}
41456+
41457+
41458+
/* store the client side session from the first successful connection */
41459+
static void test_wolfSSL_SESSION_expire_downgrade_ssl_result(WOLFSSL* ssl)
41460+
{
41461+
AssertPtrNE((test_wolfSSL_SESSION_expire_sess = wolfSSL_get1_session(ssl)),
41462+
NULL); /* ref count 1 */
41463+
}
41464+
41465+
41466+
/* wait till session is expired then set it in the WOLFSSL struct for use */
41467+
static void test_wolfSSL_SESSION_expire_downgrade_ssl_ready_wait(WOLFSSL* ssl)
41468+
{
41469+
AssertIntEQ(wolfSSL_set_timeout(ssl, 1), 1);
41470+
AssertIntEQ(wolfSSL_set_session(ssl, test_wolfSSL_SESSION_expire_sess),
41471+
WOLFSSL_SUCCESS);
41472+
XSLEEP_MS(2000); /* wait 2 seconds for session to expire */
41473+
}
41474+
41475+
41476+
/* set expired session in the WOLFSSL struct for use */
41477+
static void test_wolfSSL_SESSION_expire_downgrade_ssl_ready_set(WOLFSSL* ssl)
41478+
{
41479+
XSLEEP_MS(1200); /* wait a second for session to expire */
41480+
41481+
/* set the expired session, call to set session fails but continuing on
41482+
after failure should be handled here */
41483+
#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL)
41484+
AssertIntEQ(wolfSSL_set_session(ssl, test_wolfSSL_SESSION_expire_sess),
41485+
WOLFSSL_SUCCESS);
41486+
#else
41487+
AssertIntNE(wolfSSL_set_session(ssl, test_wolfSSL_SESSION_expire_sess),
41488+
WOLFSSL_SUCCESS);
41489+
#endif
41490+
}
41491+
41492+
41493+
/* check that the expired session was not reused */
41494+
static void test_wolfSSL_SESSION_expire_downgrade_ssl_result_reuse(WOLFSSL* ssl)
41495+
{
41496+
/* since the session has expired it should not have been reused */
41497+
AssertIntEQ(wolfSSL_session_reused(ssl), 0);
41498+
}
41499+
#endif
41500+
41501+
static int test_wolfSSL_SESSION_expire_downgrade(void)
41502+
{
41503+
EXPECT_DECLS;
41504+
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \
41505+
!defined(NO_RSA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \
41506+
!defined(NO_SESSION_CACHE) && defined(OPENSSL_EXTRA) && \
41507+
!defined(WOLFSSL_NO_TLS12)
41508+
41509+
WOLFSSL_CTX* ctx = NULL;
41510+
callback_functions server_cbf, client_cbf;
41511+
41512+
XMEMSET(&server_cbf, 0, sizeof(callback_functions));
41513+
XMEMSET(&client_cbf, 0, sizeof(callback_functions));
41514+
41515+
/* force server side to use TLS 1.2 */
41516+
server_cbf.ctx = ctx;
41517+
server_cbf.method = wolfTLSv1_2_server_method;
41518+
41519+
client_cbf.method = wolfSSLv23_client_method;
41520+
server_cbf.ctx_ready = test_wolfSSL_SESSION_expire_downgrade_ctx_ready;
41521+
client_cbf.ssl_ready = test_wolfSSL_SESSION_expire_downgrade_ssl_ready;
41522+
client_cbf.on_result = test_wolfSSL_SESSION_expire_downgrade_ssl_result;
41523+
41524+
test_wolfSSL_client_server_nofail(&client_cbf, &server_cbf);
41525+
ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS);
41526+
ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS);
41527+
41528+
/* set the previously created session and wait till expired */
41529+
server_cbf.ctx = ctx;
41530+
41531+
client_cbf.method = wolfSSLv23_client_method;
41532+
server_cbf.ctx_ready = test_wolfSSL_SESSION_expire_downgrade_ctx_ready;
41533+
client_cbf.ssl_ready = test_wolfSSL_SESSION_expire_downgrade_ssl_ready_wait;
41534+
client_cbf.on_result =
41535+
test_wolfSSL_SESSION_expire_downgrade_ssl_result_reuse;
41536+
41537+
test_wolfSSL_client_server_nofail(&client_cbf, &server_cbf);
41538+
ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS);
41539+
ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS);
41540+
41541+
/* set the previously created expired session */
41542+
server_cbf.ctx = ctx;
41543+
41544+
client_cbf.method = wolfSSLv23_client_method;
41545+
server_cbf.ctx_ready = test_wolfSSL_SESSION_expire_downgrade_ctx_ready;
41546+
client_cbf.ssl_ready = test_wolfSSL_SESSION_expire_downgrade_ssl_ready_set;
41547+
client_cbf.on_result =
41548+
test_wolfSSL_SESSION_expire_downgrade_ssl_result_reuse;
41549+
41550+
test_wolfSSL_client_server_nofail(&client_cbf, &server_cbf);
41551+
ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS);
41552+
ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS);
41553+
41554+
wolfSSL_SESSION_free(test_wolfSSL_SESSION_expire_sess);
41555+
wolfSSL_CTX_free(ctx);
41556+
41557+
#endif
41558+
return EXPECT_RESULT();
41559+
}
41560+
4143441561
#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \
4143541562
defined(HAVE_EX_DATA) && !defined(NO_SESSION_CACHE)
4143641563
static int clientSessRemCountMalloc = 0;
@@ -64191,6 +64318,7 @@ TEST_CASE testCases[] = {
6419164318
TEST_DECL(test_wolfSSL_cert_cb),
6419264319
/* Can't memory test as tcp_connect aborts. */
6419364320
TEST_DECL(test_wolfSSL_SESSION),
64321+
TEST_DECL(test_wolfSSL_SESSION_expire_downgrade),
6419464322
TEST_DECL(test_wolfSSL_CTX_sess_set_remove_cb),
6419564323
TEST_DECL(test_wolfSSL_ticket_keys),
6419664324
TEST_DECL(test_wolfSSL_sk_GENERAL_NAME),

0 commit comments

Comments
 (0)