Test resumability of same, different, and default ticket keys.
If we were to accidentally leave the ticket keys zero-initialized, the
only tests that notice are DefaultTicketKeyInitialization (initial key
is not all zeros) and DefaultTicketKeyRotation (old key is not new key),
by way of querying the keys themselves.
Add some tests which additionally test the effects on resumption itself.
Change-Id: I3bfd3f1e082e3a466105dbdffa18621b81c53d17
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/41564
Commit-Queue: Adam Langley <agl@google.com>
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/ssl_test.cc b/ssl/ssl_test.cc
index 4f4a80f..3c2d852 100644
--- a/ssl/ssl_test.cc
+++ b/ssl/ssl_test.cc
@@ -6115,6 +6115,111 @@
}
}
+TEST_P(SSLVersionTest, SameKeyResume) {
+ uint8_t key[48];
+ RAND_bytes(key, sizeof(key));
+
+ bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
+ ASSERT_TRUE(server_ctx2);
+ ASSERT_TRUE(UseCertAndKey(server_ctx2.get()));
+ ASSERT_TRUE(
+ SSL_CTX_set_tlsext_ticket_keys(server_ctx_.get(), key, sizeof(key)));
+ ASSERT_TRUE(
+ SSL_CTX_set_tlsext_ticket_keys(server_ctx2.get(), key, sizeof(key)));
+
+ SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
+ SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
+ SSL_CTX_set_session_cache_mode(server_ctx2.get(), SSL_SESS_CACHE_BOTH);
+
+ // Establish a session for |server_ctx_|.
+ bssl::UniquePtr<SSL_SESSION> session =
+ CreateClientSession(client_ctx_.get(), server_ctx_.get());
+ ASSERT_TRUE(session);
+ ClientConfig config;
+ config.session = session.get();
+
+ // Resuming with |server_ctx_| again works.
+ bssl::UniquePtr<SSL> client, server;
+ ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
+ server_ctx_.get(), config));
+ EXPECT_TRUE(SSL_session_reused(client.get()));
+ EXPECT_TRUE(SSL_session_reused(server.get()));
+
+ // Resuming with |server_ctx2| also works.
+ ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
+ server_ctx2.get(), config));
+ EXPECT_TRUE(SSL_session_reused(client.get()));
+ EXPECT_TRUE(SSL_session_reused(server.get()));
+}
+
+TEST_P(SSLVersionTest, DifferentKeyNoResume) {
+ uint8_t key1[48], key2[48];
+ RAND_bytes(key1, sizeof(key1));
+ RAND_bytes(key2, sizeof(key2));
+
+ bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
+ ASSERT_TRUE(server_ctx2);
+ ASSERT_TRUE(UseCertAndKey(server_ctx2.get()));
+ ASSERT_TRUE(
+ SSL_CTX_set_tlsext_ticket_keys(server_ctx_.get(), key1, sizeof(key1)));
+ ASSERT_TRUE(
+ SSL_CTX_set_tlsext_ticket_keys(server_ctx2.get(), key2, sizeof(key2)));
+
+ SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
+ SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
+ SSL_CTX_set_session_cache_mode(server_ctx2.get(), SSL_SESS_CACHE_BOTH);
+
+ // Establish a session for |server_ctx_|.
+ bssl::UniquePtr<SSL_SESSION> session =
+ CreateClientSession(client_ctx_.get(), server_ctx_.get());
+ ASSERT_TRUE(session);
+ ClientConfig config;
+ config.session = session.get();
+
+ // Resuming with |server_ctx_| again works.
+ bssl::UniquePtr<SSL> client, server;
+ ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
+ server_ctx_.get(), config));
+ EXPECT_TRUE(SSL_session_reused(client.get()));
+ EXPECT_TRUE(SSL_session_reused(server.get()));
+
+ // Resuming with |server_ctx2| does not work.
+ ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
+ server_ctx2.get(), config));
+ EXPECT_FALSE(SSL_session_reused(client.get()));
+ EXPECT_FALSE(SSL_session_reused(server.get()));
+}
+
+TEST_P(SSLVersionTest, UnrelatedServerNoResume) {
+ bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
+ ASSERT_TRUE(server_ctx2);
+ ASSERT_TRUE(UseCertAndKey(server_ctx2.get()));
+
+ SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
+ SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
+ SSL_CTX_set_session_cache_mode(server_ctx2.get(), SSL_SESS_CACHE_BOTH);
+
+ // Establish a session for |server_ctx_|.
+ bssl::UniquePtr<SSL_SESSION> session =
+ CreateClientSession(client_ctx_.get(), server_ctx_.get());
+ ASSERT_TRUE(session);
+ ClientConfig config;
+ config.session = session.get();
+
+ // Resuming with |server_ctx_| again works.
+ bssl::UniquePtr<SSL> client, server;
+ ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
+ server_ctx_.get(), config));
+ EXPECT_TRUE(SSL_session_reused(client.get()));
+ EXPECT_TRUE(SSL_session_reused(server.get()));
+
+ // Resuming with |server_ctx2| does not work.
+ ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
+ server_ctx2.get(), config));
+ EXPECT_FALSE(SSL_session_reused(client.get()));
+ EXPECT_FALSE(SSL_session_reused(server.get()));
+}
+
TEST(SSLTest, WriteWhileExplicitRenegotiate) {
bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
ASSERT_TRUE(ctx);