diff options
author | tb <> | 2020-06-01 19:51:31 +0000 |
---|---|---|
committer | tb <> | 2020-06-01 19:51:31 +0000 |
commit | 4e967b47a9720e5103bffe1537f460142bb49437 (patch) | |
tree | ec75cae4bc63fe2fadaccf9167466567d3f5196a | |
parent | e495e6d54d419f6c036260759c1c9f274a80cfcd (diff) | |
download | openbsd-4e967b47a9720e5103bffe1537f460142bb49437.tar.gz openbsd-4e967b47a9720e5103bffe1537f460142bb49437.tar.bz2 openbsd-4e967b47a9720e5103bffe1537f460142bb49437.zip |
Split the handling of post handshake handshake messages into its
own recv function. This simplifies tls13_recod_layer_read_internal()
greatly and makes the phh handling easier to reason about since the
code is no longer glued to the right hand edge of the terminal.
ok jsing
-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 | ||