From 49a36a528a48bb6b8421b8a0363adb85e63d71fe Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Tue, 16 Jun 2020 17:19:40 +0100 Subject: [PATCH] Add an SSL_dup test Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/12180) --- test/sslapitest.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/test/sslapitest.c b/test/sslapitest.c index e0a92b31ae..c3ee6fa996 100644 --- a/test/sslapitest.c +++ b/test/sslapitest.c @@ -8151,6 +8151,75 @@ static int test_pluggable_group(void) } #endif +#ifndef OPENSSL_NO_TLS1_2 +static int test_ssl_dup(void) +{ + SSL_CTX *cctx = NULL, *sctx = NULL; + SSL *clientssl = NULL, *serverssl = NULL, *client2ssl = NULL; + int testresult = 0; + BIO *rbio = NULL, *wbio = NULL; + + if (!TEST_true(create_ssl_ctx_pair(libctx, TLS_server_method(), + TLS_client_method(), + 0, + 0, + &sctx, &cctx, cert, privkey))) + goto end; + + if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl, + NULL, NULL))) + goto end; + + if (!TEST_true(SSL_set_min_proto_version(clientssl, TLS1_2_VERSION)) + || !TEST_true(SSL_set_max_proto_version(clientssl, TLS1_2_VERSION))) + goto end; + + client2ssl = SSL_dup(clientssl); + rbio = SSL_get_rbio(clientssl); + if (!TEST_ptr(rbio) + || !TEST_true(BIO_up_ref(rbio))) + goto end; + SSL_set0_rbio(client2ssl, rbio); + rbio = NULL; + + wbio = SSL_get_wbio(clientssl); + if (!TEST_ptr(wbio) || !TEST_true(BIO_up_ref(wbio))) + goto end; + SSL_set0_wbio(client2ssl, wbio); + rbio = NULL; + + if (!TEST_ptr(client2ssl) + /* Handshake not started so pointers should be different */ + || !TEST_ptr_ne(clientssl, client2ssl)) + goto end; + + if (!TEST_int_eq(SSL_get_min_proto_version(client2ssl), TLS1_2_VERSION) + || !TEST_int_eq(SSL_get_max_proto_version(client2ssl), TLS1_2_VERSION)) + goto end; + + if (!TEST_true(create_ssl_connection(serverssl, client2ssl, SSL_ERROR_NONE))) + goto end; + + SSL_free(clientssl); + clientssl = SSL_dup(client2ssl); + if (!TEST_ptr(clientssl) + /* Handshake has finished so pointers should be the same */ + || !TEST_ptr_eq(clientssl, client2ssl)) + goto end; + + testresult = 1; + + end: + SSL_free(serverssl); + SSL_free(clientssl); + SSL_free(client2ssl); + SSL_CTX_free(sctx); + SSL_CTX_free(cctx); + + return testresult; +} +#endif + OPT_TEST_DECLARE_USAGE("certfile privkeyfile srpvfile tmpfile provider config\n") int setup_tests(void) @@ -8352,6 +8421,9 @@ int setup_tests(void) #endif #ifndef OPENSSL_NO_TLS1_3 ADD_TEST(test_pluggable_group); +#endif +#ifndef OPENSSL_NO_TLS1_2 + ADD_TEST(test_ssl_dup); #endif return 1; -- 2.25.1