126 lines
3.9 KiB
Diff
126 lines
3.9 KiB
Diff
From 913ac6975162dde9e6f715c7b12869ea32ab8b70 Mon Sep 17 00:00:00 2001
|
|
From: Matt Caswell <matt@openssl.org>
|
|
Date: Mon, 4 Mar 2024 13:45:23 +0000
|
|
Subject: [PATCH] Add a test for session cache handling
|
|
|
|
Repeatedly create sessions to be added to the cache and ensure we never
|
|
exceed the expected size.
|
|
|
|
Related to CVE-2024-2511
|
|
|
|
Reviewed-by: Neil Horman <nhorman@openssl.org>
|
|
Reviewed-by: Tomas Mraz <tomas@openssl.org>
|
|
(Merged from https://github.com/openssl/openssl/pull/24044)
|
|
|
|
(cherry picked from commit 5f5b9e1ca1fad0215f623b8bd4955a2e8101f306)
|
|
Signed-off-by: Liu-Ermeng <liuermeng2@huawei.com>
|
|
---
|
|
test/sslapitest.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 91 insertions(+)
|
|
|
|
diff --git a/test/sslapitest.c b/test/sslapitest.c
|
|
index 5ee982ab06..2992356fdf 100644
|
|
--- a/test/sslapitest.c
|
|
+++ b/test/sslapitest.c
|
|
@@ -7288,6 +7288,97 @@ static int test_inherit_verify_param(void)
|
|
return testresult;
|
|
}
|
|
|
|
+/*
|
|
+ * Test multiple resumptions and cache size handling
|
|
+ * Test 0: TLSv1.3 (max_early_data set)
|
|
+ * Test 1: TLSv1.3 (SSL_OP_NO_TICKET set)
|
|
+ * Test 2: TLSv1.3 (max_early_data and SSL_OP_NO_TICKET set)
|
|
+ * Test 3: TLSv1.2
|
|
+ */
|
|
+static int test_multi_resume(int idx)
|
|
+{
|
|
+ SSL_CTX *sctx = NULL, *cctx = NULL;
|
|
+ SSL *serverssl = NULL, *clientssl = NULL;
|
|
+ SSL_SESSION *sess = NULL;
|
|
+ int max_version = TLS1_3_VERSION;
|
|
+ int i, testresult = 0;
|
|
+
|
|
+ if (idx == 3)
|
|
+ max_version = TLS1_2_VERSION;
|
|
+
|
|
+ if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
|
|
+ TLS_client_method(), TLS1_VERSION,
|
|
+ max_version, &sctx, &cctx, cert,
|
|
+ privkey)))
|
|
+ goto end;
|
|
+
|
|
+ /*
|
|
+ * TLSv1.3 only uses a session cache if either max_early_data > 0 (used for
|
|
+ * replay protection), or if SSL_OP_NO_TICKET is in use
|
|
+ */
|
|
+ if (idx == 0 || idx == 2) {
|
|
+ if (!TEST_true(SSL_CTX_set_max_early_data(sctx, 1024)))
|
|
+ goto end;
|
|
+ }
|
|
+ if (idx == 1 || idx == 2)
|
|
+ SSL_CTX_set_options(sctx, SSL_OP_NO_TICKET);
|
|
+
|
|
+ SSL_CTX_sess_set_cache_size(sctx, 5);
|
|
+
|
|
+ for (i = 0; i < 30; i++) {
|
|
+ if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
|
|
+ NULL, NULL))
|
|
+ || !TEST_true(SSL_set_session(clientssl, sess)))
|
|
+ goto end;
|
|
+
|
|
+ /*
|
|
+ * Recreate a bug where dynamically changing the max_early_data value
|
|
+ * can cause sessions in the session cache which cannot be deleted.
|
|
+ */
|
|
+ if ((idx == 0 || idx == 2) && (i % 3) == 2)
|
|
+ SSL_set_max_early_data(serverssl, 0);
|
|
+
|
|
+ if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE)))
|
|
+ goto end;
|
|
+
|
|
+ if (sess == NULL || (idx == 0 && (i % 3) == 2)) {
|
|
+ if (!TEST_false(SSL_session_reused(clientssl)))
|
|
+ goto end;
|
|
+ } else {
|
|
+ if (!TEST_true(SSL_session_reused(clientssl)))
|
|
+ goto end;
|
|
+ }
|
|
+ SSL_SESSION_free(sess);
|
|
+
|
|
+ /* Do a full handshake, followed by two resumptions */
|
|
+ if ((i % 3) == 2) {
|
|
+ sess = NULL;
|
|
+ } else {
|
|
+ if (!TEST_ptr((sess = SSL_get1_session(clientssl))))
|
|
+ goto end;
|
|
+ }
|
|
+
|
|
+ SSL_shutdown(clientssl);
|
|
+ SSL_shutdown(serverssl);
|
|
+ SSL_free(serverssl);
|
|
+ SSL_free(clientssl);
|
|
+ serverssl = clientssl = NULL;
|
|
+ }
|
|
+
|
|
+ /* We should never exceed the session cache size limit */
|
|
+ if (!TEST_long_le(SSL_CTX_sess_number(sctx), 5))
|
|
+ goto end;
|
|
+
|
|
+ testresult = 1;
|
|
+ end:
|
|
+ SSL_free(serverssl);
|
|
+ SSL_free(clientssl);
|
|
+ SSL_CTX_free(sctx);
|
|
+ SSL_CTX_free(cctx);
|
|
+ SSL_SESSION_free(sess);
|
|
+ return testresult;
|
|
+}
|
|
+
|
|
int setup_tests(void)
|
|
{
|
|
if (!TEST_ptr(certsdir = test_get_argument(0))
|
|
--
|
|
2.33.0
|
|
|