diff options
Diffstat (limited to 'src/lib/libssl/s23_clnt.c')
-rw-r--r-- | src/lib/libssl/s23_clnt.c | 111 |
1 files changed, 97 insertions, 14 deletions
diff --git a/src/lib/libssl/s23_clnt.c b/src/lib/libssl/s23_clnt.c index c4d8bf2eb3..47673e740a 100644 --- a/src/lib/libssl/s23_clnt.c +++ b/src/lib/libssl/s23_clnt.c | |||
@@ -129,6 +129,10 @@ static const SSL_METHOD *ssl23_get_client_method(int ver) | |||
129 | return(SSLv3_client_method()); | 129 | return(SSLv3_client_method()); |
130 | else if (ver == TLS1_VERSION) | 130 | else if (ver == TLS1_VERSION) |
131 | return(TLSv1_client_method()); | 131 | return(TLSv1_client_method()); |
132 | else if (ver == TLS1_1_VERSION) | ||
133 | return(TLSv1_1_client_method()); | ||
134 | else if (ver == TLS1_2_VERSION) | ||
135 | return(TLSv1_2_client_method()); | ||
132 | else | 136 | else |
133 | return(NULL); | 137 | return(NULL); |
134 | } | 138 | } |
@@ -278,24 +282,51 @@ static int ssl23_client_hello(SSL *s) | |||
278 | SSL_COMP *comp; | 282 | SSL_COMP *comp; |
279 | #endif | 283 | #endif |
280 | int ret; | 284 | int ret; |
285 | unsigned long mask, options = s->options; | ||
281 | 286 | ||
282 | ssl2_compat = (s->options & SSL_OP_NO_SSLv2) ? 0 : 1; | 287 | ssl2_compat = (options & SSL_OP_NO_SSLv2) ? 0 : 1; |
283 | 288 | ||
284 | if (ssl2_compat && ssl23_no_ssl2_ciphers(s)) | 289 | if (ssl2_compat && ssl23_no_ssl2_ciphers(s)) |
285 | ssl2_compat = 0; | 290 | ssl2_compat = 0; |
286 | 291 | ||
287 | if (!(s->options & SSL_OP_NO_TLSv1)) | 292 | /* |
288 | { | 293 | * SSL_OP_NO_X disables all protocols above X *if* there are |
294 | * some protocols below X enabled. This is required in order | ||
295 | * to maintain "version capability" vector contiguous. So | ||
296 | * that if application wants to disable TLS1.0 in favour of | ||
297 | * TLS1>=1, it would be insufficient to pass SSL_NO_TLSv1, the | ||
298 | * answer is SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2. | ||
299 | */ | ||
300 | mask = SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1 | ||
301 | #if !defined(OPENSSL_NO_SSL3) | ||
302 | |SSL_OP_NO_SSLv3 | ||
303 | #endif | ||
304 | #if !defined(OPENSSL_NO_SSL2) | ||
305 | |(ssl2_compat?SSL_OP_NO_SSLv2:0) | ||
306 | #endif | ||
307 | ; | ||
308 | #if !defined(OPENSSL_NO_TLS1_2_CLIENT) | ||
309 | version = TLS1_2_VERSION; | ||
310 | |||
311 | if ((options & SSL_OP_NO_TLSv1_2) && (options & mask) != mask) | ||
312 | version = TLS1_1_VERSION; | ||
313 | #else | ||
314 | version = TLS1_1_VERSION; | ||
315 | #endif | ||
316 | mask &= ~SSL_OP_NO_TLSv1_1; | ||
317 | if ((options & SSL_OP_NO_TLSv1_1) && (options & mask) != mask) | ||
289 | version = TLS1_VERSION; | 318 | version = TLS1_VERSION; |
290 | } | 319 | mask &= ~SSL_OP_NO_TLSv1; |
291 | else if (!(s->options & SSL_OP_NO_SSLv3)) | 320 | #if !defined(OPENSSL_NO_SSL3) |
292 | { | 321 | if ((options & SSL_OP_NO_TLSv1) && (options & mask) != mask) |
293 | version = SSL3_VERSION; | 322 | version = SSL3_VERSION; |
294 | } | 323 | mask &= ~SSL_OP_NO_SSLv3; |
295 | else if (!(s->options & SSL_OP_NO_SSLv2)) | 324 | #endif |
296 | { | 325 | #if !defined(OPENSSL_NO_SSL2) |
326 | if ((options & SSL_OP_NO_SSLv3) && (options & mask) != mask) | ||
297 | version = SSL2_VERSION; | 327 | version = SSL2_VERSION; |
298 | } | 328 | #endif |
329 | |||
299 | #ifndef OPENSSL_NO_TLSEXT | 330 | #ifndef OPENSSL_NO_TLSEXT |
300 | if (version != SSL2_VERSION) | 331 | if (version != SSL2_VERSION) |
301 | { | 332 | { |
@@ -329,11 +360,29 @@ static int ssl23_client_hello(SSL *s) | |||
329 | if (RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-4) <= 0) | 360 | if (RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-4) <= 0) |
330 | return -1; | 361 | return -1; |
331 | 362 | ||
332 | if (version == TLS1_VERSION) | 363 | if (version == TLS1_2_VERSION) |
364 | { | ||
365 | version_major = TLS1_2_VERSION_MAJOR; | ||
366 | version_minor = TLS1_2_VERSION_MINOR; | ||
367 | } | ||
368 | else if (version == TLS1_1_VERSION) | ||
369 | { | ||
370 | version_major = TLS1_1_VERSION_MAJOR; | ||
371 | version_minor = TLS1_1_VERSION_MINOR; | ||
372 | } | ||
373 | else if (version == TLS1_VERSION) | ||
333 | { | 374 | { |
334 | version_major = TLS1_VERSION_MAJOR; | 375 | version_major = TLS1_VERSION_MAJOR; |
335 | version_minor = TLS1_VERSION_MINOR; | 376 | version_minor = TLS1_VERSION_MINOR; |
336 | } | 377 | } |
378 | #ifdef OPENSSL_FIPS | ||
379 | else if(FIPS_mode()) | ||
380 | { | ||
381 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, | ||
382 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | ||
383 | return -1; | ||
384 | } | ||
385 | #endif | ||
337 | else if (version == SSL3_VERSION) | 386 | else if (version == SSL3_VERSION) |
338 | { | 387 | { |
339 | version_major = SSL3_VERSION_MAJOR; | 388 | version_major = SSL3_VERSION_MAJOR; |
@@ -437,6 +486,15 @@ static int ssl23_client_hello(SSL *s) | |||
437 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); | 486 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); |
438 | return -1; | 487 | return -1; |
439 | } | 488 | } |
489 | #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH | ||
490 | /* Some servers hang if client hello > 256 bytes | ||
491 | * as hack workaround chop number of supported ciphers | ||
492 | * to keep it well below this if we use TLS v1.2 | ||
493 | */ | ||
494 | if (TLS1_get_version(s) >= TLS1_2_VERSION | ||
495 | && i > OPENSSL_MAX_TLS1_2_CIPHER_LENGTH) | ||
496 | i = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1; | ||
497 | #endif | ||
440 | s2n(i,p); | 498 | s2n(i,p); |
441 | p+=i; | 499 | p+=i; |
442 | 500 | ||
@@ -491,8 +549,13 @@ static int ssl23_client_hello(SSL *s) | |||
491 | d=buf; | 549 | d=buf; |
492 | *(d++) = SSL3_RT_HANDSHAKE; | 550 | *(d++) = SSL3_RT_HANDSHAKE; |
493 | *(d++) = version_major; | 551 | *(d++) = version_major; |
494 | *(d++) = version_minor; /* arguably we should send the *lowest* suported version here | 552 | /* Some servers hang if we use long client hellos |
495 | * (indicating, e.g., TLS 1.0 in "SSL 3.0 format") */ | 553 | * and a record number > TLS 1.0. |
554 | */ | ||
555 | if (TLS1_get_client_version(s) > TLS1_VERSION) | ||
556 | *(d++) = 1; | ||
557 | else | ||
558 | *(d++) = version_minor; | ||
496 | s2n((int)l,d); | 559 | s2n((int)l,d); |
497 | 560 | ||
498 | /* number of bytes to write */ | 561 | /* number of bytes to write */ |
@@ -608,7 +671,7 @@ static int ssl23_get_server_hello(SSL *s) | |||
608 | #endif | 671 | #endif |
609 | } | 672 | } |
610 | else if (p[1] == SSL3_VERSION_MAJOR && | 673 | else if (p[1] == SSL3_VERSION_MAJOR && |
611 | (p[2] == SSL3_VERSION_MINOR || p[2] == TLS1_VERSION_MINOR) && | 674 | p[2] <= TLS1_2_VERSION_MINOR && |
612 | ((p[0] == SSL3_RT_HANDSHAKE && p[5] == SSL3_MT_SERVER_HELLO) || | 675 | ((p[0] == SSL3_RT_HANDSHAKE && p[5] == SSL3_MT_SERVER_HELLO) || |
613 | (p[0] == SSL3_RT_ALERT && p[3] == 0 && p[4] == 2))) | 676 | (p[0] == SSL3_RT_ALERT && p[3] == 0 && p[4] == 2))) |
614 | { | 677 | { |
@@ -617,6 +680,14 @@ static int ssl23_get_server_hello(SSL *s) | |||
617 | if ((p[2] == SSL3_VERSION_MINOR) && | 680 | if ((p[2] == SSL3_VERSION_MINOR) && |
618 | !(s->options & SSL_OP_NO_SSLv3)) | 681 | !(s->options & SSL_OP_NO_SSLv3)) |
619 | { | 682 | { |
683 | #ifdef OPENSSL_FIPS | ||
684 | if(FIPS_mode()) | ||
685 | { | ||
686 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, | ||
687 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | ||
688 | goto err; | ||
689 | } | ||
690 | #endif | ||
620 | s->version=SSL3_VERSION; | 691 | s->version=SSL3_VERSION; |
621 | s->method=SSLv3_client_method(); | 692 | s->method=SSLv3_client_method(); |
622 | } | 693 | } |
@@ -626,6 +697,18 @@ static int ssl23_get_server_hello(SSL *s) | |||
626 | s->version=TLS1_VERSION; | 697 | s->version=TLS1_VERSION; |
627 | s->method=TLSv1_client_method(); | 698 | s->method=TLSv1_client_method(); |
628 | } | 699 | } |
700 | else if ((p[2] == TLS1_1_VERSION_MINOR) && | ||
701 | !(s->options & SSL_OP_NO_TLSv1_1)) | ||
702 | { | ||
703 | s->version=TLS1_1_VERSION; | ||
704 | s->method=TLSv1_1_client_method(); | ||
705 | } | ||
706 | else if ((p[2] == TLS1_2_VERSION_MINOR) && | ||
707 | !(s->options & SSL_OP_NO_TLSv1_2)) | ||
708 | { | ||
709 | s->version=TLS1_2_VERSION; | ||
710 | s->method=TLSv1_2_client_method(); | ||
711 | } | ||
629 | else | 712 | else |
630 | { | 713 | { |
631 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); | 714 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); |