@@ -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)
4142741635static int clientSessRemCountMalloc = 0;
4142841636static 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