summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2018-08-24 17:44:22 +0000
committerjsing <>2018-08-24 17:44:22 +0000
commit32564ad6b169c4d391b5303bf7ed7e516be54aca (patch)
treea60c634f53ed4d7ec848999b59e2119b7d499249 /src
parenta095c2bc9384570737b68a33280c4ebdf412fc79 (diff)
downloadopenbsd-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.c40
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))