Skip to content

Commit 8f4f7f2

Browse files
committed
QUIC: add v1 quic_transport_parameters
1 parent 5b76e4f commit 8f4f7f2

File tree

14 files changed

+326
-37
lines changed

14 files changed

+326
-37
lines changed

crypto/err/openssl.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,7 @@ SSL_F_FINAL_EC_PT_FORMATS:485:final_ec_pt_formats
11601160
SSL_F_FINAL_EMS:486:final_ems
11611161
SSL_F_FINAL_KEY_SHARE:503:final_key_share
11621162
SSL_F_FINAL_MAXFRAGMENTLEN:557:final_maxfragmentlen
1163+
SSL_F_FINAL_QUIC_TRANSPORT_PARAMS:652:final_quic_transport_params
11631164
SSL_F_FINAL_RENEGOTIATE:483:final_renegotiate
11641165
SSL_F_FINAL_SERVER_NAME:558:final_server_name
11651166
SSL_F_FINAL_SIG_ALGS:497:final_sig_algs
@@ -1432,6 +1433,8 @@ SSL_F_TLS_CONSTRUCT_CTOS_PSK:501:tls_construct_ctos_psk
14321433
SSL_F_TLS_CONSTRUCT_CTOS_PSK_KEX_MODES:509:tls_construct_ctos_psk_kex_modes
14331434
SSL_F_TLS_CONSTRUCT_CTOS_QUIC_TRANSPORT_PARAMS:648:\
14341435
tls_construct_ctos_quic_transport_params
1436+
SSL_F_TLS_CONSTRUCT_CTOS_QUIC_TRANSPORT_PARAMS_DRAFT:653:\
1437+
tls_construct_ctos_quic_transport_params_draft
14351438
SSL_F_TLS_CONSTRUCT_CTOS_RENEGOTIATE:473:tls_construct_ctos_renegotiate
14361439
SSL_F_TLS_CONSTRUCT_CTOS_SCT:474:tls_construct_ctos_sct
14371440
SSL_F_TLS_CONSTRUCT_CTOS_SERVER_NAME:475:tls_construct_ctos_server_name
@@ -1475,6 +1478,8 @@ SSL_F_TLS_CONSTRUCT_STOC_NEXT_PROTO_NEG:457:tls_construct_stoc_next_proto_neg
14751478
SSL_F_TLS_CONSTRUCT_STOC_PSK:504:tls_construct_stoc_psk
14761479
SSL_F_TLS_CONSTRUCT_STOC_QUIC_TRANSPORT_PARAMS:649:\
14771480
tls_construct_stoc_quic_transport_params
1481+
SSL_F_TLS_CONSTRUCT_STOC_QUIC_TRANSPORT_PARAMS_DRAFT:654:\
1482+
tls_construct_stoc_quic_transport_params_draft
14781483
SSL_F_TLS_CONSTRUCT_STOC_RENEGOTIATE:458:tls_construct_stoc_renegotiate
14791484
SSL_F_TLS_CONSTRUCT_STOC_SERVER_NAME:459:tls_construct_stoc_server_name
14801485
SSL_F_TLS_CONSTRUCT_STOC_SESSION_TICKET:460:tls_construct_stoc_session_ticket
@@ -1505,6 +1510,8 @@ SSL_F_TLS_PARSE_CTOS_PSK:505:tls_parse_ctos_psk
15051510
SSL_F_TLS_PARSE_CTOS_PSK_KEX_MODES:572:tls_parse_ctos_psk_kex_modes
15061511
SSL_F_TLS_PARSE_CTOS_QUIC_TRANSPORT_PARAMS:650:\
15071512
tls_parse_ctos_quic_transport_params
1513+
SSL_F_TLS_PARSE_CTOS_QUIC_TRANSPORT_PARAMS_DRAFT:655:\
1514+
tls_parse_ctos_quic_transport_params_draft
15081515
SSL_F_TLS_PARSE_CTOS_RENEGOTIATE:464:tls_parse_ctos_renegotiate
15091516
SSL_F_TLS_PARSE_CTOS_SERVER_NAME:573:tls_parse_ctos_server_name
15101517
SSL_F_TLS_PARSE_CTOS_SESSION_TICKET:574:tls_parse_ctos_session_ticket
@@ -1525,6 +1532,8 @@ SSL_F_TLS_PARSE_STOC_NPN:582:tls_parse_stoc_npn
15251532
SSL_F_TLS_PARSE_STOC_PSK:502:tls_parse_stoc_psk
15261533
SSL_F_TLS_PARSE_STOC_QUIC_TRANSPORT_PARAMS:651:\
15271534
tls_parse_stoc_quic_transport_params
1535+
SSL_F_TLS_PARSE_STOC_QUIC_TRANSPORT_PARAMS_DRAFT:656:\
1536+
tls_parse_stoc_quic_transport_params_draft
15281537
SSL_F_TLS_PARSE_STOC_RENEGOTIATE:448:tls_parse_stoc_renegotiate
15291538
SSL_F_TLS_PARSE_STOC_SCT:564:tls_parse_stoc_sct
15301539
SSL_F_TLS_PARSE_STOC_SERVER_NAME:583:tls_parse_stoc_server_name
@@ -2757,6 +2766,8 @@ SSL_R_MISSING_DSA_SIGNING_CERT:165:missing dsa signing cert
27572766
SSL_R_MISSING_ECDSA_SIGNING_CERT:381:missing ecdsa signing cert
27582767
SSL_R_MISSING_FATAL:256:missing fatal
27592768
SSL_R_MISSING_PARAMETERS:290:missing parameters
2769+
SSL_R_MISSING_QUIC_TRANSPORT_PARAMETERS_EXTENSION:294:\
2770+
missing quic transport parameters extension
27602771
SSL_R_MISSING_RSA_CERTIFICATE:168:missing rsa certificate
27612772
SSL_R_MISSING_RSA_ENCRYPTING_CERT:169:missing rsa encrypting cert
27622773
SSL_R_MISSING_RSA_SIGNING_CERT:170:missing rsa signing cert

include/openssl/ssl.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2473,6 +2473,17 @@ __owur int SSL_process_quic_post_handshake(SSL *ssl);
24732473

24742474
__owur int SSL_is_quic(SSL *ssl);
24752475

2476+
/* BoringSSL API */
2477+
__owur void SSL_set_quic_use_legacy_codepoint(SSL *ssl, int use_legacy);
2478+
2479+
/* Set an explicit value that you want to use */
2480+
/* If set to 0 (default) the server will use the versions the client used */
2481+
/* If set to 0 (default) the client will send both extensions */
2482+
void SSL_set_quic_transport_version(SSL *ssl, int version);
2483+
__owur int SSL_get_quic_transport_version(const SSL *ssl);
2484+
/* Get the version the peer sent, -1 if neither, 0 if both */
2485+
__owur int SSL_get_peer_quic_transport_version(const SSL *ssl);
2486+
24762487
int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *c);
24772488

24782489
# endif

include/openssl/sslerr.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ int ERR_load_SSL_strings(void);
7070
# define SSL_F_FINAL_EMS 486
7171
# define SSL_F_FINAL_KEY_SHARE 503
7272
# define SSL_F_FINAL_MAXFRAGMENTLEN 557
73+
# define SSL_F_FINAL_QUIC_TRANSPORT_PARAMS 652
7374
# define SSL_F_FINAL_RENEGOTIATE 483
7475
# define SSL_F_FINAL_SERVER_NAME 558
7576
# define SSL_F_FINAL_SIG_ALGS 497
@@ -328,6 +329,7 @@ int ERR_load_SSL_strings(void);
328329
# define SSL_F_TLS_CONSTRUCT_CTOS_PSK 501
329330
# define SSL_F_TLS_CONSTRUCT_CTOS_PSK_KEX_MODES 509
330331
# define SSL_F_TLS_CONSTRUCT_CTOS_QUIC_TRANSPORT_PARAMS 648
332+
# define SSL_F_TLS_CONSTRUCT_CTOS_QUIC_TRANSPORT_PARAMS_DRAFT 653
331333
# define SSL_F_TLS_CONSTRUCT_CTOS_RENEGOTIATE 473
332334
# define SSL_F_TLS_CONSTRUCT_CTOS_SCT 474
333335
# define SSL_F_TLS_CONSTRUCT_CTOS_SERVER_NAME 475
@@ -368,6 +370,7 @@ int ERR_load_SSL_strings(void);
368370
# define SSL_F_TLS_CONSTRUCT_STOC_NEXT_PROTO_NEG 457
369371
# define SSL_F_TLS_CONSTRUCT_STOC_PSK 504
370372
# define SSL_F_TLS_CONSTRUCT_STOC_QUIC_TRANSPORT_PARAMS 649
373+
# define SSL_F_TLS_CONSTRUCT_STOC_QUIC_TRANSPORT_PARAMS_DRAFT 654
371374
# define SSL_F_TLS_CONSTRUCT_STOC_RENEGOTIATE 458
372375
# define SSL_F_TLS_CONSTRUCT_STOC_SERVER_NAME 459
373376
# define SSL_F_TLS_CONSTRUCT_STOC_SESSION_TICKET 460
@@ -394,6 +397,7 @@ int ERR_load_SSL_strings(void);
394397
# define SSL_F_TLS_PARSE_CTOS_PSK 505
395398
# define SSL_F_TLS_PARSE_CTOS_PSK_KEX_MODES 572
396399
# define SSL_F_TLS_PARSE_CTOS_QUIC_TRANSPORT_PARAMS 650
400+
# define SSL_F_TLS_PARSE_CTOS_QUIC_TRANSPORT_PARAMS_DRAFT 655
397401
# define SSL_F_TLS_PARSE_CTOS_RENEGOTIATE 464
398402
# define SSL_F_TLS_PARSE_CTOS_SERVER_NAME 573
399403
# define SSL_F_TLS_PARSE_CTOS_SESSION_TICKET 574
@@ -413,6 +417,7 @@ int ERR_load_SSL_strings(void);
413417
# define SSL_F_TLS_PARSE_STOC_NPN 582
414418
# define SSL_F_TLS_PARSE_STOC_PSK 502
415419
# define SSL_F_TLS_PARSE_STOC_QUIC_TRANSPORT_PARAMS 651
420+
# define SSL_F_TLS_PARSE_STOC_QUIC_TRANSPORT_PARAMS_DRAFT 656
416421
# define SSL_F_TLS_PARSE_STOC_RENEGOTIATE 448
417422
# define SSL_F_TLS_PARSE_STOC_SCT 564
418423
# define SSL_F_TLS_PARSE_STOC_SERVER_NAME 583
@@ -605,6 +610,7 @@ int ERR_load_SSL_strings(void);
605610
# define SSL_R_MISSING_ECDSA_SIGNING_CERT 381
606611
# define SSL_R_MISSING_FATAL 256
607612
# define SSL_R_MISSING_PARAMETERS 290
613+
# define SSL_R_MISSING_QUIC_TRANSPORT_PARAMETERS_EXTENSION 294
608614
# define SSL_R_MISSING_RSA_CERTIFICATE 168
609615
# define SSL_R_MISSING_RSA_ENCRYPTING_CERT 169
610616
# define SSL_R_MISSING_RSA_SIGNING_CERT 170

include/openssl/tls1.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ extern "C" {
149149
# define TLSEXT_TYPE_renegotiate 0xff01
150150

151151
/* ExtensionType value from draft-ietf-quic-tls-27 */
152-
# define TLSEXT_TYPE_quic_transport_parameters 0xffa5
152+
# define TLSEXT_TYPE_quic_transport_parameters_draft 0xffa5
153+
# define TLSEXT_TYPE_quic_transport_parameters 0x0039
153154

154155
# ifndef OPENSSL_NO_NEXTPROTONEG
155156
/* This is not an IANA defined extension number */

ssl/ssl_err.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Generated by util/mkerr.pl DO NOT EDIT
3-
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
3+
* Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
44
*
55
* Licensed under the OpenSSL license (the "License"). You may not use
66
* this file except in compliance with the License. You can obtain a copy
@@ -85,6 +85,8 @@ static const ERR_STRING_DATA SSL_str_functs[] = {
8585
{ERR_PACK(ERR_LIB_SSL, SSL_F_FINAL_KEY_SHARE, 0), "final_key_share"},
8686
{ERR_PACK(ERR_LIB_SSL, SSL_F_FINAL_MAXFRAGMENTLEN, 0),
8787
"final_maxfragmentlen"},
88+
{ERR_PACK(ERR_LIB_SSL, SSL_F_FINAL_QUIC_TRANSPORT_PARAMS, 0),
89+
"final_quic_transport_params"},
8890
{ERR_PACK(ERR_LIB_SSL, SSL_F_FINAL_RENEGOTIATE, 0), "final_renegotiate"},
8991
{ERR_PACK(ERR_LIB_SSL, SSL_F_FINAL_SERVER_NAME, 0), "final_server_name"},
9092
{ERR_PACK(ERR_LIB_SSL, SSL_F_FINAL_SIG_ALGS, 0), "final_sig_algs"},
@@ -496,6 +498,8 @@ static const ERR_STRING_DATA SSL_str_functs[] = {
496498
"tls_construct_ctos_psk_kex_modes"},
497499
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_CONSTRUCT_CTOS_QUIC_TRANSPORT_PARAMS, 0),
498500
"tls_construct_ctos_quic_transport_params"},
501+
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_CONSTRUCT_CTOS_QUIC_TRANSPORT_PARAMS_DRAFT, 0),
502+
"tls_construct_ctos_quic_transport_params_draft"},
499503
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_CONSTRUCT_CTOS_RENEGOTIATE, 0),
500504
"tls_construct_ctos_renegotiate"},
501505
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_CONSTRUCT_CTOS_SCT, 0),
@@ -569,6 +573,8 @@ static const ERR_STRING_DATA SSL_str_functs[] = {
569573
"tls_construct_stoc_psk"},
570574
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_CONSTRUCT_STOC_QUIC_TRANSPORT_PARAMS, 0),
571575
"tls_construct_stoc_quic_transport_params"},
576+
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_CONSTRUCT_STOC_QUIC_TRANSPORT_PARAMS_DRAFT, 0),
577+
"tls_construct_stoc_quic_transport_params_draft"},
572578
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_CONSTRUCT_STOC_RENEGOTIATE, 0),
573579
"tls_construct_stoc_renegotiate"},
574580
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_CONSTRUCT_STOC_SERVER_NAME, 0),
@@ -617,6 +623,8 @@ static const ERR_STRING_DATA SSL_str_functs[] = {
617623
"tls_parse_ctos_psk_kex_modes"},
618624
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_PARSE_CTOS_QUIC_TRANSPORT_PARAMS, 0),
619625
"tls_parse_ctos_quic_transport_params"},
626+
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_PARSE_CTOS_QUIC_TRANSPORT_PARAMS_DRAFT, 0),
627+
"tls_parse_ctos_quic_transport_params_draft"},
620628
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_PARSE_CTOS_RENEGOTIATE, 0),
621629
"tls_parse_ctos_renegotiate"},
622630
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_PARSE_CTOS_SERVER_NAME, 0),
@@ -651,6 +659,8 @@ static const ERR_STRING_DATA SSL_str_functs[] = {
651659
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_PARSE_STOC_PSK, 0), "tls_parse_stoc_psk"},
652660
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_PARSE_STOC_QUIC_TRANSPORT_PARAMS, 0),
653661
"tls_parse_stoc_quic_transport_params"},
662+
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_PARSE_STOC_QUIC_TRANSPORT_PARAMS_DRAFT, 0),
663+
"tls_parse_stoc_quic_transport_params_draft"},
654664
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_PARSE_STOC_RENEGOTIATE, 0),
655665
"tls_parse_stoc_renegotiate"},
656666
{ERR_PACK(ERR_LIB_SSL, SSL_F_TLS_PARSE_STOC_SCT, 0), "tls_parse_stoc_sct"},
@@ -972,6 +982,8 @@ static const ERR_STRING_DATA SSL_str_reasons[] = {
972982
"missing ecdsa signing cert"},
973983
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_MISSING_FATAL), "missing fatal"},
974984
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_MISSING_PARAMETERS), "missing parameters"},
985+
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_MISSING_QUIC_TRANSPORT_PARAMETERS_EXTENSION),
986+
"missing quic transport parameters extension"},
975987
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_MISSING_RSA_CERTIFICATE),
976988
"missing rsa certificate"},
977989
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_MISSING_RSA_ENCRYPTING_CERT),

ssl/ssl_lib.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,6 +1212,7 @@ void SSL_free(SSL *s)
12121212

12131213
#ifndef OPENSSL_NO_QUIC
12141214
OPENSSL_free(s->ext.quic_transport_params);
1215+
OPENSSL_free(s->ext.peer_quic_transport_params_draft);
12151216
OPENSSL_free(s->ext.peer_quic_transport_params);
12161217
BUF_MEM_free(s->quic_buf);
12171218
while (s->quic_input_data_head != NULL) {

ssl/ssl_local.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,7 @@ typedef enum tlsext_index_en {
722722
TLSEXT_IDX_cryptopro_bug,
723723
TLSEXT_IDX_early_data,
724724
TLSEXT_IDX_certificate_authorities,
725+
TLSEXT_IDX_quic_transport_params_draft,
725726
TLSEXT_IDX_quic_transport_params,
726727
TLSEXT_IDX_padding,
727728
TLSEXT_IDX_psk,
@@ -1399,6 +1400,8 @@ struct ssl_st {
13991400
#ifndef OPENSSL_NO_QUIC
14001401
uint8_t *quic_transport_params;
14011402
size_t quic_transport_params_len;
1403+
uint8_t *peer_quic_transport_params_draft;
1404+
size_t peer_quic_transport_params_draft_len;
14021405
uint8_t *peer_quic_transport_params;
14031406
size_t peer_quic_transport_params_len;
14041407
#endif
@@ -1408,6 +1411,13 @@ struct ssl_st {
14081411
OSSL_ENCRYPTION_LEVEL quic_read_level;
14091412
OSSL_ENCRYPTION_LEVEL quic_write_level;
14101413
OSSL_ENCRYPTION_LEVEL quic_latest_level_received;
1414+
/* defaults to 0, but can be set to:
1415+
* - TLSEXT_TYPE_quic_transport_parameters_draft
1416+
* - TLSEXT_TYPE_quic_transport_parameters
1417+
* Client: if 0, send both
1418+
* Server: if 0, use same version as client sent
1419+
*/
1420+
int quic_transport_version;
14111421
BUF_MEM *quic_buf; /* buffer incoming handshake messages */
14121422
QUIC_DATA *quic_input_data_head;
14131423
QUIC_DATA *quic_input_data_tail;

ssl/ssl_quic.c

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,45 @@ void SSL_get_peer_quic_transport_params(const SSL *ssl,
3535
const uint8_t **out_params,
3636
size_t *out_params_len)
3737
{
38-
*out_params = ssl->ext.peer_quic_transport_params;
39-
*out_params_len = ssl->ext.peer_quic_transport_params_len;
38+
if (ssl->ext.peer_quic_transport_params_len) {
39+
*out_params = ssl->ext.peer_quic_transport_params;
40+
*out_params_len = ssl->ext.peer_quic_transport_params_len;
41+
} else {
42+
*out_params = ssl->ext.peer_quic_transport_params_draft;
43+
*out_params_len = ssl->ext.peer_quic_transport_params_draft_len;
44+
}
45+
}
46+
47+
/* returns 0 if both are set, -1 if neither, otherwise version */
48+
int SSL_get_peer_quic_transport_version(const SSL *ssl)
49+
{
50+
if (ssl->ext.peer_quic_transport_params_len != 0
51+
&& ssl->ext.peer_quic_transport_params_draft_len != 0)
52+
return -1;
53+
if (ssl->ext.peer_quic_transport_params_len != 0)
54+
return TLSEXT_TYPE_quic_transport_parameters;
55+
if (ssl->ext.peer_quic_transport_params_draft_len != 0)
56+
return TLSEXT_TYPE_quic_transport_parameters_draft;
57+
58+
return -1;
59+
}
60+
61+
void SSL_set_quic_use_legacy_codepoint(SSL *ssl, int use_legacy)
62+
{
63+
if (use_legacy)
64+
ssl->quic_transport_version = TLSEXT_TYPE_quic_transport_parameters_draft;
65+
else
66+
ssl->quic_transport_version = TLSEXT_TYPE_quic_transport_parameters;
67+
}
68+
69+
void SSL_set_quic_transport_version(SSL *ssl, int version)
70+
{
71+
ssl->quic_transport_version = version;
72+
}
73+
74+
int SSL_get_quic_transport_version(const SSL *ssl)
75+
{
76+
return ssl->quic_transport_version;
4077
}
4178

4279
size_t SSL_quic_max_handshake_flight_len(const SSL *ssl, OSSL_ENCRYPTION_LEVEL level)

ssl/statem/extensions.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ static int final_maxfragmentlen(SSL *s, unsigned int context, int sent);
5858
static int init_post_handshake_auth(SSL *s, unsigned int context);
5959
#ifndef OPENSSL_NO_QUIC
6060
static int init_quic_transport_params(SSL *s, unsigned int context);
61+
static int final_quic_transport_params_draft(SSL *s, unsigned int context, int sent);
6162
static int final_quic_transport_params(SSL *s, unsigned int context, int sent);
6263
#endif
6364

@@ -378,6 +379,15 @@ static const EXTENSION_DEFINITION ext_defs[] = {
378379
tls_construct_certificate_authorities, NULL,
379380
},
380381
#ifndef OPENSSL_NO_QUIC
382+
{
383+
TLSEXT_TYPE_quic_transport_parameters_draft,
384+
SSL_EXT_CLIENT_HELLO | SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS
385+
| SSL_EXT_TLS_IMPLEMENTATION_ONLY | SSL_EXT_TLS1_3_ONLY,
386+
init_quic_transport_params,
387+
tls_parse_ctos_quic_transport_params_draft, tls_parse_stoc_quic_transport_params_draft,
388+
tls_construct_stoc_quic_transport_params_draft, tls_construct_ctos_quic_transport_params_draft,
389+
final_quic_transport_params_draft,
390+
},
381391
{
382392
TLSEXT_TYPE_quic_transport_parameters,
383393
SSL_EXT_CLIENT_HELLO | SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS
@@ -1737,8 +1747,38 @@ static int init_quic_transport_params(SSL *s, unsigned int context)
17371747
return 1;
17381748
}
17391749

1750+
static int final_quic_transport_params_draft(SSL *s, unsigned int context,
1751+
int sent)
1752+
{
1753+
return 1;
1754+
}
1755+
17401756
static int final_quic_transport_params(SSL *s, unsigned int context, int sent)
17411757
{
1758+
/* called after final_quic_transport_params_draft */
1759+
if (SSL_IS_QUIC(s)) {
1760+
if (s->ext.peer_quic_transport_params_len == 0
1761+
&& s->ext.peer_quic_transport_params_draft_len == 0) {
1762+
SSLfatal(s, SSL_AD_MISSING_EXTENSION,
1763+
SSL_F_FINAL_QUIC_TRANSPORT_PARAMS,
1764+
SSL_R_MISSING_QUIC_TRANSPORT_PARAMETERS_EXTENSION);
1765+
return 0;
1766+
}
1767+
/* if we got both, discard the one we can't use */
1768+
if (s->ext.peer_quic_transport_params_len != 0
1769+
&& s->ext.peer_quic_transport_params_draft_len != 0) {
1770+
if (s->quic_transport_version == TLSEXT_TYPE_quic_transport_parameters_draft) {
1771+
OPENSSL_free(s->ext.peer_quic_transport_params);
1772+
s->ext.peer_quic_transport_params = NULL;
1773+
s->ext.peer_quic_transport_params_len = 0;
1774+
} else {
1775+
OPENSSL_free(s->ext.peer_quic_transport_params_draft);
1776+
s->ext.peer_quic_transport_params_draft = NULL;
1777+
s->ext.peer_quic_transport_params_draft_len = 0;
1778+
}
1779+
}
1780+
}
1781+
17421782
return 1;
17431783
}
17441784
#endif

0 commit comments

Comments
 (0)