diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/src/ssl/ssl_locl.h | 4 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/t1_reneg.c | 36 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_locl.h | 4 | ||||
| -rw-r--r-- | src/lib/libssl/t1_reneg.c | 36 |
4 files changed, 42 insertions, 38 deletions
diff --git a/src/lib/libssl/src/ssl/ssl_locl.h b/src/lib/libssl/src/ssl/ssl_locl.h index b55e8265af..43c6974268 100644 --- a/src/lib/libssl/src/ssl/ssl_locl.h +++ b/src/lib/libssl/src/ssl/ssl_locl.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_locl.h,v 1.92 2015/06/20 04:04:35 doug Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.93 2015/06/20 16:42:48 doug 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 | * |
| @@ -835,7 +835,7 @@ EVP_MD_CTX* ssl_replace_hash(EVP_MD_CTX **hash, const EVP_MD *md); | |||
| 835 | void ssl_clear_hash_ctx(EVP_MD_CTX **hash); | 835 | void ssl_clear_hash_ctx(EVP_MD_CTX **hash); |
| 836 | int ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p, | 836 | int ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p, |
| 837 | int *len, int maxlen); | 837 | int *len, int maxlen); |
| 838 | int ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, | 838 | int ssl_parse_serverhello_renegotiate_ext(SSL *s, const unsigned char *d, |
| 839 | int len, int *al); | 839 | int len, int *al); |
| 840 | int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, | 840 | int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, |
| 841 | int *len, int maxlen); | 841 | int *len, int maxlen); |
diff --git a/src/lib/libssl/src/ssl/t1_reneg.c b/src/lib/libssl/src/ssl/t1_reneg.c index 52d1754d94..294a632b8f 100644 --- a/src/lib/libssl/src/ssl/t1_reneg.c +++ b/src/lib/libssl/src/ssl/t1_reneg.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: t1_reneg.c,v 1.10 2015/06/20 04:04:36 doug Exp $ */ | 1 | /* $OpenBSD: t1_reneg.c,v 1.11 2015/06/20 16:42:48 doug 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 | * |
| @@ -224,29 +224,28 @@ ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p, int *len, | |||
| 224 | /* Parse the server's renegotiation binding and abort if it's not | 224 | /* Parse the server's renegotiation binding and abort if it's not |
| 225 | right */ | 225 | right */ |
| 226 | int | 226 | int |
| 227 | ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, int len, | 227 | ssl_parse_serverhello_renegotiate_ext(SSL *s, const unsigned char *d, int len, int *al) |
| 228 | int *al) | ||
| 229 | { | 228 | { |
| 229 | CBS cbs, reneg, previous_client, previous_server; | ||
| 230 | int expected_len = s->s3->previous_client_finished_len + | 230 | int expected_len = s->s3->previous_client_finished_len + |
| 231 | s->s3->previous_server_finished_len; | 231 | s->s3->previous_server_finished_len; |
| 232 | int ilen; | ||
| 233 | 232 | ||
| 234 | /* Check for logic errors */ | 233 | /* Check for logic errors */ |
| 235 | OPENSSL_assert(!expected_len || s->s3->previous_client_finished_len); | 234 | OPENSSL_assert(!expected_len || s->s3->previous_client_finished_len); |
| 236 | OPENSSL_assert(!expected_len || s->s3->previous_server_finished_len); | 235 | OPENSSL_assert(!expected_len || s->s3->previous_server_finished_len); |
| 237 | 236 | ||
| 238 | /* Parse the length byte */ | 237 | if (len < 0) { |
| 239 | if (len < 1) { | ||
| 240 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, | 238 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, |
| 241 | SSL_R_RENEGOTIATION_ENCODING_ERR); | 239 | SSL_R_RENEGOTIATION_ENCODING_ERR); |
| 242 | *al = SSL_AD_ILLEGAL_PARAMETER; | 240 | *al = SSL_AD_ILLEGAL_PARAMETER; |
| 243 | return 0; | 241 | return 0; |
| 244 | } | 242 | } |
| 245 | ilen = *d; | ||
| 246 | d++; | ||
| 247 | 243 | ||
| 248 | /* Consistency check */ | 244 | CBS_init(&cbs, d, len); |
| 249 | if (ilen + 1 != len) { | 245 | |
| 246 | if (!CBS_get_u8_length_prefixed(&cbs, &reneg) || | ||
| 247 | /* Consistency check */ | ||
| 248 | CBS_len(&cbs) != 0) { | ||
| 250 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, | 249 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, |
| 251 | SSL_R_RENEGOTIATION_ENCODING_ERR); | 250 | SSL_R_RENEGOTIATION_ENCODING_ERR); |
| 252 | *al = SSL_AD_ILLEGAL_PARAMETER; | 251 | *al = SSL_AD_ILLEGAL_PARAMETER; |
| @@ -254,24 +253,27 @@ ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, int len, | |||
| 254 | } | 253 | } |
| 255 | 254 | ||
| 256 | /* Check that the extension matches */ | 255 | /* Check that the extension matches */ |
| 257 | if (ilen != expected_len) { | 256 | if (CBS_len(&reneg) != expected_len || |
| 257 | !CBS_get_bytes(&reneg, &previous_client, | ||
| 258 | s->s3->previous_client_finished_len) || | ||
| 259 | !CBS_get_bytes(&reneg, &previous_server, | ||
| 260 | s->s3->previous_server_finished_len) || | ||
| 261 | CBS_len(&reneg) != 0) { | ||
| 258 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, | 262 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, |
| 259 | SSL_R_RENEGOTIATION_MISMATCH); | 263 | SSL_R_RENEGOTIATION_MISMATCH); |
| 260 | *al = SSL_AD_HANDSHAKE_FAILURE; | 264 | *al = SSL_AD_HANDSHAKE_FAILURE; |
| 261 | return 0; | 265 | return 0; |
| 262 | } | 266 | } |
| 263 | 267 | ||
| 264 | if (timingsafe_memcmp(d, s->s3->previous_client_finished, | 268 | if (!CBS_mem_equal(&previous_client, s->s3->previous_client_finished, |
| 265 | s->s3->previous_client_finished_len) != 0) { | 269 | CBS_len(&previous_client))) { |
| 266 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, | 270 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, |
| 267 | SSL_R_RENEGOTIATION_MISMATCH); | 271 | SSL_R_RENEGOTIATION_MISMATCH); |
| 268 | *al = SSL_AD_HANDSHAKE_FAILURE; | 272 | *al = SSL_AD_HANDSHAKE_FAILURE; |
| 269 | return 0; | 273 | return 0; |
| 270 | } | 274 | } |
| 271 | d += s->s3->previous_client_finished_len; | 275 | if (!CBS_mem_equal(&previous_server, s->s3->previous_server_finished, |
| 272 | 276 | CBS_len(&previous_server))) { | |
| 273 | if (timingsafe_memcmp(d, s->s3->previous_server_finished, | ||
| 274 | s->s3->previous_server_finished_len)) { | ||
| 275 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, | 277 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, |
| 276 | SSL_R_RENEGOTIATION_MISMATCH); | 278 | SSL_R_RENEGOTIATION_MISMATCH); |
| 277 | *al = SSL_AD_ILLEGAL_PARAMETER; | 279 | *al = SSL_AD_ILLEGAL_PARAMETER; |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index b55e8265af..43c6974268 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_locl.h,v 1.92 2015/06/20 04:04:35 doug Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.93 2015/06/20 16:42:48 doug 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 | * |
| @@ -835,7 +835,7 @@ EVP_MD_CTX* ssl_replace_hash(EVP_MD_CTX **hash, const EVP_MD *md); | |||
| 835 | void ssl_clear_hash_ctx(EVP_MD_CTX **hash); | 835 | void ssl_clear_hash_ctx(EVP_MD_CTX **hash); |
| 836 | int ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p, | 836 | int ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p, |
| 837 | int *len, int maxlen); | 837 | int *len, int maxlen); |
| 838 | int ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, | 838 | int ssl_parse_serverhello_renegotiate_ext(SSL *s, const unsigned char *d, |
| 839 | int len, int *al); | 839 | int len, int *al); |
| 840 | int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, | 840 | int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, |
| 841 | int *len, int maxlen); | 841 | int *len, int maxlen); |
diff --git a/src/lib/libssl/t1_reneg.c b/src/lib/libssl/t1_reneg.c index 52d1754d94..294a632b8f 100644 --- a/src/lib/libssl/t1_reneg.c +++ b/src/lib/libssl/t1_reneg.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: t1_reneg.c,v 1.10 2015/06/20 04:04:36 doug Exp $ */ | 1 | /* $OpenBSD: t1_reneg.c,v 1.11 2015/06/20 16:42:48 doug 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 | * |
| @@ -224,29 +224,28 @@ ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p, int *len, | |||
| 224 | /* Parse the server's renegotiation binding and abort if it's not | 224 | /* Parse the server's renegotiation binding and abort if it's not |
| 225 | right */ | 225 | right */ |
| 226 | int | 226 | int |
| 227 | ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, int len, | 227 | ssl_parse_serverhello_renegotiate_ext(SSL *s, const unsigned char *d, int len, int *al) |
| 228 | int *al) | ||
| 229 | { | 228 | { |
| 229 | CBS cbs, reneg, previous_client, previous_server; | ||
| 230 | int expected_len = s->s3->previous_client_finished_len + | 230 | int expected_len = s->s3->previous_client_finished_len + |
| 231 | s->s3->previous_server_finished_len; | 231 | s->s3->previous_server_finished_len; |
| 232 | int ilen; | ||
| 233 | 232 | ||
| 234 | /* Check for logic errors */ | 233 | /* Check for logic errors */ |
| 235 | OPENSSL_assert(!expected_len || s->s3->previous_client_finished_len); | 234 | OPENSSL_assert(!expected_len || s->s3->previous_client_finished_len); |
| 236 | OPENSSL_assert(!expected_len || s->s3->previous_server_finished_len); | 235 | OPENSSL_assert(!expected_len || s->s3->previous_server_finished_len); |
| 237 | 236 | ||
| 238 | /* Parse the length byte */ | 237 | if (len < 0) { |
| 239 | if (len < 1) { | ||
| 240 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, | 238 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, |
| 241 | SSL_R_RENEGOTIATION_ENCODING_ERR); | 239 | SSL_R_RENEGOTIATION_ENCODING_ERR); |
| 242 | *al = SSL_AD_ILLEGAL_PARAMETER; | 240 | *al = SSL_AD_ILLEGAL_PARAMETER; |
| 243 | return 0; | 241 | return 0; |
| 244 | } | 242 | } |
| 245 | ilen = *d; | ||
| 246 | d++; | ||
| 247 | 243 | ||
| 248 | /* Consistency check */ | 244 | CBS_init(&cbs, d, len); |
| 249 | if (ilen + 1 != len) { | 245 | |
| 246 | if (!CBS_get_u8_length_prefixed(&cbs, &reneg) || | ||
| 247 | /* Consistency check */ | ||
| 248 | CBS_len(&cbs) != 0) { | ||
| 250 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, | 249 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, |
| 251 | SSL_R_RENEGOTIATION_ENCODING_ERR); | 250 | SSL_R_RENEGOTIATION_ENCODING_ERR); |
| 252 | *al = SSL_AD_ILLEGAL_PARAMETER; | 251 | *al = SSL_AD_ILLEGAL_PARAMETER; |
| @@ -254,24 +253,27 @@ ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, int len, | |||
| 254 | } | 253 | } |
| 255 | 254 | ||
| 256 | /* Check that the extension matches */ | 255 | /* Check that the extension matches */ |
| 257 | if (ilen != expected_len) { | 256 | if (CBS_len(&reneg) != expected_len || |
| 257 | !CBS_get_bytes(&reneg, &previous_client, | ||
| 258 | s->s3->previous_client_finished_len) || | ||
| 259 | !CBS_get_bytes(&reneg, &previous_server, | ||
| 260 | s->s3->previous_server_finished_len) || | ||
| 261 | CBS_len(&reneg) != 0) { | ||
| 258 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, | 262 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, |
| 259 | SSL_R_RENEGOTIATION_MISMATCH); | 263 | SSL_R_RENEGOTIATION_MISMATCH); |
| 260 | *al = SSL_AD_HANDSHAKE_FAILURE; | 264 | *al = SSL_AD_HANDSHAKE_FAILURE; |
| 261 | return 0; | 265 | return 0; |
| 262 | } | 266 | } |
| 263 | 267 | ||
| 264 | if (timingsafe_memcmp(d, s->s3->previous_client_finished, | 268 | if (!CBS_mem_equal(&previous_client, s->s3->previous_client_finished, |
| 265 | s->s3->previous_client_finished_len) != 0) { | 269 | CBS_len(&previous_client))) { |
| 266 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, | 270 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, |
| 267 | SSL_R_RENEGOTIATION_MISMATCH); | 271 | SSL_R_RENEGOTIATION_MISMATCH); |
| 268 | *al = SSL_AD_HANDSHAKE_FAILURE; | 272 | *al = SSL_AD_HANDSHAKE_FAILURE; |
| 269 | return 0; | 273 | return 0; |
| 270 | } | 274 | } |
| 271 | d += s->s3->previous_client_finished_len; | 275 | if (!CBS_mem_equal(&previous_server, s->s3->previous_server_finished, |
| 272 | 276 | CBS_len(&previous_server))) { | |
| 273 | if (timingsafe_memcmp(d, s->s3->previous_server_finished, | ||
| 274 | s->s3->previous_server_finished_len)) { | ||
| 275 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, | 277 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, |
| 276 | SSL_R_RENEGOTIATION_MISMATCH); | 278 | SSL_R_RENEGOTIATION_MISMATCH); |
| 277 | *al = SSL_AD_ILLEGAL_PARAMETER; | 279 | *al = SSL_AD_ILLEGAL_PARAMETER; |
