@@ -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)
4143641563static 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