diff options
-rw-r--r-- | src/lib/libssl/tls13_internal.h | 5 | ||||
-rw-r--r-- | src/lib/libssl/tls13_lib.c | 6 | ||||
-rw-r--r-- | src/lib/libssl/tls13_record_layer.c | 44 |
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 | |||
929 | tls13_record_layer_peek(struct tls13_record_layer *rl, uint8_t content_type, | 929 | tls13_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 | ||
935 | ssize_t | 941 | ssize_t |
936 | tls13_record_layer_read(struct tls13_record_layer *rl, uint8_t content_type, | 942 | tls13_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 | ||
942 | static ssize_t | 954 | static 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 | ||
1024 | ssize_t | 1043 | ssize_t |
@@ -1075,10 +1094,15 @@ ssize_t | |||
1075 | tls13_send_alert(struct tls13_record_layer *rl, uint8_t alert_desc) | 1094 | tls13_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 | } |