summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbeck <>2020-01-24 04:36:29 +0000
committerbeck <>2020-01-24 04:36:29 +0000
commit9bdb8cf2b0cdef5430b92da746812d02b3e4a0db (patch)
tree1e380b51c8b8b1ef639f72f8967a2a3aab5f9349 /src
parent7136a54d43d7b515b6d9043faeb359a87cf1ab0f (diff)
downloadopenbsd-9bdb8cf2b0cdef5430b92da746812d02b3e4a0db.tar.gz
openbsd-9bdb8cf2b0cdef5430b92da746812d02b3e4a0db.tar.bz2
openbsd-9bdb8cf2b0cdef5430b92da746812d02b3e4a0db.zip
Fix breakage in SSL_connect, SSL_accept, etc. by not propagating
new retry conditions from the record layer all the way up to the callers. Instead we catch them at the top of the record layer and retry the operations, unless we actually got a retry indicated from actual IO operations. ok jsing@ tb@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libssl/tls13_internal.h5
-rw-r--r--src/lib/libssl/tls13_lib.c6
-rw-r--r--src/lib/libssl/tls13_record_layer.c44
3 files changed, 42 insertions, 13 deletions
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h
index e9f629f387..7b3670bf45 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.50 2020/01/23 11:57:20 jsing Exp $ */ 1/* $OpenBSD: tls13_internal.h,v 1.51 2020/01/24 04:36:29 beck 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>
@@ -36,7 +36,8 @@ __BEGIN_HIDDEN_DECLS
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_USE_LEGACY -5 39#define TLS13_IO_WANT_RETRY -5 /* Retry the previous call immediately. */
40#define TLS13_IO_USE_LEGACY -6
40 41
41#define TLS13_ERR_VERIFY_FAILED 16 42#define TLS13_ERR_VERIFY_FAILED 16
42#define TLS13_ERR_HRR_FAILED 17 43#define TLS13_ERR_HRR_FAILED 17
diff --git a/src/lib/libssl/tls13_lib.c b/src/lib/libssl/tls13_lib.c
index 473163ee76..cfe3985050 100644
--- a/src/lib/libssl/tls13_lib.c
+++ b/src/lib/libssl/tls13_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_lib.c,v 1.26 2020/01/23 11:57:20 jsing Exp $ */ 1/* $OpenBSD: tls13_lib.c,v 1.27 2020/01/24 04:36:29 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2019 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2019 Bob Beck <beck@openbsd.org>
@@ -420,6 +420,10 @@ tls13_legacy_return_code(SSL *ssl, ssize_t ret)
420 BIO_set_retry_write(ssl->wbio); 420 BIO_set_retry_write(ssl->wbio);
421 ssl->internal->rwstate = SSL_WRITING; 421 ssl->internal->rwstate = SSL_WRITING;
422 return -1; 422 return -1;
423
424 case TLS13_IO_WANT_RETRY:
425 SSLerror(ssl, ERR_R_INTERNAL_ERROR);
426 return -1;
423 } 427 }
424 428
425 SSLerror(ssl, ERR_R_INTERNAL_ERROR); 429 SSLerror(ssl, ERR_R_INTERNAL_ERROR);
diff --git a/src/lib/libssl/tls13_record_layer.c b/src/lib/libssl/tls13_record_layer.c
index aa8968484b..e5f8ba8859 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.24 2020/01/23 05:08:30 jsing Exp $ */ 1/* $OpenBSD: tls13_record_layer.c,v 1.25 2020/01/24 04:36:29 beck 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 *
@@ -274,7 +274,7 @@ tls13_record_layer_process_alert(struct tls13_record_layer *rl)
274 ret = TLS13_IO_EOF; 274 ret = TLS13_IO_EOF;
275 } else if (alert_desc == SSL_AD_USER_CANCELLED) { 275 } else if (alert_desc == SSL_AD_USER_CANCELLED) {
276 /* Ignored at the record layer. */ 276 /* Ignored at the record layer. */
277 ret = TLS13_IO_WANT_POLLIN; 277 ret = TLS13_IO_WANT_RETRY;
278 } else if (alert_level == SSL3_AL_FATAL) { 278 } else if (alert_level == SSL3_AL_FATAL) {
279 rl->read_closed = 1; 279 rl->read_closed = 1;
280 rl->write_closed = 1; 280 rl->write_closed = 1;
@@ -330,7 +330,7 @@ tls13_record_layer_send_phh(struct tls13_record_layer *rl)
330 if (!CBS_skip(&rl->phh_cbs, ret)) 330 if (!CBS_skip(&rl->phh_cbs, ret))
331 return TLS13_IO_FAILURE; 331 return TLS13_IO_FAILURE;
332 if (CBS_len(&rl->phh_cbs) != 0) 332 if (CBS_len(&rl->phh_cbs) != 0)
333 return TLS13_IO_WANT_POLLOUT; 333 return TLS13_IO_WANT_RETRY;
334 334
335 freezero(rl->phh_data, rl->phh_len); 335 freezero(rl->phh_data, rl->phh_len);
336 rl->phh_data = NULL; 336 rl->phh_data = NULL;
@@ -776,7 +776,7 @@ tls13_record_layer_read_record(struct tls13_record_layer *rl)
776 return tls13_send_alert(rl, SSL_AD_ILLEGAL_PARAMETER); 776 return tls13_send_alert(rl, SSL_AD_ILLEGAL_PARAMETER);
777 rl->ccs_seen = 1; 777 rl->ccs_seen = 1;
778 tls13_record_layer_rrec_free(rl); 778 tls13_record_layer_rrec_free(rl);
779 return TLS13_IO_WANT_POLLIN; 779 return TLS13_IO_WANT_RETRY;
780 } 780 }
781 781
782 /* 782 /*
@@ -896,7 +896,7 @@ tls13_record_layer_read_internal(struct tls13_record_layer *rl,
896 rl->phh = 0; 896 rl->phh = 0;
897 897
898 if (ret == TLS13_IO_SUCCESS) 898 if (ret == TLS13_IO_SUCCESS)
899 return TLS13_IO_WANT_POLLIN; 899 return TLS13_IO_WANT_RETRY;
900 900
901 return ret; 901 return ret;
902 } 902 }
@@ -929,14 +929,26 @@ ssize_t
929tls13_record_layer_peek(struct tls13_record_layer *rl, uint8_t content_type, 929tls13_record_layer_peek(struct tls13_record_layer *rl, uint8_t content_type,
930 uint8_t *buf, size_t n) 930 uint8_t *buf, size_t n)
931{ 931{
932 return tls13_record_layer_read_internal(rl, content_type, buf, n, 1); 932 ssize_t ret;
933
934 do {
935 ret = tls13_record_layer_read_internal(rl, content_type, buf, n, 1);
936 } while (ret == TLS13_IO_WANT_RETRY);
937
938 return ret;
933} 939}
934 940
935ssize_t 941ssize_t
936tls13_record_layer_read(struct tls13_record_layer *rl, uint8_t content_type, 942tls13_record_layer_read(struct tls13_record_layer *rl, uint8_t content_type,
937 uint8_t *buf, size_t n) 943 uint8_t *buf, size_t n)
938{ 944{
939 return tls13_record_layer_read_internal(rl, content_type, buf, n, 0); 945 ssize_t ret;
946
947 do {
948 ret = tls13_record_layer_read_internal(rl, content_type, buf, n, 0);
949 } while (ret == TLS13_IO_WANT_RETRY);
950
951 return ret;
940} 952}
941 953
942static ssize_t 954static ssize_t
@@ -1015,10 +1027,17 @@ tls13_record_layer_write(struct tls13_record_layer *rl, uint8_t content_type,
1015{ 1027{
1016 ssize_t ret; 1028 ssize_t ret;
1017 1029
1018 if ((ret = tls13_record_layer_send_pending(rl)) != TLS13_IO_SUCCESS) 1030 do {
1031 ret = tls13_record_layer_send_pending(rl);
1032 } while (ret == TLS13_IO_WANT_RETRY);
1033 if (ret != TLS13_IO_SUCCESS)
1019 return ret; 1034 return ret;
1020 1035
1021 return tls13_record_layer_write_chunk(rl, content_type, buf, n); 1036 do {
1037 ret = tls13_record_layer_write_chunk(rl, content_type, buf, n);
1038 } while (ret == TLS13_IO_WANT_RETRY);
1039
1040 return ret;
1022} 1041}
1023 1042
1024ssize_t 1043ssize_t
@@ -1075,10 +1094,15 @@ ssize_t
1075tls13_send_alert(struct tls13_record_layer *rl, uint8_t alert_desc) 1094tls13_send_alert(struct tls13_record_layer *rl, uint8_t alert_desc)
1076{ 1095{
1077 uint8_t alert_level = SSL3_AL_FATAL; 1096 uint8_t alert_level = SSL3_AL_FATAL;
1097 ssize_t ret;
1078 1098
1079 if (alert_desc == SSL_AD_CLOSE_NOTIFY || 1099 if (alert_desc == SSL_AD_CLOSE_NOTIFY ||
1080 alert_desc == SSL_AD_USER_CANCELLED) 1100 alert_desc == SSL_AD_USER_CANCELLED)
1081 alert_level = SSL3_AL_WARNING; 1101 alert_level = SSL3_AL_WARNING;
1082 1102
1083 return tls13_record_layer_alert(rl, alert_level, alert_desc); 1103 do {
1104 ret = tls13_record_layer_alert(rl, alert_level, alert_desc);
1105 } while (ret == TLS13_IO_WANT_RETRY);
1106
1107 return ret;
1084} 1108}