diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/s3_clnt.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c index 5b9af06aa5..1d1a0c77f0 100644 --- a/src/lib/libssl/s3_clnt.c +++ b/src/lib/libssl/s3_clnt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s3_clnt.c,v 1.124 2015/09/01 13:38:27 jsing Exp $ */ | 1 | /* $OpenBSD: s3_clnt.c,v 1.125 2015/09/02 17:59:15 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 | * |
| @@ -584,7 +584,6 @@ end: | |||
| 584 | return (ret); | 584 | return (ret); |
| 585 | } | 585 | } |
| 586 | 586 | ||
| 587 | |||
| 588 | int | 587 | int |
| 589 | ssl3_client_hello(SSL *s) | 588 | ssl3_client_hello(SSL *s) |
| 590 | { | 589 | { |
| @@ -603,7 +602,13 @@ ssl3_client_hello(SSL *s) | |||
| 603 | } | 602 | } |
| 604 | /* else use the pre-loaded session */ | 603 | /* else use the pre-loaded session */ |
| 605 | 604 | ||
| 606 | arc4random_buf(s->s3->client_random, SSL3_RANDOM_SIZE); | 605 | /* |
| 606 | * If a DTLS ClientHello message is being resent after a | ||
| 607 | * HelloVerifyRequest, we must retain the original client | ||
| 608 | * random value. | ||
| 609 | */ | ||
| 610 | if (!SSL_IS_DTLS(s) || s->d1->send_cookie == 0) | ||
| 611 | arc4random_buf(s->s3->client_random, SSL3_RANDOM_SIZE); | ||
| 607 | 612 | ||
| 608 | d = p = ssl3_handshake_msg_start(s, SSL3_MT_CLIENT_HELLO); | 613 | d = p = ssl3_handshake_msg_start(s, SSL3_MT_CLIENT_HELLO); |
| 609 | 614 | ||
| @@ -660,6 +665,18 @@ ssl3_client_hello(SSL *s) | |||
| 660 | p += i; | 665 | p += i; |
| 661 | } | 666 | } |
| 662 | 667 | ||
| 668 | /* DTLS Cookie. */ | ||
| 669 | if (SSL_IS_DTLS(s)) { | ||
| 670 | if (s->d1->cookie_len > sizeof(s->d1->cookie)) { | ||
| 671 | SSLerr(SSL_F_DTLS1_CLIENT_HELLO, | ||
| 672 | ERR_R_INTERNAL_ERROR); | ||
| 673 | goto err; | ||
| 674 | } | ||
| 675 | *(p++) = s->d1->cookie_len; | ||
| 676 | memcpy(p, s->d1->cookie, s->d1->cookie_len); | ||
| 677 | p += s->d1->cookie_len; | ||
| 678 | } | ||
| 679 | |||
| 663 | /* Ciphers supported */ | 680 | /* Ciphers supported */ |
| 664 | i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &p[2]); | 681 | i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &p[2]); |
| 665 | if (i == 0) { | 682 | if (i == 0) { |
| @@ -683,9 +700,9 @@ ssl3_client_hello(SSL *s) | |||
| 683 | goto err; | 700 | goto err; |
| 684 | } | 701 | } |
| 685 | 702 | ||
| 686 | s->state = SSL3_ST_CW_CLNT_HELLO_B; | ||
| 687 | |||
| 688 | ssl3_handshake_msg_finish(s, p - d); | 703 | ssl3_handshake_msg_finish(s, p - d); |
| 704 | |||
| 705 | s->state = SSL3_ST_CW_CLNT_HELLO_B; | ||
| 689 | } | 706 | } |
| 690 | 707 | ||
| 691 | /* SSL3_ST_CW_CLNT_HELLO_B */ | 708 | /* SSL3_ST_CW_CLNT_HELLO_B */ |
