summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/ssl_clnt.c20
-rw-r--r--src/lib/libssl/ssl_locl.h26
-rw-r--r--src/lib/libssl/ssl_pkt.c7
-rw-r--r--src/lib/libssl/ssl_sigalgs.c8
-rw-r--r--src/lib/libssl/ssl_srvr.c21
-rw-r--r--src/lib/libssl/ssl_tlsext.c116
-rw-r--r--src/lib/libssl/ssl_versions.c26
-rw-r--r--src/lib/libssl/tls13_client.c20
-rw-r--r--src/lib/libssl/tls13_server.c9
9 files changed, 145 insertions, 108 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c
index 70bda982c6..97418f1ac7 100644
--- a/src/lib/libssl/ssl_clnt.c
+++ b/src/lib/libssl/ssl_clnt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_clnt.c,v 1.84 2021/02/22 15:59:10 jsing Exp $ */ 1/* $OpenBSD: ssl_clnt.c,v 1.85 2021/03/10 18:27:01 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -218,7 +218,14 @@ ssl3_connect(SSL *s)
218 goto end; 218 goto end;
219 } 219 }
220 220
221 /* s->version=SSL3_VERSION; */ 221 if (!ssl_supported_tls_version_range(s,
222 &S3I(s)->hs.our_min_tls_version,
223 &S3I(s)->hs.our_max_tls_version)) {
224 SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE);
225 ret = -1;
226 goto end;
227 }
228
222 s->internal->type = SSL_ST_CONNECT; 229 s->internal->type = SSL_ST_CONNECT;
223 230
224 if (!ssl3_setup_init_buffer(s)) { 231 if (!ssl3_setup_init_buffer(s)) {
@@ -904,6 +911,12 @@ ssl3_get_server_hello(SSL *s)
904 } 911 }
905 s->version = server_version; 912 s->version = server_version;
906 913
914 S3I(s)->hs.negotiated_tls_version = ssl_tls_version(server_version);
915 if (S3I(s)->hs.negotiated_tls_version == 0) {
916 SSLerror(s, ERR_R_INTERNAL_ERROR);
917 goto err;
918 }
919
907 if ((method = ssl_get_method(server_version)) == NULL) { 920 if ((method = ssl_get_method(server_version)) == NULL) {
908 SSLerror(s, ERR_R_INTERNAL_ERROR); 921 SSLerror(s, ERR_R_INTERNAL_ERROR);
909 goto err; 922 goto err;
@@ -1019,7 +1032,7 @@ ssl3_get_server_hello(SSL *s)
1019 1032
1020 /* TLS v1.2 only ciphersuites require v1.2 or later. */ 1033 /* TLS v1.2 only ciphersuites require v1.2 or later. */
1021 if ((cipher->algorithm_ssl & SSL_TLSV1_2) && 1034 if ((cipher->algorithm_ssl & SSL_TLSV1_2) &&
1022 (TLS1_get_version(s) < TLS1_2_VERSION)) { 1035 S3I(s)->hs.negotiated_tls_version < TLS1_2_VERSION) {
1023 al = SSL_AD_ILLEGAL_PARAMETER; 1036 al = SSL_AD_ILLEGAL_PARAMETER;
1024 SSLerror(s, SSL_R_WRONG_CIPHER_RETURNED); 1037 SSLerror(s, SSL_R_WRONG_CIPHER_RETURNED);
1025 goto fatal_err; 1038 goto fatal_err;
@@ -1982,6 +1995,7 @@ ssl3_send_client_kex_rsa(SSL *s, SESS_CERT *sess_cert, CBB *cbb)
1982 goto err; 1995 goto err;
1983 } 1996 }
1984 1997
1998 /* XXX - our max protocol version. */
1985 pms[0] = s->client_version >> 8; 1999 pms[0] = s->client_version >> 8;
1986 pms[1] = s->client_version & 0xff; 2000 pms[1] = s->client_version & 0xff;
1987 arc4random_buf(&pms[2], sizeof(pms) - 2); 2001 arc4random_buf(&pms[2], sizeof(pms) - 2);
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index b2af8fd7c9..6f66a8932e 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.324 2021/02/27 14:20:50 jsing Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.325 2021/03/10 18:27:01 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -407,6 +407,23 @@ typedef struct ssl_session_internal_st {
407#define SSI(s) (s->session->internal) 407#define SSI(s) (s->session->internal)
408 408
409typedef struct ssl_handshake_st { 409typedef struct ssl_handshake_st {
410 /*
411 * Minimum and maximum versions supported for this handshake. These are
412 * initialised at the start of a handshake based on the method in use
413 * and the current protocol version configuration.
414 */
415 uint16_t our_min_tls_version;
416 uint16_t our_max_tls_version;
417
418 /*
419 * Version negotiated for this session. For a client this is set once
420 * the server selected version is parsed from the ServerHello (either
421 * from the legacy version or supported versions extension). For a
422 * server this is set once we select the version we will use with the
423 * client.
424 */
425 uint16_t negotiated_tls_version;
426
410 /* state contains one of the SSL3_ST_* values. */ 427 /* state contains one of the SSL3_ST_* values. */
411 int state; 428 int state;
412 429
@@ -435,10 +452,6 @@ typedef struct cert_pkey_st {
435} CERT_PKEY; 452} CERT_PKEY;
436 453
437typedef struct ssl_handshake_tls13_st { 454typedef struct ssl_handshake_tls13_st {
438 uint16_t min_version;
439 uint16_t max_version;
440 uint16_t version;
441
442 int use_legacy; 455 int use_legacy;
443 int hrr; 456 int hrr;
444 457
@@ -468,7 +481,6 @@ typedef struct ssl_handshake_tls13_st {
468 EVP_MD_CTX *clienthello_md_ctx; 481 EVP_MD_CTX *clienthello_md_ctx;
469 unsigned char *clienthello_hash; 482 unsigned char *clienthello_hash;
470 unsigned int clienthello_hash_len; 483 unsigned int clienthello_hash_len;
471
472} SSL_HANDSHAKE_TLS13; 484} SSL_HANDSHAKE_TLS13;
473 485
474struct tls12_record_layer; 486struct tls12_record_layer;
@@ -1117,6 +1129,8 @@ int ssl_version_set_max(const SSL_METHOD *meth, uint16_t proto_ver,
1117 uint16_t min_tls_ver, uint16_t *out_tls_ver, uint16_t *out_proto_ver); 1129 uint16_t min_tls_ver, uint16_t *out_tls_ver, uint16_t *out_proto_ver);
1118int ssl_enabled_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver); 1130int ssl_enabled_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver);
1119int ssl_supported_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver); 1131int ssl_supported_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver);
1132uint16_t ssl_tls_version(uint16_t version);
1133uint16_t ssl_effective_tls_version(SSL *s);
1120int ssl_downgrade_max_version(SSL *s, uint16_t *max_ver); 1134int ssl_downgrade_max_version(SSL *s, uint16_t *max_ver);
1121int ssl_max_supported_version(SSL *s, uint16_t *max_ver); 1135int ssl_max_supported_version(SSL *s, uint16_t *max_ver);
1122int ssl_max_shared_version(SSL *s, uint16_t peer_ver, uint16_t *max_ver); 1136int ssl_max_shared_version(SSL *s, uint16_t peer_ver, uint16_t *max_ver);
diff --git a/src/lib/libssl/ssl_pkt.c b/src/lib/libssl/ssl_pkt.c
index 894064c817..5b1af504fb 100644
--- a/src/lib/libssl/ssl_pkt.c
+++ b/src/lib/libssl/ssl_pkt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_pkt.c,v 1.36 2021/02/20 14:14:16 tb Exp $ */ 1/* $OpenBSD: ssl_pkt.c,v 1.37 2021/03/10 18:27:02 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -561,8 +561,9 @@ do_ssl3_write(SSL *s, int type, const unsigned char *buf, unsigned int len)
561 * bytes and record version number > TLS 1.0. 561 * bytes and record version number > TLS 1.0.
562 */ 562 */
563 version = s->version; 563 version = s->version;
564 if (S3I(s)->hs.state == SSL3_ST_CW_CLNT_HELLO_B && !s->internal->renegotiate && 564 if (S3I(s)->hs.state == SSL3_ST_CW_CLNT_HELLO_B &&
565 TLS1_get_version(s) > TLS1_VERSION) 565 !s->internal->renegotiate &&
566 S3I(s)->hs.our_max_tls_version > TLS1_VERSION)
566 version = TLS1_VERSION; 567 version = TLS1_VERSION;
567 568
568 /* 569 /*
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c
index 1b5aad72f7..68bb6a3889 100644
--- a/src/lib/libssl/ssl_sigalgs.c
+++ b/src/lib/libssl/ssl_sigalgs.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_sigalgs.c,v 1.22 2020/10/11 01:13:04 guenther Exp $ */ 1/* $OpenBSD: ssl_sigalgs.c,v 1.23 2021/03/10 18:27:02 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018-2020 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018-2020 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -265,7 +265,7 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey)
265 int check_curve = 0; 265 int check_curve = 0;
266 CBS cbs; 266 CBS cbs;
267 267
268 if (TLS1_get_version(s) >= TLS1_3_VERSION) { 268 if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION) {
269 tls_sigalgs = tls13_sigalgs; 269 tls_sigalgs = tls13_sigalgs;
270 tls_sigalgs_len = tls13_sigalgs_len; 270 tls_sigalgs_len = tls13_sigalgs_len;
271 check_curve = 1; 271 check_curve = 1;
@@ -291,7 +291,7 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey)
291 * RFC 5246 allows a TLS 1.2 client to send no sigalgs, in 291 * RFC 5246 allows a TLS 1.2 client to send no sigalgs, in
292 * which case the server must use the the default. 292 * which case the server must use the the default.
293 */ 293 */
294 if (TLS1_get_version(s) < TLS1_3_VERSION && 294 if (S3I(s)->hs.negotiated_tls_version < TLS1_3_VERSION &&
295 S3I(s)->hs.sigalgs == NULL) { 295 S3I(s)->hs.sigalgs == NULL) {
296 switch (pkey->type) { 296 switch (pkey->type) {
297 case EVP_PKEY_RSA: 297 case EVP_PKEY_RSA:
@@ -323,7 +323,7 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey)
323 continue; 323 continue;
324 324
325 /* RSA cannot be used without PSS in TLSv1.3. */ 325 /* RSA cannot be used without PSS in TLSv1.3. */
326 if (TLS1_get_version(s) >= TLS1_3_VERSION && 326 if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION &&
327 sigalg->key_type == EVP_PKEY_RSA && 327 sigalg->key_type == EVP_PKEY_RSA &&
328 (sigalg->flags & SIGALG_FLAG_RSA_PSS) == 0) 328 (sigalg->flags & SIGALG_FLAG_RSA_PSS) == 0)
329 continue; 329 continue;
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index be9c27f73f..373a20d61b 100644
--- a/src/lib/libssl/ssl_srvr.c
+++ b/src/lib/libssl/ssl_srvr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_srvr.c,v 1.95 2021/02/20 14:16:56 tb Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.96 2021/03/10 18:27:02 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -219,6 +219,14 @@ ssl3_accept(SSL *s)
219 goto end; 219 goto end;
220 } 220 }
221 221
222 if (!ssl_supported_tls_version_range(s,
223 &S3I(s)->hs.our_min_tls_version,
224 &S3I(s)->hs.our_max_tls_version)) {
225 SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE);
226 ret = -1;
227 goto end;
228 }
229
222 s->internal->type = SSL_ST_ACCEPT; 230 s->internal->type = SSL_ST_ACCEPT;
223 231
224 if (!ssl3_setup_init_buffer(s)) { 232 if (!ssl3_setup_init_buffer(s)) {
@@ -844,7 +852,7 @@ ssl3_get_client_hello(SSL *s)
844 */ 852 */
845 if (!ssl_downgrade_max_version(s, &max_version)) 853 if (!ssl_downgrade_max_version(s, &max_version))
846 goto err; 854 goto err;
847 if (ssl_max_shared_version(s, client_version, &shared_version) != 1) { 855 if (!ssl_max_shared_version(s, client_version, &shared_version)) {
848 if ((s->client_version >> 8) == SSL3_VERSION_MAJOR && 856 if ((s->client_version >> 8) == SSL3_VERSION_MAJOR &&
849 !tls12_record_layer_write_protected(s->internal->rl)) { 857 !tls12_record_layer_write_protected(s->internal->rl)) {
850 /* 858 /*
@@ -860,6 +868,12 @@ ssl3_get_client_hello(SSL *s)
860 s->client_version = client_version; 868 s->client_version = client_version;
861 s->version = shared_version; 869 s->version = shared_version;
862 870
871 S3I(s)->hs.negotiated_tls_version = ssl_tls_version(shared_version);
872 if (S3I(s)->hs.negotiated_tls_version == 0) {
873 SSLerror(s, ERR_R_INTERNAL_ERROR);
874 goto err;
875 }
876
863 if ((method = ssl_get_method(shared_version)) == NULL) { 877 if ((method = ssl_get_method(shared_version)) == NULL) {
864 SSLerror(s, ERR_R_INTERNAL_ERROR); 878 SSLerror(s, ERR_R_INTERNAL_ERROR);
865 goto err; 879 goto err;
@@ -1718,6 +1732,8 @@ ssl3_get_client_kex_rsa(SSL *s, CBS *cbs)
1718 int al = -1; 1732 int al = -1;
1719 1733
1720 arc4random_buf(fakekey, sizeof(fakekey)); 1734 arc4random_buf(fakekey, sizeof(fakekey));
1735
1736 /* XXX - peer max protocol version. */
1721 fakekey[0] = s->client_version >> 8; 1737 fakekey[0] = s->client_version >> 8;
1722 fakekey[1] = s->client_version & 0xff; 1738 fakekey[1] = s->client_version & 0xff;
1723 1739
@@ -1754,6 +1770,7 @@ ssl3_get_client_kex_rsa(SSL *s, CBS *cbs)
1754 /* SSLerror(s, SSL_R_BAD_RSA_DECRYPT); */ 1770 /* SSLerror(s, SSL_R_BAD_RSA_DECRYPT); */
1755 } 1771 }
1756 1772
1773 /* XXX - peer max version. */
1757 if ((al == -1) && !((pms[0] == (s->client_version >> 8)) && 1774 if ((al == -1) && !((pms[0] == (s->client_version >> 8)) &&
1758 (pms[1] == (s->client_version & 0xff)))) { 1775 (pms[1] == (s->client_version & 0xff)))) {
1759 /* 1776 /*
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c
index dca9de0305..4f4a39d4bb 100644
--- a/src/lib/libssl/ssl_tlsext.c
+++ b/src/lib/libssl/ssl_tlsext.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_tlsext.c,v 1.86 2021/02/08 17:20:47 jsing Exp $ */ 1/* $OpenBSD: ssl_tlsext.c,v 1.87 2021/03/10 18:27:02 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> 4 * Copyright (c) 2017 Doug Hogan <doug@openbsd.org>
@@ -174,7 +174,7 @@ int
174tlsext_supportedgroups_client_needs(SSL *s, uint16_t msg_type) 174tlsext_supportedgroups_client_needs(SSL *s, uint16_t msg_type)
175{ 175{
176 return ssl_has_ecc_ciphers(s) || 176 return ssl_has_ecc_ciphers(s) ||
177 (S3I(s)->hs_tls13.max_version >= TLS1_3_VERSION); 177 (S3I(s)->hs.our_max_tls_version >= TLS1_3_VERSION);
178} 178}
179 179
180int 180int
@@ -472,7 +472,8 @@ tlsext_ri_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
472int 472int
473tlsext_ri_server_needs(SSL *s, uint16_t msg_type) 473tlsext_ri_server_needs(SSL *s, uint16_t msg_type)
474{ 474{
475 return (s->version < TLS1_3_VERSION && S3I(s)->send_connection_binding); 475 return (S3I(s)->hs.negotiated_tls_version < TLS1_3_VERSION &&
476 S3I(s)->send_connection_binding);
476} 477}
477 478
478int 479int
@@ -554,7 +555,7 @@ tlsext_ri_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
554int 555int
555tlsext_sigalgs_client_needs(SSL *s, uint16_t msg_type) 556tlsext_sigalgs_client_needs(SSL *s, uint16_t msg_type)
556{ 557{
557 return (TLS1_get_client_version(s) >= TLS1_2_VERSION); 558 return (S3I(s)->hs.our_max_tls_version >= TLS1_2_VERSION);
558} 559}
559 560
560int 561int
@@ -564,8 +565,7 @@ tlsext_sigalgs_client_build(SSL *s, uint16_t msg_type, CBB *cbb)
564 size_t tls_sigalgs_len = tls12_sigalgs_len; 565 size_t tls_sigalgs_len = tls12_sigalgs_len;
565 CBB sigalgs; 566 CBB sigalgs;
566 567
567 if (TLS1_get_client_version(s) >= TLS1_3_VERSION && 568 if (S3I(s)->hs.our_min_tls_version >= TLS1_3_VERSION) {
568 S3I(s)->hs_tls13.min_version >= TLS1_3_VERSION) {
569 tls_sigalgs = tls13_sigalgs; 569 tls_sigalgs = tls13_sigalgs;
570 tls_sigalgs_len = tls13_sigalgs_len; 570 tls_sigalgs_len = tls13_sigalgs_len;
571 } 571 }
@@ -600,7 +600,7 @@ tlsext_sigalgs_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
600int 600int
601tlsext_sigalgs_server_needs(SSL *s, uint16_t msg_type) 601tlsext_sigalgs_server_needs(SSL *s, uint16_t msg_type)
602{ 602{
603 return (s->version >= TLS1_3_VERSION); 603 return (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION);
604} 604}
605 605
606int 606int
@@ -610,7 +610,7 @@ tlsext_sigalgs_server_build(SSL *s, uint16_t msg_type, CBB *cbb)
610 size_t tls_sigalgs_len = tls12_sigalgs_len; 610 size_t tls_sigalgs_len = tls12_sigalgs_len;
611 CBB sigalgs; 611 CBB sigalgs;
612 612
613 if (s->version >= TLS1_3_VERSION) { 613 if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION) {
614 tls_sigalgs = tls13_sigalgs; 614 tls_sigalgs = tls13_sigalgs;
615 tls_sigalgs_len = tls13_sigalgs_len; 615 tls_sigalgs_len = tls13_sigalgs_len;
616 } 616 }
@@ -632,7 +632,7 @@ tlsext_sigalgs_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
632{ 632{
633 CBS sigalgs; 633 CBS sigalgs;
634 634
635 if (s->version < TLS1_3_VERSION) 635 if (ssl_effective_tls_version(s) < TLS1_3_VERSION)
636 return 0; 636 return 0;
637 637
638 if (!CBS_get_u16_length_prefixed(cbs, &sigalgs)) 638 if (!CBS_get_u16_length_prefixed(cbs, &sigalgs))
@@ -981,7 +981,7 @@ tlsext_ocsp_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
981int 981int
982tlsext_ocsp_server_needs(SSL *s, uint16_t msg_type) 982tlsext_ocsp_server_needs(SSL *s, uint16_t msg_type)
983{ 983{
984 if (s->version >= TLS1_3_VERSION && 984 if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION &&
985 s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp && 985 s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp &&
986 s->ctx->internal->tlsext_status_cb != NULL) { 986 s->ctx->internal->tlsext_status_cb != NULL) {
987 s->internal->tlsext_status_expected = 0; 987 s->internal->tlsext_status_expected = 0;
@@ -998,7 +998,7 @@ tlsext_ocsp_server_build(SSL *s, uint16_t msg_type, CBB *cbb)
998{ 998{
999 CBB ocsp_response; 999 CBB ocsp_response;
1000 1000
1001 if (s->version >= TLS1_3_VERSION) { 1001 if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION) {
1002 if (!CBB_add_u8(cbb, TLSEXT_STATUSTYPE_ocsp)) 1002 if (!CBB_add_u8(cbb, TLSEXT_STATUSTYPE_ocsp))
1003 return 0; 1003 return 0;
1004 if (!CBB_add_u24_length_prefixed(cbb, &ocsp_response)) 1004 if (!CBB_add_u24_length_prefixed(cbb, &ocsp_response))
@@ -1016,11 +1016,10 @@ tlsext_ocsp_server_build(SSL *s, uint16_t msg_type, CBB *cbb)
1016int 1016int
1017tlsext_ocsp_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) 1017tlsext_ocsp_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1018{ 1018{
1019 CBS response;
1020 uint16_t version = TLS1_get_client_version(s);
1021 uint8_t status_type; 1019 uint8_t status_type;
1020 CBS response;
1022 1021
1023 if (version >= TLS1_3_VERSION) { 1022 if (ssl_effective_tls_version(s) >= TLS1_3_VERSION) {
1024 if (msg_type == SSL_TLSEXT_MSG_CR) { 1023 if (msg_type == SSL_TLSEXT_MSG_CR) {
1025 /* 1024 /*
1026 * RFC 8446, 4.4.2.1 - the server may request an OCSP 1025 * RFC 8446, 4.4.2.1 - the server may request an OCSP
@@ -1406,11 +1405,7 @@ tlsext_srtp_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1406int 1405int
1407tlsext_keyshare_client_needs(SSL *s, uint16_t msg_type) 1406tlsext_keyshare_client_needs(SSL *s, uint16_t msg_type)
1408{ 1407{
1409 /* XXX once this gets initialized when we get tls13_client.c */ 1408 return (S3I(s)->hs.our_max_tls_version >= TLS1_3_VERSION);
1410 if (S3I(s)->hs_tls13.max_version == 0)
1411 return 0;
1412 return (!SSL_is_dtls(s) && S3I(s)->hs_tls13.max_version >=
1413 TLS1_3_VERSION);
1414} 1409}
1415 1410
1416int 1411int
@@ -1457,7 +1452,7 @@ tlsext_keyshare_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1457 * Ignore this client share if we're using earlier than TLSv1.3 1452 * Ignore this client share if we're using earlier than TLSv1.3
1458 * or we've already selected a key share. 1453 * or we've already selected a key share.
1459 */ 1454 */
1460 if (S3I(s)->hs_tls13.max_version < TLS1_3_VERSION) 1455 if (S3I(s)->hs.our_max_tls_version < TLS1_3_VERSION)
1461 continue; 1456 continue;
1462 if (S3I(s)->hs_tls13.key_share != NULL) 1457 if (S3I(s)->hs_tls13.key_share != NULL)
1463 continue; 1458 continue;
@@ -1485,10 +1480,8 @@ tlsext_keyshare_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1485int 1480int
1486tlsext_keyshare_server_needs(SSL *s, uint16_t msg_type) 1481tlsext_keyshare_server_needs(SSL *s, uint16_t msg_type)
1487{ 1482{
1488 if (SSL_is_dtls(s) || s->version < TLS1_3_VERSION) 1483 return (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION &&
1489 return 0; 1484 tlsext_extension_seen(s, TLSEXT_TYPE_key_share));
1490
1491 return tlsext_extension_seen(s, TLSEXT_TYPE_key_share);
1492} 1485}
1493 1486
1494int 1487int
@@ -1550,9 +1543,7 @@ tlsext_keyshare_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1550int 1543int
1551tlsext_versions_client_needs(SSL *s, uint16_t msg_type) 1544tlsext_versions_client_needs(SSL *s, uint16_t msg_type)
1552{ 1545{
1553 if (SSL_is_dtls(s)) 1546 return (S3I(s)->hs.our_max_tls_version >= TLS1_3_VERSION);
1554 return 0;
1555 return (S3I(s)->hs_tls13.max_version >= TLS1_3_VERSION);
1556} 1547}
1557 1548
1558int 1549int
@@ -1562,11 +1553,8 @@ tlsext_versions_client_build(SSL *s, uint16_t msg_type, CBB *cbb)
1562 uint16_t version; 1553 uint16_t version;
1563 CBB versions; 1554 CBB versions;
1564 1555
1565 max = S3I(s)->hs_tls13.max_version; 1556 max = S3I(s)->hs.our_max_tls_version;
1566 min = S3I(s)->hs_tls13.min_version; 1557 min = S3I(s)->hs.our_min_tls_version;
1567
1568 if (min < TLS1_VERSION)
1569 return 0;
1570 1558
1571 if (!CBB_add_u8_length_prefixed(cbb, &versions)) 1559 if (!CBB_add_u8_length_prefixed(cbb, &versions))
1572 return 0; 1560 return 0;
@@ -1591,8 +1579,8 @@ tlsext_versions_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1591 uint16_t max, min; 1579 uint16_t max, min;
1592 uint16_t matched_version = 0; 1580 uint16_t matched_version = 0;
1593 1581
1594 max = S3I(s)->hs_tls13.max_version; 1582 max = S3I(s)->hs.our_max_tls_version;
1595 min = S3I(s)->hs_tls13.min_version; 1583 min = S3I(s)->hs.our_min_tls_version;
1596 1584
1597 if (!CBS_get_u8_length_prefixed(cbs, &versions)) 1585 if (!CBS_get_u8_length_prefixed(cbs, &versions))
1598 goto err; 1586 goto err;
@@ -1608,16 +1596,8 @@ tlsext_versions_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1608 matched_version = version; 1596 matched_version = version;
1609 } 1597 }
1610 1598
1611 /* 1599 if (matched_version > 0) {
1612 * XXX if we haven't matched a version we should 1600 /* XXX - this should be stored for later processing. */
1613 * fail - but we currently need to succeed to
1614 * ignore this before the server code for 1.3
1615 * is set up and initialized.
1616 */
1617 if (max == 0)
1618 return 1; /* XXX */
1619
1620 if (matched_version != 0) {
1621 s->version = matched_version; 1601 s->version = matched_version;
1622 return 1; 1602 return 1;
1623 } 1603 }
@@ -1633,17 +1613,13 @@ tlsext_versions_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1633int 1613int
1634tlsext_versions_server_needs(SSL *s, uint16_t msg_type) 1614tlsext_versions_server_needs(SSL *s, uint16_t msg_type)
1635{ 1615{
1636 return (!SSL_is_dtls(s) && s->version >= TLS1_3_VERSION); 1616 return (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION);
1637} 1617}
1638 1618
1639int 1619int
1640tlsext_versions_server_build(SSL *s, uint16_t msg_type, CBB *cbb) 1620tlsext_versions_server_build(SSL *s, uint16_t msg_type, CBB *cbb)
1641{ 1621{
1642 if (!CBB_add_u16(cbb, TLS1_3_VERSION)) 1622 return CBB_add_u16(cbb, TLS1_3_VERSION);
1643 return 0;
1644 /* XXX set 1.2 in legacy version? */
1645
1646 return 1;
1647} 1623}
1648 1624
1649int 1625int
@@ -1656,6 +1632,7 @@ tlsext_versions_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1656 return 0; 1632 return 0;
1657 } 1633 }
1658 1634
1635 /* XXX - need to fix for DTLS 1.3 */
1659 if (selected_version < TLS1_3_VERSION) { 1636 if (selected_version < TLS1_3_VERSION) {
1660 *alert = SSL_AD_ILLEGAL_PARAMETER; 1637 *alert = SSL_AD_ILLEGAL_PARAMETER;
1661 return 0; 1638 return 0;
@@ -1675,12 +1652,8 @@ tlsext_versions_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1675int 1652int
1676tlsext_cookie_client_needs(SSL *s, uint16_t msg_type) 1653tlsext_cookie_client_needs(SSL *s, uint16_t msg_type)
1677{ 1654{
1678 if (SSL_is_dtls(s)) 1655 return (S3I(s)->hs.our_max_tls_version >= TLS1_3_VERSION &&
1679 return 0; 1656 S3I(s)->hs_tls13.cookie_len > 0 && S3I(s)->hs_tls13.cookie != NULL);
1680 if (S3I(s)->hs_tls13.max_version < TLS1_3_VERSION)
1681 return 0;
1682 return (S3I(s)->hs_tls13.cookie_len > 0 &&
1683 S3I(s)->hs_tls13.cookie != NULL);
1684} 1657}
1685 1658
1686int 1659int
@@ -1734,17 +1707,12 @@ tlsext_cookie_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1734int 1707int
1735tlsext_cookie_server_needs(SSL *s, uint16_t msg_type) 1708tlsext_cookie_server_needs(SSL *s, uint16_t msg_type)
1736{ 1709{
1737
1738 if (SSL_is_dtls(s))
1739 return 0;
1740 if (S3I(s)->hs_tls13.max_version < TLS1_3_VERSION)
1741 return 0;
1742 /* 1710 /*
1743 * Server needs to set cookie value in tls13 handshake 1711 * Server needs to set cookie value in tls13 handshake
1744 * in order to send one, should only be sent with HRR. 1712 * in order to send one, should only be sent with HRR.
1745 */ 1713 */
1746 return (S3I(s)->hs_tls13.cookie_len > 0 && 1714 return (S3I(s)->hs.our_max_tls_version >= TLS1_3_VERSION &&
1747 S3I(s)->hs_tls13.cookie != NULL); 1715 S3I(s)->hs_tls13.cookie_len > 0 && S3I(s)->hs_tls13.cookie != NULL);
1748} 1716}
1749 1717
1750int 1718int
@@ -2033,13 +2001,10 @@ tlsext_build(SSL *s, int is_server, uint16_t msg_type, CBB *cbb)
2033 const struct tls_extension *tlsext; 2001 const struct tls_extension *tlsext;
2034 CBB extensions, extension_data; 2002 CBB extensions, extension_data;
2035 int extensions_present = 0; 2003 int extensions_present = 0;
2004 uint16_t tls_version;
2036 size_t i; 2005 size_t i;
2037 uint16_t version;
2038 2006
2039 if (is_server) 2007 tls_version = ssl_effective_tls_version(s);
2040 version = s->version;
2041 else
2042 version = TLS1_get_client_version(s);
2043 2008
2044 if (!CBB_add_u16_length_prefixed(cbb, &extensions)) 2009 if (!CBB_add_u16_length_prefixed(cbb, &extensions))
2045 return 0; 2010 return 0;
@@ -2049,7 +2014,7 @@ tlsext_build(SSL *s, int is_server, uint16_t msg_type, CBB *cbb)
2049 ext = tlsext_funcs(tlsext, is_server); 2014 ext = tlsext_funcs(tlsext, is_server);
2050 2015
2051 /* RFC 8446 Section 4.2 */ 2016 /* RFC 8446 Section 4.2 */
2052 if (version >= TLS1_3_VERSION && 2017 if (tls_version >= TLS1_3_VERSION &&
2053 !(tlsext->messages & msg_type)) 2018 !(tlsext->messages & msg_type))
2054 continue; 2019 continue;
2055 2020
@@ -2112,15 +2077,12 @@ tlsext_parse(SSL *s, int is_server, uint16_t msg_type, CBS *cbs, int *alert)
2112 CBS extensions, extension_data; 2077 CBS extensions, extension_data;
2113 uint16_t type; 2078 uint16_t type;
2114 size_t idx; 2079 size_t idx;
2115 uint16_t version; 2080 uint16_t tls_version;
2116 int alert_desc; 2081 int alert_desc;
2117 2082
2118 S3I(s)->hs.extensions_seen = 0; 2083 tls_version = ssl_effective_tls_version(s);
2119 2084
2120 if (is_server) 2085 S3I(s)->hs.extensions_seen = 0;
2121 version = s->version;
2122 else
2123 version = TLS1_get_client_version(s);
2124 2086
2125 /* An empty extensions block is valid. */ 2087 /* An empty extensions block is valid. */
2126 if (CBS_len(cbs) == 0) 2088 if (CBS_len(cbs) == 0)
@@ -2143,7 +2105,7 @@ tlsext_parse(SSL *s, int is_server, uint16_t msg_type, CBS *cbs, int *alert)
2143 CBS_len(&extension_data), 2105 CBS_len(&extension_data),
2144 s->internal->tlsext_debug_arg); 2106 s->internal->tlsext_debug_arg);
2145 2107
2146 if (!SSL_is_dtls(s) && version >= TLS1_3_VERSION && is_server && 2108 if (tls_version >= TLS1_3_VERSION && is_server &&
2147 msg_type == SSL_TLSEXT_MSG_CH) { 2109 msg_type == SSL_TLSEXT_MSG_CH) {
2148 if (!tlsext_clienthello_hash_extension(s, type, 2110 if (!tlsext_clienthello_hash_extension(s, type,
2149 &extension_data)) 2111 &extension_data))
@@ -2155,7 +2117,7 @@ tlsext_parse(SSL *s, int is_server, uint16_t msg_type, CBS *cbs, int *alert)
2155 continue; 2117 continue;
2156 2118
2157 /* RFC 8446 Section 4.2 */ 2119 /* RFC 8446 Section 4.2 */
2158 if (version >= TLS1_3_VERSION && 2120 if (tls_version >= TLS1_3_VERSION &&
2159 !(tlsext->messages & msg_type)) { 2121 !(tlsext->messages & msg_type)) {
2160 alert_desc = SSL_AD_ILLEGAL_PARAMETER; 2122 alert_desc = SSL_AD_ILLEGAL_PARAMETER;
2161 goto err; 2123 goto err;
diff --git a/src/lib/libssl/ssl_versions.c b/src/lib/libssl/ssl_versions.c
index a216de6e81..37957fd0ab 100644
--- a/src/lib/libssl/ssl_versions.c
+++ b/src/lib/libssl/ssl_versions.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_versions.c,v 1.13 2021/02/25 17:06:05 jsing Exp $ */ 1/* $OpenBSD: ssl_versions.c,v 1.14 2021/03/10 18:27:02 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -171,6 +171,30 @@ ssl_supported_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver)
171 return 1; 171 return 1;
172} 172}
173 173
174uint16_t
175ssl_tls_version(uint16_t version)
176{
177 if (version == TLS1_VERSION || version == TLS1_1_VERSION ||
178 version == TLS1_2_VERSION || version == TLS1_3_VERSION)
179 return version;
180
181 if (version == DTLS1_VERSION)
182 return TLS1_1_VERSION;
183 if (version == DTLS1_2_VERSION)
184 return TLS1_2_VERSION;
185
186 return 0;
187}
188
189uint16_t
190ssl_effective_tls_version(SSL *s)
191{
192 if (S3I(s)->hs.negotiated_tls_version > 0)
193 return S3I(s)->hs.negotiated_tls_version;
194
195 return S3I(s)->hs.our_max_tls_version;
196}
197
174int 198int
175ssl_max_supported_version(SSL *s, uint16_t *max_ver) 199ssl_max_supported_version(SSL *s, uint16_t *max_ver)
176{ 200{
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c
index a7c3bf2c00..4de3d3693b 100644
--- a/src/lib/libssl/tls13_client.c
+++ b/src/lib/libssl/tls13_client.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_client.c,v 1.73 2021/02/25 17:06:05 jsing Exp $ */ 1/* $OpenBSD: tls13_client.c,v 1.74 2021/03/10 18:27:02 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -31,12 +31,12 @@ tls13_client_init(struct tls13_ctx *ctx)
31 size_t groups_len; 31 size_t groups_len;
32 SSL *s = ctx->ssl; 32 SSL *s = ctx->ssl;
33 33
34 if (!ssl_supported_tls_version_range(s, &ctx->hs->min_version, 34 if (!ssl_supported_tls_version_range(s, &S3I(s)->hs.our_min_tls_version,
35 &ctx->hs->max_version)) { 35 &S3I(s)->hs.our_max_tls_version)) {
36 SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE); 36 SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE);
37 return 0; 37 return 0;
38 } 38 }
39 s->client_version = s->version = ctx->hs->max_version; 39 s->client_version = s->version = S3I(s)->hs.our_max_tls_version;
40 40
41 tls13_record_layer_set_retry_after_phh(ctx->rl, 41 tls13_record_layer_set_retry_after_phh(ctx->rl,
42 (s->internal->mode & SSL_MODE_AUTO_RETRY) != 0); 42 (s->internal->mode & SSL_MODE_AUTO_RETRY) != 0);
@@ -64,7 +64,8 @@ tls13_client_init(struct tls13_ctx *ctx)
64 * legacy session identifier triggers compatibility mode (see RFC 8446 64 * legacy session identifier triggers compatibility mode (see RFC 8446
65 * Appendix D.4). In the pre-TLSv1.3 case a zero length value is used. 65 * Appendix D.4). In the pre-TLSv1.3 case a zero length value is used.
66 */ 66 */
67 if (ctx->middlebox_compat && ctx->hs->max_version >= TLS1_3_VERSION) { 67 if (ctx->middlebox_compat &&
68 S3I(s)->hs.our_max_tls_version >= TLS1_3_VERSION) {
68 arc4random_buf(ctx->hs->legacy_session_id, 69 arc4random_buf(ctx->hs->legacy_session_id,
69 sizeof(ctx->hs->legacy_session_id)); 70 sizeof(ctx->hs->legacy_session_id));
70 ctx->hs->legacy_session_id_len = 71 ctx->hs->legacy_session_id_len =
@@ -91,7 +92,7 @@ tls13_client_hello_build(struct tls13_ctx *ctx, CBB *cbb)
91 SSL *s = ctx->ssl; 92 SSL *s = ctx->ssl;
92 93
93 /* Legacy client version is capped at TLS 1.2. */ 94 /* Legacy client version is capped at TLS 1.2. */
94 client_version = ctx->hs->max_version; 95 client_version = S3I(s)->hs.our_max_tls_version;
95 if (client_version > TLS1_2_VERSION) 96 if (client_version > TLS1_2_VERSION)
96 client_version = TLS1_2_VERSION; 97 client_version = TLS1_2_VERSION;
97 98
@@ -133,7 +134,9 @@ tls13_client_hello_build(struct tls13_ctx *ctx, CBB *cbb)
133int 134int
134tls13_client_hello_send(struct tls13_ctx *ctx, CBB *cbb) 135tls13_client_hello_send(struct tls13_ctx *ctx, CBB *cbb)
135{ 136{
136 if (ctx->hs->min_version < TLS1_2_VERSION) 137 SSL *s = ctx->ssl;
138
139 if (S3I(s)->hs.our_min_tls_version < TLS1_2_VERSION)
137 tls13_record_layer_set_legacy_version(ctx->rl, TLS1_VERSION); 140 tls13_record_layer_set_legacy_version(ctx->rl, TLS1_VERSION);
138 141
139 /* We may receive a pre-TLSv1.3 alert in response to the client hello. */ 142 /* We may receive a pre-TLSv1.3 alert in response to the client hello. */
@@ -228,7 +231,7 @@ tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs)
228 goto err; 231 goto err;
229 232
230 if (tls13_server_hello_is_legacy(cbs)) { 233 if (tls13_server_hello_is_legacy(cbs)) {
231 if (ctx->hs->max_version >= TLS1_3_VERSION) { 234 if (S3I(s)->hs.our_max_tls_version >= TLS1_3_VERSION) {
232 /* 235 /*
233 * RFC 8446 section 4.1.3: we must not downgrade if 236 * RFC 8446 section 4.1.3: we must not downgrade if
234 * the server random value contains the TLS 1.2 or 1.1 237 * the server random value contains the TLS 1.2 or 1.1
@@ -280,6 +283,7 @@ tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs)
280 ctx->alert = TLS13_ALERT_PROTOCOL_VERSION; 283 ctx->alert = TLS13_ALERT_PROTOCOL_VERSION;
281 goto err; 284 goto err;
282 } 285 }
286 S3I(s)->hs.negotiated_tls_version = ctx->hs->server_version;
283 287
284 /* The session_id must match. */ 288 /* The session_id must match. */
285 if (!CBS_mem_equal(&session_id, ctx->hs->legacy_session_id, 289 if (!CBS_mem_equal(&session_id, ctx->hs->legacy_session_id,
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c
index 715066fb59..29c63bcd06 100644
--- a/src/lib/libssl/tls13_server.c
+++ b/src/lib/libssl/tls13_server.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_server.c,v 1.70 2021/02/25 17:06:05 jsing Exp $ */ 1/* $OpenBSD: tls13_server.c,v 1.71 2021/03/10 18:27:02 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
@@ -29,12 +29,12 @@ tls13_server_init(struct tls13_ctx *ctx)
29{ 29{
30 SSL *s = ctx->ssl; 30 SSL *s = ctx->ssl;
31 31
32 if (!ssl_supported_tls_version_range(s, &ctx->hs->min_version, 32 if (!ssl_supported_tls_version_range(s, &S3I(s)->hs.our_min_tls_version,
33 &ctx->hs->max_version)) { 33 &S3I(s)->hs.our_max_tls_version)) {
34 SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE); 34 SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE);
35 return 0; 35 return 0;
36 } 36 }
37 s->version = ctx->hs->max_version; 37 s->version = S3I(s)->hs.our_max_tls_version;
38 38
39 tls13_record_layer_set_retry_after_phh(ctx->rl, 39 tls13_record_layer_set_retry_after_phh(ctx->rl,
40 (s->internal->mode & SSL_MODE_AUTO_RETRY) != 0); 40 (s->internal->mode & SSL_MODE_AUTO_RETRY) != 0);
@@ -163,6 +163,7 @@ tls13_client_hello_process(struct tls13_ctx *ctx, CBS *cbs)
163 goto err; 163 goto err;
164 return tls13_use_legacy_server(ctx); 164 return tls13_use_legacy_server(ctx);
165 } 165 }
166 S3I(s)->hs.negotiated_tls_version = TLS1_3_VERSION;
166 167
167 /* Add decoded values to the current ClientHello hash */ 168 /* Add decoded values to the current ClientHello hash */
168 if (!tls13_clienthello_hash_init(ctx)) { 169 if (!tls13_clienthello_hash_init(ctx)) {