diff options
Diffstat (limited to 'src/lib')
| -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 | } |
