diff options
author | jsing <> | 2021-03-10 18:27:02 +0000 |
---|---|---|
committer | jsing <> | 2021-03-10 18:27:02 +0000 |
commit | bec282ffa4cbd669be0dc9e8fab07c4c21ebcb66 (patch) | |
tree | d994b83bcf4c074517ad35a21855741c2995e67b /src/lib | |
parent | 9108b7f38107e9f7ce1aaa33e615a7935b057ad0 (diff) | |
download | openbsd-bec282ffa4cbd669be0dc9e8fab07c4c21ebcb66.tar.gz openbsd-bec282ffa4cbd669be0dc9e8fab07c4c21ebcb66.tar.bz2 openbsd-bec282ffa4cbd669be0dc9e8fab07c4c21ebcb66.zip |
Improve internal version handling.
Add handshake fields for our minimum TLS version, our maximum TLS version
and the TLS version negotiated during the handshake. Initialise our min/max
versions at the start of the handshake and leave these unchanged. The
negotiated TLS version is set in the client once we receive the ServerHello
and in the server at the point we select the highest shared version.
Provide an ssl_effective_version() function that returns the negotiated TLS
version if known, otherwise our maximum TLS version - this is effectively
what is stored in s->version currently.
Convert most of the internal code to use one of these three version fields,
which greatly simplifies code (especially in the TLS extension handling
code).
ok tb@
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/ssl_clnt.c | 20 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 26 | ||||
-rw-r--r-- | src/lib/libssl/ssl_pkt.c | 7 | ||||
-rw-r--r-- | src/lib/libssl/ssl_sigalgs.c | 8 | ||||
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 21 | ||||
-rw-r--r-- | src/lib/libssl/ssl_tlsext.c | 116 | ||||
-rw-r--r-- | src/lib/libssl/ssl_versions.c | 26 | ||||
-rw-r--r-- | src/lib/libssl/tls13_client.c | 20 | ||||
-rw-r--r-- | src/lib/libssl/tls13_server.c | 9 |
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 | ||
409 | typedef struct ssl_handshake_st { | 409 | typedef 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 | ||
437 | typedef struct ssl_handshake_tls13_st { | 454 | typedef 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 | ||
474 | struct tls12_record_layer; | 486 | struct 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); |
1118 | int ssl_enabled_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver); | 1130 | int ssl_enabled_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver); |
1119 | int ssl_supported_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver); | 1131 | int ssl_supported_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver); |
1132 | uint16_t ssl_tls_version(uint16_t version); | ||
1133 | uint16_t ssl_effective_tls_version(SSL *s); | ||
1120 | int ssl_downgrade_max_version(SSL *s, uint16_t *max_ver); | 1134 | int ssl_downgrade_max_version(SSL *s, uint16_t *max_ver); |
1121 | int ssl_max_supported_version(SSL *s, uint16_t *max_ver); | 1135 | int ssl_max_supported_version(SSL *s, uint16_t *max_ver); |
1122 | int ssl_max_shared_version(SSL *s, uint16_t peer_ver, uint16_t *max_ver); | 1136 | int 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 | |||
174 | tlsext_supportedgroups_client_needs(SSL *s, uint16_t msg_type) | 174 | tlsext_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 | ||
180 | int | 180 | int |
@@ -472,7 +472,8 @@ tlsext_ri_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | |||
472 | int | 472 | int |
473 | tlsext_ri_server_needs(SSL *s, uint16_t msg_type) | 473 | tlsext_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 | ||
478 | int | 479 | int |
@@ -554,7 +555,7 @@ tlsext_ri_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | |||
554 | int | 555 | int |
555 | tlsext_sigalgs_client_needs(SSL *s, uint16_t msg_type) | 556 | tlsext_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 | ||
560 | int | 561 | int |
@@ -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) | |||
600 | int | 600 | int |
601 | tlsext_sigalgs_server_needs(SSL *s, uint16_t msg_type) | 601 | tlsext_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 | ||
606 | int | 606 | int |
@@ -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) | |||
981 | int | 981 | int |
982 | tlsext_ocsp_server_needs(SSL *s, uint16_t msg_type) | 982 | tlsext_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) | |||
1016 | int | 1016 | int |
1017 | tlsext_ocsp_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1017 | tlsext_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) | |||
1406 | int | 1405 | int |
1407 | tlsext_keyshare_client_needs(SSL *s, uint16_t msg_type) | 1406 | tlsext_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 | ||
1416 | int | 1411 | int |
@@ -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) | |||
1485 | int | 1480 | int |
1486 | tlsext_keyshare_server_needs(SSL *s, uint16_t msg_type) | 1481 | tlsext_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 | ||
1494 | int | 1487 | int |
@@ -1550,9 +1543,7 @@ tlsext_keyshare_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | |||
1550 | int | 1543 | int |
1551 | tlsext_versions_client_needs(SSL *s, uint16_t msg_type) | 1544 | tlsext_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 | ||
1558 | int | 1549 | int |
@@ -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) | |||
1633 | int | 1613 | int |
1634 | tlsext_versions_server_needs(SSL *s, uint16_t msg_type) | 1614 | tlsext_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 | ||
1639 | int | 1619 | int |
1640 | tlsext_versions_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | 1620 | tlsext_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 | ||
1649 | int | 1625 | int |
@@ -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) | |||
1675 | int | 1652 | int |
1676 | tlsext_cookie_client_needs(SSL *s, uint16_t msg_type) | 1653 | tlsext_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 | ||
1686 | int | 1659 | int |
@@ -1734,17 +1707,12 @@ tlsext_cookie_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | |||
1734 | int | 1707 | int |
1735 | tlsext_cookie_server_needs(SSL *s, uint16_t msg_type) | 1708 | tlsext_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 | ||
1750 | int | 1718 | int |
@@ -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 | ||
174 | uint16_t | ||
175 | ssl_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 | |||
189 | uint16_t | ||
190 | ssl_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 | |||
174 | int | 198 | int |
175 | ssl_max_supported_version(SSL *s, uint16_t *max_ver) | 199 | ssl_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) | |||
133 | int | 134 | int |
134 | tls13_client_hello_send(struct tls13_ctx *ctx, CBB *cbb) | 135 | tls13_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)) { |