提交 9ceb2426 编写于 作者: M Matt Caswell

PACKETise ClientHello processing

Uses the new PACKET code to process the incoming ClientHello including all
extensions etc.
Reviewed-by: NTim Hudson <tjh@openssl.org>
上级 6fc2ef20
...@@ -266,38 +266,18 @@ int ssl_add_clienthello_use_srtp_ext(SSL *s, unsigned char *p, int *len, ...@@ -266,38 +266,18 @@ int ssl_add_clienthello_use_srtp_ext(SSL *s, unsigned char *p, int *len,
return 0; return 0;
} }
int ssl_parse_clienthello_use_srtp_ext(SSL *s, unsigned char *d, int len, int ssl_parse_clienthello_use_srtp_ext(SSL *s, PACKET *pkt, int *al)
int *al)
{ {
SRTP_PROTECTION_PROFILE *sprof; SRTP_PROTECTION_PROFILE *sprof;
STACK_OF(SRTP_PROTECTION_PROFILE) *srvr; STACK_OF(SRTP_PROTECTION_PROFILE) *srvr;
int ct; unsigned int ct, mki_len, id;
int mki_len;
int i, srtp_pref; int i, srtp_pref;
unsigned int id; PACKET subpkt;
/* Length value + the MKI length */
if (len < 3) {
SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT,
SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
*al = SSL_AD_DECODE_ERROR;
return 1;
}
/* Pull off the length of the cipher suite list */
n2s(d, ct);
len -= 2;
/* Check that it is even */ /* Pull off the length of the cipher suite list and check it is even */
if (ct % 2) { if (!PACKET_get_net_2(pkt, &ct)
SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT, || (ct & 1) != 0
SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST); || !PACKET_get_sub_packet(pkt, &subpkt, ct)) {
*al = SSL_AD_DECODE_ERROR;
return 1;
}
/* Check that lengths are consistent */
if (len < (ct + 1)) {
SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT, SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT,
SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST); SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
*al = SSL_AD_DECODE_ERROR; *al = SSL_AD_DECODE_ERROR;
...@@ -309,10 +289,13 @@ int ssl_parse_clienthello_use_srtp_ext(SSL *s, unsigned char *d, int len, ...@@ -309,10 +289,13 @@ int ssl_parse_clienthello_use_srtp_ext(SSL *s, unsigned char *d, int len,
/* Search all profiles for a match initially */ /* Search all profiles for a match initially */
srtp_pref = sk_SRTP_PROTECTION_PROFILE_num(srvr); srtp_pref = sk_SRTP_PROTECTION_PROFILE_num(srvr);
while (ct) { while (PACKET_remaining(&subpkt)) {
n2s(d, id); if (!PACKET_get_net_2(&subpkt, &id)) {
ct -= 2; SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT,
len -= 2; SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
*al = SSL_AD_DECODE_ERROR;
return 1;
}
/* /*
* Only look for match in profiles of higher preference than * Only look for match in profiles of higher preference than
...@@ -333,11 +316,15 @@ int ssl_parse_clienthello_use_srtp_ext(SSL *s, unsigned char *d, int len, ...@@ -333,11 +316,15 @@ int ssl_parse_clienthello_use_srtp_ext(SSL *s, unsigned char *d, int len,
/* /*
* Now extract the MKI value as a sanity check, but discard it for now * Now extract the MKI value as a sanity check, but discard it for now
*/ */
mki_len = *d; if (!PACKET_get_1(pkt, &mki_len)) {
d++; SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT,
len--; SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
*al = SSL_AD_DECODE_ERROR;
return 1;
}
if (mki_len != len) { if (!PACKET_forward(pkt, mki_len)
|| PACKET_remaining(pkt)) {
SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT, SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT,
SSL_R_BAD_SRTP_MKI_VALUE); SSL_R_BAD_SRTP_MKI_VALUE);
*al = SSL_AD_DECODE_ERROR; *al = SSL_AD_DECODE_ERROR;
......
...@@ -862,11 +862,11 @@ int ssl3_send_hello_request(SSL *s) ...@@ -862,11 +862,11 @@ int ssl3_send_hello_request(SSL *s)
int ssl3_get_client_hello(SSL *s) int ssl3_get_client_hello(SSL *s)
{ {
int i, complen, j, ok, al = SSL_AD_INTERNAL_ERROR, ret = -1; int i, ok, al = SSL_AD_INTERNAL_ERROR, ret = -1;
unsigned int cookie_len; unsigned int j, cipherlen, complen;
unsigned int cookie_len = 0;
long n; long n;
unsigned long id; unsigned long id;
unsigned char *p, *d;
SSL_CIPHER *c; SSL_CIPHER *c;
#ifndef OPENSSL_NO_COMP #ifndef OPENSSL_NO_COMP
unsigned char *q = NULL; unsigned char *q = NULL;
...@@ -874,6 +874,8 @@ int ssl3_get_client_hello(SSL *s) ...@@ -874,6 +874,8 @@ int ssl3_get_client_hello(SSL *s)
#endif #endif
STACK_OF(SSL_CIPHER) *ciphers = NULL; STACK_OF(SSL_CIPHER) *ciphers = NULL;
int protverr = 1; int protverr = 1;
PACKET pkt;
unsigned char *sess, *cdata;
if (s->state == SSL3_ST_SR_CLNT_HELLO_C && !s->first_packet) if (s->state == SSL3_ST_SR_CLNT_HELLO_C && !s->first_packet)
goto retry_cert; goto retry_cert;
...@@ -897,10 +899,12 @@ int ssl3_get_client_hello(SSL *s) ...@@ -897,10 +899,12 @@ int ssl3_get_client_hello(SSL *s)
if (!ok) if (!ok)
return ((int)n); return ((int)n);
s->first_packet = 0; s->first_packet = 0;
d = p = (unsigned char *)s->init_msg; PACKET_buf_init(&pkt, s->init_msg, n);
/* First lets get s->client_version set correctly */ /* First lets get s->client_version set correctly */
if (RECORD_LAYER_is_sslv2_record(&s->rlayer)) { if (RECORD_LAYER_is_sslv2_record(&s->rlayer)) {
unsigned int version;
unsigned int mt;
/*- /*-
* An SSLv3/TLSv1 backwards-compatible CLIENT-HELLO in an SSLv2 * An SSLv3/TLSv1 backwards-compatible CLIENT-HELLO in an SSLv2
* header is sent directly on the wire, not wrapped as a TLS * header is sent directly on the wire, not wrapped as a TLS
...@@ -916,7 +920,8 @@ int ssl3_get_client_hello(SSL *s) ...@@ -916,7 +920,8 @@ int ssl3_get_client_hello(SSL *s)
* ... ... * ... ...
*/ */
if (p[0] != SSL2_MT_CLIENT_HELLO) { if (!PACKET_get_1(&pkt, &mt)
|| mt != SSL2_MT_CLIENT_HELLO) {
/* /*
* Should never happen. We should have tested this in the record * Should never happen. We should have tested this in the record
* layer in order to have determined that this is a SSLv2 record * layer in order to have determined that this is a SSLv2 record
...@@ -926,13 +931,18 @@ int ssl3_get_client_hello(SSL *s) ...@@ -926,13 +931,18 @@ int ssl3_get_client_hello(SSL *s)
goto err; goto err;
} }
if ((p[1] == 0x00) && (p[2] == 0x02)) { if (!PACKET_get_net_2(&pkt, &version)) {
/* No protocol version supplied! */
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_UNKNOWN_PROTOCOL);
goto err;
}
if (version == 0x0002) {
/* This is real SSLv2. We don't support it. */ /* This is real SSLv2. We don't support it. */
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_UNKNOWN_PROTOCOL); SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_UNKNOWN_PROTOCOL);
goto err; goto err;
} else if (p[1] == SSL3_VERSION_MAJOR) { } else if ((version & 0xff00) == (SSL3_VERSION_MAJOR << 8)) {
/* SSLv3/TLS */ /* SSLv3/TLS */
s->client_version = (((int)p[1]) << 8) | (int)p[2]; s->client_version = version;
} else { } else {
/* No idea what protocol this is */ /* No idea what protocol this is */
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_UNKNOWN_PROTOCOL); SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_UNKNOWN_PROTOCOL);
...@@ -940,20 +950,14 @@ int ssl3_get_client_hello(SSL *s) ...@@ -940,20 +950,14 @@ int ssl3_get_client_hello(SSL *s)
} }
} else { } else {
/* /*
* 2 bytes for client version, SSL3_RANDOM_SIZE bytes for random, 1 byte * use version from inside client hello, not from record header (may
* for session id length * differ: see RFC 2246, Appendix E, second paragraph)
*/ */
if (n < 2 + SSL3_RANDOM_SIZE + 1) { if(!PACKET_get_net_2(&pkt, (unsigned int *)&s->client_version)) {
al = SSL_AD_DECODE_ERROR; al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT); SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
goto f_err; goto f_err;
} }
/*
* use version from inside client hello, not from record header (may
* differ: see RFC 2246, Appendix E, second paragraph)
*/
s->client_version = (((int)p[0]) << 8) | (int)p[1];
} }
/* Do SSL/TLS version negotiation if applicable */ /* Do SSL/TLS version negotiation if applicable */
...@@ -1032,15 +1036,9 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1032,15 +1036,9 @@ int ssl3_get_client_hello(SSL *s)
*/ */
unsigned int csl, sil, cl; unsigned int csl, sil, cl;
p += 3; if (!PACKET_get_net_2(&pkt, &csl)
n2s(p, csl); || !PACKET_get_net_2(&pkt, &sil)
n2s(p, sil); || !PACKET_get_net_2(&pkt, &cl)) {
n2s(p, cl);
if (csl + sil + cl + MIN_SSL2_RECORD_LEN != (unsigned int) n) {
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_RECORD_LENGTH_MISMATCH);
al = SSL_AD_DECODE_ERROR;
goto f_err;
} }
if (csl == 0) { if (csl == 0) {
...@@ -1050,7 +1048,13 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1050,7 +1048,13 @@ int ssl3_get_client_hello(SSL *s)
goto f_err; goto f_err;
} }
if (ssl_bytes_to_cipher_list(s, p, csl, &(ciphers), 1) == NULL) { if (!PACKET_get_bytes(&pkt, &cdata, csl)) {
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_RECORD_LENGTH_MISMATCH);
al = SSL_AD_DECODE_ERROR;
goto f_err;
}
if (ssl_bytes_to_cipher_list(s, cdata, csl, &(ciphers), 1) == NULL) {
goto err; goto err;
} }
...@@ -1058,6 +1062,11 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1058,6 +1062,11 @@ int ssl3_get_client_hello(SSL *s)
* Ignore any session id. We don't allow resumption in a backwards * Ignore any session id. We don't allow resumption in a backwards
* compatible ClientHello * compatible ClientHello
*/ */
if (!PACKET_forward(&pkt, sil)) {
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_RECORD_LENGTH_MISMATCH);
al = SSL_AD_DECODE_ERROR;
goto f_err;
}
s->hit = 0; s->hit = 0;
if (!ssl_get_new_session(s, 1)) if (!ssl_get_new_session(s, 1))
...@@ -1066,17 +1075,27 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1066,17 +1075,27 @@ int ssl3_get_client_hello(SSL *s)
/* Load the client random */ /* Load the client random */
i = (cl > SSL3_RANDOM_SIZE) ? SSL3_RANDOM_SIZE : cl; i = (cl > SSL3_RANDOM_SIZE) ? SSL3_RANDOM_SIZE : cl;
memset(s->s3->client_random, 0, SSL3_RANDOM_SIZE); memset(s->s3->client_random, 0, SSL3_RANDOM_SIZE);
memcpy(s->s3->client_random, &(p[csl + sil]), i); if (!PACKET_peek_copy_bytes(&pkt, s->s3->client_random, i)
|| !PACKET_forward(&pkt, cl)
/* Set p to end of packet to ensure we don't look for extensions */ || !PACKET_remaining(&pkt) == 0) {
p = d + n; SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_RECORD_LENGTH_MISMATCH);
al = SSL_AD_DECODE_ERROR;
goto f_err;
}
/* No compression, so set complen to 0 */ /* No compression, so set complen to 0 */
complen = 0; complen = 0;
} else { } else {
/* If we get here we've got SSLv3+ in an SSLv3+ record */ /* If we get here we've got SSLv3+ in an SSLv3+ record */
p += 2; /* load the client random and get the session-id */
if (!PACKET_copy_bytes(&pkt, s->s3->client_random, SSL3_RANDOM_SIZE)
|| !PACKET_get_1(&pkt, &j)
|| !PACKET_get_bytes(&pkt, &sess, j)) {
al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
goto f_err;
}
/* /*
* If we require cookies and this ClientHello doesn't contain one, just * If we require cookies and this ClientHello doesn't contain one, just
...@@ -1084,34 +1103,17 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1084,34 +1103,17 @@ int ssl3_get_client_hello(SSL *s)
* cookie length... * cookie length...
*/ */
if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) { if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) {
unsigned int session_length, cookie_length;
session_length = *(p + SSL3_RANDOM_SIZE); if (!PACKET_peek_1(&pkt, &cookie_len)) {
if (p + SSL3_RANDOM_SIZE + session_length + 1 >= d + n) {
al = SSL_AD_DECODE_ERROR; al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT); SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
goto f_err; goto f_err;
} }
cookie_length = *(p + SSL3_RANDOM_SIZE + session_length + 1);
if (cookie_length == 0) if (cookie_len == 0)
return 1; return 1;
} }
/* load the client random */
memcpy(s->s3->client_random, p, SSL3_RANDOM_SIZE);
p += SSL3_RANDOM_SIZE;
/* get the session-id */
j = *(p++);
if (p + j > d + n) {
al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
goto f_err;
}
s->hit = 0; s->hit = 0;
/* /*
* Versions before 0.9.7 always allow clients to resume sessions in * Versions before 0.9.7 always allow clients to resume sessions in
...@@ -1131,7 +1133,7 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1131,7 +1133,7 @@ int ssl3_get_client_hello(SSL *s)
if (!ssl_get_new_session(s, 1)) if (!ssl_get_new_session(s, 1))
goto err; goto err;
} else { } else {
i = ssl_get_prev_session(s, p, j, d + n); i = ssl_get_prev_session(s, &pkt, sess, j);
/* /*
* Only resume if the session's version matches the negotiated * Only resume if the session's version matches the negotiated
* version. * version.
...@@ -1153,23 +1155,12 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1153,23 +1155,12 @@ int ssl3_get_client_hello(SSL *s)
} }
} }
p += j;
if (SSL_IS_DTLS(s)) { if (SSL_IS_DTLS(s)) {
/* cookie stuff */ if (!PACKET_get_1(&pkt, &cookie_len)) {
if (p + 1 > d + n) {
al = SSL_AD_DECODE_ERROR; al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT); SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
goto f_err; goto f_err;
} }
cookie_len = *(p++);
if (p + cookie_len > d + n) {
al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
goto f_err;
}
/* /*
* The ClientHello may contain a cookie even if the * The ClientHello may contain a cookie even if the
* HelloVerify message has not been sent--make sure that it * HelloVerify message has not been sent--make sure that it
...@@ -1185,7 +1176,13 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1185,7 +1176,13 @@ int ssl3_get_client_hello(SSL *s)
/* verify the cookie if appropriate option is set. */ /* verify the cookie if appropriate option is set. */
if ((SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) if ((SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE)
&& cookie_len > 0) { && cookie_len > 0) {
memcpy(s->d1->rcvd_cookie, p, cookie_len); /* Get cookie */
if (!PACKET_copy_bytes(&pkt, s->d1->rcvd_cookie,
cookie_len)) {
al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
goto f_err;
}
if (s->ctx->app_verify_cookie_cb != NULL) { if (s->ctx->app_verify_cookie_cb != NULL) {
if (s->ctx->app_verify_cookie_cb(s, s->d1->rcvd_cookie, if (s->ctx->app_verify_cookie_cb(s, s->d1->rcvd_cookie,
...@@ -1206,9 +1203,15 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1206,9 +1203,15 @@ int ssl3_get_client_hello(SSL *s)
} }
/* Set to -2 so if successful we return 2 */ /* Set to -2 so if successful we return 2 */
ret = -2; ret = -2;
} else {
/* Skip over cookie */
if (!PACKET_forward(&pkt, cookie_len)) {
al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
goto f_err;
}
} }
p += cookie_len;
if (s->method->version == DTLS_ANY_VERSION) { if (s->method->version == DTLS_ANY_VERSION) {
/* Select version to use */ /* Select version to use */
if (s->client_version <= DTLS1_2_VERSION && if (s->client_version <= DTLS1_2_VERSION &&
...@@ -1236,30 +1239,28 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1236,30 +1239,28 @@ int ssl3_get_client_hello(SSL *s)
} }
} }
if (p + 2 > d + n) { if (!PACKET_get_net_2(&pkt, &cipherlen)) {
al = SSL_AD_DECODE_ERROR; al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT); SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
goto f_err; goto f_err;
} }
n2s(p, i);
if (i == 0) { if (cipherlen == 0) {
al = SSL_AD_ILLEGAL_PARAMETER; al = SSL_AD_ILLEGAL_PARAMETER;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_NO_CIPHERS_SPECIFIED); SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_NO_CIPHERS_SPECIFIED);
goto f_err; goto f_err;
} }
/* i bytes of cipher data + 1 byte for compression length later */ if (!PACKET_get_bytes(&pkt, &cdata, cipherlen)) {
if ((p + i + 1) > (d + n)) {
/* not enough data */ /* not enough data */
al = SSL_AD_DECODE_ERROR; al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_MISMATCH); SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_MISMATCH);
goto f_err; goto f_err;
} }
if (ssl_bytes_to_cipher_list(s, p, i, &(ciphers), 0) == NULL) {
if (ssl_bytes_to_cipher_list(s, cdata, cipherlen, &(ciphers), 0) == NULL) {
goto err; goto err;
} }
p += i;
/* If it is a hit, check that the cipher is in the list */ /* If it is a hit, check that the cipher is in the list */
if (s->hit) { if (s->hit) {
...@@ -1316,22 +1317,22 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1316,22 +1317,22 @@ int ssl3_get_client_hello(SSL *s)
} }
/* compression */ /* compression */
complen = *(p++); if (!PACKET_get_1(&pkt, &complen)
if ((p + complen) > (d + n)) { || !PACKET_get_bytes(&pkt, &cdata, complen)) {
/* not enough data */ /* not enough data */
al = SSL_AD_DECODE_ERROR; al = SSL_AD_DECODE_ERROR;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_MISMATCH); SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_MISMATCH);
goto f_err; goto f_err;
} }
#ifndef OPENSSL_NO_COMP #ifndef OPENSSL_NO_COMP
q = p; q = cdata;
#endif #endif
for (j = 0; j < complen; j++) { for (j = 0; j < complen; j++) {
if (p[j] == 0) if (cdata[j] == 0)
break; break;
} }
p += complen;
if (j >= complen) { if (j >= complen) {
/* no compress */ /* no compress */
al = SSL_AD_DECODE_ERROR; al = SSL_AD_DECODE_ERROR;
...@@ -1342,7 +1343,7 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1342,7 +1343,7 @@ int ssl3_get_client_hello(SSL *s)
/* TLS extensions */ /* TLS extensions */
if (s->version >= SSL3_VERSION) { if (s->version >= SSL3_VERSION) {
if (!ssl_parse_clienthello_tlsext(s, &p, d, n)) { if (!ssl_parse_clienthello_tlsext(s, &pkt)) {
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_PARSE_TLSEXT); SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_PARSE_TLSEXT);
goto err; goto err;
} }
...@@ -1407,6 +1408,7 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1407,6 +1408,7 @@ int ssl3_get_client_hello(SSL *s)
/* This only happens if we have a cache hit */ /* This only happens if we have a cache hit */
if (s->session->compress_meth != 0) { if (s->session->compress_meth != 0) {
int m, comp_id = s->session->compress_meth; int m, comp_id = s->session->compress_meth;
unsigned int k;
/* Perform sanity checks on resumed compression algorithm */ /* Perform sanity checks on resumed compression algorithm */
/* Can't disable compression */ /* Can't disable compression */
if (!ssl_allow_compression(s)) { if (!ssl_allow_compression(s)) {
...@@ -1428,11 +1430,11 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1428,11 +1430,11 @@ int ssl3_get_client_hello(SSL *s)
goto f_err; goto f_err;
} }
/* Look for resumed method in compression list */ /* Look for resumed method in compression list */
for (m = 0; m < complen; m++) { for (k = 0; k < complen; k++) {
if (q[m] == comp_id) if (q[k] == comp_id)
break; break;
} }
if (m >= complen) { if (k >= complen) {
al = SSL_AD_ILLEGAL_PARAMETER; al = SSL_AD_ILLEGAL_PARAMETER;
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,
SSL_R_REQUIRED_COMPRESSSION_ALGORITHM_MISSING); SSL_R_REQUIRED_COMPRESSSION_ALGORITHM_MISSING);
...@@ -1442,7 +1444,8 @@ int ssl3_get_client_hello(SSL *s) ...@@ -1442,7 +1444,8 @@ int ssl3_get_client_hello(SSL *s)
comp = NULL; comp = NULL;
else if (ssl_allow_compression(s) && s->ctx->comp_methods) { else if (ssl_allow_compression(s) && s->ctx->comp_methods) {
/* See if we have a match */ /* See if we have a match */
int m, nn, o, v, done = 0; int m, nn, v, done = 0;
unsigned int o;
nn = sk_SSL_COMP_num(s->ctx->comp_methods); nn = sk_SSL_COMP_num(s->ctx->comp_methods);
for (m = 0; m < nn; m++) { for (m = 0; m < nn; m++) {
......
...@@ -1854,8 +1854,8 @@ __owur CERT *ssl_cert_dup(CERT *cert); ...@@ -1854,8 +1854,8 @@ __owur CERT *ssl_cert_dup(CERT *cert);
void ssl_cert_clear_certs(CERT *c); void ssl_cert_clear_certs(CERT *c);
void ssl_cert_free(CERT *c); void ssl_cert_free(CERT *c);
__owur int ssl_get_new_session(SSL *s, int session); __owur int ssl_get_new_session(SSL *s, int session);
__owur int ssl_get_prev_session(SSL *s, unsigned char *session, int len, __owur int ssl_get_prev_session(SSL *s, PACKET *pkt, unsigned char *session,
const unsigned char *limit); int len);
__owur SSL_SESSION *ssl_session_dup(SSL_SESSION *src, int ticket); __owur SSL_SESSION *ssl_session_dup(SSL_SESSION *src, int ticket);
__owur int ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b); __owur int ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b);
DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(SSL_CIPHER, SSL_CIPHER, ssl_cipher_id); DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(SSL_CIPHER, SSL_CIPHER, ssl_cipher_id);
...@@ -2088,8 +2088,7 @@ __owur unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf, ...@@ -2088,8 +2088,7 @@ __owur unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf,
unsigned char *limit, int *al); unsigned char *limit, int *al);
__owur unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf, __owur unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf,
unsigned char *limit, int *al); unsigned char *limit, int *al);
__owur int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **data, __owur int ssl_parse_clienthello_tlsext(SSL *s, PACKET *pkt);
unsigned char *d, int n);
__owur int tls1_set_server_sigalgs(SSL *s); __owur int tls1_set_server_sigalgs(SSL *s);
__owur int ssl_check_clienthello_tlsext_late(SSL *s); __owur int ssl_check_clienthello_tlsext_late(SSL *s);
__owur int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **data, __owur int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **data,
...@@ -2104,8 +2103,8 @@ __owur int tls1_process_heartbeat(SSL *s, unsigned char *p, unsigned int length) ...@@ -2104,8 +2103,8 @@ __owur int tls1_process_heartbeat(SSL *s, unsigned char *p, unsigned int length)
__owur int dtls1_process_heartbeat(SSL *s, unsigned char *p, unsigned int length); __owur int dtls1_process_heartbeat(SSL *s, unsigned char *p, unsigned int length);
# endif # endif
__owur int tls1_process_ticket(SSL *s, unsigned char *session_id, int len, __owur int tls1_process_ticket(SSL *s, PACKET *pkt, unsigned char *session_id,
const unsigned char *limit, SSL_SESSION **ret); int len, SSL_SESSION **ret);
__owur int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, __owur int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk,
const EVP_MD *md); const EVP_MD *md);
...@@ -2134,8 +2133,7 @@ __owur int ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, int l ...@@ -2134,8 +2133,7 @@ __owur int ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, int l
int *al); int *al);
__owur int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, int *len, __owur int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, int *len,
int maxlen); int maxlen);
__owur int ssl_parse_clienthello_renegotiate_ext(SSL *s, unsigned char *d, int len, __owur int ssl_parse_clienthello_renegotiate_ext(SSL *s, PACKET *pkt, int *al);
int *al);
__owur long ssl_get_algorithm2(SSL *s); __owur long ssl_get_algorithm2(SSL *s);
__owur size_t tls12_copy_sigalgs(SSL *s, unsigned char *out, __owur size_t tls12_copy_sigalgs(SSL *s, unsigned char *out,
const unsigned char *psig, size_t psiglen); const unsigned char *psig, size_t psiglen);
...@@ -2149,8 +2147,7 @@ __owur int ssl_cipher_disabled(SSL *s, const SSL_CIPHER *c, int op); ...@@ -2149,8 +2147,7 @@ __owur int ssl_cipher_disabled(SSL *s, const SSL_CIPHER *c, int op);
__owur int ssl_add_clienthello_use_srtp_ext(SSL *s, unsigned char *p, int *len, __owur int ssl_add_clienthello_use_srtp_ext(SSL *s, unsigned char *p, int *len,
int maxlen); int maxlen);
__owur int ssl_parse_clienthello_use_srtp_ext(SSL *s, unsigned char *d, int len, __owur int ssl_parse_clienthello_use_srtp_ext(SSL *s, PACKET *pkt, int *al);
int *al);
__owur int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len, __owur int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len,
int maxlen); int maxlen);
__owur int ssl_parse_serverhello_use_srtp_ext(SSL *s, unsigned char *d, int len, __owur int ssl_parse_serverhello_use_srtp_ext(SSL *s, unsigned char *d, int len,
......
...@@ -547,8 +547,8 @@ int ssl_get_new_session(SSL *s, int session) ...@@ -547,8 +547,8 @@ int ssl_get_new_session(SSL *s, int session)
* - Both for new and resumed sessions, s->tlsext_ticket_expected is set to 1 * - Both for new and resumed sessions, s->tlsext_ticket_expected is set to 1
* if the server should issue a new session ticket (to 0 otherwise). * if the server should issue a new session ticket (to 0 otherwise).
*/ */
int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len, int ssl_get_prev_session(SSL *s, PACKET *pkt, unsigned char *session_id,
const unsigned char *limit) int len)
{ {
/* This is used only by servers. */ /* This is used only by servers. */
...@@ -560,16 +560,11 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len, ...@@ -560,16 +560,11 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len,
if (len < 0 || len > SSL_MAX_SSL_SESSION_ID_LENGTH) if (len < 0 || len > SSL_MAX_SSL_SESSION_ID_LENGTH)
goto err; goto err;
if (session_id + len > limit) {
fatal = 1;
goto err;
}
if (len == 0) if (len == 0)
try_session_cache = 0; try_session_cache = 0;
/* sets s->tlsext_ticket_expected */ /* sets s->tlsext_ticket_expected */
r = tls1_process_ticket(s, session_id, len, limit, &ret); r = tls1_process_ticket(s, pkt, session_id, len, &ret);
switch (r) { switch (r) {
case -1: /* Error during processing */ case -1: /* Error during processing */
fatal = 1; fatal = 1;
......
此差异已折叠。
...@@ -143,23 +143,14 @@ int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, int *len, ...@@ -143,23 +143,14 @@ int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, int *len,
/* /*
* Parse the client's renegotiation binding and abort if it's not right * Parse the client's renegotiation binding and abort if it's not right
*/ */
int ssl_parse_clienthello_renegotiate_ext(SSL *s, unsigned char *d, int len, int ssl_parse_clienthello_renegotiate_ext(SSL *s, PACKET *pkt, int *al)
int *al)
{ {
int ilen; unsigned int ilen;
unsigned char *d;
/* Parse the length byte */ /* Parse the length byte */
if (len < 1) { if (!PACKET_get_1(pkt, &ilen)
SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT, || !PACKET_get_bytes(pkt, &d, ilen)) {
SSL_R_RENEGOTIATION_ENCODING_ERR);
*al = SSL_AD_ILLEGAL_PARAMETER;
return 0;
}
ilen = *d;
d++;
/* Consistency check */
if ((ilen + 1) != len) {
SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT, SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT,
SSL_R_RENEGOTIATION_ENCODING_ERR); SSL_R_RENEGOTIATION_ENCODING_ERR);
*al = SSL_AD_ILLEGAL_PARAMETER; *al = SSL_AD_ILLEGAL_PARAMETER;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册