summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2020-05-11 18:03:51 +0000
committerjsing <>2020-05-11 18:03:51 +0000
commit825d508a4b688821e99561b72a842c81c93b84a5 (patch)
tree8db77e997c933fb8987ec9250fff46520b8c6487
parent28b584ddd2d0a41bceacbb1c350d790e3a39cd75 (diff)
downloadopenbsd-825d508a4b688821e99561b72a842c81c93b84a5.tar.gz
openbsd-825d508a4b688821e99561b72a842c81c93b84a5.tar.bz2
openbsd-825d508a4b688821e99561b72a842c81c93b84a5.zip
Add record version checks.
When legacy version is below TLSv1.2 ensure that the record version is SSL3/TLS, however when the legacy version is set to TLSv1.2 require this specifically. ok beck@ tb@
-rw-r--r--src/lib/libssl/tls13_internal.h25
-rw-r--r--src/lib/libssl/tls13_record.c4
-rw-r--r--src/lib/libssl/tls13_record_layer.c17
3 files changed, 28 insertions, 18 deletions
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h
index d597ef5a96..d35610e179 100644
--- a/src/lib/libssl/tls13_internal.h
+++ b/src/lib/libssl/tls13_internal.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_internal.h,v 1.77 2020/05/11 17:46:46 jsing Exp $ */ 1/* $OpenBSD: tls13_internal.h,v 1.78 2020/05/11 18:03:51 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018 Bob Beck <beck@openbsd.org>
4 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> 4 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org>
@@ -27,17 +27,18 @@
27 27
28__BEGIN_HIDDEN_DECLS 28__BEGIN_HIDDEN_DECLS
29 29
30#define TLS13_HS_CLIENT 1 30#define TLS13_HS_CLIENT 1
31#define TLS13_HS_SERVER 2 31#define TLS13_HS_SERVER 2
32 32
33#define TLS13_IO_SUCCESS 1 33#define TLS13_IO_SUCCESS 1
34#define TLS13_IO_EOF 0 34#define TLS13_IO_EOF 0
35#define TLS13_IO_FAILURE -1 35#define TLS13_IO_FAILURE -1
36#define TLS13_IO_ALERT -2 36#define TLS13_IO_ALERT -2
37#define TLS13_IO_WANT_POLLIN -3 37#define TLS13_IO_WANT_POLLIN -3
38#define TLS13_IO_WANT_POLLOUT -4 38#define TLS13_IO_WANT_POLLOUT -4
39#define TLS13_IO_WANT_RETRY -5 /* Retry the previous call immediately. */ 39#define TLS13_IO_WANT_RETRY -5 /* Retry the previous call immediately. */
40#define TLS13_IO_USE_LEGACY -6 40#define TLS13_IO_USE_LEGACY -6
41#define TLS13_IO_RECORD_VERSION -7
41 42
42#define TLS13_ERR_VERIFY_FAILED 16 43#define TLS13_ERR_VERIFY_FAILED 16
43#define TLS13_ERR_HRR_FAILED 17 44#define TLS13_ERR_HRR_FAILED 17
diff --git a/src/lib/libssl/tls13_record.c b/src/lib/libssl/tls13_record.c
index 9ab4cdba36..ca61a94ff1 100644
--- a/src/lib/libssl/tls13_record.c
+++ b/src/lib/libssl/tls13_record.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_record.c,v 1.4 2020/02/15 14:36:58 jsing Exp $ */ 1/* $OpenBSD: tls13_record.c,v 1.5 2020/05/11 18:03:51 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 *
@@ -146,6 +146,8 @@ tls13_record_recv(struct tls13_record *rec, tls13_read_cb wire_read,
146 return TLS13_IO_FAILURE; 146 return TLS13_IO_FAILURE;
147 147
148 /* XXX - record overflow alert. */ 148 /* XXX - record overflow alert. */
149 if ((rec_version >> 8) != SSL3_VERSION_MAJOR)
150 return TLS13_IO_RECORD_VERSION;
149 if (rec_len > TLS13_RECORD_MAX_CIPHERTEXT_LEN) 151 if (rec_len > TLS13_RECORD_MAX_CIPHERTEXT_LEN)
150 return TLS13_IO_FAILURE; 152 return TLS13_IO_FAILURE;
151 153
diff --git a/src/lib/libssl/tls13_record_layer.c b/src/lib/libssl/tls13_record_layer.c
index e7650b1ecc..8ca52d0b7f 100644
--- a/src/lib/libssl/tls13_record_layer.c
+++ b/src/lib/libssl/tls13_record_layer.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_record_layer.c,v 1.39 2020/05/11 17:46:46 jsing Exp $ */ 1/* $OpenBSD: tls13_record_layer.c,v 1.40 2020/05/11 18:03:51 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 *
@@ -769,11 +769,18 @@ tls13_record_layer_read_record(struct tls13_record_layer *rl)
769 goto err; 769 goto err;
770 } 770 }
771 771
772 if ((ret = tls13_record_recv(rl->rrec, rl->cb.wire_read, rl->cb_arg)) <= 0) 772 if ((ret = tls13_record_recv(rl->rrec, rl->cb.wire_read, rl->cb_arg)) <= 0) {
773 switch (ret) {
774 case TLS13_IO_RECORD_VERSION:
775 return tls13_send_alert(rl, SSL_AD_PROTOCOL_VERSION);
776 }
773 return ret; 777 return ret;
774 778 }
775 /* XXX - record version checks. */ 779
776 780 if (rl->legacy_version == TLS1_2_VERSION &&
781 tls13_record_version(rl->rrec) != TLS1_2_VERSION)
782 return tls13_send_alert(rl, SSL_AD_PROTOCOL_VERSION);
783
777 content_type = tls13_record_content_type(rl->rrec); 784 content_type = tls13_record_content_type(rl->rrec);
778 785
779 /* 786 /*