diff options
author | jsing <> | 2018-08-24 17:44:22 +0000 |
---|---|---|
committer | jsing <> | 2018-08-24 17:44:22 +0000 |
commit | 32564ad6b169c4d391b5303bf7ed7e516be54aca (patch) | |
tree | a60c634f53ed4d7ec848999b59e2119b7d499249 /src | |
parent | a095c2bc9384570737b68a33280c4ebdf412fc79 (diff) | |
download | openbsd-32564ad6b169c4d391b5303bf7ed7e516be54aca.tar.gz openbsd-32564ad6b169c4d391b5303bf7ed7e516be54aca.tar.bz2 openbsd-32564ad6b169c4d391b5303bf7ed7e516be54aca.zip |
Pull up the parsing of a ClientHello.
Parse up until the extensions (if any), then proceed with processing,
rather than gradually parsing while processing. This makes the code
cleaner, requires messages to be valid before processing and makes way
for upcoming changes.
ok inoguchi@ tb@
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index 745fd6d83a..b9b2c58705 100644 --- a/src/lib/libssl/ssl_srvr.c +++ b/src/lib/libssl/ssl_srvr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_srvr.c,v 1.43 2018/08/24 17:30:32 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.44 2018/08/24 17:44:22 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -846,13 +846,26 @@ ssl3_get_client_hello(SSL *s) | |||
846 | 846 | ||
847 | CBS_init(&cbs, s->internal->init_msg, n); | 847 | CBS_init(&cbs, s->internal->init_msg, n); |
848 | 848 | ||
849 | /* Parse client hello up until the extensions (if any). */ | ||
850 | if (!CBS_get_u16(&cbs, &client_version)) | ||
851 | goto truncated; | ||
852 | if (!CBS_get_bytes(&cbs, &client_random, SSL3_RANDOM_SIZE)) | ||
853 | goto truncated; | ||
854 | if (!CBS_get_u8_length_prefixed(&cbs, &session_id)) | ||
855 | goto truncated; | ||
856 | if (SSL_IS_DTLS(s)) { | ||
857 | if (!CBS_get_u8_length_prefixed(&cbs, &cookie)) | ||
858 | goto truncated; | ||
859 | } | ||
860 | if (!CBS_get_u16_length_prefixed(&cbs, &cipher_suites)) | ||
861 | goto truncated; | ||
862 | if (!CBS_get_u8_length_prefixed(&cbs, &compression_methods)) | ||
863 | goto truncated; | ||
864 | |||
849 | /* | 865 | /* |
850 | * Use version from inside client hello, not from record header. | 866 | * Use version from inside client hello, not from record header. |
851 | * (may differ: see RFC 2246, Appendix E, second paragraph) | 867 | * (may differ: see RFC 2246, Appendix E, second paragraph) |
852 | */ | 868 | */ |
853 | if (!CBS_get_u16(&cbs, &client_version)) | ||
854 | goto truncated; | ||
855 | |||
856 | if (ssl_max_shared_version(s, client_version, &shared_version) != 1) { | 869 | if (ssl_max_shared_version(s, client_version, &shared_version) != 1) { |
857 | SSLerror(s, SSL_R_WRONG_VERSION_NUMBER); | 870 | SSLerror(s, SSL_R_WRONG_VERSION_NUMBER); |
858 | if ((s->client_version >> 8) == SSL3_VERSION_MAJOR && | 871 | if ((s->client_version >> 8) == SSL3_VERSION_MAJOR && |
@@ -877,19 +890,12 @@ ssl3_get_client_hello(SSL *s) | |||
877 | } | 890 | } |
878 | s->method = method; | 891 | s->method = method; |
879 | 892 | ||
880 | if (!CBS_get_bytes(&cbs, &client_random, SSL3_RANDOM_SIZE)) | ||
881 | goto truncated; | ||
882 | if (!CBS_get_u8_length_prefixed(&cbs, &session_id)) | ||
883 | goto truncated; | ||
884 | |||
885 | /* | 893 | /* |
886 | * If we require cookies (DTLS) and this ClientHello doesn't | 894 | * If we require cookies (DTLS) and this ClientHello does not contain |
887 | * contain one, just return since we do not want to | 895 | * one, just return since we do not want to allocate any memory yet. |
888 | * allocate any memory yet. So check cookie length... | 896 | * So check cookie length... |
889 | */ | 897 | */ |
890 | if (SSL_IS_DTLS(s)) { | 898 | if (SSL_IS_DTLS(s)) { |
891 | if (!CBS_get_u8_length_prefixed(&cbs, &cookie)) | ||
892 | goto truncated; | ||
893 | if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) { | 899 | if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) { |
894 | if (CBS_len(&cookie) == 0) | 900 | if (CBS_len(&cookie) == 0) |
895 | return (1); | 901 | return (1); |
@@ -979,9 +985,6 @@ ssl3_get_client_hello(SSL *s) | |||
979 | } | 985 | } |
980 | } | 986 | } |
981 | 987 | ||
982 | if (!CBS_get_u16_length_prefixed(&cbs, &cipher_suites)) | ||
983 | goto truncated; | ||
984 | |||
985 | /* XXX - This logic seems wrong... */ | 988 | /* XXX - This logic seems wrong... */ |
986 | if (CBS_len(&cipher_suites) == 0 && CBS_len(&session_id) != 0) { | 989 | if (CBS_len(&cipher_suites) == 0 && CBS_len(&session_id) != 0) { |
987 | /* we need a cipher if we are not resuming a session */ | 990 | /* we need a cipher if we are not resuming a session */ |
@@ -1020,9 +1023,6 @@ ssl3_get_client_hello(SSL *s) | |||
1020 | } | 1023 | } |
1021 | } | 1024 | } |
1022 | 1025 | ||
1023 | if (!CBS_get_u8_length_prefixed(&cbs, &compression_methods)) | ||
1024 | goto truncated; | ||
1025 | |||
1026 | comp_null = 0; | 1026 | comp_null = 0; |
1027 | while (CBS_len(&compression_methods) > 0) { | 1027 | while (CBS_len(&compression_methods) > 0) { |
1028 | if (!CBS_get_u8(&compression_methods, &comp_method)) | 1028 | if (!CBS_get_u8(&compression_methods, &comp_method)) |