@@ -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)
4163541554static int clientSessRemCountMalloc = 0;
4163641555static int serverSessRemCountMalloc = 0;
0 commit comments