diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/tls13_record_layer.c | 99 |
1 files changed, 44 insertions, 55 deletions
diff --git a/src/lib/libssl/tls13_record_layer.c b/src/lib/libssl/tls13_record_layer.c index 6c48c93f08..9465a54b6d 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.48 2020/06/01 07:59:49 tb Exp $ */ | 1 | /* $OpenBSD: tls13_record_layer.c,v 1.49 2020/06/01 19:51:31 tb 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 | * |
| @@ -885,6 +885,40 @@ tls13_record_layer_pending(struct tls13_record_layer *rl, uint8_t content_type) | |||
| 885 | } | 885 | } |
| 886 | 886 | ||
| 887 | static ssize_t | 887 | static ssize_t |
| 888 | tls13_record_layer_recv_phh(struct tls13_record_layer *rl) | ||
| 889 | { | ||
| 890 | ssize_t ret = TLS13_IO_FAILURE; | ||
| 891 | |||
| 892 | rl->phh = 1; | ||
| 893 | |||
| 894 | /* | ||
| 895 | * The post handshake handshake receive callback is allowed to return: | ||
| 896 | * | ||
| 897 | * TLS13_IO_WANT_POLLIN need more handshake data. | ||
| 898 | * TLS13_IO_WANT_POLLOUT got whole handshake message, response enqueued. | ||
| 899 | * TLS13_IO_SUCCESS got the whole handshake, nothing more to do. | ||
| 900 | * TLS13_IO_FAILURE something broke. | ||
| 901 | */ | ||
| 902 | if (rl->cb.phh_recv != NULL) | ||
| 903 | ret = rl->cb.phh_recv(rl->cb_arg, &rl->rbuf_cbs); | ||
| 904 | |||
| 905 | tls13_record_layer_rbuf_free(rl); | ||
| 906 | |||
| 907 | /* Leave post handshake handshake mode unless we need more data. */ | ||
| 908 | if (ret != TLS13_IO_WANT_POLLIN) | ||
| 909 | rl->phh = 0; | ||
| 910 | |||
| 911 | if (ret == TLS13_IO_SUCCESS) { | ||
| 912 | if (rl->phh_retry) | ||
| 913 | return TLS13_IO_WANT_RETRY; | ||
| 914 | |||
| 915 | return TLS13_IO_WANT_POLLIN; | ||
| 916 | } | ||
| 917 | |||
| 918 | return ret; | ||
| 919 | } | ||
| 920 | |||
| 921 | static ssize_t | ||
| 888 | tls13_record_layer_read_internal(struct tls13_record_layer *rl, | 922 | tls13_record_layer_read_internal(struct tls13_record_layer *rl, |
| 889 | uint8_t content_type, uint8_t *buf, size_t n, int peek) | 923 | uint8_t content_type, uint8_t *buf, size_t n, int peek) |
| 890 | { | 924 | { |
| @@ -912,68 +946,23 @@ tls13_record_layer_read_internal(struct tls13_record_layer *rl, | |||
| 912 | } | 946 | } |
| 913 | 947 | ||
| 914 | /* | 948 | /* |
| 915 | * If we are in post handshake handshake mode, we may not see | 949 | * If we are in post handshake handshake mode, we must not see |
| 916 | * any record type that isn't a handshake until we are done. | 950 | * any record type that isn't a handshake until we are done. |
| 917 | */ | 951 | */ |
| 918 | if (rl->phh && rl->rbuf_content_type != SSL3_RT_HANDSHAKE) | 952 | if (rl->phh && rl->rbuf_content_type != SSL3_RT_HANDSHAKE) |
| 919 | return tls13_send_alert(rl, TLS13_ALERT_UNEXPECTED_MESSAGE); | 953 | return tls13_send_alert(rl, TLS13_ALERT_UNEXPECTED_MESSAGE); |
| 920 | 954 | ||
| 955 | /* | ||
| 956 | * Handshake content can appear as post-handshake messages (yup, | ||
| 957 | * the RFC reused the same content type...), which means we can | ||
| 958 | * be trying to read application data and need to handle a | ||
| 959 | * post-handshake handshake message instead... | ||
| 960 | */ | ||
| 921 | if (rl->rbuf_content_type != content_type) { | 961 | if (rl->rbuf_content_type != content_type) { |
| 922 | /* | ||
| 923 | * Handshake content can appear as post-handshake messages (yup, | ||
| 924 | * the RFC reused the same content type...), which means we can | ||
| 925 | * be trying to read application data and need to handle a | ||
| 926 | * post-handshake handshake message instead... | ||
| 927 | */ | ||
| 928 | if (rl->rbuf_content_type == SSL3_RT_HANDSHAKE) { | 962 | if (rl->rbuf_content_type == SSL3_RT_HANDSHAKE) { |
| 929 | if (rl->handshake_completed) { | 963 | if (rl->handshake_completed) |
| 930 | rl->phh = 1; | 964 | return tls13_record_layer_recv_phh(rl); |
| 931 | ret = TLS13_IO_FAILURE; | ||
| 932 | |||
| 933 | /* | ||
| 934 | * The post handshake handshake | ||
| 935 | * receive callback is allowed to | ||
| 936 | * return: | ||
| 937 | * | ||
| 938 | * TLS13_IO_WANT_POLLIN -> | ||
| 939 | * I need more handshake data. | ||
| 940 | * | ||
| 941 | * TLS13_IO_WANT_POLLOUT -> I got the | ||
| 942 | * whole handshake message, and have | ||
| 943 | * enqueued a response | ||
| 944 | * | ||
| 945 | * TLS13_IO_SUCCESS -> I got the whole handshake, | ||
| 946 | * nothing more to do | ||
| 947 | * | ||
| 948 | * TLS13_IO_FAILURE -> something broke. | ||
| 949 | */ | ||
| 950 | if (rl->cb.phh_recv != NULL) { | ||
| 951 | ret = rl->cb.phh_recv( | ||
| 952 | rl->cb_arg, &rl->rbuf_cbs); | ||
| 953 | } | ||
| 954 | |||
| 955 | tls13_record_layer_rbuf_free(rl); | ||
| 956 | |||
| 957 | if (ret == TLS13_IO_WANT_POLLIN) | ||
| 958 | return ret; | ||
| 959 | |||
| 960 | /* | ||
| 961 | * leave post handshake handshake mode | ||
| 962 | * if we do not need more handshake data | ||
| 963 | */ | ||
| 964 | rl->phh = 0; | ||
| 965 | |||
| 966 | if (ret == TLS13_IO_SUCCESS) { | ||
| 967 | if (rl->phh_retry) | ||
| 968 | return TLS13_IO_WANT_RETRY; | ||
| 969 | |||
| 970 | return TLS13_IO_WANT_POLLIN; | ||
| 971 | } | ||
| 972 | |||
| 973 | return ret; | ||
| 974 | } | ||
| 975 | } | 965 | } |
| 976 | |||
| 977 | return tls13_send_alert(rl, TLS13_ALERT_UNEXPECTED_MESSAGE); | 966 | return tls13_send_alert(rl, TLS13_ALERT_UNEXPECTED_MESSAGE); |
| 978 | } | 967 | } |
| 979 | 968 | ||
