summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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}