Skip to content
This repository was archived by the owner on Apr 10, 2025. It is now read-only.

Commit 24c35c5

Browse files
tmshortwbl
authored andcommitted
QUIC: Update SSL_clear() to clear quic data
Fixes #55 Had to fixup tests because SSL_accept() eventually calls SSL_clear() and it was removing the inital ClientHello sent via SSL_provide_quic_data() from the server SSL.
1 parent a54d64f commit 24c35c5

File tree

3 files changed

+46
-10
lines changed

3 files changed

+46
-10
lines changed

ssl/ssl_lib.c

+32
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,38 @@ int SSL_clear(SSL *s)
633633
s->shared_sigalgs = NULL;
634634
s->shared_sigalgslen = 0;
635635

636+
#if !defined(OPENSSL_NO_QUIC)
637+
OPENSSL_free(s->ext.peer_quic_transport_params_draft);
638+
s->ext.peer_quic_transport_params_draft = NULL;
639+
s->ext.peer_quic_transport_params_draft_len = 0;
640+
OPENSSL_free(s->ext.peer_quic_transport_params);
641+
s->ext.peer_quic_transport_params = NULL;
642+
s->ext.peer_quic_transport_params_len = 0;
643+
s->quic_read_level = ssl_encryption_initial;
644+
s->quic_write_level = ssl_encryption_initial;
645+
s->quic_latest_level_received = ssl_encryption_initial;
646+
while (s->quic_input_data_head != NULL) {
647+
QUIC_DATA *qd;
648+
649+
qd = s->quic_input_data_head;
650+
s->quic_input_data_head = qd->next;
651+
OPENSSL_free(qd);
652+
}
653+
s->quic_input_data_tail = NULL;
654+
BUF_MEM_free(s->quic_buf);
655+
s->quic_buf = NULL;
656+
s->quic_next_record_start = 0;
657+
memset(s->client_hand_traffic_secret, 0, EVP_MAX_MD_SIZE);
658+
memset(s->server_hand_traffic_secret, 0, EVP_MAX_MD_SIZE);
659+
memset(s->client_early_traffic_secret, 0, EVP_MAX_MD_SIZE);
660+
/*
661+
* CONFIG - DON'T CLEAR
662+
* s->ext.quic_transport_params
663+
* s->ext.quic_transport_params_len
664+
* s->quic_transport_version
665+
* s->quic_method = NULL;
666+
*/
667+
#endif
636668
/*
637669
* Check to see if we were changed into a different method, if so, revert
638670
* back.

test/sslapitest.c

+14-5
Original file line numberDiff line numberDiff line change
@@ -7514,6 +7514,7 @@ static int test_quic_api_version(int clnt, int srvr)
75147514
static const char *client_str = "CLIENT";
75157515
const uint8_t *peer_str;
75167516
size_t peer_str_len;
7517+
int err;
75177518

75187519
TEST_info("original clnt=0x%X, srvr=0x%X\n", clnt, srvr);
75197520

@@ -7535,8 +7536,10 @@ static int test_quic_api_version(int clnt, int srvr)
75357536
|| !TEST_true(SSL_set_app_data(clientssl, serverssl))
75367537
|| !TEST_true(test_quic_api_set_versions(clientssl, clnt))
75377538
|| !TEST_true(test_quic_api_set_versions(serverssl, srvr))
7538-
|| !TEST_true(create_ssl_connection(serverssl, clientssl,
7539-
SSL_ERROR_NONE))
7539+
|| !TEST_int_eq(err = SSL_accept(serverssl), -1)
7540+
|| !TEST_int_eq(SSL_get_error(serverssl, err), SSL_ERROR_WANT_READ)
7541+
|| !TEST_true(create_bare_ssl_connection(serverssl, clientssl,
7542+
SSL_ERROR_NONE, 0))
75407543
|| !TEST_true(SSL_version(serverssl) == TLS1_3_VERSION)
75417544
|| !TEST_true(SSL_version(clientssl) == TLS1_3_VERSION)
75427545
|| !(TEST_int_eq(SSL_quic_read_level(clientssl), ssl_encryption_application))
@@ -7662,6 +7665,7 @@ static int quic_setupearly_data_test(SSL_CTX **cctx, SSL_CTX **sctx,
76627665
{
76637666
static const char *server_str = "SERVER";
76647667
static const char *client_str = "CLIENT";
7668+
int err;
76657669

76667670
if (*sctx == NULL
76677671
&& (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
@@ -7739,8 +7743,10 @@ static int quic_setupearly_data_test(SSL_CTX **cctx, SSL_CTX **sctx,
77397743
if (sess == NULL)
77407744
return 1;
77417745

7742-
if (!TEST_true(create_ssl_connection(*serverssl, *clientssl,
7743-
SSL_ERROR_NONE)))
7746+
if (!TEST_int_eq(err = SSL_accept(*serverssl), -1)
7747+
|| !TEST_int_eq(SSL_get_error(*serverssl, err), SSL_ERROR_WANT_READ)
7748+
|| !TEST_true(create_bare_ssl_connection(*serverssl, *clientssl,
7749+
SSL_ERROR_NONE, 0)))
77447750
return 0;
77457751

77467752
/* Deal with two NewSessionTickets */
@@ -7779,12 +7785,15 @@ static int test_quic_early_data(int tst)
77797785
SSL *clientssl = NULL, *serverssl = NULL;
77807786
int testresult = 0;
77817787
SSL_SESSION *sess = NULL;
7788+
int err;
77827789

77837790
if (!TEST_true(quic_setupearly_data_test(&cctx, &sctx, &clientssl,
77847791
&serverssl, &sess, tst)))
77857792
goto end;
77867793

7787-
if (!TEST_true(create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE))
7794+
if (!TEST_int_eq(err = SSL_accept(serverssl), -1)
7795+
|| !TEST_int_eq(SSL_get_error(serverssl, err), SSL_ERROR_WANT_READ)
7796+
|| !TEST_true(create_bare_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE, 0))
77887797
|| !TEST_true(SSL_get_early_data_status(serverssl)))
77897798
goto end;
77907799

test/ssltestlib.c

-5
Original file line numberDiff line numberDiff line change
@@ -950,11 +950,6 @@ int create_ssl_connection(SSL *serverssl, SSL *clientssl, int want)
950950
if (!create_bare_ssl_connection(serverssl, clientssl, want, 1))
951951
return 0;
952952

953-
#ifndef OPENSSL_NO_QUIC
954-
/* QUIC does not support SSL_read_ex */
955-
if (SSL_is_quic(clientssl))
956-
return 1;
957-
#endif
958953
/*
959954
* We attempt to read some data on the client side which we expect to fail.
960955
* This will ensure we have received the NewSessionTicket in TLSv1.3 where

0 commit comments

Comments
 (0)