Skip to content

Commit 2ef7c58

Browse files
committed
Add support for BoringSSL QUIC APIs
This is a cherry-pick of 2a4b03a306439307e0b822b17eda3bdabddfbb68 on the master-quic-support2 branch (2019-10-07) Which was a rebase/squash of master-quic-support: * 5aa62ce Add support for more secrets - Todd Short/Todd Short (master-quic-support) * 58e0643 Tweeks to quic_change_cipher_state() - Todd Short/Todd Short * 8169702 Move QUIC code out of tls13_change_cipher_state() - Todd Short/Todd Short * a08cfe6 Correctly disable middlebox compat - Todd Short/Todd Short * 3a9eabf Add OPENSSL_NO_QUIC wrapper - Todd Short/Todd Short * f550eca Add client early traffic secret storage - Todd Short/Todd Short * 1b787ae Quick fix: s2c to c2s for early secret - Todd Short/Todd Short * f97e6a9 Don't process an incomplete message - Todd Short/Todd Short * 81f0ce2 Reset init state in SSL_process_quic_post_handshake() - Todd Short/Todd Short * 5d59cf9 Fix quic_transport constructors/parsers - Todd Short/Todd Short * 5e5f91c Fix INSTALL nit. - Todd Short/Todd Short * bd290ab Fix duplicate word in docs - Todd Short/Todd Short * 699590b fixup! Handle partial handshake messages - Todd Short/Todd Short * a472a8d Handle partial handshake messages - Todd Short/Todd Short * 363cf3d fixup! Use proper secrets for handshake - Todd Short/Todd Short * b03fee6 Use proper secrets for handshake - Todd Short/Todd Short * 2ab1aa0 Move QUIC transport params to encrypted extensions - Todd Short/Todd Short * 0d16af9 Make temp secret names less confusing - Todd Short/Todd Short * abb6f39 New method to get QUIC secret length - Todd Short/Todd Short * 05fdae9 Add support for BoringSSL QUIC APIs - Todd Short/Todd Short This adds a compatible API for BoringSSL's QUIC support, based on the current |draft-ietf-quic-tls|. Based on BoringSSL commit 3c034b2cf386b3131f75520705491871a2e0cafe Based on BoringSSL commit c8e0f90f83b9ec38ea833deb86b5a41360b62b6a Based on BoringSSL commit 3cbb0299a28a8bd0136257251a78b91a96c5eec8 Based on BoringSSL commit cc9d935256539af2d3b7f831abf57c0d685ffd81 Based on BoringSSL commit e6eef1ca16a022e476bbaedffef044597cfc8f4b Based on BoringSSL commit 6f733791148cf8a076bf0e95498235aadbe5926d Based on BoringSSL commit 384d0eaf1930af1ebc47eda751f0c78dfcba1c03 Based on BoringSSL commit a0373182eb5cc7b81d49f434596b473c7801c942 Based on BoringSSL commit b1b76aee3cb43ce11889403c5334283d951ebd37 New method to get QUIC secret length Make temp secret names less confusing Move QUIC transport params to encrypted extensions Use proper secrets for handshake fixup! Use proper secrets for handshake Handle partial handshake messages fixup! Handle partial handshake messages Fix duplicate word in docs Fix INSTALL nit. Fix quic_transport constructors/parsers Reset init state in SSL_process_quic_post_handshake() Don't process an incomplete message Quick fix: s2c to c2s for early secret Add client early traffic secret storage Add OPENSSL_NO_QUIC wrapper Correctly disable middlebox compat Move QUIC code out of tls13_change_cipher_state() Create quic_change_cipher_state() that does the minimal required to generate the QUIC secrets. (e.g. encryption contexts are not initialized). Tweeks to quic_change_cipher_state() Add support for more secrets
1 parent 36eadf1 commit 2ef7c58

31 files changed

+1341
-31
lines changed

CHANGES

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@
9494

9595
Changes between 1.1.1c and 1.1.1d [10 Sep 2019]
9696

97+
*) Implement BoringSSL's QUIC API
98+
[Todd Short]
99+
97100
*) Fixed a fork protection issue. OpenSSL 1.1.1 introduced a rewritten random
98101
number generator (RNG). This was intended to include protection in the
99102
event of a fork() system call in order to ensure that the parent and child

Configure

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@ my @disablables = (
391391
"poly1305",
392392
"posix-io",
393393
"psk",
394+
"quic",
394395
"rc2",
395396
"rc4",
396397
"rc5",
@@ -507,6 +508,8 @@ my @disable_cascades = (
507508
sub { !$disabled{"unit-test"} } => [ "heartbeats" ],
508509

509510
sub { !$disabled{"msan"} } => [ "asm" ],
511+
512+
"tls1_3" => [ "quic" ],
510513
);
511514

512515
# Avoid protocol support holes. Also disable all versions below N, if version

INSTALL

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,9 @@
456456
no-psk
457457
Don't build support for Pre-Shared Key based ciphersuites.
458458

459+
no-quic
460+
Don't build with support for QUIC.
461+
459462
no-rdrand
460463
Don't use hardware RDRAND capabilities.
461464

crypto/err/openssl.txt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1180,7 +1180,7 @@ SSL_F_OSSL_STATEM_SERVER_CONSTRUCT_MESSAGE:431:*
11801180
SSL_F_OSSL_STATEM_SERVER_POST_PROCESS_MESSAGE:601:\
11811181
ossl_statem_server_post_process_message
11821182
SSL_F_OSSL_STATEM_SERVER_POST_WORK:602:ossl_statem_server_post_work
1183-
SSL_F_OSSL_STATEM_SERVER_PRE_WORK:640:
1183+
SSL_F_OSSL_STATEM_SERVER_PRE_WORK:640:ossl_statem_server_pre_work
11841184
SSL_F_OSSL_STATEM_SERVER_PROCESS_MESSAGE:603:ossl_statem_server_process_message
11851185
SSL_F_OSSL_STATEM_SERVER_READ_TRANSITION:418:ossl_statem_server_read_transition
11861186
SSL_F_OSSL_STATEM_SERVER_WRITE_TRANSITION:604:\
@@ -1189,6 +1189,9 @@ SSL_F_PARSE_CA_NAMES:541:parse_ca_names
11891189
SSL_F_PITEM_NEW:624:pitem_new
11901190
SSL_F_PQUEUE_NEW:625:pqueue_new
11911191
SSL_F_PROCESS_KEY_SHARE_EXT:439:*
1192+
SSL_F_QUIC_CHANGE_CIPHER_STATE:639:quic_change_cipher_state
1193+
SSL_F_QUIC_GET_MESSAGE:641:quic_get_message
1194+
SSL_F_QUIC_SET_ENCRYPTION_SECRETS:642:quic_set_encryption_secrets
11921195
SSL_F_READ_STATE_MACHINE:352:read_state_machine
11931196
SSL_F_SET_CLIENT_CIPHERSUITE:540:set_client_ciphersuite
11941197
SSL_F_SRP_GENERATE_CLIENT_MASTER_SECRET:595:srp_generate_client_master_secret
@@ -1199,7 +1202,9 @@ SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM:130:ssl3_check_cert_and_algorithm
11991202
SSL_F_SSL3_CTRL:213:ssl3_ctrl
12001203
SSL_F_SSL3_CTX_CTRL:133:ssl3_ctx_ctrl
12011204
SSL_F_SSL3_DIGEST_CACHED_RECORDS:293:ssl3_digest_cached_records
1205+
SSL_F_SSL3_DISPATCH_ALERT:643:ssl3_dispatch_alert
12021206
SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC:292:ssl3_do_change_cipher_spec
1207+
SSL_F_SSL3_DO_WRITE:644:ssl3_do_write
12031208
SSL_F_SSL3_ENC:608:ssl3_enc
12041209
SSL_F_SSL3_FINAL_FINISH_MAC:285:ssl3_final_finish_mac
12051210
SSL_F_SSL3_FINISH_MAC:587:ssl3_finish_mac
@@ -1307,6 +1312,8 @@ SSL_F_SSL_PARSE_SERVERHELLO_USE_SRTP_EXT:311:*
13071312
SSL_F_SSL_PEEK:270:SSL_peek
13081313
SSL_F_SSL_PEEK_EX:432:SSL_peek_ex
13091314
SSL_F_SSL_PEEK_INTERNAL:522:ssl_peek_internal
1315+
SSL_F_SSL_PROCESS_QUIC_POST_HANDSHAKE:645:SSL_process_quic_post_handshake
1316+
SSL_F_SSL_PROVIDE_QUIC_DATA:646:SSL_provide_quic_data
13101317
SSL_F_SSL_READ:223:SSL_read
13111318
SSL_F_SSL_READ_EARLY_DATA:529:SSL_read_early_data
13121319
SSL_F_SSL_READ_EX:434:SSL_read_ex
@@ -1356,6 +1363,7 @@ SSL_F_SSL_WRITE_EARLY_DATA:526:SSL_write_early_data
13561363
SSL_F_SSL_WRITE_EARLY_FINISH:527:*
13571364
SSL_F_SSL_WRITE_EX:433:SSL_write_ex
13581365
SSL_F_SSL_WRITE_INTERNAL:524:ssl_write_internal
1366+
SSL_F_STATEM_FLUSH:647:statem_flush
13591367
SSL_F_STATE_MACHINE:353:state_machine
13601368
SSL_F_TLS12_CHECK_PEER_SIGALG:333:tls12_check_peer_sigalg
13611369
SSL_F_TLS12_COPY_SIGALGS:533:tls12_copy_sigalgs
@@ -1419,6 +1427,8 @@ SSL_F_TLS_CONSTRUCT_CTOS_POST_HANDSHAKE_AUTH:619:\
14191427
tls_construct_ctos_post_handshake_auth
14201428
SSL_F_TLS_CONSTRUCT_CTOS_PSK:501:tls_construct_ctos_psk
14211429
SSL_F_TLS_CONSTRUCT_CTOS_PSK_KEX_MODES:509:tls_construct_ctos_psk_kex_modes
1430+
SSL_F_TLS_CONSTRUCT_CTOS_QUIC_TRANSPORT_PARAMS:648:\
1431+
tls_construct_ctos_quic_transport_params
14221432
SSL_F_TLS_CONSTRUCT_CTOS_RENEGOTIATE:473:tls_construct_ctos_renegotiate
14231433
SSL_F_TLS_CONSTRUCT_CTOS_SCT:474:tls_construct_ctos_sct
14241434
SSL_F_TLS_CONSTRUCT_CTOS_SERVER_NAME:475:tls_construct_ctos_server_name
@@ -1460,6 +1470,8 @@ SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE:456:tls_construct_stoc_key_share
14601470
SSL_F_TLS_CONSTRUCT_STOC_MAXFRAGMENTLEN:548:tls_construct_stoc_maxfragmentlen
14611471
SSL_F_TLS_CONSTRUCT_STOC_NEXT_PROTO_NEG:457:tls_construct_stoc_next_proto_neg
14621472
SSL_F_TLS_CONSTRUCT_STOC_PSK:504:tls_construct_stoc_psk
1473+
SSL_F_TLS_CONSTRUCT_STOC_QUIC_TRANSPORT_PARAMS:649:\
1474+
tls_construct_stoc_quic_transport_params
14631475
SSL_F_TLS_CONSTRUCT_STOC_RENEGOTIATE:458:tls_construct_stoc_renegotiate
14641476
SSL_F_TLS_CONSTRUCT_STOC_SERVER_NAME:459:tls_construct_stoc_server_name
14651477
SSL_F_TLS_CONSTRUCT_STOC_SESSION_TICKET:460:tls_construct_stoc_session_ticket
@@ -1488,6 +1500,8 @@ SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN:571:tls_parse_ctos_maxfragmentlen
14881500
SSL_F_TLS_PARSE_CTOS_POST_HANDSHAKE_AUTH:620:tls_parse_ctos_post_handshake_auth
14891501
SSL_F_TLS_PARSE_CTOS_PSK:505:tls_parse_ctos_psk
14901502
SSL_F_TLS_PARSE_CTOS_PSK_KEX_MODES:572:tls_parse_ctos_psk_kex_modes
1503+
SSL_F_TLS_PARSE_CTOS_QUIC_TRANSPORT_PARAMS:650:\
1504+
tls_parse_ctos_quic_transport_params
14911505
SSL_F_TLS_PARSE_CTOS_RENEGOTIATE:464:tls_parse_ctos_renegotiate
14921506
SSL_F_TLS_PARSE_CTOS_SERVER_NAME:573:tls_parse_ctos_server_name
14931507
SSL_F_TLS_PARSE_CTOS_SESSION_TICKET:574:tls_parse_ctos_session_ticket
@@ -1506,6 +1520,8 @@ SSL_F_TLS_PARSE_STOC_KEY_SHARE:445:tls_parse_stoc_key_share
15061520
SSL_F_TLS_PARSE_STOC_MAXFRAGMENTLEN:581:tls_parse_stoc_maxfragmentlen
15071521
SSL_F_TLS_PARSE_STOC_NPN:582:tls_parse_stoc_npn
15081522
SSL_F_TLS_PARSE_STOC_PSK:502:tls_parse_stoc_psk
1523+
SSL_F_TLS_PARSE_STOC_QUIC_TRANSPORT_PARAMS:651:\
1524+
tls_parse_stoc_quic_transport_params
15091525
SSL_F_TLS_PARSE_STOC_RENEGOTIATE:448:tls_parse_stoc_renegotiate
15101526
SSL_F_TLS_PARSE_STOC_SCT:564:tls_parse_stoc_sct
15111527
SSL_F_TLS_PARSE_STOC_SERVER_NAME:583:tls_parse_stoc_server_name
@@ -2706,6 +2722,7 @@ SSL_R_INCONSISTENT_EARLY_DATA_ALPN:222:inconsistent early data alpn
27062722
SSL_R_INCONSISTENT_EARLY_DATA_SNI:231:inconsistent early data sni
27072723
SSL_R_INCONSISTENT_EXTMS:104:inconsistent extms
27082724
SSL_R_INSUFFICIENT_SECURITY:241:insufficient security
2725+
SSL_R_INTERNAL_ERROR:295:internal error
27092726
SSL_R_INVALID_ALERT:205:invalid alert
27102727
SSL_R_INVALID_CCS_MESSAGE:260:invalid ccs message
27112728
SSL_R_INVALID_CERTIFICATE_OR_ALG:238:invalid certificate or alg
@@ -2881,6 +2898,7 @@ SSL_R_VERSION_TOO_LOW:396:version too low
28812898
SSL_R_WRONG_CERTIFICATE_TYPE:383:wrong certificate type
28822899
SSL_R_WRONG_CIPHER_RETURNED:261:wrong cipher returned
28832900
SSL_R_WRONG_CURVE:378:wrong curve
2901+
SSL_R_WRONG_ENCRYPTION_LEVEL_RECEIVED:296:wrong encryption level received
28842902
SSL_R_WRONG_SIGNATURE_LENGTH:264:wrong signature length
28852903
SSL_R_WRONG_SIGNATURE_SIZE:265:wrong signature size
28862904
SSL_R_WRONG_SIGNATURE_TYPE:370:wrong signature type

doc/man3/SSL_CIPHER_get_name.pod

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ SSL_CIPHER_get_digest_nid,
1313
SSL_CIPHER_get_handshake_digest,
1414
SSL_CIPHER_get_kx_nid,
1515
SSL_CIPHER_get_auth_nid,
16+
SSL_CIPHER_get_prf_nid,
1617
SSL_CIPHER_is_aead,
1718
SSL_CIPHER_find,
1819
SSL_CIPHER_get_id,
@@ -34,6 +35,7 @@ SSL_CIPHER_get_protocol_id
3435
const EVP_MD *SSL_CIPHER_get_handshake_digest(const SSL_CIPHER *c);
3536
int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c);
3637
int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c);
38+
int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *c);
3739
int SSL_CIPHER_is_aead(const SSL_CIPHER *c);
3840
const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr);
3941
uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c);
@@ -91,6 +93,15 @@ TLS 1.3 cipher suites) B<NID_auth_any> is returned. Examples (not comprehensive)
9193
NID_auth_ecdsa
9294
NID_auth_psk
9395

96+
SSL_CIPHER_get_prf_nid() retuns the pseudo-random function NID for B<c>. If B<c> is
97+
a pre-TLS-1.2 cipher, it returns B<NID_md5_sha1> but note these ciphers use
98+
SHA-256 in TLS 1.2. Other return values may be treated uniformly in all
99+
applicable versions. Examples (not comprehensive):
100+
101+
NID_md5_sha1
102+
NID_sha256
103+
NID_sha384
104+
94105
SSL_CIPHER_is_aead() returns 1 if the cipher B<c> is AEAD (e.g. GCM or
95106
ChaCha20/Poly1305), and 0 if it is not AEAD.
96107

@@ -201,6 +212,8 @@ required to enable this function.
201212

202213
The OPENSSL_cipher_name() function was added in OpenSSL 1.1.1.
203214

215+
The SSL_CIPHER_get_prf_nid() function was added in OpenSSL 3.0.0.
216+
204217
=head1 COPYRIGHT
205218

206219
Copyright 2000-2019 The OpenSSL Project Authors. All Rights Reserved.

0 commit comments

Comments
 (0)