diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/s3_clnt.c | 1526 | ||||
| -rw-r--r-- | src/lib/libssl/s3_lib.c | 280 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/s3_clnt.c | 1526 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/s3_lib.c | 280 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/ssl_lib.c | 707 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_lib.c | 707 |
6 files changed, 2974 insertions, 2052 deletions
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c index 0cd40f3a2d..b63f0bf0c9 100644 --- a/src/lib/libssl/s3_clnt.c +++ b/src/lib/libssl/s3_clnt.c | |||
| @@ -181,10 +181,10 @@ IMPLEMENT_ssl3_meth_func(SSLv3_client_method, | |||
| 181 | int | 181 | int |
| 182 | ssl3_connect(SSL *s) | 182 | ssl3_connect(SSL *s) |
| 183 | { | 183 | { |
| 184 | BUF_MEM *buf = NULL; | 184 | BUF_MEM *buf = NULL; |
| 185 | void (*cb)(const SSL *ssl, int type, int val) = NULL; | 185 | void (*cb)(const SSL *ssl, int type, int val) = NULL; |
| 186 | int ret = -1; | 186 | int ret = -1; |
| 187 | int new_state, state, skip = 0; | 187 | int new_state, state, skip = 0; |
| 188 | 188 | ||
| 189 | ERR_clear_error(); | 189 | ERR_clear_error(); |
| 190 | errno = 0; | 190 | errno = 0; |
| @@ -217,7 +217,8 @@ ssl3_connect(SSL *s) | |||
| 217 | cb(s, SSL_CB_HANDSHAKE_START, 1); | 217 | cb(s, SSL_CB_HANDSHAKE_START, 1); |
| 218 | 218 | ||
| 219 | if ((s->version & 0xff00 ) != 0x0300) { | 219 | if ((s->version & 0xff00 ) != 0x0300) { |
| 220 | SSLerr(SSL_F_SSL3_CONNECT, ERR_R_INTERNAL_ERROR); | 220 | SSLerr(SSL_F_SSL3_CONNECT, |
| 221 | ERR_R_INTERNAL_ERROR); | ||
| 221 | ret = -1; | 222 | ret = -1; |
| 222 | goto end; | 223 | goto end; |
| 223 | } | 224 | } |
| @@ -230,7 +231,8 @@ ssl3_connect(SSL *s) | |||
| 230 | ret = -1; | 231 | ret = -1; |
| 231 | goto end; | 232 | goto end; |
| 232 | } | 233 | } |
| 233 | if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) { | 234 | if (!BUF_MEM_grow(buf, |
| 235 | SSL3_RT_MAX_PLAIN_LENGTH)) { | ||
| 234 | ret = -1; | 236 | ret = -1; |
| 235 | goto end; | 237 | goto end; |
| 236 | } | 238 | } |
| @@ -309,10 +311,11 @@ ssl3_connect(SSL *s) | |||
| 309 | break; | 311 | break; |
| 310 | } | 312 | } |
| 311 | #endif | 313 | #endif |
| 312 | /* Check if it is anon DH/ECDH */ | 314 | /* Check if it is anon DH/ECDH or PSK */ |
| 313 | /* or PSK */ | 315 | if (!(s->s3->tmp.new_cipher->algorithm_auth & |
| 314 | if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) && | 316 | SSL_aNULL) && |
| 315 | !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) { | 317 | !(s->s3->tmp.new_cipher->algorithm_mkey & |
| 318 | SSL_kPSK)) { | ||
| 316 | ret = ssl3_get_server_certificate(s); | 319 | ret = ssl3_get_server_certificate(s); |
| 317 | if (ret <= 0) | 320 | if (ret <= 0) |
| 318 | goto end; | 321 | goto end; |
| @@ -342,8 +345,10 @@ ssl3_connect(SSL *s) | |||
| 342 | s->state = SSL3_ST_CR_CERT_REQ_A; | 345 | s->state = SSL3_ST_CR_CERT_REQ_A; |
| 343 | s->init_num = 0; | 346 | s->init_num = 0; |
| 344 | 347 | ||
| 345 | /* at this point we check that we have the | 348 | /* |
| 346 | * required stuff from the server */ | 349 | * At this point we check that we have the |
| 350 | * required stuff from the server. | ||
| 351 | */ | ||
| 347 | if (!ssl3_check_cert_and_algorithm(s)) { | 352 | if (!ssl3_check_cert_and_algorithm(s)) { |
| 348 | ret = -1; | 353 | ret = -1; |
| 349 | goto end; | 354 | goto end; |
| @@ -367,8 +372,10 @@ ssl3_connect(SSL *s) | |||
| 367 | #ifndef OPENSSL_NO_SRP | 372 | #ifndef OPENSSL_NO_SRP |
| 368 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) { | 373 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) { |
| 369 | if ((ret = SRP_Calc_A_param(s)) <= 0) { | 374 | if ((ret = SRP_Calc_A_param(s)) <= 0) { |
| 370 | SSLerr(SSL_F_SSL3_CONNECT, SSL_R_SRP_A_CALC); | 375 | SSLerr(SSL_F_SSL3_CONNECT, |
| 371 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); | 376 | SSL_R_SRP_A_CALC); |
| 377 | ssl3_send_alert(s, SSL3_AL_FATAL, | ||
| 378 | SSL_AD_INTERNAL_ERROR); | ||
| 372 | goto end; | 379 | goto end; |
| 373 | } | 380 | } |
| 374 | } | 381 | } |
| @@ -397,11 +404,16 @@ ssl3_connect(SSL *s) | |||
| 397 | ret = ssl3_send_client_key_exchange(s); | 404 | ret = ssl3_send_client_key_exchange(s); |
| 398 | if (ret <= 0) | 405 | if (ret <= 0) |
| 399 | goto end; | 406 | goto end; |
| 400 | /* EAY EAY EAY need to check for DH fix cert | 407 | /* |
| 401 | * sent back */ | 408 | * EAY EAY EAY need to check for DH fix cert |
| 402 | /* For TLS, cert_req is set to 2, so a cert chain | 409 | * sent back |
| 403 | * of nothing is sent, but no verify packet is sent */ | 410 | */ |
| 404 | /* XXX: For now, we do not support client | 411 | /* |
| 412 | * For TLS, cert_req is set to 2, so a cert chain | ||
| 413 | * of nothing is sent, but no verify packet is sent | ||
| 414 | */ | ||
| 415 | /* | ||
| 416 | * XXX: For now, we do not support client | ||
| 405 | * authentication in ECDH cipher suites with | 417 | * authentication in ECDH cipher suites with |
| 406 | * ECDH (rather than ECDSA) certificates. | 418 | * ECDH (rather than ECDSA) certificates. |
| 407 | * We need to skip the certificate verify | 419 | * We need to skip the certificate verify |
| @@ -457,7 +469,7 @@ ssl3_connect(SSL *s) | |||
| 457 | s->session->compress_meth = 0; | 469 | s->session->compress_meth = 0; |
| 458 | else | 470 | else |
| 459 | s->session->compress_meth = | 471 | s->session->compress_meth = |
| 460 | s->s3->tmp.new_compression->id; | 472 | s->s3->tmp.new_compression->id; |
| 461 | #endif | 473 | #endif |
| 462 | if (!s->method->ssl3_enc->setup_key_block(s)) { | 474 | if (!s->method->ssl3_enc->setup_key_block(s)) { |
| 463 | ret = -1; | 475 | ret = -1; |
| @@ -465,7 +477,7 @@ ssl3_connect(SSL *s) | |||
| 465 | } | 477 | } |
| 466 | 478 | ||
| 467 | if (!s->method->ssl3_enc->change_cipher_state(s, | 479 | if (!s->method->ssl3_enc->change_cipher_state(s, |
| 468 | SSL3_CHANGE_CIPHER_CLIENT_WRITE)) { | 480 | SSL3_CHANGE_CIPHER_CLIENT_WRITE)) { |
| 469 | ret = -1; | 481 | ret = -1; |
| 470 | goto end; | 482 | goto end; |
| 471 | } | 483 | } |
| @@ -496,7 +508,8 @@ ssl3_connect(SSL *s) | |||
| 496 | s->s3->flags &= ~SSL3_FLAGS_POP_BUFFER; | 508 | s->s3->flags &= ~SSL3_FLAGS_POP_BUFFER; |
| 497 | if (s->hit) { | 509 | if (s->hit) { |
| 498 | s->s3->tmp.next_state = SSL_ST_OK; | 510 | s->s3->tmp.next_state = SSL_ST_OK; |
| 499 | if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED) { | 511 | if (s->s3->flags & |
| 512 | SSL3_FLAGS_DELAY_CLIENT_FINISHED) { | ||
| 500 | s->state = SSL_ST_OK; | 513 | s->state = SSL_ST_OK; |
| 501 | s->s3->flags|=SSL3_FLAGS_POP_BUFFER; | 514 | s->s3->flags|=SSL3_FLAGS_POP_BUFFER; |
| 502 | s->s3->delay_buf_pop_ret = 0; | 515 | s->s3->delay_buf_pop_ret = 0; |
| @@ -505,7 +518,8 @@ ssl3_connect(SSL *s) | |||
| 505 | #ifndef OPENSSL_NO_TLSEXT | 518 | #ifndef OPENSSL_NO_TLSEXT |
| 506 | /* Allow NewSessionTicket if ticket expected */ | 519 | /* Allow NewSessionTicket if ticket expected */ |
| 507 | if (s->tlsext_ticket_expected) | 520 | if (s->tlsext_ticket_expected) |
| 508 | s->s3->tmp.next_state = SSL3_ST_CR_SESSION_TICKET_A; | 521 | s->s3->tmp.next_state = |
| 522 | SSL3_ST_CR_SESSION_TICKET_A; | ||
| 509 | else | 523 | else |
| 510 | #endif | 524 | #endif |
| 511 | 525 | ||
| @@ -568,8 +582,10 @@ ssl3_connect(SSL *s) | |||
| 568 | s->init_buf = NULL; | 582 | s->init_buf = NULL; |
| 569 | } | 583 | } |
| 570 | 584 | ||
| 571 | /* If we are not 'joining' the last two packets, | 585 | /* |
| 572 | * remove the buffering now */ | 586 | * If we are not 'joining' the last two packets, |
| 587 | * remove the buffering now | ||
| 588 | */ | ||
| 573 | if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER)) | 589 | if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER)) |
| 574 | ssl_free_wbio_buffer(s); | 590 | ssl_free_wbio_buffer(s); |
| 575 | /* else do it later in ssl3_write */ | 591 | /* else do it later in ssl3_write */ |
| @@ -594,7 +610,8 @@ ssl3_connect(SSL *s) | |||
| 594 | /* break; */ | 610 | /* break; */ |
| 595 | 611 | ||
| 596 | default: | 612 | default: |
| 597 | SSLerr(SSL_F_SSL3_CONNECT, SSL_R_UNKNOWN_STATE); | 613 | SSLerr(SSL_F_SSL3_CONNECT, |
| 614 | SSL_R_UNKNOWN_STATE); | ||
| 598 | ret = -1; | 615 | ret = -1; |
| 599 | goto end; | 616 | goto end; |
| 600 | /* break; */ | 617 | /* break; */ |
| @@ -616,7 +633,7 @@ ssl3_connect(SSL *s) | |||
| 616 | } | 633 | } |
| 617 | skip = 0; | 634 | skip = 0; |
| 618 | } | 635 | } |
| 619 | end: | 636 | end: |
| 620 | s->in_handshake--; | 637 | s->in_handshake--; |
| 621 | if (buf != NULL) | 638 | if (buf != NULL) |
| 622 | BUF_MEM_free(buf); | 639 | BUF_MEM_free(buf); |
| @@ -629,13 +646,13 @@ end: | |||
| 629 | int | 646 | int |
| 630 | ssl3_client_hello(SSL *s) | 647 | ssl3_client_hello(SSL *s) |
| 631 | { | 648 | { |
| 632 | unsigned char *buf; | 649 | unsigned char *buf; |
| 633 | unsigned char *p, *d; | 650 | unsigned char *p, *d; |
| 634 | int i; | 651 | int i; |
| 635 | unsigned long l; | 652 | unsigned long l; |
| 636 | #ifndef OPENSSL_NO_COMP | 653 | #ifndef OPENSSL_NO_COMP |
| 637 | int j; | 654 | int j; |
| 638 | SSL_COMP *comp; | 655 | SSL_COMP *comp; |
| 639 | #endif | 656 | #endif |
| 640 | 657 | ||
| 641 | buf = (unsigned char *)s->init_buf->data; | 658 | buf = (unsigned char *)s->init_buf->data; |
| @@ -660,9 +677,10 @@ ssl3_client_hello(SSL *s) | |||
| 660 | goto err; | 677 | goto err; |
| 661 | 678 | ||
| 662 | /* Do the message type and length last */ | 679 | /* Do the message type and length last */ |
| 663 | d = p= &(buf[4]); | 680 | d = p = &(buf[4]); |
| 664 | 681 | ||
| 665 | /* version indicates the negotiated version: for example from | 682 | /* |
| 683 | * Version indicates the negotiated version: for example from | ||
| 666 | * an SSLv2/v3 compatible client hello). The client_version | 684 | * an SSLv2/v3 compatible client hello). The client_version |
| 667 | * field is the maximum version we permit and it is also | 685 | * field is the maximum version we permit and it is also |
| 668 | * used in RSA encrypted premaster secrets. Some servers can | 686 | * used in RSA encrypted premaster secrets. Some servers can |
| @@ -697,7 +715,7 @@ ssl3_client_hello(SSL *s) | |||
| 697 | s->client_version = s->version; | 715 | s->client_version = s->version; |
| 698 | #else | 716 | #else |
| 699 | *(p++) = s->client_version >> 8; | 717 | *(p++) = s->client_version >> 8; |
| 700 | *(p++) = s->client_version&0xff; | 718 | *(p++) = s->client_version & 0xff; |
| 701 | #endif | 719 | #endif |
| 702 | 720 | ||
| 703 | /* Random stuff */ | 721 | /* Random stuff */ |
| @@ -712,7 +730,8 @@ ssl3_client_hello(SSL *s) | |||
| 712 | *(p++) = i; | 730 | *(p++) = i; |
| 713 | if (i != 0) { | 731 | if (i != 0) { |
| 714 | if (i > (int)sizeof(s->session->session_id)) { | 732 | if (i > (int)sizeof(s->session->session_id)) { |
| 715 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); | 733 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, |
| 734 | ERR_R_INTERNAL_ERROR); | ||
| 716 | goto err; | 735 | goto err; |
| 717 | } | 736 | } |
| 718 | memcpy(p, s->session->session_id, i); | 737 | memcpy(p, s->session->session_id, i); |
| @@ -722,11 +741,13 @@ ssl3_client_hello(SSL *s) | |||
| 722 | /* Ciphers supported */ | 741 | /* Ciphers supported */ |
| 723 | i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &(p[2]), 0); | 742 | i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &(p[2]), 0); |
| 724 | if (i == 0) { | 743 | if (i == 0) { |
| 725 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, SSL_R_NO_CIPHERS_AVAILABLE); | 744 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, |
| 745 | SSL_R_NO_CIPHERS_AVAILABLE); | ||
| 726 | goto err; | 746 | goto err; |
| 727 | } | 747 | } |
| 728 | #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH | 748 | #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH |
| 729 | /* Some servers hang if client hello > 256 bytes | 749 | /* |
| 750 | * Some servers hang if client hello > 256 bytes | ||
| 730 | * as hack workaround chop number of supported ciphers | 751 | * as hack workaround chop number of supported ciphers |
| 731 | * to keep it well below this if we use TLS v1.2 | 752 | * to keep it well below this if we use TLS v1.2 |
| 732 | */ | 753 | */ |
| @@ -758,11 +779,14 @@ ssl3_client_hello(SSL *s) | |||
| 758 | #ifndef OPENSSL_NO_TLSEXT | 779 | #ifndef OPENSSL_NO_TLSEXT |
| 759 | /* TLS extensions*/ | 780 | /* TLS extensions*/ |
| 760 | if (ssl_prepare_clienthello_tlsext(s) <= 0) { | 781 | if (ssl_prepare_clienthello_tlsext(s) <= 0) { |
| 761 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, SSL_R_CLIENTHELLO_TLSEXT); | 782 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, |
| 783 | SSL_R_CLIENTHELLO_TLSEXT); | ||
| 762 | goto err; | 784 | goto err; |
| 763 | } | 785 | } |
| 764 | if ((p = ssl_add_clienthello_tlsext(s, p, buf + SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) { | 786 | if ((p = ssl_add_clienthello_tlsext(s, p, |
| 765 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); | 787 | buf + SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) { |
| 788 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, | ||
| 789 | ERR_R_INTERNAL_ERROR); | ||
| 766 | goto err; | 790 | goto err; |
| 767 | } | 791 | } |
| 768 | #endif | 792 | #endif |
| @@ -780,21 +804,21 @@ ssl3_client_hello(SSL *s) | |||
| 780 | 804 | ||
| 781 | /* SSL3_ST_CW_CLNT_HELLO_B */ | 805 | /* SSL3_ST_CW_CLNT_HELLO_B */ |
| 782 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); | 806 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); |
| 783 | err: | 807 | err: |
| 784 | return (-1); | 808 | return (-1); |
| 785 | } | 809 | } |
| 786 | 810 | ||
| 787 | int | 811 | int |
| 788 | ssl3_get_server_hello(SSL *s) | 812 | ssl3_get_server_hello(SSL *s) |
| 789 | { | 813 | { |
| 790 | STACK_OF(SSL_CIPHER) *sk; | 814 | STACK_OF(SSL_CIPHER) *sk; |
| 791 | const SSL_CIPHER *c; | 815 | const SSL_CIPHER *c; |
| 792 | unsigned char *p, *d; | 816 | unsigned char *p, *d; |
| 793 | int i, al, ok; | 817 | int i, al, ok; |
| 794 | unsigned int j; | 818 | unsigned int j; |
| 795 | long n; | 819 | long n; |
| 796 | #ifndef OPENSSL_NO_COMP | 820 | #ifndef OPENSSL_NO_COMP |
| 797 | SSL_COMP *comp; | 821 | SSL_COMP *comp; |
| 798 | #endif | 822 | #endif |
| 799 | 823 | ||
| 800 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SRVR_HELLO_A, | 824 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SRVR_HELLO_A, |
| @@ -803,7 +827,8 @@ ssl3_get_server_hello(SSL *s) | |||
| 803 | if (!ok) | 827 | if (!ok) |
| 804 | return ((int)n); | 828 | return ((int)n); |
| 805 | 829 | ||
| 806 | if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER) { | 830 | if (SSL_version(s) == DTLS1_VERSION || |
| 831 | SSL_version(s) == DTLS1_BAD_VER) { | ||
| 807 | if (s->s3->tmp.message_type == DTLS1_MT_HELLO_VERIFY_REQUEST) { | 832 | if (s->s3->tmp.message_type == DTLS1_MT_HELLO_VERIFY_REQUEST) { |
| 808 | if (s->d1->send_cookie == 0) { | 833 | if (s->d1->send_cookie == 0) { |
| 809 | s->s3->tmp.reuse_message = 1; | 834 | s->s3->tmp.reuse_message = 1; |
| @@ -812,7 +837,8 @@ ssl3_get_server_hello(SSL *s) | |||
| 812 | else /* already sent a cookie */ | 837 | else /* already sent a cookie */ |
| 813 | { | 838 | { |
| 814 | al = SSL_AD_UNEXPECTED_MESSAGE; | 839 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 815 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_BAD_MESSAGE_TYPE); | 840 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 841 | SSL_R_BAD_MESSAGE_TYPE); | ||
| 816 | goto f_err; | 842 | goto f_err; |
| 817 | } | 843 | } |
| 818 | } | 844 | } |
| @@ -820,14 +846,16 @@ ssl3_get_server_hello(SSL *s) | |||
| 820 | 846 | ||
| 821 | if (s->s3->tmp.message_type != SSL3_MT_SERVER_HELLO) { | 847 | if (s->s3->tmp.message_type != SSL3_MT_SERVER_HELLO) { |
| 822 | al = SSL_AD_UNEXPECTED_MESSAGE; | 848 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 823 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_BAD_MESSAGE_TYPE); | 849 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 850 | SSL_R_BAD_MESSAGE_TYPE); | ||
| 824 | goto f_err; | 851 | goto f_err; |
| 825 | } | 852 | } |
| 826 | 853 | ||
| 827 | d = p=(unsigned char *)s->init_msg; | 854 | d = p=(unsigned char *)s->init_msg; |
| 828 | 855 | ||
| 829 | if ((p[0] != (s->version >> 8)) || (p[1] != (s->version & 0xff))) { | 856 | if ((p[0] != (s->version >> 8)) || (p[1] != (s->version & 0xff))) { |
| 830 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_SSL_VERSION); | 857 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 858 | SSL_R_WRONG_SSL_VERSION); | ||
| 831 | s->version = (s->version&0xff00)|p[1]; | 859 | s->version = (s->version&0xff00)|p[1]; |
| 832 | al = SSL_AD_PROTOCOL_VERSION; | 860 | al = SSL_AD_PROTOCOL_VERSION; |
| 833 | goto f_err; | 861 | goto f_err; |
| @@ -842,14 +870,19 @@ ssl3_get_server_hello(SSL *s) | |||
| 842 | /* get the session-id */ | 870 | /* get the session-id */ |
| 843 | j= *(p++); | 871 | j= *(p++); |
| 844 | 872 | ||
| 845 | if ((j > sizeof s->session->session_id) || (j > SSL3_SESSION_ID_SIZE)) { | 873 | if ((j > sizeof s->session->session_id) || |
| 874 | (j > SSL3_SESSION_ID_SIZE)) { | ||
| 846 | al = SSL_AD_ILLEGAL_PARAMETER; | 875 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 847 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_SSL3_SESSION_ID_TOO_LONG); | 876 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 877 | SSL_R_SSL3_SESSION_ID_TOO_LONG); | ||
| 848 | goto f_err; | 878 | goto f_err; |
| 849 | } | 879 | } |
| 850 | 880 | ||
| 851 | #ifndef OPENSSL_NO_TLSEXT | 881 | #ifndef OPENSSL_NO_TLSEXT |
| 852 | /* check if we want to resume the session based on external pre-shared secret */ | 882 | /* |
| 883 | * Check if we want to resume the session based on external | ||
| 884 | * pre-shared secret | ||
| 885 | */ | ||
| 853 | if (s->version >= TLS1_VERSION && s->tls_session_secret_cb) { | 886 | if (s->version >= TLS1_VERSION && s->tls_session_secret_cb) { |
| 854 | SSL_CIPHER *pref_cipher = NULL; | 887 | SSL_CIPHER *pref_cipher = NULL; |
| 855 | s->session->master_key_length = sizeof(s->session->master_key); | 888 | s->session->master_key_length = sizeof(s->session->master_key); |
| @@ -865,16 +898,17 @@ ssl3_get_server_hello(SSL *s) | |||
| 865 | if (j != 0 && j == s->session->session_id_length && | 898 | if (j != 0 && j == s->session->session_id_length && |
| 866 | memcmp(p, s->session->session_id, j) == 0) { | 899 | memcmp(p, s->session->session_id, j) == 0) { |
| 867 | if (s->sid_ctx_length != s->session->sid_ctx_length || | 900 | if (s->sid_ctx_length != s->session->sid_ctx_length || |
| 868 | memcmp(s->session->sid_ctx, s->sid_ctx, s->sid_ctx_length)) { | 901 | memcmp(s->session->sid_ctx, |
| 902 | s->sid_ctx, s->sid_ctx_length)) { | ||
| 869 | /* actually a client application bug */ | 903 | /* actually a client application bug */ |
| 870 | al = SSL_AD_ILLEGAL_PARAMETER; | 904 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 871 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT); | 905 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 906 | SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT); | ||
| 872 | goto f_err; | 907 | goto f_err; |
| 873 | } | 908 | } |
| 874 | s->hit = 1; | 909 | s->hit = 1; |
| 875 | } | 910 | } else { /* a miss or crap from the other end */ |
| 876 | else /* a miss or crap from the other end */ | 911 | |
| 877 | { | ||
| 878 | /* If we were trying for session-id reuse, make a new | 912 | /* If we were trying for session-id reuse, make a new |
| 879 | * SSL_SESSION so we don't stuff up other people */ | 913 | * SSL_SESSION so we don't stuff up other people */ |
| 880 | s->hit = 0; | 914 | s->hit = 0; |
| @@ -892,14 +926,16 @@ ssl3_get_server_hello(SSL *s) | |||
| 892 | if (c == NULL) { | 926 | if (c == NULL) { |
| 893 | /* unknown cipher */ | 927 | /* unknown cipher */ |
| 894 | al = SSL_AD_ILLEGAL_PARAMETER; | 928 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 895 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_UNKNOWN_CIPHER_RETURNED); | 929 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 930 | SSL_R_UNKNOWN_CIPHER_RETURNED); | ||
| 896 | goto f_err; | 931 | goto f_err; |
| 897 | } | 932 | } |
| 898 | /* TLS v1.2 only ciphersuites require v1.2 or later */ | 933 | /* TLS v1.2 only ciphersuites require v1.2 or later */ |
| 899 | if ((c->algorithm_ssl & SSL_TLSV1_2) && | 934 | if ((c->algorithm_ssl & SSL_TLSV1_2) && |
| 900 | (TLS1_get_version(s) < TLS1_2_VERSION)) { | 935 | (TLS1_get_version(s) < TLS1_2_VERSION)) { |
| 901 | al = SSL_AD_ILLEGAL_PARAMETER; | 936 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 902 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_CIPHER_RETURNED); | 937 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 938 | SSL_R_WRONG_CIPHER_RETURNED); | ||
| 903 | goto f_err; | 939 | goto f_err; |
| 904 | } | 940 | } |
| 905 | p += ssl_put_cipher_by_char(s, NULL, NULL); | 941 | p += ssl_put_cipher_by_char(s, NULL, NULL); |
| @@ -909,25 +945,31 @@ ssl3_get_server_hello(SSL *s) | |||
| 909 | if (i < 0) { | 945 | if (i < 0) { |
| 910 | /* we did not say we would use this cipher */ | 946 | /* we did not say we would use this cipher */ |
| 911 | al = SSL_AD_ILLEGAL_PARAMETER; | 947 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 912 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_CIPHER_RETURNED); | 948 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 949 | SSL_R_WRONG_CIPHER_RETURNED); | ||
| 913 | goto f_err; | 950 | goto f_err; |
| 914 | } | 951 | } |
| 915 | 952 | ||
| 916 | /* Depending on the session caching (internal/external), the cipher | 953 | /* |
| 917 | and/or cipher_id values may not be set. Make sure that | 954 | * Depending on the session caching (internal/external), the cipher |
| 918 | cipher_id is set and use it for comparison. */ | 955 | * and/or cipher_id values may not be set. Make sure that |
| 956 | * cipher_id is set and use it for comparison. | ||
| 957 | */ | ||
| 919 | if (s->session->cipher) | 958 | if (s->session->cipher) |
| 920 | s->session->cipher_id = s->session->cipher->id; | 959 | s->session->cipher_id = s->session->cipher->id; |
| 921 | if (s->hit && (s->session->cipher_id != c->id)) { | 960 | if (s->hit && (s->session->cipher_id != c->id)) { |
| 922 | al = SSL_AD_ILLEGAL_PARAMETER; | 961 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 923 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED); | 962 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 963 | SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED); | ||
| 924 | goto f_err; | 964 | goto f_err; |
| 925 | } | 965 | } |
| 926 | s->s3->tmp.new_cipher = c; | 966 | s->s3->tmp.new_cipher = c; |
| 927 | /* Don't digest cached records if TLS v1.2: we may need them for | 967 | /* |
| 968 | * Don't digest cached records if TLS v1.2: we may need them for | ||
| 928 | * client authentication. | 969 | * client authentication. |
| 929 | */ | 970 | */ |
| 930 | if (TLS1_get_version(s) < TLS1_2_VERSION && !ssl3_digest_cached_records(s)) { | 971 | if (TLS1_get_version(s) < TLS1_2_VERSION && |
| 972 | !ssl3_digest_cached_records(s)) { | ||
| 931 | al = SSL_AD_INTERNAL_ERROR; | 973 | al = SSL_AD_INTERNAL_ERROR; |
| 932 | goto f_err; | 974 | goto f_err; |
| 933 | } | 975 | } |
| @@ -936,36 +978,42 @@ ssl3_get_server_hello(SSL *s) | |||
| 936 | #ifdef OPENSSL_NO_COMP | 978 | #ifdef OPENSSL_NO_COMP |
| 937 | if (*(p++) != 0) { | 979 | if (*(p++) != 0) { |
| 938 | al = SSL_AD_ILLEGAL_PARAMETER; | 980 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 939 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | 981 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 982 | SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | ||
| 940 | goto f_err; | 983 | goto f_err; |
| 941 | } | 984 | } |
| 942 | /* If compression is disabled we'd better not try to resume a session | 985 | /* |
| 986 | * If compression is disabled we'd better not try to resume a session | ||
| 943 | * using compression. | 987 | * using compression. |
| 944 | */ | 988 | */ |
| 945 | if (s->session->compress_meth != 0) { | 989 | if (s->session->compress_meth != 0) { |
| 946 | al = SSL_AD_INTERNAL_ERROR; | 990 | al = SSL_AD_INTERNAL_ERROR; |
| 947 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_INCONSISTENT_COMPRESSION); | 991 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 992 | SSL_R_INCONSISTENT_COMPRESSION); | ||
| 948 | goto f_err; | 993 | goto f_err; |
| 949 | } | 994 | } |
| 950 | #else | 995 | #else |
| 951 | j= *(p++); | 996 | j= *(p++); |
| 952 | if (s->hit && j != s->session->compress_meth) { | 997 | if (s->hit && j != s->session->compress_meth) { |
| 953 | al = SSL_AD_ILLEGAL_PARAMETER; | 998 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 954 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED); | 999 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1000 | SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED); | ||
| 955 | goto f_err; | 1001 | goto f_err; |
| 956 | } | 1002 | } |
| 957 | if (j == 0) | 1003 | if (j == 0) |
| 958 | comp = NULL; | 1004 | comp = NULL; |
| 959 | else if (s->options & SSL_OP_NO_COMPRESSION) { | 1005 | else if (s->options & SSL_OP_NO_COMPRESSION) { |
| 960 | al = SSL_AD_ILLEGAL_PARAMETER; | 1006 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 961 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_COMPRESSION_DISABLED); | 1007 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1008 | SSL_R_COMPRESSION_DISABLED); | ||
| 962 | goto f_err; | 1009 | goto f_err; |
| 963 | } else | 1010 | } else |
| 964 | comp = ssl3_comp_find(s->ctx->comp_methods, j); | 1011 | comp = ssl3_comp_find(s->ctx->comp_methods, j); |
| 965 | 1012 | ||
| 966 | if ((j != 0) && (comp == NULL)) { | 1013 | if ((j != 0) && (comp == NULL)) { |
| 967 | al = SSL_AD_ILLEGAL_PARAMETER; | 1014 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 968 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | 1015 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1016 | SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | ||
| 969 | goto f_err; | 1017 | goto f_err; |
| 970 | } else { | 1018 | } else { |
| 971 | s->s3->tmp.new_compression = comp; | 1019 | s->s3->tmp.new_compression = comp; |
| @@ -977,12 +1025,14 @@ ssl3_get_server_hello(SSL *s) | |||
| 977 | if (s->version >= SSL3_VERSION) { | 1025 | if (s->version >= SSL3_VERSION) { |
| 978 | if (!ssl_parse_serverhello_tlsext(s, &p, d, n, &al)) { | 1026 | if (!ssl_parse_serverhello_tlsext(s, &p, d, n, &al)) { |
| 979 | /* 'al' set by ssl_parse_serverhello_tlsext */ | 1027 | /* 'al' set by ssl_parse_serverhello_tlsext */ |
| 980 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_PARSE_TLSEXT); | 1028 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1029 | SSL_R_PARSE_TLSEXT); | ||
| 981 | goto f_err; | 1030 | goto f_err; |
| 982 | 1031 | ||
| 983 | } | 1032 | } |
| 984 | if (ssl_check_serverhello_tlsext(s) <= 0) { | 1033 | if (ssl_check_serverhello_tlsext(s) <= 0) { |
| 985 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_SERVERHELLO_TLSEXT); | 1034 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1035 | SSL_R_SERVERHELLO_TLSEXT); | ||
| 986 | goto err; | 1036 | goto err; |
| 987 | } | 1037 | } |
| 988 | } | 1038 | } |
| @@ -991,29 +1041,32 @@ ssl3_get_server_hello(SSL *s) | |||
| 991 | if (p != (d + n)) { | 1041 | if (p != (d + n)) { |
| 992 | /* wrong packet length */ | 1042 | /* wrong packet length */ |
| 993 | al = SSL_AD_DECODE_ERROR; | 1043 | al = SSL_AD_DECODE_ERROR; |
| 994 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_BAD_PACKET_LENGTH); | 1044 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1045 | SSL_R_BAD_PACKET_LENGTH); | ||
| 995 | goto f_err; | 1046 | goto f_err; |
| 996 | } | 1047 | } |
| 997 | 1048 | ||
| 998 | return (1); | 1049 | return (1); |
| 999 | f_err: | 1050 | f_err: |
| 1000 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1051 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1001 | err: | 1052 | err: |
| 1002 | return (-1); | 1053 | return (-1); |
| 1003 | } | 1054 | } |
| 1004 | 1055 | ||
| 1005 | int | 1056 | int |
| 1006 | ssl3_get_server_certificate(SSL *s) | 1057 | ssl3_get_server_certificate(SSL *s) |
| 1007 | { | 1058 | { |
| 1008 | int al, i, ok, ret = -1; | 1059 | int al, i, ok, ret = -1; |
| 1009 | unsigned long n, nc, llen, l; | 1060 | unsigned long n, nc, llen, l; |
| 1010 | X509 *x = NULL; | 1061 | X509 *x = NULL; |
| 1011 | const unsigned char *q, *p; | 1062 | const unsigned char *q, *p; |
| 1012 | unsigned char *d; | 1063 | unsigned char *d; |
| 1013 | STACK_OF(X509) *sk = NULL; | 1064 | STACK_OF(X509) *sk = NULL; |
| 1014 | SESS_CERT *sc; | 1065 | SESS_CERT *sc; |
| 1015 | EVP_PKEY *pkey = NULL; | 1066 | EVP_PKEY *pkey = NULL; |
| 1016 | int need_cert = 1; /* VRS: 0=> will allow null cert if auth == KRB5 */ | 1067 | |
| 1068 | /* VRS: 0=> will allow null cert if auth == KRB5 */ | ||
| 1069 | int need_cert = 1; | ||
| 1017 | 1070 | ||
| 1018 | n = s->method->ssl_get_message(s, SSL3_ST_CR_CERT_A, | 1071 | n = s->method->ssl_get_message(s, SSL3_ST_CR_CERT_A, |
| 1019 | SSL3_ST_CR_CERT_B, -1, s->max_cert_list, &ok); | 1072 | SSL3_ST_CR_CERT_B, -1, s->max_cert_list, &ok); |
| @@ -1030,27 +1083,31 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1030 | 1083 | ||
| 1031 | if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE) { | 1084 | if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE) { |
| 1032 | al = SSL_AD_UNEXPECTED_MESSAGE; | 1085 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 1033 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_BAD_MESSAGE_TYPE); | 1086 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1087 | SSL_R_BAD_MESSAGE_TYPE); | ||
| 1034 | goto f_err; | 1088 | goto f_err; |
| 1035 | } | 1089 | } |
| 1036 | p = d = (unsigned char *)s->init_msg; | 1090 | p = d = (unsigned char *)s->init_msg; |
| 1037 | 1091 | ||
| 1038 | if ((sk = sk_X509_new_null()) == NULL) { | 1092 | if ((sk = sk_X509_new_null()) == NULL) { |
| 1039 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_MALLOC_FAILURE); | 1093 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1094 | ERR_R_MALLOC_FAILURE); | ||
| 1040 | goto err; | 1095 | goto err; |
| 1041 | } | 1096 | } |
| 1042 | 1097 | ||
| 1043 | n2l3(p, llen); | 1098 | n2l3(p, llen); |
| 1044 | if (llen + 3 != n) { | 1099 | if (llen + 3 != n) { |
| 1045 | al = SSL_AD_DECODE_ERROR; | 1100 | al = SSL_AD_DECODE_ERROR; |
| 1046 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_LENGTH_MISMATCH); | 1101 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1102 | SSL_R_LENGTH_MISMATCH); | ||
| 1047 | goto f_err; | 1103 | goto f_err; |
| 1048 | } | 1104 | } |
| 1049 | for (nc = 0; nc < llen; ) { | 1105 | for (nc = 0; nc < llen; ) { |
| 1050 | n2l3(p, l); | 1106 | n2l3(p, l); |
| 1051 | if ((l + nc + 3) > llen) { | 1107 | if ((l + nc + 3) > llen) { |
| 1052 | al = SSL_AD_DECODE_ERROR; | 1108 | al = SSL_AD_DECODE_ERROR; |
| 1053 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_CERT_LENGTH_MISMATCH); | 1109 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1110 | SSL_R_CERT_LENGTH_MISMATCH); | ||
| 1054 | goto f_err; | 1111 | goto f_err; |
| 1055 | } | 1112 | } |
| 1056 | 1113 | ||
| @@ -1058,16 +1115,19 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1058 | x = d2i_X509(NULL, &q, l); | 1115 | x = d2i_X509(NULL, &q, l); |
| 1059 | if (x == NULL) { | 1116 | if (x == NULL) { |
| 1060 | al = SSL_AD_BAD_CERTIFICATE; | 1117 | al = SSL_AD_BAD_CERTIFICATE; |
| 1061 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_ASN1_LIB); | 1118 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1119 | ERR_R_ASN1_LIB); | ||
| 1062 | goto f_err; | 1120 | goto f_err; |
| 1063 | } | 1121 | } |
| 1064 | if (q != (p + l)) { | 1122 | if (q != (p + l)) { |
| 1065 | al = SSL_AD_DECODE_ERROR; | 1123 | al = SSL_AD_DECODE_ERROR; |
| 1066 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_CERT_LENGTH_MISMATCH); | 1124 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1125 | SSL_R_CERT_LENGTH_MISMATCH); | ||
| 1067 | goto f_err; | 1126 | goto f_err; |
| 1068 | } | 1127 | } |
| 1069 | if (!sk_X509_push(sk, x)) { | 1128 | if (!sk_X509_push(sk, x)) { |
| 1070 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_MALLOC_FAILURE); | 1129 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1130 | ERR_R_MALLOC_FAILURE); | ||
| 1071 | goto err; | 1131 | goto err; |
| 1072 | } | 1132 | } |
| 1073 | x = NULL; | 1133 | x = NULL; |
| @@ -1083,7 +1143,8 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1083 | #endif /* OPENSSL_NO_KRB5 */ | 1143 | #endif /* OPENSSL_NO_KRB5 */ |
| 1084 | ) { | 1144 | ) { |
| 1085 | al = ssl_verify_alarm_type(s->verify_result); | 1145 | al = ssl_verify_alarm_type(s->verify_result); |
| 1086 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_CERTIFICATE_VERIFY_FAILED); | 1146 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1147 | SSL_R_CERTIFICATE_VERIFY_FAILED); | ||
| 1087 | goto f_err; | 1148 | goto f_err; |
| 1088 | 1149 | ||
| 1089 | } | 1150 | } |
| @@ -1098,8 +1159,10 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1098 | s->session->sess_cert = sc; | 1159 | s->session->sess_cert = sc; |
| 1099 | 1160 | ||
| 1100 | sc->cert_chain = sk; | 1161 | sc->cert_chain = sk; |
| 1101 | /* Inconsistency alert: cert_chain does include the peer's | 1162 | /* |
| 1102 | * certificate, which we don't include in s3_srvr.c */ | 1163 | * Inconsistency alert: cert_chain does include the peer's |
| 1164 | * certificate, which we don't include in s3_srvr.c | ||
| 1165 | */ | ||
| 1103 | x = sk_X509_value(sk, 0); | 1166 | x = sk_X509_value(sk, 0); |
| 1104 | sk = NULL; | 1167 | sk = NULL; |
| 1105 | /* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/ | 1168 | /* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/ |
| @@ -1108,17 +1171,19 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1108 | 1171 | ||
| 1109 | /* VRS: allow null cert if auth == KRB5 */ | 1172 | /* VRS: allow null cert if auth == KRB5 */ |
| 1110 | need_cert = ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kKRB5) && | 1173 | need_cert = ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kKRB5) && |
| 1111 | (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5)) | 1174 | (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5)) |
| 1112 | ? 0 : 1; | 1175 | ? 0 : 1; |
| 1113 | 1176 | ||
| 1114 | #ifdef KSSL_DEBUG | 1177 | #ifdef KSSL_DEBUG |
| 1115 | printf("pkey, x = %p, %p\n", pkey, x); | 1178 | printf("pkey, x = %p, %p\n", pkey, x); |
| 1116 | printf("ssl_cert_type(x, pkey) = %d\n", ssl_cert_type(x, pkey)); | 1179 | printf("ssl_cert_type(x, pkey) = %d\n", ssl_cert_type(x, pkey)); |
| 1117 | printf("cipher, alg, nc = %s, %lx, %lx, %d\n", s->s3->tmp.new_cipher->name, | 1180 | printf("cipher, alg, nc = %s, %lx, %lx, %d\n", |
| 1118 | s->s3->tmp.new_cipher->algorithm_mkey, s->s3->tmp.new_cipher->algorithm_auth, need_cert); | 1181 | s->s3->tmp.new_cipher->name, s->s3->tmp.new_cipher->algorithm_mkey, |
| 1182 | s->s3->tmp.new_cipher->algorithm_auth, need_cert); | ||
| 1119 | #endif /* KSSL_DEBUG */ | 1183 | #endif /* KSSL_DEBUG */ |
| 1120 | 1184 | ||
| 1121 | if (need_cert && ((pkey == NULL) || EVP_PKEY_missing_parameters(pkey))) { | 1185 | if (need_cert && ((pkey == NULL) || |
| 1186 | EVP_PKEY_missing_parameters(pkey))) { | ||
| 1122 | x = NULL; | 1187 | x = NULL; |
| 1123 | al = SSL3_AL_FATAL; | 1188 | al = SSL3_AL_FATAL; |
| 1124 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, | 1189 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| @@ -1138,8 +1203,10 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1138 | if (need_cert) { | 1203 | if (need_cert) { |
| 1139 | sc->peer_cert_type = i; | 1204 | sc->peer_cert_type = i; |
| 1140 | CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); | 1205 | CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); |
| 1141 | /* Why would the following ever happen? | 1206 | /* |
| 1142 | * We just created sc a couple of lines ago. */ | 1207 | * Why would the following ever happen? |
| 1208 | * We just created sc a couple of lines ago. | ||
| 1209 | */ | ||
| 1143 | if (sc->peer_pkeys[i].x509 != NULL) | 1210 | if (sc->peer_pkeys[i].x509 != NULL) |
| 1144 | X509_free(sc->peer_pkeys[i].x509); | 1211 | X509_free(sc->peer_pkeys[i].x509); |
| 1145 | sc->peer_pkeys[i].x509 = x; | 1212 | sc->peer_pkeys[i].x509 = x; |
| @@ -1163,10 +1230,10 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1163 | ret = 1; | 1230 | ret = 1; |
| 1164 | 1231 | ||
| 1165 | if (0) { | 1232 | if (0) { |
| 1166 | f_err: | 1233 | f_err: |
| 1167 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1234 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1168 | } | 1235 | } |
| 1169 | err: | 1236 | err: |
| 1170 | EVP_PKEY_free(pkey); | 1237 | EVP_PKEY_free(pkey); |
| 1171 | X509_free(x); | 1238 | X509_free(x); |
| 1172 | sk_X509_pop_free(sk, X509_free); | 1239 | sk_X509_pop_free(sk, X509_free); |
| @@ -1176,27 +1243,29 @@ err: | |||
| 1176 | int | 1243 | int |
| 1177 | ssl3_get_key_exchange(SSL *s) | 1244 | ssl3_get_key_exchange(SSL *s) |
| 1178 | { | 1245 | { |
| 1179 | unsigned char *q, md_buf[EVP_MAX_MD_SIZE*2]; | 1246 | unsigned char *q, md_buf[EVP_MAX_MD_SIZE*2]; |
| 1180 | EVP_MD_CTX md_ctx; | 1247 | EVP_MD_CTX md_ctx; |
| 1181 | unsigned char *param, *p; | 1248 | unsigned char *param, *p; |
| 1182 | int al, i, j, param_len, ok; | 1249 | int al, i, j, param_len, ok; |
| 1183 | long n, alg_k, alg_a; | 1250 | long n, alg_k, alg_a; |
| 1184 | EVP_PKEY *pkey = NULL; | 1251 | EVP_PKEY *pkey = NULL; |
| 1185 | const EVP_MD *md = NULL; | 1252 | const EVP_MD *md = NULL; |
| 1186 | RSA *rsa = NULL; | 1253 | RSA *rsa = NULL; |
| 1187 | #ifndef OPENSSL_NO_DH | 1254 | #ifndef OPENSSL_NO_DH |
| 1188 | DH *dh = NULL; | 1255 | DH *dh = NULL; |
| 1189 | #endif | 1256 | #endif |
| 1190 | #ifndef OPENSSL_NO_ECDH | 1257 | #ifndef OPENSSL_NO_ECDH |
| 1191 | EC_KEY *ecdh = NULL; | 1258 | EC_KEY *ecdh = NULL; |
| 1192 | BN_CTX *bn_ctx = NULL; | 1259 | BN_CTX *bn_ctx = NULL; |
| 1193 | EC_POINT *srvr_ecpoint = NULL; | 1260 | EC_POINT *srvr_ecpoint = NULL; |
| 1194 | int curve_nid = 0; | 1261 | int curve_nid = 0; |
| 1195 | int encoded_pt_len = 0; | 1262 | int encoded_pt_len = 0; |
| 1196 | #endif | 1263 | #endif |
| 1197 | 1264 | ||
| 1198 | /* use same message size as in ssl3_get_certificate_request() | 1265 | /* |
| 1199 | * as ServerKeyExchange message may be skipped */ | 1266 | * Use same message size as in ssl3_get_certificate_request() |
| 1267 | * as ServerKeyExchange message may be skipped. | ||
| 1268 | */ | ||
| 1200 | n = s->method->ssl_get_message(s, SSL3_ST_CR_KEY_EXCH_A, | 1269 | n = s->method->ssl_get_message(s, SSL3_ST_CR_KEY_EXCH_A, |
| 1201 | SSL3_ST_CR_KEY_EXCH_B, -1, s->max_cert_list, &ok); | 1270 | SSL3_ST_CR_KEY_EXCH_B, -1, s->max_cert_list, &ok); |
| 1202 | if (!ok) | 1271 | if (!ok) |
| @@ -1204,10 +1273,11 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1204 | 1273 | ||
| 1205 | if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) { | 1274 | if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) { |
| 1206 | #ifndef OPENSSL_NO_PSK | 1275 | #ifndef OPENSSL_NO_PSK |
| 1207 | /* In plain PSK ciphersuite, ServerKeyExchange can be | 1276 | /* |
| 1208 | omitted if no identity hint is sent. Set | 1277 | * In plain PSK ciphersuite, ServerKeyExchange can be |
| 1209 | session->sess_cert anyway to avoid problems | 1278 | * omitted if no identity hint is sent. Set session->sess_cert |
| 1210 | later.*/ | 1279 | * anyway to avoid problems later. |
| 1280 | */ | ||
| 1211 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK) { | 1281 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK) { |
| 1212 | s->session->sess_cert = ssl_sess_cert_new(); | 1282 | s->session->sess_cert = ssl_sess_cert_new(); |
| 1213 | if (s->ctx->psk_identity_hint) | 1283 | if (s->ctx->psk_identity_hint) |
| @@ -1253,32 +1323,37 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1253 | al = SSL_AD_HANDSHAKE_FAILURE; | 1323 | al = SSL_AD_HANDSHAKE_FAILURE; |
| 1254 | n2s(p, i); | 1324 | n2s(p, i); |
| 1255 | param_len = i + 2; | 1325 | param_len = i + 2; |
| 1256 | /* Store PSK identity hint for later use, hint is used | 1326 | /* |
| 1327 | * Store PSK identity hint for later use, hint is used | ||
| 1257 | * in ssl3_send_client_key_exchange. Assume that the | 1328 | * in ssl3_send_client_key_exchange. Assume that the |
| 1258 | * maximum length of a PSK identity hint can be as | 1329 | * maximum length of a PSK identity hint can be as |
| 1259 | * long as the maximum length of a PSK identity. */ | 1330 | * long as the maximum length of a PSK identity. |
| 1331 | */ | ||
| 1260 | if (i > PSK_MAX_IDENTITY_LEN) { | 1332 | if (i > PSK_MAX_IDENTITY_LEN) { |
| 1261 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1333 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1262 | SSL_R_DATA_LENGTH_TOO_LONG); | 1334 | SSL_R_DATA_LENGTH_TOO_LONG); |
| 1263 | goto f_err; | 1335 | goto f_err; |
| 1264 | } | 1336 | } |
| 1265 | if (param_len > n) { | 1337 | if (param_len > n) { |
| 1266 | al = SSL_AD_DECODE_ERROR; | 1338 | al = SSL_AD_DECODE_ERROR; |
| 1267 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1339 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1268 | SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH); | 1340 | SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH); |
| 1269 | goto f_err; | 1341 | goto f_err; |
| 1270 | } | 1342 | } |
| 1271 | /* If received PSK identity hint contains NULL | 1343 | /* |
| 1344 | * If received PSK identity hint contains NULL | ||
| 1272 | * characters, the hint is truncated from the first | 1345 | * characters, the hint is truncated from the first |
| 1273 | * NULL. p may not be ending with NULL, so create a | 1346 | * NULL. p may not be ending with NULL, so create a |
| 1274 | * NULL-terminated string. */ | 1347 | * NULL-terminated string. |
| 1348 | */ | ||
| 1275 | memcpy(tmp_id_hint, p, i); | 1349 | memcpy(tmp_id_hint, p, i); |
| 1276 | memset(tmp_id_hint + i, 0, PSK_MAX_IDENTITY_LEN + 1 - i); | 1350 | memset(tmp_id_hint + i, 0, PSK_MAX_IDENTITY_LEN + 1 - i); |
| 1277 | if (s->ctx->psk_identity_hint != NULL) | 1351 | if (s->ctx->psk_identity_hint != NULL) |
| 1278 | free(s->ctx->psk_identity_hint); | 1352 | free(s->ctx->psk_identity_hint); |
| 1279 | s->ctx->psk_identity_hint = BUF_strdup(tmp_id_hint); | 1353 | s->ctx->psk_identity_hint = BUF_strdup(tmp_id_hint); |
| 1280 | if (s->ctx->psk_identity_hint == NULL) { | 1354 | if (s->ctx->psk_identity_hint == NULL) { |
| 1281 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 1355 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1356 | ERR_R_MALLOC_FAILURE); | ||
| 1282 | goto f_err; | 1357 | goto f_err; |
| 1283 | } | 1358 | } |
| 1284 | 1359 | ||
| @@ -1292,11 +1367,13 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1292 | param_len = i + 2; | 1367 | param_len = i + 2; |
| 1293 | if (param_len > n) { | 1368 | if (param_len > n) { |
| 1294 | al = SSL_AD_DECODE_ERROR; | 1369 | al = SSL_AD_DECODE_ERROR; |
| 1295 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SRP_N_LENGTH); | 1370 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1371 | SSL_R_BAD_SRP_N_LENGTH); | ||
| 1296 | goto f_err; | 1372 | goto f_err; |
| 1297 | } | 1373 | } |
| 1298 | if (!(s->srp_ctx.N = BN_bin2bn(p, i, NULL))) { | 1374 | if (!(s->srp_ctx.N = BN_bin2bn(p, i, NULL))) { |
| 1299 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1375 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1376 | ERR_R_BN_LIB); | ||
| 1300 | goto err; | 1377 | goto err; |
| 1301 | } | 1378 | } |
| 1302 | p += i; | 1379 | p += i; |
| @@ -1305,11 +1382,13 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1305 | param_len += i + 2; | 1382 | param_len += i + 2; |
| 1306 | if (param_len > n) { | 1383 | if (param_len > n) { |
| 1307 | al = SSL_AD_DECODE_ERROR; | 1384 | al = SSL_AD_DECODE_ERROR; |
| 1308 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SRP_G_LENGTH); | 1385 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1386 | SSL_R_BAD_SRP_G_LENGTH); | ||
| 1309 | goto f_err; | 1387 | goto f_err; |
| 1310 | } | 1388 | } |
| 1311 | if (!(s->srp_ctx.g = BN_bin2bn(p, i, NULL))) { | 1389 | if (!(s->srp_ctx.g = BN_bin2bn(p, i, NULL))) { |
| 1312 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1390 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1391 | ERR_R_BN_LIB); | ||
| 1313 | goto err; | 1392 | goto err; |
| 1314 | } | 1393 | } |
| 1315 | p += i; | 1394 | p += i; |
| @@ -1319,11 +1398,13 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1319 | param_len += i + 1; | 1398 | param_len += i + 1; |
| 1320 | if (param_len > n) { | 1399 | if (param_len > n) { |
| 1321 | al = SSL_AD_DECODE_ERROR; | 1400 | al = SSL_AD_DECODE_ERROR; |
| 1322 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SRP_S_LENGTH); | 1401 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1402 | SSL_R_BAD_SRP_S_LENGTH); | ||
| 1323 | goto f_err; | 1403 | goto f_err; |
| 1324 | } | 1404 | } |
| 1325 | if (!(s->srp_ctx.s = BN_bin2bn(p, i, NULL))) { | 1405 | if (!(s->srp_ctx.s = BN_bin2bn(p, i, NULL))) { |
| 1326 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1406 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1407 | ERR_R_BN_LIB); | ||
| 1327 | goto err; | 1408 | goto err; |
| 1328 | } | 1409 | } |
| 1329 | p += i; | 1410 | p += i; |
| @@ -1332,224 +1413,268 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1332 | param_len += i + 2; | 1413 | param_len += i + 2; |
| 1333 | if (param_len > n) { | 1414 | if (param_len > n) { |
| 1334 | al = SSL_AD_DECODE_ERROR; | 1415 | al = SSL_AD_DECODE_ERROR; |
| 1335 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SRP_B_LENGTH); | 1416 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1417 | SSL_R_BAD_SRP_B_LENGTH); | ||
| 1336 | goto f_err; | 1418 | goto f_err; |
| 1337 | } | 1419 | } |
| 1338 | if (!(s->srp_ctx.B = BN_bin2bn(p, i, NULL))) { | 1420 | if (!(s->srp_ctx.B = BN_bin2bn(p, i, NULL))) { |
| 1339 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1421 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1422 | ERR_R_BN_LIB); | ||
| 1340 | goto err; | 1423 | goto err; |
| 1341 | } | 1424 | } |
| 1342 | p += i; | 1425 | p += i; |
| 1343 | n -= param_len; | 1426 | n -= param_len; |
| 1344 | 1427 | ||
| 1345 | /* We must check if there is a certificate */ | 1428 | /* We must check if there is a certificate */ |
| 1346 | if (alg_a & SSL_aRSA) | 1429 | if (alg_a & SSL_aRSA) |
| 1347 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509); | 1430 | pkey = X509_get_pubkey( |
| 1431 | s->session->sess_cert->peer_pkeys[ | ||
| 1432 | SSL_PKEY_RSA_ENC].x509); | ||
| 1348 | else if (alg_a & SSL_aDSS) | 1433 | else if (alg_a & SSL_aDSS) |
| 1349 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509); | 1434 | pkey = X509_get_pubkey( |
| 1435 | s->session->sess_cert->peer_pkeys[ | ||
| 1436 | SSL_PKEY_DSA_SIGN].x509); | ||
| 1350 | } else | 1437 | } else |
| 1351 | #endif /* !OPENSSL_NO_SRP */ | 1438 | #endif /* !OPENSSL_NO_SRP */ |
| 1352 | if (alg_k & SSL_kRSA) { | 1439 | if (alg_k & SSL_kRSA) { |
| 1353 | if ((rsa = RSA_new()) == NULL) { | 1440 | if ((rsa = RSA_new()) == NULL) { |
| 1354 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 1441 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1355 | goto err; | 1442 | ERR_R_MALLOC_FAILURE); |
| 1356 | } | 1443 | goto err; |
| 1357 | n2s(p, i); | 1444 | } |
| 1358 | param_len = i + 2; | 1445 | n2s(p, i); |
| 1359 | if (param_len > n) { | 1446 | param_len = i + 2; |
| 1360 | al = SSL_AD_DECODE_ERROR; | 1447 | if (param_len > n) { |
| 1361 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_RSA_MODULUS_LENGTH); | 1448 | al = SSL_AD_DECODE_ERROR; |
| 1362 | goto f_err; | 1449 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1363 | } | 1450 | SSL_R_BAD_RSA_MODULUS_LENGTH); |
| 1364 | if (!(rsa->n = BN_bin2bn(p, i, rsa->n))) { | 1451 | goto f_err; |
| 1365 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1452 | } |
| 1366 | goto err; | 1453 | if (!(rsa->n = BN_bin2bn(p, i, rsa->n))) { |
| 1367 | } | 1454 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1368 | p += i; | 1455 | ERR_R_BN_LIB); |
| 1456 | goto err; | ||
| 1457 | } | ||
| 1458 | p += i; | ||
| 1369 | 1459 | ||
| 1370 | n2s(p, i); | 1460 | n2s(p, i); |
| 1371 | param_len += i + 2; | 1461 | param_len += i + 2; |
| 1372 | if (param_len > n) { | 1462 | if (param_len > n) { |
| 1373 | al = SSL_AD_DECODE_ERROR; | 1463 | al = SSL_AD_DECODE_ERROR; |
| 1374 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_RSA_E_LENGTH); | 1464 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1375 | goto f_err; | 1465 | SSL_R_BAD_RSA_E_LENGTH); |
| 1376 | } | 1466 | goto f_err; |
| 1377 | if (!(rsa->e = BN_bin2bn(p, i, rsa->e))) { | 1467 | } |
| 1378 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1468 | if (!(rsa->e = BN_bin2bn(p, i, rsa->e))) { |
| 1379 | goto err; | 1469 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1380 | } | 1470 | ERR_R_BN_LIB); |
| 1381 | p += i; | 1471 | goto err; |
| 1382 | n -= param_len; | 1472 | } |
| 1473 | p += i; | ||
| 1474 | n -= param_len; | ||
| 1383 | 1475 | ||
| 1384 | /* this should be because we are using an export cipher */ | 1476 | /* |
| 1385 | if (alg_a & SSL_aRSA) | 1477 | * This should be because we are using an |
| 1386 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509); | 1478 | * export cipher |
| 1387 | else { | 1479 | */ |
| 1388 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 1480 | if (alg_a & SSL_aRSA) |
| 1389 | goto err; | 1481 | pkey = X509_get_pubkey( |
| 1482 | s->session->sess_cert->peer_pkeys[ | ||
| 1483 | SSL_PKEY_RSA_ENC].x509); | ||
| 1484 | else { | ||
| 1485 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1486 | ERR_R_INTERNAL_ERROR); | ||
| 1487 | goto err; | ||
| 1488 | } | ||
| 1489 | s->session->sess_cert->peer_rsa_tmp = rsa; | ||
| 1490 | rsa = NULL; | ||
| 1390 | } | 1491 | } |
| 1391 | s->session->sess_cert->peer_rsa_tmp = rsa; | ||
| 1392 | rsa = NULL; | ||
| 1393 | } | ||
| 1394 | #ifndef OPENSSL_NO_DH | 1492 | #ifndef OPENSSL_NO_DH |
| 1395 | else if (alg_k & SSL_kEDH) { | 1493 | else if (alg_k & SSL_kEDH) { |
| 1396 | if ((dh = DH_new()) == NULL) { | 1494 | if ((dh = DH_new()) == NULL) { |
| 1397 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_DH_LIB); | 1495 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1398 | goto err; | 1496 | ERR_R_DH_LIB); |
| 1399 | } | 1497 | goto err; |
| 1400 | n2s(p, i); | 1498 | } |
| 1401 | param_len = i + 2; | 1499 | n2s(p, i); |
| 1402 | if (param_len > n) { | 1500 | param_len = i + 2; |
| 1403 | al = SSL_AD_DECODE_ERROR; | 1501 | if (param_len > n) { |
| 1404 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_P_LENGTH); | 1502 | al = SSL_AD_DECODE_ERROR; |
| 1405 | goto f_err; | 1503 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1406 | } | 1504 | SSL_R_BAD_DH_P_LENGTH); |
| 1407 | if (!(dh->p = BN_bin2bn(p, i, NULL))) { | 1505 | goto f_err; |
| 1408 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1506 | } |
| 1409 | goto err; | 1507 | if (!(dh->p = BN_bin2bn(p, i, NULL))) { |
| 1410 | } | 1508 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1411 | p += i; | 1509 | ERR_R_BN_LIB); |
| 1510 | goto err; | ||
| 1511 | } | ||
| 1512 | p += i; | ||
| 1412 | 1513 | ||
| 1413 | n2s(p, i); | 1514 | n2s(p, i); |
| 1414 | param_len += i + 2; | 1515 | param_len += i + 2; |
| 1415 | if (param_len > n) { | 1516 | if (param_len > n) { |
| 1416 | al = SSL_AD_DECODE_ERROR; | 1517 | al = SSL_AD_DECODE_ERROR; |
| 1417 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_G_LENGTH); | 1518 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1418 | goto f_err; | 1519 | SSL_R_BAD_DH_G_LENGTH); |
| 1419 | } | 1520 | goto f_err; |
| 1420 | if (!(dh->g = BN_bin2bn(p, i, NULL))) { | 1521 | } |
| 1421 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1522 | if (!(dh->g = BN_bin2bn(p, i, NULL))) { |
| 1422 | goto err; | 1523 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1423 | } | 1524 | ERR_R_BN_LIB); |
| 1424 | p += i; | 1525 | goto err; |
| 1526 | } | ||
| 1527 | p += i; | ||
| 1425 | 1528 | ||
| 1426 | n2s(p, i); | 1529 | n2s(p, i); |
| 1427 | param_len += i + 2; | 1530 | param_len += i + 2; |
| 1428 | if (param_len > n) { | 1531 | if (param_len > n) { |
| 1429 | al = SSL_AD_DECODE_ERROR; | 1532 | al = SSL_AD_DECODE_ERROR; |
| 1430 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_PUB_KEY_LENGTH); | 1533 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1534 | SSL_R_BAD_DH_PUB_KEY_LENGTH); | ||
| 1535 | goto f_err; | ||
| 1536 | } | ||
| 1537 | if (!(dh->pub_key = BN_bin2bn(p, i, NULL))) { | ||
| 1538 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1539 | ERR_R_BN_LIB); | ||
| 1540 | goto err; | ||
| 1541 | } | ||
| 1542 | p += i; | ||
| 1543 | n -= param_len; | ||
| 1544 | |||
| 1545 | if (alg_a & SSL_aRSA) | ||
| 1546 | pkey = X509_get_pubkey( | ||
| 1547 | s->session->sess_cert->peer_pkeys[ | ||
| 1548 | SSL_PKEY_RSA_ENC].x509); | ||
| 1549 | else if (alg_a & SSL_aDSS) | ||
| 1550 | pkey = X509_get_pubkey( | ||
| 1551 | s->session->sess_cert->peer_pkeys[ | ||
| 1552 | SSL_PKEY_DSA_SIGN].x509); | ||
| 1553 | /* else anonymous DH, so no certificate or pkey. */ | ||
| 1554 | |||
| 1555 | s->session->sess_cert->peer_dh_tmp = dh; | ||
| 1556 | dh = NULL; | ||
| 1557 | } else if ((alg_k & SSL_kDHr) || (alg_k & SSL_kDHd)) { | ||
| 1558 | al = SSL_AD_ILLEGAL_PARAMETER; | ||
| 1559 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1560 | SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER); | ||
| 1431 | goto f_err; | 1561 | goto f_err; |
| 1432 | } | 1562 | } |
| 1433 | if (!(dh->pub_key = BN_bin2bn(p, i, NULL))) { | ||
| 1434 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | ||
| 1435 | goto err; | ||
| 1436 | } | ||
| 1437 | p += i; | ||
| 1438 | n -= param_len; | ||
| 1439 | |||
| 1440 | if (alg_a & SSL_aRSA) | ||
| 1441 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509); | ||
| 1442 | else if (alg_a & SSL_aDSS) | ||
| 1443 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509); | ||
| 1444 | /* else anonymous DH, so no certificate or pkey. */ | ||
| 1445 | |||
| 1446 | s->session->sess_cert->peer_dh_tmp = dh; | ||
| 1447 | dh = NULL; | ||
| 1448 | } else if ((alg_k & SSL_kDHr) || (alg_k & SSL_kDHd)) { | ||
| 1449 | al = SSL_AD_ILLEGAL_PARAMETER; | ||
| 1450 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER); | ||
| 1451 | goto f_err; | ||
| 1452 | } | ||
| 1453 | #endif /* !OPENSSL_NO_DH */ | 1563 | #endif /* !OPENSSL_NO_DH */ |
| 1454 | 1564 | ||
| 1455 | #ifndef OPENSSL_NO_ECDH | 1565 | #ifndef OPENSSL_NO_ECDH |
| 1456 | else if (alg_k & SSL_kEECDH) { | 1566 | else if (alg_k & SSL_kEECDH) { |
| 1457 | EC_GROUP *ngroup; | 1567 | EC_GROUP *ngroup; |
| 1458 | const EC_GROUP *group; | 1568 | const EC_GROUP *group; |
| 1459 | 1569 | ||
| 1460 | if ((ecdh = EC_KEY_new()) == NULL) { | 1570 | if ((ecdh = EC_KEY_new()) == NULL) { |
| 1461 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 1571 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1462 | goto err; | 1572 | ERR_R_MALLOC_FAILURE); |
| 1463 | } | 1573 | goto err; |
| 1574 | } | ||
| 1464 | 1575 | ||
| 1465 | /* Extract elliptic curve parameters and the | 1576 | /* |
| 1466 | * server's ephemeral ECDH public key. | 1577 | * Extract elliptic curve parameters and the |
| 1467 | * Keep accumulating lengths of various components in | 1578 | * server's ephemeral ECDH public key. |
| 1468 | * param_len and make sure it never exceeds n. | 1579 | * Keep accumulating lengths of various components in |
| 1469 | */ | 1580 | * param_len and make sure it never exceeds n. |
| 1581 | */ | ||
| 1470 | 1582 | ||
| 1471 | /* XXX: For now we only support named (not generic) curves | 1583 | /* |
| 1472 | * and the ECParameters in this case is just three bytes. | 1584 | * XXX: For now we only support named (not generic) |
| 1473 | */ | 1585 | * curves and the ECParameters in this case is just |
| 1474 | param_len = 3; | 1586 | * three bytes. |
| 1475 | if ((param_len > n) || | 1587 | */ |
| 1476 | (*p != NAMED_CURVE_TYPE) || | 1588 | param_len = 3; |
| 1477 | ((curve_nid = tls1_ec_curve_id2nid(*(p + 2))) == 0)) { | 1589 | if ((param_len > n) || (*p != NAMED_CURVE_TYPE) || |
| 1478 | al = SSL_AD_INTERNAL_ERROR; | 1590 | ((curve_nid = tls1_ec_curve_id2nid(*(p + 2))) |
| 1479 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS); | 1591 | == 0)) { |
| 1480 | goto f_err; | 1592 | al = SSL_AD_INTERNAL_ERROR; |
| 1481 | } | 1593 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1594 | SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS); | ||
| 1595 | goto f_err; | ||
| 1596 | } | ||
| 1482 | 1597 | ||
| 1483 | ngroup = EC_GROUP_new_by_curve_name(curve_nid); | 1598 | ngroup = EC_GROUP_new_by_curve_name(curve_nid); |
| 1484 | if (ngroup == NULL) { | 1599 | if (ngroup == NULL) { |
| 1485 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EC_LIB); | 1600 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1486 | goto err; | 1601 | ERR_R_EC_LIB); |
| 1487 | } | 1602 | goto err; |
| 1488 | if (EC_KEY_set_group(ecdh, ngroup) == 0) { | 1603 | } |
| 1489 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EC_LIB); | 1604 | if (EC_KEY_set_group(ecdh, ngroup) == 0) { |
| 1490 | goto err; | 1605 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1491 | } | 1606 | ERR_R_EC_LIB); |
| 1492 | EC_GROUP_free(ngroup); | 1607 | goto err; |
| 1608 | } | ||
| 1609 | EC_GROUP_free(ngroup); | ||
| 1493 | 1610 | ||
| 1494 | group = EC_KEY_get0_group(ecdh); | 1611 | group = EC_KEY_get0_group(ecdh); |
| 1495 | 1612 | ||
| 1496 | if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && | 1613 | if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && |
| 1497 | (EC_GROUP_get_degree(group) > 163)) { | 1614 | (EC_GROUP_get_degree(group) > 163)) { |
| 1498 | al = SSL_AD_EXPORT_RESTRICTION; | 1615 | al = SSL_AD_EXPORT_RESTRICTION; |
| 1499 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER); | 1616 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1500 | goto f_err; | 1617 | SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER); |
| 1501 | } | 1618 | goto f_err; |
| 1619 | } | ||
| 1502 | 1620 | ||
| 1503 | p += 3; | 1621 | p += 3; |
| 1504 | 1622 | ||
| 1505 | /* Next, get the encoded ECPoint */ | 1623 | /* Next, get the encoded ECPoint */ |
| 1506 | if (((srvr_ecpoint = EC_POINT_new(group)) == NULL) || | 1624 | if (((srvr_ecpoint = EC_POINT_new(group)) == NULL) || |
| 1507 | ((bn_ctx = BN_CTX_new()) == NULL)) { | 1625 | ((bn_ctx = BN_CTX_new()) == NULL)) { |
| 1508 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 1626 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1509 | goto err; | 1627 | ERR_R_MALLOC_FAILURE); |
| 1510 | } | 1628 | goto err; |
| 1629 | } | ||
| 1511 | 1630 | ||
| 1512 | encoded_pt_len = *p; | 1631 | encoded_pt_len = *p; |
| 1513 | /* length of encoded point */ | 1632 | /* length of encoded point */ |
| 1514 | p += 1; | 1633 | p += 1; |
| 1515 | param_len += (1 + encoded_pt_len); | 1634 | param_len += (1 + encoded_pt_len); |
| 1516 | if ((param_len > n) || | 1635 | if ((param_len > n) || |
| 1517 | (EC_POINT_oct2point(group, srvr_ecpoint, | 1636 | (EC_POINT_oct2point(group, srvr_ecpoint, |
| 1518 | p, encoded_pt_len, bn_ctx) == 0)) { | 1637 | p, encoded_pt_len, bn_ctx) == 0)) { |
| 1519 | al = SSL_AD_DECODE_ERROR; | 1638 | al = SSL_AD_DECODE_ERROR; |
| 1520 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_ECPOINT); | 1639 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1521 | goto f_err; | 1640 | SSL_R_BAD_ECPOINT); |
| 1522 | } | 1641 | goto f_err; |
| 1642 | } | ||
| 1523 | 1643 | ||
| 1524 | n -= param_len; | 1644 | n -= param_len; |
| 1525 | p += encoded_pt_len; | 1645 | p += encoded_pt_len; |
| 1526 | 1646 | ||
| 1527 | /* The ECC/TLS specification does not mention | 1647 | /* |
| 1528 | * the use of DSA to sign ECParameters in the server | 1648 | * The ECC/TLS specification does not mention the use |
| 1529 | * key exchange message. We do support RSA and ECDSA. | 1649 | * of DSA to sign ECParameters in the server key |
| 1530 | */ | 1650 | * exchange message. We do support RSA and ECDSA. |
| 1531 | if (alg_a & SSL_aRSA) | 1651 | */ |
| 1532 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509); | 1652 | if (alg_a & SSL_aRSA) |
| 1653 | pkey = X509_get_pubkey( | ||
| 1654 | s->session->sess_cert->peer_pkeys[ | ||
| 1655 | SSL_PKEY_RSA_ENC].x509); | ||
| 1533 | #ifndef OPENSSL_NO_ECDSA | 1656 | #ifndef OPENSSL_NO_ECDSA |
| 1534 | else if (alg_a & SSL_aECDSA) | 1657 | else if (alg_a & SSL_aECDSA) |
| 1535 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_ECC].x509); | 1658 | pkey = X509_get_pubkey( |
| 1659 | s->session->sess_cert->peer_pkeys[ | ||
| 1660 | SSL_PKEY_ECC].x509); | ||
| 1536 | #endif | 1661 | #endif |
| 1537 | /* else anonymous ECDH, so no certificate or pkey. */ | 1662 | /* Else anonymous ECDH, so no certificate or pkey. */ |
| 1538 | EC_KEY_set_public_key(ecdh, srvr_ecpoint); | 1663 | EC_KEY_set_public_key(ecdh, srvr_ecpoint); |
| 1539 | s->session->sess_cert->peer_ecdh_tmp = ecdh; | 1664 | s->session->sess_cert->peer_ecdh_tmp = ecdh; |
| 1540 | ecdh = NULL; | 1665 | ecdh = NULL; |
| 1541 | BN_CTX_free(bn_ctx); | 1666 | BN_CTX_free(bn_ctx); |
| 1542 | bn_ctx = NULL; | 1667 | bn_ctx = NULL; |
| 1543 | EC_POINT_free(srvr_ecpoint); | 1668 | EC_POINT_free(srvr_ecpoint); |
| 1544 | srvr_ecpoint = NULL; | 1669 | srvr_ecpoint = NULL; |
| 1545 | } else if (alg_k) { | 1670 | } else if (alg_k) { |
| 1546 | al = SSL_AD_UNEXPECTED_MESSAGE; | 1671 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 1547 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNEXPECTED_MESSAGE); | 1672 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1548 | goto f_err; | 1673 | SSL_R_UNEXPECTED_MESSAGE); |
| 1549 | } | 1674 | goto f_err; |
| 1675 | } | ||
| 1550 | #endif /* !OPENSSL_NO_ECDH */ | 1676 | #endif /* !OPENSSL_NO_ECDH */ |
| 1551 | 1677 | ||
| 1552 | |||
| 1553 | /* p points to the next byte, there are 'n' bytes left */ | 1678 | /* p points to the next byte, there are 'n' bytes left */ |
| 1554 | 1679 | ||
| 1555 | /* if it was signed, check the signature */ | 1680 | /* if it was signed, check the signature */ |
| @@ -1558,23 +1683,30 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1558 | int sigalg = tls12_get_sigid(pkey); | 1683 | int sigalg = tls12_get_sigid(pkey); |
| 1559 | /* Should never happen */ | 1684 | /* Should never happen */ |
| 1560 | if (sigalg == -1) { | 1685 | if (sigalg == -1) { |
| 1561 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 1686 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1687 | ERR_R_INTERNAL_ERROR); | ||
| 1562 | goto err; | 1688 | goto err; |
| 1563 | } | 1689 | } |
| 1564 | /* Check key type is consistent with signature */ | 1690 | /* |
| 1691 | * Check key type is consistent | ||
| 1692 | * with signature | ||
| 1693 | */ | ||
| 1565 | if (sigalg != (int)p[1]) { | 1694 | if (sigalg != (int)p[1]) { |
| 1566 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_WRONG_SIGNATURE_TYPE); | 1695 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1696 | SSL_R_WRONG_SIGNATURE_TYPE); | ||
| 1567 | al = SSL_AD_DECODE_ERROR; | 1697 | al = SSL_AD_DECODE_ERROR; |
| 1568 | goto f_err; | 1698 | goto f_err; |
| 1569 | } | 1699 | } |
| 1570 | md = tls12_get_hash(p[0]); | 1700 | md = tls12_get_hash(p[0]); |
| 1571 | if (md == NULL) { | 1701 | if (md == NULL) { |
| 1572 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNKNOWN_DIGEST); | 1702 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1703 | SSL_R_UNKNOWN_DIGEST); | ||
| 1573 | al = SSL_AD_DECODE_ERROR; | 1704 | al = SSL_AD_DECODE_ERROR; |
| 1574 | goto f_err; | 1705 | goto f_err; |
| 1575 | } | 1706 | } |
| 1576 | #ifdef SSL_DEBUG | 1707 | #ifdef SSL_DEBUG |
| 1577 | fprintf(stderr, "USING TLSv1.2 HASH %s\n", EVP_MD_name(md)); | 1708 | fprintf(stderr, "USING TLSv1.2 HASH %s\n", |
| 1709 | EVP_MD_name(md)); | ||
| 1578 | #endif | 1710 | #endif |
| 1579 | p += 2; | 1711 | p += 2; |
| 1580 | n -= 2; | 1712 | n -= 2; |
| @@ -1588,11 +1720,13 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1588 | if ((i != n) || (n > j) || (n <= 0)) { | 1720 | if ((i != n) || (n > j) || (n <= 0)) { |
| 1589 | /* wrong packet length */ | 1721 | /* wrong packet length */ |
| 1590 | al = SSL_AD_DECODE_ERROR; | 1722 | al = SSL_AD_DECODE_ERROR; |
| 1591 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_WRONG_SIGNATURE_LENGTH); | 1723 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1724 | SSL_R_WRONG_SIGNATURE_LENGTH); | ||
| 1592 | goto f_err; | 1725 | goto f_err; |
| 1593 | } | 1726 | } |
| 1594 | 1727 | ||
| 1595 | if (pkey->type == EVP_PKEY_RSA && TLS1_get_version(s) < TLS1_2_VERSION) { | 1728 | if (pkey->type == EVP_PKEY_RSA && |
| 1729 | TLS1_get_version(s) < TLS1_2_VERSION) { | ||
| 1596 | int num; | 1730 | int num; |
| 1597 | 1731 | ||
| 1598 | j = 0; | 1732 | j = 0; |
| @@ -1600,61 +1734,72 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1600 | for (num = 2; num > 0; num--) { | 1734 | for (num = 2; num > 0; num--) { |
| 1601 | EVP_MD_CTX_set_flags(&md_ctx, | 1735 | EVP_MD_CTX_set_flags(&md_ctx, |
| 1602 | EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); | 1736 | EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); |
| 1603 | EVP_DigestInit_ex(&md_ctx,(num == 2) | 1737 | EVP_DigestInit_ex(&md_ctx, |
| 1604 | ?s->ctx->md5 : s->ctx->sha1, NULL); | 1738 | (num == 2) ? s->ctx->md5 : s->ctx->sha1, |
| 1605 | EVP_DigestUpdate(&md_ctx, &(s->s3->client_random[0]), SSL3_RANDOM_SIZE); | 1739 | NULL); |
| 1606 | EVP_DigestUpdate(&md_ctx, &(s->s3->server_random[0]), SSL3_RANDOM_SIZE); | 1740 | EVP_DigestUpdate(&md_ctx, |
| 1741 | &(s->s3->client_random[0]), | ||
| 1742 | SSL3_RANDOM_SIZE); | ||
| 1743 | EVP_DigestUpdate(&md_ctx, | ||
| 1744 | &(s->s3->server_random[0]), | ||
| 1745 | SSL3_RANDOM_SIZE); | ||
| 1607 | EVP_DigestUpdate(&md_ctx, param, param_len); | 1746 | EVP_DigestUpdate(&md_ctx, param, param_len); |
| 1608 | EVP_DigestFinal_ex(&md_ctx, q,(unsigned int *)&i); | 1747 | EVP_DigestFinal_ex(&md_ctx, q, |
| 1748 | (unsigned int *)&i); | ||
| 1609 | q += i; | 1749 | q += i; |
| 1610 | j += i; | 1750 | j += i; |
| 1611 | } | 1751 | } |
| 1612 | i = RSA_verify(NID_md5_sha1, md_buf, j, p, n, | 1752 | i = RSA_verify(NID_md5_sha1, md_buf, j, |
| 1613 | pkey->pkey.rsa); | 1753 | p, n, pkey->pkey.rsa); |
| 1614 | if (i < 0) { | 1754 | if (i < 0) { |
| 1615 | al = SSL_AD_DECRYPT_ERROR; | 1755 | al = SSL_AD_DECRYPT_ERROR; |
| 1616 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_RSA_DECRYPT); | 1756 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1757 | SSL_R_BAD_RSA_DECRYPT); | ||
| 1617 | goto f_err; | 1758 | goto f_err; |
| 1618 | } | 1759 | } |
| 1619 | if (i == 0) { | 1760 | if (i == 0) { |
| 1620 | /* bad signature */ | 1761 | /* bad signature */ |
| 1621 | al = SSL_AD_DECRYPT_ERROR; | 1762 | al = SSL_AD_DECRYPT_ERROR; |
| 1622 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SIGNATURE); | 1763 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1764 | SSL_R_BAD_SIGNATURE); | ||
| 1623 | goto f_err; | 1765 | goto f_err; |
| 1624 | } | 1766 | } |
| 1625 | } else | 1767 | } else { |
| 1626 | { | ||
| 1627 | EVP_VerifyInit_ex(&md_ctx, md, NULL); | 1768 | EVP_VerifyInit_ex(&md_ctx, md, NULL); |
| 1628 | EVP_VerifyUpdate(&md_ctx, &(s->s3->client_random[0]), SSL3_RANDOM_SIZE); | 1769 | EVP_VerifyUpdate(&md_ctx, &(s->s3->client_random[0]), |
| 1629 | EVP_VerifyUpdate(&md_ctx, &(s->s3->server_random[0]), SSL3_RANDOM_SIZE); | 1770 | SSL3_RANDOM_SIZE); |
| 1771 | EVP_VerifyUpdate(&md_ctx, &(s->s3->server_random[0]), | ||
| 1772 | SSL3_RANDOM_SIZE); | ||
| 1630 | EVP_VerifyUpdate(&md_ctx, param, param_len); | 1773 | EVP_VerifyUpdate(&md_ctx, param, param_len); |
| 1631 | if (EVP_VerifyFinal(&md_ctx, p,(int)n, pkey) <= 0) { | 1774 | if (EVP_VerifyFinal(&md_ctx, p,(int)n, pkey) <= 0) { |
| 1632 | /* bad signature */ | 1775 | /* bad signature */ |
| 1633 | al = SSL_AD_DECRYPT_ERROR; | 1776 | al = SSL_AD_DECRYPT_ERROR; |
| 1634 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SIGNATURE); | 1777 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1778 | SSL_R_BAD_SIGNATURE); | ||
| 1635 | goto f_err; | 1779 | goto f_err; |
| 1636 | } | 1780 | } |
| 1637 | } | 1781 | } |
| 1638 | } else { | 1782 | } else { |
| 1639 | if (!(alg_a & SSL_aNULL) && !(alg_k & SSL_kPSK)) | 1783 | /* aNULL or kPSK do not need public keys */ |
| 1640 | /* aNULL or kPSK do not need public keys */ | 1784 | if (!(alg_a & SSL_aNULL) && !(alg_k & SSL_kPSK)) { |
| 1641 | { | 1785 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1642 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 1786 | ERR_R_INTERNAL_ERROR); |
| 1643 | goto err; | 1787 | goto err; |
| 1644 | } | 1788 | } |
| 1645 | /* still data left over */ | 1789 | /* still data left over */ |
| 1646 | if (n != 0) { | 1790 | if (n != 0) { |
| 1647 | al = SSL_AD_DECODE_ERROR; | 1791 | al = SSL_AD_DECODE_ERROR; |
| 1648 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_EXTRA_DATA_IN_MESSAGE); | 1792 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1793 | SSL_R_EXTRA_DATA_IN_MESSAGE); | ||
| 1649 | goto f_err; | 1794 | goto f_err; |
| 1650 | } | 1795 | } |
| 1651 | } | 1796 | } |
| 1652 | EVP_PKEY_free(pkey); | 1797 | EVP_PKEY_free(pkey); |
| 1653 | EVP_MD_CTX_cleanup(&md_ctx); | 1798 | EVP_MD_CTX_cleanup(&md_ctx); |
| 1654 | return (1); | 1799 | return (1); |
| 1655 | f_err: | 1800 | f_err: |
| 1656 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1801 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1657 | err: | 1802 | err: |
| 1658 | EVP_PKEY_free(pkey); | 1803 | EVP_PKEY_free(pkey); |
| 1659 | if (rsa != NULL) | 1804 | if (rsa != NULL) |
| 1660 | RSA_free(rsa); | 1805 | RSA_free(rsa); |
| @@ -1675,20 +1820,16 @@ err: | |||
| 1675 | int | 1820 | int |
| 1676 | ssl3_get_certificate_request(SSL *s) | 1821 | ssl3_get_certificate_request(SSL *s) |
| 1677 | { | 1822 | { |
| 1678 | int ok, ret = 0; | 1823 | int ok, ret = 0; |
| 1679 | unsigned long n, nc, l; | 1824 | unsigned long n, nc, l; |
| 1680 | unsigned int llen, ctype_num, i; | 1825 | unsigned int llen, ctype_num, i; |
| 1681 | X509_NAME *xn = NULL; | 1826 | X509_NAME *xn = NULL; |
| 1682 | const unsigned char *p, *q; | 1827 | const unsigned char *p, *q; |
| 1683 | unsigned char *d; | 1828 | unsigned char *d; |
| 1684 | STACK_OF(X509_NAME) *ca_sk = NULL; | 1829 | STACK_OF(X509_NAME) *ca_sk = NULL; |
| 1685 | 1830 | ||
| 1686 | n = s->method->ssl_get_message(s, | 1831 | n = s->method->ssl_get_message(s, SSL3_ST_CR_CERT_REQ_A, |
| 1687 | SSL3_ST_CR_CERT_REQ_A, | 1832 | SSL3_ST_CR_CERT_REQ_B, -1, s->max_cert_list, &ok); |
| 1688 | SSL3_ST_CR_CERT_REQ_B, | ||
| 1689 | -1, | ||
| 1690 | s->max_cert_list, | ||
| 1691 | &ok); | ||
| 1692 | 1833 | ||
| 1693 | if (!ok) | 1834 | if (!ok) |
| 1694 | return ((int)n); | 1835 | return ((int)n); |
| @@ -1697,7 +1838,8 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1697 | 1838 | ||
| 1698 | if (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE) { | 1839 | if (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE) { |
| 1699 | s->s3->tmp.reuse_message = 1; | 1840 | s->s3->tmp.reuse_message = 1; |
| 1700 | /* If we get here we don't need any cached handshake records | 1841 | /* |
| 1842 | * If we get here we don't need any cached handshake records | ||
| 1701 | * as we wont be doing client auth. | 1843 | * as we wont be doing client auth. |
| 1702 | */ | 1844 | */ |
| 1703 | if (s->s3->handshake_buffer) { | 1845 | if (s->s3->handshake_buffer) { |
| @@ -1709,15 +1851,18 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1709 | 1851 | ||
| 1710 | if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST) { | 1852 | if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST) { |
| 1711 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); | 1853 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); |
| 1712 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_WRONG_MESSAGE_TYPE); | 1854 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1855 | SSL_R_WRONG_MESSAGE_TYPE); | ||
| 1713 | goto err; | 1856 | goto err; |
| 1714 | } | 1857 | } |
| 1715 | 1858 | ||
| 1716 | /* TLS does not like anon-DH with client cert */ | 1859 | /* TLS does not like anon-DH with client cert */ |
| 1717 | if (s->version > SSL3_VERSION) { | 1860 | if (s->version > SSL3_VERSION) { |
| 1718 | if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) { | 1861 | if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) { |
| 1719 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); | 1862 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 1720 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER); | 1863 | SSL_AD_UNEXPECTED_MESSAGE); |
| 1864 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1865 | SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER); | ||
| 1721 | goto err; | 1866 | goto err; |
| 1722 | } | 1867 | } |
| 1723 | } | 1868 | } |
| @@ -1725,7 +1870,8 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1725 | p = d=(unsigned char *)s->init_msg; | 1870 | p = d=(unsigned char *)s->init_msg; |
| 1726 | 1871 | ||
| 1727 | if ((ca_sk = sk_X509_NAME_new(ca_dn_cmp)) == NULL) { | 1872 | if ((ca_sk = sk_X509_NAME_new(ca_dn_cmp)) == NULL) { |
| 1728 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, ERR_R_MALLOC_FAILURE); | 1873 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1874 | ERR_R_MALLOC_FAILURE); | ||
| 1729 | goto err; | 1875 | goto err; |
| 1730 | } | 1876 | } |
| 1731 | 1877 | ||
| @@ -1743,12 +1889,14 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1743 | */ | 1889 | */ |
| 1744 | if ((unsigned long)(p - d + llen + 2) > n) { | 1890 | if ((unsigned long)(p - d + llen + 2) > n) { |
| 1745 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1891 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1746 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_DATA_LENGTH_TOO_LONG); | 1892 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1893 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 1747 | goto err; | 1894 | goto err; |
| 1748 | } | 1895 | } |
| 1749 | if ((llen & 1) || !tls1_process_sigalgs(s, p, llen)) { | 1896 | if ((llen & 1) || !tls1_process_sigalgs(s, p, llen)) { |
| 1750 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1897 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1751 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_SIGNATURE_ALGORITHMS_ERROR); | 1898 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1899 | SSL_R_SIGNATURE_ALGORITHMS_ERROR); | ||
| 1752 | goto err; | 1900 | goto err; |
| 1753 | } | 1901 | } |
| 1754 | p += llen; | 1902 | p += llen; |
| @@ -1759,7 +1907,8 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1759 | 1907 | ||
| 1760 | if ((unsigned long)(p - d + llen) != n) { | 1908 | if ((unsigned long)(p - d + llen) != n) { |
| 1761 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1909 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1762 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_LENGTH_MISMATCH); | 1910 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1911 | SSL_R_LENGTH_MISMATCH); | ||
| 1763 | goto err; | 1912 | goto err; |
| 1764 | } | 1913 | } |
| 1765 | 1914 | ||
| @@ -1769,7 +1918,8 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1769 | if ((s->options & SSL_OP_NETSCAPE_CA_DN_BUG)) | 1918 | if ((s->options & SSL_OP_NETSCAPE_CA_DN_BUG)) |
| 1770 | goto cont; /* netscape bugs */ | 1919 | goto cont; /* netscape bugs */ |
| 1771 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1920 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1772 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_CA_DN_TOO_LONG); | 1921 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1922 | SSL_R_CA_DN_TOO_LONG); | ||
| 1773 | goto err; | 1923 | goto err; |
| 1774 | } | 1924 | } |
| 1775 | 1925 | ||
| @@ -1780,19 +1930,23 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1780 | if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG) | 1930 | if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG) |
| 1781 | goto cont; | 1931 | goto cont; |
| 1782 | else { | 1932 | else { |
| 1783 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1933 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 1784 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, ERR_R_ASN1_LIB); | 1934 | SSL_AD_DECODE_ERROR); |
| 1935 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1936 | ERR_R_ASN1_LIB); | ||
| 1785 | goto err; | 1937 | goto err; |
| 1786 | } | 1938 | } |
| 1787 | } | 1939 | } |
| 1788 | 1940 | ||
| 1789 | if (q != (p + l)) { | 1941 | if (q != (p + l)) { |
| 1790 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1942 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1791 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_CA_DN_LENGTH_MISMATCH); | 1943 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1944 | SSL_R_CA_DN_LENGTH_MISMATCH); | ||
| 1792 | goto err; | 1945 | goto err; |
| 1793 | } | 1946 | } |
| 1794 | if (!sk_X509_NAME_push(ca_sk, xn)) { | 1947 | if (!sk_X509_NAME_push(ca_sk, xn)) { |
| 1795 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, ERR_R_MALLOC_FAILURE); | 1948 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1949 | ERR_R_MALLOC_FAILURE); | ||
| 1796 | goto err; | 1950 | goto err; |
| 1797 | } | 1951 | } |
| 1798 | 1952 | ||
| @@ -1801,7 +1955,7 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1801 | } | 1955 | } |
| 1802 | 1956 | ||
| 1803 | if (0) { | 1957 | if (0) { |
| 1804 | cont: | 1958 | cont: |
| 1805 | ERR_clear_error(); | 1959 | ERR_clear_error(); |
| 1806 | } | 1960 | } |
| 1807 | 1961 | ||
| @@ -1814,7 +1968,7 @@ cont: | |||
| 1814 | ca_sk = NULL; | 1968 | ca_sk = NULL; |
| 1815 | 1969 | ||
| 1816 | ret = 1; | 1970 | ret = 1; |
| 1817 | err: | 1971 | err: |
| 1818 | if (ca_sk != NULL) | 1972 | if (ca_sk != NULL) |
| 1819 | sk_X509_NAME_pop_free(ca_sk, X509_NAME_free); | 1973 | sk_X509_NAME_pop_free(ca_sk, X509_NAME_free); |
| 1820 | return (ret); | 1974 | return (ret); |
| @@ -1830,10 +1984,10 @@ ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b) | |||
| 1830 | int | 1984 | int |
| 1831 | ssl3_get_new_session_ticket(SSL *s) | 1985 | ssl3_get_new_session_ticket(SSL *s) |
| 1832 | { | 1986 | { |
| 1833 | int ok, al, ret = 0, ticklen; | 1987 | int ok, al, ret = 0, ticklen; |
| 1834 | long n; | 1988 | long n; |
| 1835 | const unsigned char *p; | 1989 | const unsigned char *p; |
| 1836 | unsigned char *d; | 1990 | unsigned char *d; |
| 1837 | 1991 | ||
| 1838 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SESSION_TICKET_A, | 1992 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SESSION_TICKET_A, |
| 1839 | SSL3_ST_CR_SESSION_TICKET_B, -1, 16384, &ok); | 1993 | SSL3_ST_CR_SESSION_TICKET_B, -1, 16384, &ok); |
| @@ -1846,13 +2000,15 @@ ssl3_get_new_session_ticket(SSL *s) | |||
| 1846 | } | 2000 | } |
| 1847 | if (s->s3->tmp.message_type != SSL3_MT_NEWSESSION_TICKET) { | 2001 | if (s->s3->tmp.message_type != SSL3_MT_NEWSESSION_TICKET) { |
| 1848 | al = SSL_AD_UNEXPECTED_MESSAGE; | 2002 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 1849 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_BAD_MESSAGE_TYPE); | 2003 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, |
| 2004 | SSL_R_BAD_MESSAGE_TYPE); | ||
| 1850 | goto f_err; | 2005 | goto f_err; |
| 1851 | } | 2006 | } |
| 1852 | if (n < 6) { | 2007 | if (n < 6) { |
| 1853 | /* need at least ticket_lifetime_hint + ticket length */ | 2008 | /* need at least ticket_lifetime_hint + ticket length */ |
| 1854 | al = SSL_AD_DECODE_ERROR; | 2009 | al = SSL_AD_DECODE_ERROR; |
| 1855 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_LENGTH_MISMATCH); | 2010 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, |
| 2011 | SSL_R_LENGTH_MISMATCH); | ||
| 1856 | goto f_err; | 2012 | goto f_err; |
| 1857 | } | 2013 | } |
| 1858 | 2014 | ||
| @@ -1862,7 +2018,8 @@ ssl3_get_new_session_ticket(SSL *s) | |||
| 1862 | /* ticket_lifetime_hint + ticket_length + ticket */ | 2018 | /* ticket_lifetime_hint + ticket_length + ticket */ |
| 1863 | if (ticklen + 6 != n) { | 2019 | if (ticklen + 6 != n) { |
| 1864 | al = SSL_AD_DECODE_ERROR; | 2020 | al = SSL_AD_DECODE_ERROR; |
| 1865 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_LENGTH_MISMATCH); | 2021 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, |
| 2022 | SSL_R_LENGTH_MISMATCH); | ||
| 1866 | goto f_err; | 2023 | goto f_err; |
| 1867 | } | 2024 | } |
| 1868 | if (s->session->tlsext_tick) { | 2025 | if (s->session->tlsext_tick) { |
| @@ -1871,12 +2028,14 @@ ssl3_get_new_session_ticket(SSL *s) | |||
| 1871 | } | 2028 | } |
| 1872 | s->session->tlsext_tick = malloc(ticklen); | 2029 | s->session->tlsext_tick = malloc(ticklen); |
| 1873 | if (!s->session->tlsext_tick) { | 2030 | if (!s->session->tlsext_tick) { |
| 1874 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, ERR_R_MALLOC_FAILURE); | 2031 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, |
| 2032 | ERR_R_MALLOC_FAILURE); | ||
| 1875 | goto err; | 2033 | goto err; |
| 1876 | } | 2034 | } |
| 1877 | memcpy(s->session->tlsext_tick, p, ticklen); | 2035 | memcpy(s->session->tlsext_tick, p, ticklen); |
| 1878 | s->session->tlsext_ticklen = ticklen; | 2036 | s->session->tlsext_ticklen = ticklen; |
| 1879 | /* There are two ways to detect a resumed ticket sesion. | 2037 | /* |
| 2038 | * There are two ways to detect a resumed ticket sesion. | ||
| 1880 | * One is to set an appropriate session ID and then the server | 2039 | * One is to set an appropriate session ID and then the server |
| 1881 | * must return a match in ServerHello. This allows the normal | 2040 | * must return a match in ServerHello. This allows the normal |
| 1882 | * client session ID matching to work and we know much | 2041 | * client session ID matching to work and we know much |
| @@ -1891,23 +2050,22 @@ ssl3_get_new_session_ticket(SSL *s) | |||
| 1891 | * to the SHA256 (or SHA1 is SHA256 is disabled) hash of the | 2050 | * to the SHA256 (or SHA1 is SHA256 is disabled) hash of the |
| 1892 | * ticket. | 2051 | * ticket. |
| 1893 | */ | 2052 | */ |
| 1894 | EVP_Digest(p, ticklen, | 2053 | EVP_Digest(p, ticklen, s->session->session_id, |
| 1895 | s->session->session_id, &s->session->session_id_length, | 2054 | &s->session->session_id_length, EVP_sha256(), NULL); |
| 1896 | EVP_sha256(), NULL); | ||
| 1897 | ret = 1; | 2055 | ret = 1; |
| 1898 | return (ret); | 2056 | return (ret); |
| 1899 | f_err: | 2057 | f_err: |
| 1900 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2058 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1901 | err: | 2059 | err: |
| 1902 | return (-1); | 2060 | return (-1); |
| 1903 | } | 2061 | } |
| 1904 | 2062 | ||
| 1905 | int | 2063 | int |
| 1906 | ssl3_get_cert_status(SSL *s) | 2064 | ssl3_get_cert_status(SSL *s) |
| 1907 | { | 2065 | { |
| 1908 | int ok, al; | 2066 | int ok, al; |
| 1909 | unsigned long resplen, n; | 2067 | unsigned long resplen, n; |
| 1910 | const unsigned char *p; | 2068 | const unsigned char *p; |
| 1911 | 2069 | ||
| 1912 | n = s->method->ssl_get_message(s, | 2070 | n = s->method->ssl_get_message(s, |
| 1913 | SSL3_ST_CR_CERT_STATUS_A, | 2071 | SSL3_ST_CR_CERT_STATUS_A, |
| @@ -1921,19 +2079,22 @@ ssl3_get_cert_status(SSL *s) | |||
| 1921 | if (n < 4) { | 2079 | if (n < 4) { |
| 1922 | /* need at least status type + length */ | 2080 | /* need at least status type + length */ |
| 1923 | al = SSL_AD_DECODE_ERROR; | 2081 | al = SSL_AD_DECODE_ERROR; |
| 1924 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_LENGTH_MISMATCH); | 2082 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2083 | SSL_R_LENGTH_MISMATCH); | ||
| 1925 | goto f_err; | 2084 | goto f_err; |
| 1926 | } | 2085 | } |
| 1927 | p = (unsigned char *)s->init_msg; | 2086 | p = (unsigned char *)s->init_msg; |
| 1928 | if (*p++ != TLSEXT_STATUSTYPE_ocsp) { | 2087 | if (*p++ != TLSEXT_STATUSTYPE_ocsp) { |
| 1929 | al = SSL_AD_DECODE_ERROR; | 2088 | al = SSL_AD_DECODE_ERROR; |
| 1930 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_UNSUPPORTED_STATUS_TYPE); | 2089 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2090 | SSL_R_UNSUPPORTED_STATUS_TYPE); | ||
| 1931 | goto f_err; | 2091 | goto f_err; |
| 1932 | } | 2092 | } |
| 1933 | n2l3(p, resplen); | 2093 | n2l3(p, resplen); |
| 1934 | if (resplen + 4 != n) { | 2094 | if (resplen + 4 != n) { |
| 1935 | al = SSL_AD_DECODE_ERROR; | 2095 | al = SSL_AD_DECODE_ERROR; |
| 1936 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_LENGTH_MISMATCH); | 2096 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2097 | SSL_R_LENGTH_MISMATCH); | ||
| 1937 | goto f_err; | 2098 | goto f_err; |
| 1938 | } | 2099 | } |
| 1939 | if (s->tlsext_ocsp_resp) | 2100 | if (s->tlsext_ocsp_resp) |
| @@ -1941,7 +2102,8 @@ ssl3_get_cert_status(SSL *s) | |||
| 1941 | s->tlsext_ocsp_resp = BUF_memdup(p, resplen); | 2102 | s->tlsext_ocsp_resp = BUF_memdup(p, resplen); |
| 1942 | if (!s->tlsext_ocsp_resp) { | 2103 | if (!s->tlsext_ocsp_resp) { |
| 1943 | al = SSL_AD_INTERNAL_ERROR; | 2104 | al = SSL_AD_INTERNAL_ERROR; |
| 1944 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, ERR_R_MALLOC_FAILURE); | 2105 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2106 | ERR_R_MALLOC_FAILURE); | ||
| 1945 | goto f_err; | 2107 | goto f_err; |
| 1946 | } | 2108 | } |
| 1947 | s->tlsext_ocsp_resplen = resplen; | 2109 | s->tlsext_ocsp_resplen = resplen; |
| @@ -1950,17 +2112,19 @@ ssl3_get_cert_status(SSL *s) | |||
| 1950 | ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg); | 2112 | ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg); |
| 1951 | if (ret == 0) { | 2113 | if (ret == 0) { |
| 1952 | al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE; | 2114 | al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE; |
| 1953 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_INVALID_STATUS_RESPONSE); | 2115 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2116 | SSL_R_INVALID_STATUS_RESPONSE); | ||
| 1954 | goto f_err; | 2117 | goto f_err; |
| 1955 | } | 2118 | } |
| 1956 | if (ret < 0) { | 2119 | if (ret < 0) { |
| 1957 | al = SSL_AD_INTERNAL_ERROR; | 2120 | al = SSL_AD_INTERNAL_ERROR; |
| 1958 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, ERR_R_MALLOC_FAILURE); | 2121 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2122 | ERR_R_MALLOC_FAILURE); | ||
| 1959 | goto f_err; | 2123 | goto f_err; |
| 1960 | } | 2124 | } |
| 1961 | } | 2125 | } |
| 1962 | return 1; | 2126 | return 1; |
| 1963 | f_err: | 2127 | f_err: |
| 1964 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2128 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1965 | return (-1); | 2129 | return (-1); |
| 1966 | } | 2130 | } |
| @@ -1969,8 +2133,8 @@ f_err: | |||
| 1969 | int | 2133 | int |
| 1970 | ssl3_get_server_done(SSL *s) | 2134 | ssl3_get_server_done(SSL *s) |
| 1971 | { | 2135 | { |
| 1972 | int ok, ret = 0; | 2136 | int ok, ret = 0; |
| 1973 | long n; | 2137 | long n; |
| 1974 | 2138 | ||
| 1975 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SRVR_DONE_A, | 2139 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SRVR_DONE_A, |
| 1976 | SSL3_ST_CR_SRVR_DONE_B, SSL3_MT_SERVER_DONE, | 2140 | SSL3_ST_CR_SRVR_DONE_B, SSL3_MT_SERVER_DONE, |
| @@ -1981,7 +2145,8 @@ ssl3_get_server_done(SSL *s) | |||
| 1981 | if (n > 0) { | 2145 | if (n > 0) { |
| 1982 | /* should contain no data */ | 2146 | /* should contain no data */ |
| 1983 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 2147 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1984 | SSLerr(SSL_F_SSL3_GET_SERVER_DONE, SSL_R_LENGTH_MISMATCH); | 2148 | SSLerr(SSL_F_SSL3_GET_SERVER_DONE, |
| 2149 | SSL_R_LENGTH_MISMATCH); | ||
| 1985 | return -1; | 2150 | return -1; |
| 1986 | } | 2151 | } |
| 1987 | ret = 1; | 2152 | ret = 1; |
| @@ -1992,21 +2157,21 @@ ssl3_get_server_done(SSL *s) | |||
| 1992 | int | 2157 | int |
| 1993 | ssl3_send_client_key_exchange(SSL *s) | 2158 | ssl3_send_client_key_exchange(SSL *s) |
| 1994 | { | 2159 | { |
| 1995 | unsigned char *p, *d; | 2160 | unsigned char *p, *d; |
| 1996 | int n; | 2161 | int n; |
| 1997 | unsigned long alg_k; | 2162 | unsigned long alg_k; |
| 1998 | unsigned char *q; | 2163 | unsigned char *q; |
| 1999 | EVP_PKEY *pkey = NULL; | 2164 | EVP_PKEY *pkey = NULL; |
| 2000 | #ifndef OPENSSL_NO_KRB5 | 2165 | #ifndef OPENSSL_NO_KRB5 |
| 2001 | KSSL_ERR kssl_err; | 2166 | KSSL_ERR kssl_err; |
| 2002 | #endif /* OPENSSL_NO_KRB5 */ | 2167 | #endif /* OPENSSL_NO_KRB5 */ |
| 2003 | #ifndef OPENSSL_NO_ECDH | 2168 | #ifndef OPENSSL_NO_ECDH |
| 2004 | EC_KEY *clnt_ecdh = NULL; | 2169 | EC_KEY *clnt_ecdh = NULL; |
| 2005 | const EC_POINT *srvr_ecpoint = NULL; | 2170 | const EC_POINT *srvr_ecpoint = NULL; |
| 2006 | EVP_PKEY *srvr_pub_pkey = NULL; | 2171 | EVP_PKEY *srvr_pub_pkey = NULL; |
| 2007 | unsigned char *encodedPoint = NULL; | 2172 | unsigned char *encodedPoint = NULL; |
| 2008 | int encoded_pt_len = 0; | 2173 | int encoded_pt_len = 0; |
| 2009 | BN_CTX * bn_ctx = NULL; | 2174 | BN_CTX *bn_ctx = NULL; |
| 2010 | #endif | 2175 | #endif |
| 2011 | 2176 | ||
| 2012 | if (s->state == SSL3_ST_CW_KEY_EXCH_A) { | 2177 | if (s->state == SSL3_ST_CW_KEY_EXCH_A) { |
| @@ -2022,11 +2187,15 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2022 | if (s->session->sess_cert->peer_rsa_tmp != NULL) | 2187 | if (s->session->sess_cert->peer_rsa_tmp != NULL) |
| 2023 | rsa = s->session->sess_cert->peer_rsa_tmp; | 2188 | rsa = s->session->sess_cert->peer_rsa_tmp; |
| 2024 | else { | 2189 | else { |
| 2025 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509); | 2190 | pkey = X509_get_pubkey( |
| 2191 | s->session->sess_cert->peer_pkeys[ | ||
| 2192 | SSL_PKEY_RSA_ENC].x509); | ||
| 2026 | if ((pkey == NULL) || | 2193 | if ((pkey == NULL) || |
| 2027 | (pkey->type != EVP_PKEY_RSA) || | 2194 | (pkey->type != EVP_PKEY_RSA) || |
| 2028 | (pkey->pkey.rsa == NULL)) { | 2195 | (pkey->pkey.rsa == NULL)) { |
| 2029 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 2196 | SSLerr( |
| 2197 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2198 | ERR_R_INTERNAL_ERROR); | ||
| 2030 | goto err; | 2199 | goto err; |
| 2031 | } | 2200 | } |
| 2032 | rsa = pkey->pkey.rsa; | 2201 | rsa = pkey->pkey.rsa; |
| @@ -2047,7 +2216,8 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2047 | n = RSA_public_encrypt(sizeof tmp_buf, | 2216 | n = RSA_public_encrypt(sizeof tmp_buf, |
| 2048 | tmp_buf, p, rsa, RSA_PKCS1_PADDING); | 2217 | tmp_buf, p, rsa, RSA_PKCS1_PADDING); |
| 2049 | if (n <= 0) { | 2218 | if (n <= 0) { |
| 2050 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, SSL_R_BAD_RSA_ENCRYPT); | 2219 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2220 | SSL_R_BAD_RSA_ENCRYPT); | ||
| 2051 | goto err; | 2221 | goto err; |
| 2052 | } | 2222 | } |
| 2053 | 2223 | ||
| @@ -2075,14 +2245,14 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2075 | unsigned char iv[EVP_MAX_IV_LENGTH]; | 2245 | unsigned char iv[EVP_MAX_IV_LENGTH]; |
| 2076 | unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH]; | 2246 | unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH]; |
| 2077 | unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH | 2247 | unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH |
| 2078 | + EVP_MAX_IV_LENGTH]; | 2248 | + EVP_MAX_IV_LENGTH]; |
| 2079 | int padl, outl = sizeof(epms); | 2249 | int padl, outl = sizeof(epms); |
| 2080 | 2250 | ||
| 2081 | EVP_CIPHER_CTX_init(&ciph_ctx); | 2251 | EVP_CIPHER_CTX_init(&ciph_ctx); |
| 2082 | 2252 | ||
| 2083 | #ifdef KSSL_DEBUG | 2253 | #ifdef KSSL_DEBUG |
| 2084 | printf("ssl3_send_client_key_exchange(%lx & %lx)\n", | 2254 | printf("ssl3_send_client_key_exchange(%lx & %lx)\n", |
| 2085 | alg_k, SSL_kKRB5); | 2255 | alg_k, SSL_kKRB5); |
| 2086 | #endif /* KSSL_DEBUG */ | 2256 | #endif /* KSSL_DEBUG */ |
| 2087 | 2257 | ||
| 2088 | authp = NULL; | 2258 | authp = NULL; |
| @@ -2100,44 +2270,46 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2100 | { | 2270 | { |
| 2101 | printf("kssl_cget_tkt rtn %d\n", krb5rc); | 2271 | printf("kssl_cget_tkt rtn %d\n", krb5rc); |
| 2102 | if (krb5rc && kssl_err.text) | 2272 | if (krb5rc && kssl_err.text) |
| 2103 | printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text); | 2273 | printf("kssl_cget_tkt kssl_err=%s\n", |
| 2274 | kssl_err.text); | ||
| 2104 | } | 2275 | } |
| 2105 | #endif /* KSSL_DEBUG */ | 2276 | #endif /* KSSL_DEBUG */ |
| 2106 | 2277 | ||
| 2107 | if (krb5rc) { | 2278 | if (krb5rc) { |
| 2108 | ssl3_send_alert(s, SSL3_AL_FATAL, | 2279 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 2109 | SSL_AD_HANDSHAKE_FAILURE); | 2280 | SSL_AD_HANDSHAKE_FAILURE); |
| 2110 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2281 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2111 | kssl_err.reason); | 2282 | kssl_err.reason); |
| 2112 | goto err; | 2283 | goto err; |
| 2113 | } | 2284 | } |
| 2114 | 2285 | ||
| 2115 | /* 20010406 VRS - Earlier versions used KRB5 AP_REQ | 2286 | /* |
| 2116 | ** in place of RFC 2712 KerberosWrapper, as in: | 2287 | * 20010406 VRS - Earlier versions used KRB5 AP_REQ |
| 2117 | ** | 2288 | * in place of RFC 2712 KerberosWrapper, as in: |
| 2118 | ** Send ticket (copy to *p, set n = length) | 2289 | * |
| 2119 | ** n = krb5_ap_req.length; | 2290 | * Send ticket (copy to *p, set n = length) |
| 2120 | ** memcpy(p, krb5_ap_req.data, krb5_ap_req.length); | 2291 | * n = krb5_ap_req.length; |
| 2121 | ** if (krb5_ap_req.data) | 2292 | * memcpy(p, krb5_ap_req.data, krb5_ap_req.length); |
| 2122 | ** kssl_krb5_free_data_contents(NULL,&krb5_ap_req); | 2293 | * if (krb5_ap_req.data) |
| 2123 | ** | 2294 | * kssl_krb5_free_data_contents(NULL,&krb5_ap_req); |
| 2124 | ** Now using real RFC 2712 KerberosWrapper | 2295 | * |
| 2125 | ** (Thanks to Simon Wilkinson <sxw@sxw.org.uk>) | 2296 | * Now using real RFC 2712 KerberosWrapper |
| 2126 | ** Note: 2712 "opaque" types are here replaced | 2297 | * (Thanks to Simon Wilkinson <sxw@sxw.org.uk>) |
| 2127 | ** with a 2-byte length followed by the value. | 2298 | * Note: 2712 "opaque" types are here replaced |
| 2128 | ** Example: | 2299 | * with a 2-byte length followed by the value. |
| 2129 | ** KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms | 2300 | * Example: |
| 2130 | ** Where "xx xx" = length bytes. Shown here with | 2301 | * KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms |
| 2131 | ** optional authenticator omitted. | 2302 | * Where "xx xx" = length bytes. Shown here with |
| 2132 | */ | 2303 | * optional authenticator omitted. |
| 2133 | 2304 | */ | |
| 2134 | /* KerberosWrapper.Ticket */ | 2305 | |
| 2306 | /* KerberosWrapper.Ticket */ | ||
| 2135 | s2n(enc_ticket->length, p); | 2307 | s2n(enc_ticket->length, p); |
| 2136 | memcpy(p, enc_ticket->data, enc_ticket->length); | 2308 | memcpy(p, enc_ticket->data, enc_ticket->length); |
| 2137 | p += enc_ticket->length; | 2309 | p += enc_ticket->length; |
| 2138 | n = enc_ticket->length + 2; | 2310 | n = enc_ticket->length + 2; |
| 2139 | 2311 | ||
| 2140 | /* KerberosWrapper.Authenticator */ | 2312 | /* KerberosWrapper.Authenticator */ |
| 2141 | if (authp && authp->length) { | 2313 | if (authp && authp->length) { |
| 2142 | s2n(authp->length, p); | 2314 | s2n(authp->length, p); |
| 2143 | memcpy(p, authp->data, authp->length); | 2315 | memcpy(p, authp->data, authp->length); |
| @@ -2153,32 +2325,34 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2153 | } | 2325 | } |
| 2154 | 2326 | ||
| 2155 | tmp_buf[0] = s->client_version >> 8; | 2327 | tmp_buf[0] = s->client_version >> 8; |
| 2156 | tmp_buf[1] = s->client_version&0xff; | 2328 | tmp_buf[1] = s->client_version & 0xff; |
| 2157 | if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= 0) | 2329 | if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= 0) |
| 2158 | goto err; | 2330 | goto err; |
| 2159 | 2331 | ||
| 2160 | /* 20010420 VRS. Tried it this way; failed. | 2332 | /* |
| 2161 | ** EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL); | 2333 | * 20010420 VRS. Tried it this way; failed. |
| 2162 | ** EVP_CIPHER_CTX_set_key_length(&ciph_ctx, | 2334 | * EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL); |
| 2163 | ** kssl_ctx->length); | 2335 | * EVP_CIPHER_CTX_set_key_length(&ciph_ctx, |
| 2164 | ** EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv); | 2336 | * kssl_ctx->length); |
| 2165 | */ | 2337 | * EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv); |
| 2338 | */ | ||
| 2166 | 2339 | ||
| 2167 | memset(iv, 0, sizeof iv); | 2340 | memset(iv, 0, sizeof iv); |
| 2168 | /* per RFC 1510 */ | 2341 | /* per RFC 1510 */ |
| 2169 | EVP_EncryptInit_ex(&ciph_ctx, enc, NULL, | 2342 | EVP_EncryptInit_ex(&ciph_ctx, enc, NULL, |
| 2170 | kssl_ctx->key, iv); | 2343 | kssl_ctx->key, iv); |
| 2171 | EVP_EncryptUpdate(&ciph_ctx, epms, &outl, tmp_buf, | 2344 | EVP_EncryptUpdate(&ciph_ctx, epms, &outl, tmp_buf, |
| 2172 | sizeof tmp_buf); | 2345 | sizeof tmp_buf); |
| 2173 | EVP_EncryptFinal_ex(&ciph_ctx, &(epms[outl]), &padl); | 2346 | EVP_EncryptFinal_ex(&ciph_ctx, &(epms[outl]), &padl); |
| 2174 | outl += padl; | 2347 | outl += padl; |
| 2175 | if (outl > (int)sizeof epms) { | 2348 | if (outl > (int)sizeof epms) { |
| 2176 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 2349 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2350 | ERR_R_INTERNAL_ERROR); | ||
| 2177 | goto err; | 2351 | goto err; |
| 2178 | } | 2352 | } |
| 2179 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | 2353 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); |
| 2180 | 2354 | ||
| 2181 | /* KerberosWrapper.EncryptedPreMasterSecret */ | 2355 | /* KerberosWrapper.EncryptedPreMasterSecret */ |
| 2182 | s2n(outl, p); | 2356 | s2n(outl, p); |
| 2183 | memcpy(p, epms, outl); | 2357 | memcpy(p, epms, outl); |
| 2184 | p += outl; | 2358 | p += outl; |
| @@ -2198,50 +2372,58 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2198 | DH *dh_srvr, *dh_clnt; | 2372 | DH *dh_srvr, *dh_clnt; |
| 2199 | 2373 | ||
| 2200 | if (s->session->sess_cert == NULL) { | 2374 | if (s->session->sess_cert == NULL) { |
| 2201 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); | 2375 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 2202 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, SSL_R_UNEXPECTED_MESSAGE); | 2376 | SSL_AD_UNEXPECTED_MESSAGE); |
| 2377 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2378 | SSL_R_UNEXPECTED_MESSAGE); | ||
| 2203 | goto err; | 2379 | goto err; |
| 2204 | } | 2380 | } |
| 2205 | 2381 | ||
| 2206 | if (s->session->sess_cert->peer_dh_tmp != NULL) | 2382 | if (s->session->sess_cert->peer_dh_tmp != NULL) |
| 2207 | dh_srvr = s->session->sess_cert->peer_dh_tmp; | 2383 | dh_srvr = s->session->sess_cert->peer_dh_tmp; |
| 2208 | else { | 2384 | else { |
| 2209 | /* we get them from the cert */ | 2385 | /* We get them from the cert. */ |
| 2210 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 2386 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 2211 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, SSL_R_UNABLE_TO_FIND_DH_PARAMETERS); | 2387 | SSL_AD_HANDSHAKE_FAILURE); |
| 2388 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2389 | SSL_R_UNABLE_TO_FIND_DH_PARAMETERS); | ||
| 2212 | goto err; | 2390 | goto err; |
| 2213 | } | 2391 | } |
| 2214 | 2392 | ||
| 2215 | /* generate a new random key */ | 2393 | /* Generate a new random key. */ |
| 2216 | if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) { | 2394 | if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) { |
| 2217 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB); | 2395 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2396 | ERR_R_DH_LIB); | ||
| 2218 | goto err; | 2397 | goto err; |
| 2219 | } | 2398 | } |
| 2220 | if (!DH_generate_key(dh_clnt)) { | 2399 | if (!DH_generate_key(dh_clnt)) { |
| 2221 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB); | 2400 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2401 | ERR_R_DH_LIB); | ||
| 2222 | DH_free(dh_clnt); | 2402 | DH_free(dh_clnt); |
| 2223 | goto err; | 2403 | goto err; |
| 2224 | } | 2404 | } |
| 2225 | 2405 | ||
| 2226 | /* use the 'p' output buffer for the DH key, but | 2406 | /* |
| 2227 | * make sure to clear it out afterwards */ | 2407 | * Use the 'p' output buffer for the DH key, but |
| 2228 | 2408 | * make sure to clear it out afterwards. | |
| 2409 | */ | ||
| 2229 | n = DH_compute_key(p, dh_srvr->pub_key, dh_clnt); | 2410 | n = DH_compute_key(p, dh_srvr->pub_key, dh_clnt); |
| 2230 | 2411 | ||
| 2231 | if (n <= 0) { | 2412 | if (n <= 0) { |
| 2232 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB); | 2413 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2414 | ERR_R_DH_LIB); | ||
| 2233 | DH_free(dh_clnt); | 2415 | DH_free(dh_clnt); |
| 2234 | goto err; | 2416 | goto err; |
| 2235 | } | 2417 | } |
| 2236 | 2418 | ||
| 2237 | /* generate master key from the result */ | 2419 | /* Generate master key from the result. */ |
| 2238 | s->session->master_key_length = | 2420 | s->session->master_key_length = |
| 2239 | s->method->ssl3_enc->generate_master_secret(s, | 2421 | s->method->ssl3_enc->generate_master_secret(s, |
| 2240 | s->session->master_key, p, n); | 2422 | s->session->master_key, p, n); |
| 2241 | /* clean up */ | 2423 | /* Clean up. */ |
| 2242 | memset(p, 0, n); | 2424 | memset(p, 0, n); |
| 2243 | 2425 | ||
| 2244 | /* send off the data */ | 2426 | /* Send off the data. */ |
| 2245 | n = BN_num_bytes(dh_clnt->pub_key); | 2427 | n = BN_num_bytes(dh_clnt->pub_key); |
| 2246 | s2n(n, p); | 2428 | s2n(n, p); |
| 2247 | BN_bn2bin(dh_clnt->pub_key, p); | 2429 | BN_bn2bin(dh_clnt->pub_key, p); |
| @@ -2260,13 +2442,15 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2260 | int ecdh_clnt_cert = 0; | 2442 | int ecdh_clnt_cert = 0; |
| 2261 | int field_size = 0; | 2443 | int field_size = 0; |
| 2262 | 2444 | ||
| 2263 | /* Did we send out the client's | 2445 | /* |
| 2264 | * ECDH share for use in premaster | 2446 | * Did we send out the client's ECDH share for use |
| 2265 | * computation as part of client certificate? | 2447 | * in premaster computation as part of client |
| 2266 | * If so, set ecdh_clnt_cert to 1. | 2448 | * certificate? If so, set ecdh_clnt_cert to 1. |
| 2267 | */ | 2449 | */ |
| 2268 | if ((alg_k & (SSL_kECDHr|SSL_kECDHe)) && (s->cert != NULL)) { | 2450 | if ((alg_k & (SSL_kECDHr|SSL_kECDHe)) && |
| 2269 | /* XXX: For now, we do not support client | 2451 | (s->cert != NULL)) { |
| 2452 | /* | ||
| 2453 | * XXX: For now, we do not support client | ||
| 2270 | * authentication using ECDH certificates. | 2454 | * authentication using ECDH certificates. |
| 2271 | * To add such support, one needs to add | 2455 | * To add such support, one needs to add |
| 2272 | * code that checks for appropriate | 2456 | * code that checks for appropriate |
| @@ -2294,10 +2478,11 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2294 | srvr_pub_pkey = X509_get_pubkey(s->session-> \ | 2478 | srvr_pub_pkey = X509_get_pubkey(s->session-> \ |
| 2295 | sess_cert->peer_pkeys[SSL_PKEY_ECC].x509); | 2479 | sess_cert->peer_pkeys[SSL_PKEY_ECC].x509); |
| 2296 | if ((srvr_pub_pkey == NULL) || | 2480 | if ((srvr_pub_pkey == NULL) || |
| 2297 | (srvr_pub_pkey->type != EVP_PKEY_EC) || | 2481 | (srvr_pub_pkey->type != EVP_PKEY_EC) || |
| 2298 | (srvr_pub_pkey->pkey.ec == NULL)) { | 2482 | (srvr_pub_pkey->pkey.ec == NULL)) { |
| 2299 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2483 | SSLerr( |
| 2300 | ERR_R_INTERNAL_ERROR); | 2484 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2485 | ERR_R_INTERNAL_ERROR); | ||
| 2301 | goto err; | 2486 | goto err; |
| 2302 | } | 2487 | } |
| 2303 | 2488 | ||
| @@ -2309,21 +2494,24 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2309 | 2494 | ||
| 2310 | if ((srvr_group == NULL) || (srvr_ecpoint == NULL)) { | 2495 | if ((srvr_group == NULL) || (srvr_ecpoint == NULL)) { |
| 2311 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2496 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2312 | ERR_R_INTERNAL_ERROR); | 2497 | ERR_R_INTERNAL_ERROR); |
| 2313 | goto err; | 2498 | goto err; |
| 2314 | } | 2499 | } |
| 2315 | 2500 | ||
| 2316 | if ((clnt_ecdh = EC_KEY_new()) == NULL) { | 2501 | if ((clnt_ecdh = EC_KEY_new()) == NULL) { |
| 2317 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 2502 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2503 | ERR_R_MALLOC_FAILURE); | ||
| 2318 | goto err; | 2504 | goto err; |
| 2319 | } | 2505 | } |
| 2320 | 2506 | ||
| 2321 | if (!EC_KEY_set_group(clnt_ecdh, srvr_group)) { | 2507 | if (!EC_KEY_set_group(clnt_ecdh, srvr_group)) { |
| 2322 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_EC_LIB); | 2508 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2509 | ERR_R_EC_LIB); | ||
| 2323 | goto err; | 2510 | goto err; |
| 2324 | } | 2511 | } |
| 2325 | if (ecdh_clnt_cert) { | 2512 | if (ecdh_clnt_cert) { |
| 2326 | /* Reuse key info from our certificate | 2513 | /* |
| 2514 | * Reuse key info from our certificate | ||
| 2327 | * We only need our private key to perform | 2515 | * We only need our private key to perform |
| 2328 | * the ECDH computation. | 2516 | * the ECDH computation. |
| 2329 | */ | 2517 | */ |
| @@ -2331,73 +2519,83 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2331 | tkey = s->cert->key->privatekey->pkey.ec; | 2519 | tkey = s->cert->key->privatekey->pkey.ec; |
| 2332 | priv_key = EC_KEY_get0_private_key(tkey); | 2520 | priv_key = EC_KEY_get0_private_key(tkey); |
| 2333 | if (priv_key == NULL) { | 2521 | if (priv_key == NULL) { |
| 2334 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 2522 | SSLerr( |
| 2523 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2524 | ERR_R_MALLOC_FAILURE); | ||
| 2335 | goto err; | 2525 | goto err; |
| 2336 | } | 2526 | } |
| 2337 | if (!EC_KEY_set_private_key(clnt_ecdh, priv_key)) { | 2527 | if (!EC_KEY_set_private_key(clnt_ecdh, |
| 2338 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_EC_LIB); | 2528 | priv_key)) { |
| 2529 | SSLerr( | ||
| 2530 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2531 | ERR_R_EC_LIB); | ||
| 2339 | goto err; | 2532 | goto err; |
| 2340 | } | 2533 | } |
| 2341 | } else { | 2534 | } else { |
| 2342 | /* Generate a new ECDH key pair */ | 2535 | /* Generate a new ECDH key pair */ |
| 2343 | if (!(EC_KEY_generate_key(clnt_ecdh))) { | 2536 | if (!(EC_KEY_generate_key(clnt_ecdh))) { |
| 2344 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB); | 2537 | SSLerr( |
| 2538 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2539 | ERR_R_ECDH_LIB); | ||
| 2345 | goto err; | 2540 | goto err; |
| 2346 | } | 2541 | } |
| 2347 | } | 2542 | } |
| 2348 | 2543 | ||
| 2349 | /* use the 'p' output buffer for the ECDH key, but | 2544 | /* |
| 2350 | * make sure to clear it out afterwards | 2545 | * Use the 'p' output buffer for the ECDH key, but |
| 2546 | * make sure to clear it out afterwards. | ||
| 2351 | */ | 2547 | */ |
| 2352 | |||
| 2353 | field_size = EC_GROUP_get_degree(srvr_group); | 2548 | field_size = EC_GROUP_get_degree(srvr_group); |
| 2354 | if (field_size <= 0) { | 2549 | if (field_size <= 0) { |
| 2355 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2550 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2356 | ERR_R_ECDH_LIB); | 2551 | ERR_R_ECDH_LIB); |
| 2357 | goto err; | 2552 | goto err; |
| 2358 | } | 2553 | } |
| 2359 | n = ECDH_compute_key(p, (field_size + 7)/8, srvr_ecpoint, clnt_ecdh, NULL); | 2554 | n = ECDH_compute_key(p, (field_size + 7)/8, |
| 2555 | srvr_ecpoint, clnt_ecdh, NULL); | ||
| 2360 | if (n <= 0) { | 2556 | if (n <= 0) { |
| 2361 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2557 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2362 | ERR_R_ECDH_LIB); | 2558 | ERR_R_ECDH_LIB); |
| 2363 | goto err; | 2559 | goto err; |
| 2364 | } | 2560 | } |
| 2365 | 2561 | ||
| 2366 | /* generate master key from the result */ | 2562 | /* generate master key from the result */ |
| 2367 | s->session->master_key_length = s->method->ssl3_enc \ | 2563 | s->session->master_key_length = s->method->ssl3_enc \ |
| 2368 | -> generate_master_secret(s, | 2564 | -> generate_master_secret(s, |
| 2369 | s->session->master_key, | 2565 | s->session->master_key, p, n); |
| 2370 | p, n); | ||
| 2371 | 2566 | ||
| 2372 | memset(p, 0, n); /* clean up */ | 2567 | memset(p, 0, n); /* clean up */ |
| 2373 | 2568 | ||
| 2374 | if (ecdh_clnt_cert) { | 2569 | if (ecdh_clnt_cert) { |
| 2375 | /* Send empty client key exch message */ | 2570 | /* Send empty client key exch message. */ |
| 2376 | n = 0; | 2571 | n = 0; |
| 2377 | } else { | 2572 | } else { |
| 2378 | /* First check the size of encoding and | 2573 | /* |
| 2574 | * First check the size of encoding and | ||
| 2379 | * allocate memory accordingly. | 2575 | * allocate memory accordingly. |
| 2380 | */ | 2576 | */ |
| 2381 | encoded_pt_len = | 2577 | encoded_pt_len = EC_POINT_point2oct( |
| 2382 | EC_POINT_point2oct(srvr_group, | 2578 | srvr_group, |
| 2383 | EC_KEY_get0_public_key(clnt_ecdh), | 2579 | EC_KEY_get0_public_key(clnt_ecdh), |
| 2384 | POINT_CONVERSION_UNCOMPRESSED, | 2580 | POINT_CONVERSION_UNCOMPRESSED, |
| 2385 | NULL, 0, NULL); | 2581 | NULL, 0, NULL); |
| 2386 | 2582 | ||
| 2387 | encodedPoint = malloc(encoded_pt_len); | 2583 | encodedPoint = malloc(encoded_pt_len); |
| 2388 | 2584 | ||
| 2389 | bn_ctx = BN_CTX_new(); | 2585 | bn_ctx = BN_CTX_new(); |
| 2390 | if ((encodedPoint == NULL) || | 2586 | if ((encodedPoint == NULL) || |
| 2391 | (bn_ctx == NULL)) { | 2587 | (bn_ctx == NULL)) { |
| 2392 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 2588 | SSLerr( |
| 2589 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2590 | ERR_R_MALLOC_FAILURE); | ||
| 2393 | goto err; | 2591 | goto err; |
| 2394 | } | 2592 | } |
| 2395 | 2593 | ||
| 2396 | /* Encode the public key */ | 2594 | /* Encode the public key */ |
| 2397 | n = EC_POINT_point2oct(srvr_group, | 2595 | n = EC_POINT_point2oct(srvr_group, |
| 2398 | EC_KEY_get0_public_key(clnt_ecdh), | 2596 | EC_KEY_get0_public_key(clnt_ecdh), |
| 2399 | POINT_CONVERSION_UNCOMPRESSED, | 2597 | POINT_CONVERSION_UNCOMPRESSED, |
| 2400 | encodedPoint, encoded_pt_len, bn_ctx); | 2598 | encodedPoint, encoded_pt_len, bn_ctx); |
| 2401 | 2599 | ||
| 2402 | *p = n; /* length of encoded point */ | 2600 | *p = n; /* length of encoded point */ |
| 2403 | /* Encoded point will be copied here */ | 2601 | /* Encoded point will be copied here */ |
| @@ -2427,61 +2625,80 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2427 | size_t msglen; | 2625 | size_t msglen; |
| 2428 | unsigned int md_len; | 2626 | unsigned int md_len; |
| 2429 | int keytype; | 2627 | int keytype; |
| 2430 | unsigned char premaster_secret[32], shared_ukm[32], tmp[256]; | 2628 | unsigned char premaster_secret[32], shared_ukm[32], |
| 2629 | tmp[256]; | ||
| 2431 | EVP_MD_CTX *ukm_hash; | 2630 | EVP_MD_CTX *ukm_hash; |
| 2432 | EVP_PKEY *pub_key; | 2631 | EVP_PKEY *pub_key; |
| 2433 | 2632 | ||
| 2434 | /* Get server sertificate PKEY and create ctx from it */ | 2633 | /* Get server sertificate PKEY and create ctx from it */ |
| 2435 | peer_cert = s->session->sess_cert->peer_pkeys[(keytype = SSL_PKEY_GOST01)].x509; | 2634 | peer_cert = s->session->sess_cert->peer_pkeys[( |
| 2635 | keytype = SSL_PKEY_GOST01)].x509; | ||
| 2436 | if (!peer_cert) | 2636 | if (!peer_cert) |
| 2437 | peer_cert = s->session->sess_cert->peer_pkeys[(keytype = SSL_PKEY_GOST94)].x509; | 2637 | peer_cert = s->session->sess_cert->peer_pkeys[ |
| 2638 | (keytype = SSL_PKEY_GOST94)].x509; | ||
| 2438 | if (!peer_cert) { | 2639 | if (!peer_cert) { |
| 2439 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER); | 2640 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2641 | SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER); | ||
| 2440 | goto err; | 2642 | goto err; |
| 2441 | } | 2643 | } |
| 2442 | 2644 | ||
| 2443 | pkey_ctx = EVP_PKEY_CTX_new(pub_key = X509_get_pubkey(peer_cert), NULL); | 2645 | pkey_ctx = EVP_PKEY_CTX_new( |
| 2444 | /* If we have send a certificate, and certificate key | 2646 | pub_key = X509_get_pubkey(peer_cert), |
| 2445 | 2647 | NULL); | |
| 2648 | /* | ||
| 2649 | * If we have send a certificate, and certificate key | ||
| 2446 | * parameters match those of server certificate, use | 2650 | * parameters match those of server certificate, use |
| 2447 | * certificate key for key exchange | 2651 | * certificate key for key exchange. |
| 2652 | * Otherwise, generate ephemeral key pair. | ||
| 2448 | */ | 2653 | */ |
| 2449 | 2654 | ||
| 2450 | /* Otherwise, generate ephemeral key pair */ | ||
| 2451 | |||
| 2452 | EVP_PKEY_encrypt_init(pkey_ctx); | 2655 | EVP_PKEY_encrypt_init(pkey_ctx); |
| 2453 | /* Generate session key */ | 2656 | /* Generate session key. */ |
| 2454 | RAND_bytes(premaster_secret, 32); | 2657 | RAND_bytes(premaster_secret, 32); |
| 2455 | /* If we have client certificate, use its secret as peer key */ | 2658 | /* |
| 2659 | * If we have client certificate, use its secret | ||
| 2660 | * as peer key. | ||
| 2661 | */ | ||
| 2456 | if (s->s3->tmp.cert_req && s->cert->key->privatekey) { | 2662 | if (s->s3->tmp.cert_req && s->cert->key->privatekey) { |
| 2457 | if (EVP_PKEY_derive_set_peer(pkey_ctx, s->cert->key->privatekey) <=0) { | 2663 | if (EVP_PKEY_derive_set_peer(pkey_ctx, |
| 2458 | /* If there was an error - just ignore it. Ephemeral key | 2664 | s->cert->key->privatekey) <=0) { |
| 2459 | * would be used | 2665 | /* |
| 2460 | */ | 2666 | * If there was an error - |
| 2667 | * just ignore it. Ephemeral key | ||
| 2668 | * would be used | ||
| 2669 | */ | ||
| 2461 | ERR_clear_error(); | 2670 | ERR_clear_error(); |
| 2462 | } | 2671 | } |
| 2463 | } | 2672 | } |
| 2464 | /* Compute shared IV and store it in algorithm-specific | 2673 | /* |
| 2465 | * context data */ | 2674 | * Compute shared IV and store it in algorithm-specific |
| 2675 | * context data | ||
| 2676 | */ | ||
| 2466 | ukm_hash = EVP_MD_CTX_create(); | 2677 | ukm_hash = EVP_MD_CTX_create(); |
| 2467 | EVP_DigestInit(ukm_hash, EVP_get_digestbynid(NID_id_GostR3411_94)); | 2678 | EVP_DigestInit(ukm_hash, |
| 2468 | EVP_DigestUpdate(ukm_hash, s->s3->client_random, SSL3_RANDOM_SIZE); | 2679 | EVP_get_digestbynid(NID_id_GostR3411_94)); |
| 2469 | EVP_DigestUpdate(ukm_hash, s->s3->server_random, SSL3_RANDOM_SIZE); | 2680 | EVP_DigestUpdate(ukm_hash, |
| 2681 | s->s3->client_random, SSL3_RANDOM_SIZE); | ||
| 2682 | EVP_DigestUpdate(ukm_hash, | ||
| 2683 | s->s3->server_random, SSL3_RANDOM_SIZE); | ||
| 2470 | EVP_DigestFinal_ex(ukm_hash, shared_ukm, &md_len); | 2684 | EVP_DigestFinal_ex(ukm_hash, shared_ukm, &md_len); |
| 2471 | EVP_MD_CTX_destroy(ukm_hash); | 2685 | EVP_MD_CTX_destroy(ukm_hash); |
| 2472 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, EVP_PKEY_OP_ENCRYPT, EVP_PKEY_CTRL_SET_IV, | 2686 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, EVP_PKEY_OP_ENCRYPT, |
| 2473 | 8, shared_ukm) < 0) { | 2687 | EVP_PKEY_CTRL_SET_IV, 8, shared_ukm) < 0) { |
| 2474 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2688 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2475 | SSL_R_LIBRARY_BUG); | 2689 | SSL_R_LIBRARY_BUG); |
| 2476 | goto err; | 2690 | goto err; |
| 2477 | } | 2691 | } |
| 2478 | /* Make GOST keytransport blob message */ | 2692 | /* |
| 2479 | /*Encapsulate it into sequence */ | 2693 | * Make GOST keytransport blob message, |
| 2694 | * encapsulate it into sequence. | ||
| 2695 | */ | ||
| 2480 | *(p++) = V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED; | 2696 | *(p++) = V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED; |
| 2481 | msglen = 255; | 2697 | msglen = 255; |
| 2482 | if (EVP_PKEY_encrypt(pkey_ctx, tmp, &msglen, premaster_secret, 32) < 0) { | 2698 | if (EVP_PKEY_encrypt(pkey_ctx, tmp, &msglen, |
| 2699 | premaster_secret, 32) < 0) { | ||
| 2483 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2700 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2484 | SSL_R_LIBRARY_BUG); | 2701 | SSL_R_LIBRARY_BUG); |
| 2485 | goto err; | 2702 | goto err; |
| 2486 | } | 2703 | } |
| 2487 | if (msglen >= 0x80) { | 2704 | if (msglen >= 0x80) { |
| @@ -2493,16 +2710,17 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2493 | n = msglen + 2; | 2710 | n = msglen + 2; |
| 2494 | } | 2711 | } |
| 2495 | memcpy(p, tmp, msglen); | 2712 | memcpy(p, tmp, msglen); |
| 2496 | /* Check if pubkey from client certificate was used */ | 2713 | /* Check if pubkey from client certificate was used. */ |
| 2497 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, EVP_PKEY_CTRL_PEER_KEY, 2, NULL) > 0) { | 2714 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, |
| 2498 | /* Set flag "skip certificate verify" */ | 2715 | EVP_PKEY_CTRL_PEER_KEY, 2, NULL) > 0) { |
| 2716 | /* Set flag "skip certificate verify". */ | ||
| 2499 | s->s3->flags |= TLS1_FLAGS_SKIP_CERT_VERIFY; | 2717 | s->s3->flags |= TLS1_FLAGS_SKIP_CERT_VERIFY; |
| 2500 | } | 2718 | } |
| 2501 | EVP_PKEY_CTX_free(pkey_ctx); | 2719 | EVP_PKEY_CTX_free(pkey_ctx); |
| 2502 | s->session->master_key_length = | 2720 | s->session->master_key_length = |
| 2503 | s->method->ssl3_enc->generate_master_secret(s, | 2721 | s->method->ssl3_enc->generate_master_secret(s, |
| 2504 | s->session->master_key, premaster_secret, 32); | 2722 | s->session->master_key, premaster_secret, 32); |
| 2505 | EVP_PKEY_free(pub_key); | 2723 | EVP_PKEY_free(pub_key); |
| 2506 | 2724 | ||
| 2507 | } | 2725 | } |
| 2508 | #ifndef OPENSSL_NO_SRP | 2726 | #ifndef OPENSSL_NO_SRP |
| @@ -2514,7 +2732,8 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2514 | BN_bn2bin(s->srp_ctx.A, p); | 2732 | BN_bn2bin(s->srp_ctx.A, p); |
| 2515 | n += 2; | 2733 | n += 2; |
| 2516 | } else { | 2734 | } else { |
| 2517 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 2735 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2736 | ERR_R_INTERNAL_ERROR); | ||
| 2518 | goto err; | 2737 | goto err; |
| 2519 | } | 2738 | } |
| 2520 | if (s->session->srp_username != NULL) | 2739 | if (s->session->srp_username != NULL) |
| @@ -2522,12 +2741,15 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2522 | s->session->srp_username = BUF_strdup(s->srp_ctx.login); | 2741 | s->session->srp_username = BUF_strdup(s->srp_ctx.login); |
| 2523 | if (s->session->srp_username == NULL) { | 2742 | if (s->session->srp_username == NULL) { |
| 2524 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2743 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2525 | ERR_R_MALLOC_FAILURE); | 2744 | ERR_R_MALLOC_FAILURE); |
| 2526 | goto err; | 2745 | goto err; |
| 2527 | } | 2746 | } |
| 2528 | 2747 | ||
| 2529 | if ((s->session->master_key_length = SRP_generate_client_master_secret(s, s->session->master_key)) < 0) { | 2748 | if ((s->session->master_key_length = |
| 2530 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 2749 | SRP_generate_client_master_secret(s, |
| 2750 | s->session->master_key)) < 0) { | ||
| 2751 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2752 | ERR_R_INTERNAL_ERROR); | ||
| 2531 | goto err; | 2753 | goto err; |
| 2532 | } | 2754 | } |
| 2533 | } | 2755 | } |
| @@ -2543,27 +2765,29 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2543 | n = 0; | 2765 | n = 0; |
| 2544 | if (s->psk_client_callback == NULL) { | 2766 | if (s->psk_client_callback == NULL) { |
| 2545 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2767 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2546 | SSL_R_PSK_NO_CLIENT_CB); | 2768 | SSL_R_PSK_NO_CLIENT_CB); |
| 2547 | goto err; | 2769 | goto err; |
| 2548 | } | 2770 | } |
| 2549 | 2771 | ||
| 2550 | psk_len = s->psk_client_callback(s, s->ctx->psk_identity_hint, | 2772 | psk_len = s->psk_client_callback(s, |
| 2551 | identity, PSK_MAX_IDENTITY_LEN, | 2773 | s->ctx->psk_identity_hint, identity, |
| 2552 | psk_or_pre_ms, sizeof(psk_or_pre_ms)); | 2774 | PSK_MAX_IDENTITY_LEN, psk_or_pre_ms, |
| 2775 | sizeof(psk_or_pre_ms)); | ||
| 2553 | if (psk_len > PSK_MAX_PSK_LEN) { | 2776 | if (psk_len > PSK_MAX_PSK_LEN) { |
| 2554 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2777 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2555 | ERR_R_INTERNAL_ERROR); | 2778 | ERR_R_INTERNAL_ERROR); |
| 2556 | goto psk_err; | 2779 | goto psk_err; |
| 2557 | } else if (psk_len == 0) { | 2780 | } else if (psk_len == 0) { |
| 2558 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2781 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2559 | SSL_R_PSK_IDENTITY_NOT_FOUND); | 2782 | SSL_R_PSK_IDENTITY_NOT_FOUND); |
| 2560 | goto psk_err; | 2783 | goto psk_err; |
| 2561 | } | 2784 | } |
| 2562 | 2785 | ||
| 2563 | /* create PSK pre_master_secret */ | 2786 | /* create PSK pre_master_secret */ |
| 2564 | pre_ms_len = 2 + psk_len + 2 + psk_len; | 2787 | pre_ms_len = 2 + psk_len + 2 + psk_len; |
| 2565 | t = psk_or_pre_ms; | 2788 | t = psk_or_pre_ms; |
| 2566 | memmove(psk_or_pre_ms + psk_len + 4, psk_or_pre_ms, psk_len); | 2789 | memmove(psk_or_pre_ms + psk_len + 4, |
| 2790 | psk_or_pre_ms, psk_len); | ||
| 2567 | s2n(psk_len, t); | 2791 | s2n(psk_len, t); |
| 2568 | memset(t, 0, psk_len); | 2792 | memset(t, 0, psk_len); |
| 2569 | t += psk_len; | 2793 | t += psk_len; |
| @@ -2571,11 +2795,12 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2571 | 2795 | ||
| 2572 | if (s->session->psk_identity_hint != NULL) | 2796 | if (s->session->psk_identity_hint != NULL) |
| 2573 | free(s->session->psk_identity_hint); | 2797 | free(s->session->psk_identity_hint); |
| 2574 | s->session->psk_identity_hint = BUF_strdup(s->ctx->psk_identity_hint); | 2798 | s->session->psk_identity_hint = |
| 2799 | BUF_strdup(s->ctx->psk_identity_hint); | ||
| 2575 | if (s->ctx->psk_identity_hint != NULL && | 2800 | if (s->ctx->psk_identity_hint != NULL && |
| 2576 | s->session->psk_identity_hint == NULL) { | 2801 | s->session->psk_identity_hint == NULL) { |
| 2577 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2802 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2578 | ERR_R_MALLOC_FAILURE); | 2803 | ERR_R_MALLOC_FAILURE); |
| 2579 | goto psk_err; | 2804 | goto psk_err; |
| 2580 | } | 2805 | } |
| 2581 | 2806 | ||
| @@ -2584,25 +2809,26 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2584 | s->session->psk_identity = BUF_strdup(identity); | 2809 | s->session->psk_identity = BUF_strdup(identity); |
| 2585 | if (s->session->psk_identity == NULL) { | 2810 | if (s->session->psk_identity == NULL) { |
| 2586 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2811 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2587 | ERR_R_MALLOC_FAILURE); | 2812 | ERR_R_MALLOC_FAILURE); |
| 2588 | goto psk_err; | 2813 | goto psk_err; |
| 2589 | } | 2814 | } |
| 2590 | 2815 | ||
| 2591 | s->session->master_key_length = | 2816 | s->session->master_key_length = |
| 2592 | s->method->ssl3_enc->generate_master_secret( | 2817 | s->method->ssl3_enc->generate_master_secret( |
| 2593 | s, s->session->master_key, psk_or_pre_ms, | 2818 | s, s->session->master_key, psk_or_pre_ms, |
| 2594 | pre_ms_len); | 2819 | pre_ms_len); |
| 2595 | 2820 | ||
| 2596 | n = strlen(identity); | 2821 | n = strlen(identity); |
| 2597 | s2n(n, p); | 2822 | s2n(n, p); |
| 2598 | memcpy(p, identity, n); | 2823 | memcpy(p, identity, n); |
| 2599 | n += 2; | 2824 | n += 2; |
| 2600 | psk_err = 0; | 2825 | psk_err = 0; |
| 2601 | psk_err: | 2826 | psk_err: |
| 2602 | OPENSSL_cleanse(identity, PSK_MAX_IDENTITY_LEN); | 2827 | OPENSSL_cleanse(identity, PSK_MAX_IDENTITY_LEN); |
| 2603 | OPENSSL_cleanse(psk_or_pre_ms, sizeof(psk_or_pre_ms)); | 2828 | OPENSSL_cleanse(psk_or_pre_ms, sizeof(psk_or_pre_ms)); |
| 2604 | if (psk_err != 0) { | 2829 | if (psk_err != 0) { |
| 2605 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 2830 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 2831 | SSL_AD_HANDSHAKE_FAILURE); | ||
| 2606 | goto err; | 2832 | goto err; |
| 2607 | } | 2833 | } |
| 2608 | } | 2834 | } |
| @@ -2626,7 +2852,7 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2626 | 2852 | ||
| 2627 | /* SSL3_ST_CW_KEY_EXCH_B */ | 2853 | /* SSL3_ST_CW_KEY_EXCH_B */ |
| 2628 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); | 2854 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); |
| 2629 | err: | 2855 | err: |
| 2630 | #ifndef OPENSSL_NO_ECDH | 2856 | #ifndef OPENSSL_NO_ECDH |
| 2631 | BN_CTX_free(bn_ctx); | 2857 | BN_CTX_free(bn_ctx); |
| 2632 | if (encodedPoint != NULL) | 2858 | if (encodedPoint != NULL) |
| @@ -2641,14 +2867,14 @@ err: | |||
| 2641 | int | 2867 | int |
| 2642 | ssl3_send_client_verify(SSL *s) | 2868 | ssl3_send_client_verify(SSL *s) |
| 2643 | { | 2869 | { |
| 2644 | unsigned char *p, *d; | 2870 | unsigned char *p, *d; |
| 2645 | unsigned char data[MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH]; | 2871 | unsigned char data[MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH]; |
| 2646 | EVP_PKEY *pkey; | 2872 | EVP_PKEY *pkey; |
| 2647 | EVP_PKEY_CTX *pctx = NULL; | 2873 | EVP_PKEY_CTX *pctx = NULL; |
| 2648 | EVP_MD_CTX mctx; | 2874 | EVP_MD_CTX mctx; |
| 2649 | unsigned u = 0; | 2875 | unsigned u = 0; |
| 2650 | unsigned long n; | 2876 | unsigned long n; |
| 2651 | int j; | 2877 | int j; |
| 2652 | 2878 | ||
| 2653 | EVP_MD_CTX_init(&mctx); | 2879 | EVP_MD_CTX_init(&mctx); |
| 2654 | 2880 | ||
| @@ -2656,18 +2882,21 @@ ssl3_send_client_verify(SSL *s) | |||
| 2656 | d = (unsigned char *)s->init_buf->data; | 2882 | d = (unsigned char *)s->init_buf->data; |
| 2657 | p = &(d[4]); | 2883 | p = &(d[4]); |
| 2658 | pkey = s->cert->key->privatekey; | 2884 | pkey = s->cert->key->privatekey; |
| 2659 | /* Create context from key and test if sha1 is allowed as digest */ | 2885 | /* |
| 2886 | * Create context from key and test if sha1 is allowed as | ||
| 2887 | * digest. | ||
| 2888 | */ | ||
| 2660 | pctx = EVP_PKEY_CTX_new(pkey, NULL); | 2889 | pctx = EVP_PKEY_CTX_new(pkey, NULL); |
| 2661 | EVP_PKEY_sign_init(pctx); | 2890 | EVP_PKEY_sign_init(pctx); |
| 2662 | if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1()) > 0) { | 2891 | if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1()) > 0) { |
| 2663 | if (TLS1_get_version(s) < TLS1_2_VERSION) | 2892 | if (TLS1_get_version(s) < TLS1_2_VERSION) |
| 2664 | s->method->ssl3_enc->cert_verify_mac(s, | 2893 | s->method->ssl3_enc->cert_verify_mac(s, |
| 2665 | NID_sha1, | 2894 | NID_sha1, &(data[MD5_DIGEST_LENGTH])); |
| 2666 | &(data[MD5_DIGEST_LENGTH])); | ||
| 2667 | } else { | 2895 | } else { |
| 2668 | ERR_clear_error(); | 2896 | ERR_clear_error(); |
| 2669 | } | 2897 | } |
| 2670 | /* For TLS v1.2 send signature algorithm and signature | 2898 | /* |
| 2899 | * For TLS v1.2 send signature algorithm and signature | ||
| 2671 | * using agreed digest and cached handshake records. | 2900 | * using agreed digest and cached handshake records. |
| 2672 | */ | 2901 | */ |
| 2673 | if (TLS1_get_version(s) >= TLS1_2_VERSION) { | 2902 | if (TLS1_get_version(s) >= TLS1_2_VERSION) { |
| @@ -2675,10 +2904,11 @@ ssl3_send_client_verify(SSL *s) | |||
| 2675 | void *hdata; | 2904 | void *hdata; |
| 2676 | const EVP_MD *md = s->cert->key->digest; | 2905 | const EVP_MD *md = s->cert->key->digest; |
| 2677 | hdatalen = BIO_get_mem_data(s->s3->handshake_buffer, | 2906 | hdatalen = BIO_get_mem_data(s->s3->handshake_buffer, |
| 2678 | &hdata); | 2907 | &hdata); |
| 2679 | if (hdatalen <= 0 || !tls12_get_sigandhash(p, pkey, md)) { | 2908 | if (hdatalen <= 0 || |
| 2909 | !tls12_get_sigandhash(p, pkey, md)) { | ||
| 2680 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, | 2910 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2681 | ERR_R_INTERNAL_ERROR); | 2911 | ERR_R_INTERNAL_ERROR); |
| 2682 | goto err; | 2912 | goto err; |
| 2683 | } | 2913 | } |
| 2684 | p += 2; | 2914 | p += 2; |
| @@ -2690,7 +2920,7 @@ ssl3_send_client_verify(SSL *s) | |||
| 2690 | !EVP_SignUpdate(&mctx, hdata, hdatalen) || | 2920 | !EVP_SignUpdate(&mctx, hdata, hdatalen) || |
| 2691 | !EVP_SignFinal(&mctx, p + 2, &u, pkey)) { | 2921 | !EVP_SignFinal(&mctx, p + 2, &u, pkey)) { |
| 2692 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, | 2922 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2693 | ERR_R_EVP_LIB); | 2923 | ERR_R_EVP_LIB); |
| 2694 | goto err; | 2924 | goto err; |
| 2695 | } | 2925 | } |
| 2696 | s2n(u, p); | 2926 | s2n(u, p); |
| @@ -2704,7 +2934,8 @@ ssl3_send_client_verify(SSL *s) | |||
| 2704 | if (RSA_sign(NID_md5_sha1, data, | 2934 | if (RSA_sign(NID_md5_sha1, data, |
| 2705 | MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH, &(p[2]), | 2935 | MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH, &(p[2]), |
| 2706 | &u, pkey->pkey.rsa) <= 0 ) { | 2936 | &u, pkey->pkey.rsa) <= 0 ) { |
| 2707 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_RSA_LIB); | 2937 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2938 | ERR_R_RSA_LIB); | ||
| 2708 | goto err; | 2939 | goto err; |
| 2709 | } | 2940 | } |
| 2710 | s2n(u, p); | 2941 | s2n(u, p); |
| @@ -2715,7 +2946,8 @@ ssl3_send_client_verify(SSL *s) | |||
| 2715 | &(data[MD5_DIGEST_LENGTH]), | 2946 | &(data[MD5_DIGEST_LENGTH]), |
| 2716 | SHA_DIGEST_LENGTH, &(p[2]), | 2947 | SHA_DIGEST_LENGTH, &(p[2]), |
| 2717 | (unsigned int *)&j, pkey->pkey.dsa)) { | 2948 | (unsigned int *)&j, pkey->pkey.dsa)) { |
| 2718 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_DSA_LIB); | 2949 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2950 | ERR_R_DSA_LIB); | ||
| 2719 | goto err; | 2951 | goto err; |
| 2720 | } | 2952 | } |
| 2721 | s2n(j, p); | 2953 | s2n(j, p); |
| @@ -2728,23 +2960,24 @@ ssl3_send_client_verify(SSL *s) | |||
| 2728 | SHA_DIGEST_LENGTH, &(p[2]), | 2960 | SHA_DIGEST_LENGTH, &(p[2]), |
| 2729 | (unsigned int *)&j, pkey->pkey.ec)) { | 2961 | (unsigned int *)&j, pkey->pkey.ec)) { |
| 2730 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, | 2962 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2731 | ERR_R_ECDSA_LIB); | 2963 | ERR_R_ECDSA_LIB); |
| 2732 | goto err; | 2964 | goto err; |
| 2733 | } | 2965 | } |
| 2734 | s2n(j, p); | 2966 | s2n(j, p); |
| 2735 | n = j + 2; | 2967 | n = j + 2; |
| 2736 | } else | 2968 | } else |
| 2737 | #endif | 2969 | #endif |
| 2738 | if (pkey->type == NID_id_GostR3410_94 || pkey->type == NID_id_GostR3410_2001) { | 2970 | if (pkey->type == NID_id_GostR3410_94 || |
| 2971 | pkey->type == NID_id_GostR3410_2001) { | ||
| 2739 | unsigned char signbuf[64]; | 2972 | unsigned char signbuf[64]; |
| 2740 | int i; | 2973 | int i; |
| 2741 | size_t sigsize = 64; | 2974 | size_t sigsize = 64; |
| 2742 | s->method->ssl3_enc->cert_verify_mac(s, | 2975 | s->method->ssl3_enc->cert_verify_mac(s, |
| 2743 | NID_id_GostR3411_94, | 2976 | NID_id_GostR3411_94, data); |
| 2744 | data); | 2977 | if (EVP_PKEY_sign(pctx, signbuf, &sigsize, data, 32) |
| 2745 | if (EVP_PKEY_sign(pctx, signbuf, &sigsize, data, 32) <= 0) { | 2978 | <= 0) { |
| 2746 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, | 2979 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2747 | ERR_R_INTERNAL_ERROR); | 2980 | ERR_R_INTERNAL_ERROR); |
| 2748 | goto err; | 2981 | goto err; |
| 2749 | } | 2982 | } |
| 2750 | for (i = 63, j = 0; i >= 0; j++, i--) { | 2983 | for (i = 63, j = 0; i >= 0; j++, i--) { |
| @@ -2753,7 +2986,8 @@ ssl3_send_client_verify(SSL *s) | |||
| 2753 | s2n(j, p); | 2986 | s2n(j, p); |
| 2754 | n = j + 2; | 2987 | n = j + 2; |
| 2755 | } else { | 2988 | } else { |
| 2756 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_INTERNAL_ERROR); | 2989 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2990 | ERR_R_INTERNAL_ERROR); | ||
| 2757 | goto err; | 2991 | goto err; |
| 2758 | } | 2992 | } |
| 2759 | *(d++) = SSL3_MT_CERTIFICATE_VERIFY; | 2993 | *(d++) = SSL3_MT_CERTIFICATE_VERIFY; |
| @@ -2766,7 +3000,7 @@ ssl3_send_client_verify(SSL *s) | |||
| 2766 | EVP_MD_CTX_cleanup(&mctx); | 3000 | EVP_MD_CTX_cleanup(&mctx); |
| 2767 | EVP_PKEY_CTX_free(pctx); | 3001 | EVP_PKEY_CTX_free(pctx); |
| 2768 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); | 3002 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); |
| 2769 | err: | 3003 | err: |
| 2770 | EVP_MD_CTX_cleanup(&mctx); | 3004 | EVP_MD_CTX_cleanup(&mctx); |
| 2771 | EVP_PKEY_CTX_free(pctx); | 3005 | EVP_PKEY_CTX_free(pctx); |
| 2772 | return (-1); | 3006 | return (-1); |
| @@ -2775,10 +3009,10 @@ err: | |||
| 2775 | int | 3009 | int |
| 2776 | ssl3_send_client_certificate(SSL *s) | 3010 | ssl3_send_client_certificate(SSL *s) |
| 2777 | { | 3011 | { |
| 2778 | X509 *x509 = NULL; | 3012 | X509 *x509 = NULL; |
| 2779 | EVP_PKEY *pkey = NULL; | 3013 | EVP_PKEY *pkey = NULL; |
| 2780 | int i; | 3014 | int i; |
| 2781 | unsigned long l; | 3015 | unsigned long l; |
| 2782 | 3016 | ||
| 2783 | if (s->state == SSL3_ST_CW_CERT_A) { | 3017 | if (s->state == SSL3_ST_CW_CERT_A) { |
| 2784 | if ((s->cert == NULL) || (s->cert->key->x509 == NULL) || | 3018 | if ((s->cert == NULL) || (s->cert->key->x509 == NULL) || |
| @@ -2792,7 +3026,8 @@ ssl3_send_client_certificate(SSL *s) | |||
| 2792 | if (s->state == SSL3_ST_CW_CERT_B) { | 3026 | if (s->state == SSL3_ST_CW_CERT_B) { |
| 2793 | /* If we get an error, we need to | 3027 | /* If we get an error, we need to |
| 2794 | * ssl->rwstate=SSL_X509_LOOKUP; return(-1); | 3028 | * ssl->rwstate=SSL_X509_LOOKUP; return(-1); |
| 2795 | * We then get retied later */ | 3029 | * We then get retied later |
| 3030 | */ | ||
| 2796 | i = ssl_do_client_cert_cb(s, &x509, &pkey); | 3031 | i = ssl_do_client_cert_cb(s, &x509, &pkey); |
| 2797 | if (i < 0) { | 3032 | if (i < 0) { |
| 2798 | s->rwstate = SSL_X509_LOOKUP; | 3033 | s->rwstate = SSL_X509_LOOKUP; |
| @@ -2806,7 +3041,8 @@ ssl3_send_client_certificate(SSL *s) | |||
| 2806 | i = 0; | 3041 | i = 0; |
| 2807 | } else if (i == 1) { | 3042 | } else if (i == 1) { |
| 2808 | i = 0; | 3043 | i = 0; |
| 2809 | SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE, SSL_R_BAD_DATA_RETURNED_BY_CALLBACK); | 3044 | SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE, |
| 3045 | SSL_R_BAD_DATA_RETURNED_BY_CALLBACK); | ||
| 2810 | } | 3046 | } |
| 2811 | 3047 | ||
| 2812 | if (x509 != NULL) | 3048 | if (x509 != NULL) |
| @@ -2816,7 +3052,8 @@ ssl3_send_client_certificate(SSL *s) | |||
| 2816 | if (i == 0) { | 3052 | if (i == 0) { |
| 2817 | if (s->version == SSL3_VERSION) { | 3053 | if (s->version == SSL3_VERSION) { |
| 2818 | s->s3->tmp.cert_req = 0; | 3054 | s->s3->tmp.cert_req = 0; |
| 2819 | ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_NO_CERTIFICATE); | 3055 | ssl3_send_alert(s, SSL3_AL_WARNING, |
| 3056 | SSL_AD_NO_CERTIFICATE); | ||
| 2820 | return (1); | 3057 | return (1); |
| 2821 | } else { | 3058 | } else { |
| 2822 | s->s3->tmp.cert_req = 2; | 3059 | s->s3->tmp.cert_req = 2; |
| @@ -2830,7 +3067,7 @@ ssl3_send_client_certificate(SSL *s) | |||
| 2830 | if (s->state == SSL3_ST_CW_CERT_C) { | 3067 | if (s->state == SSL3_ST_CW_CERT_C) { |
| 2831 | s->state = SSL3_ST_CW_CERT_D; | 3068 | s->state = SSL3_ST_CW_CERT_D; |
| 2832 | l = ssl3_output_cert_chain(s, | 3069 | l = ssl3_output_cert_chain(s, |
| 2833 | (s->s3->tmp.cert_req == 2) ? NULL : s->cert->key->x509); | 3070 | (s->s3->tmp.cert_req == 2) ? NULL : s->cert->key->x509); |
| 2834 | s->init_num = (int)l; | 3071 | s->init_num = (int)l; |
| 2835 | s->init_off = 0; | 3072 | s->init_off = 0; |
| 2836 | } | 3073 | } |
| @@ -2843,25 +3080,26 @@ ssl3_send_client_certificate(SSL *s) | |||
| 2843 | int | 3080 | int |
| 2844 | ssl3_check_cert_and_algorithm(SSL *s) | 3081 | ssl3_check_cert_and_algorithm(SSL *s) |
| 2845 | { | 3082 | { |
| 2846 | int i, idx; | 3083 | int i, idx; |
| 2847 | long alg_k, alg_a; | 3084 | long alg_k, alg_a; |
| 2848 | EVP_PKEY *pkey = NULL; | 3085 | EVP_PKEY *pkey = NULL; |
| 2849 | SESS_CERT *sc; | 3086 | SESS_CERT *sc; |
| 2850 | RSA *rsa; | 3087 | RSA *rsa; |
| 2851 | #ifndef OPENSSL_NO_DH | 3088 | #ifndef OPENSSL_NO_DH |
| 2852 | DH *dh; | 3089 | DH *dh; |
| 2853 | #endif | 3090 | #endif |
| 2854 | 3091 | ||
| 2855 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; | 3092 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; |
| 2856 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; | 3093 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; |
| 2857 | 3094 | ||
| 2858 | /* we don't have a certificate */ | 3095 | /* We don't have a certificate. */ |
| 2859 | if ((alg_a & (SSL_aDH|SSL_aNULL|SSL_aKRB5)) || (alg_k & SSL_kPSK)) | 3096 | if ((alg_a & (SSL_aDH|SSL_aNULL|SSL_aKRB5)) || (alg_k & SSL_kPSK)) |
| 2860 | return (1); | 3097 | return (1); |
| 2861 | 3098 | ||
| 2862 | sc = s->session->sess_cert; | 3099 | sc = s->session->sess_cert; |
| 2863 | if (sc == NULL) { | 3100 | if (sc == NULL) { |
| 2864 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, ERR_R_INTERNAL_ERROR); | 3101 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3102 | ERR_R_INTERNAL_ERROR); | ||
| 2865 | goto err; | 3103 | goto err; |
| 2866 | } | 3104 | } |
| 2867 | 3105 | ||
| @@ -2870,15 +3108,16 @@ ssl3_check_cert_and_algorithm(SSL *s) | |||
| 2870 | dh = s->session->sess_cert->peer_dh_tmp; | 3108 | dh = s->session->sess_cert->peer_dh_tmp; |
| 2871 | #endif | 3109 | #endif |
| 2872 | 3110 | ||
| 2873 | /* This is the passed certificate */ | 3111 | /* This is the passed certificate. */ |
| 2874 | 3112 | ||
| 2875 | idx = sc->peer_cert_type; | 3113 | idx = sc->peer_cert_type; |
| 2876 | #ifndef OPENSSL_NO_ECDH | 3114 | #ifndef OPENSSL_NO_ECDH |
| 2877 | if (idx == SSL_PKEY_ECC) { | 3115 | if (idx == SSL_PKEY_ECC) { |
| 2878 | if (ssl_check_srvr_ecc_cert_and_alg(sc->peer_pkeys[idx].x509, | 3116 | if (ssl_check_srvr_ecc_cert_and_alg(sc->peer_pkeys[idx].x509, |
| 2879 | s) == 0) | 3117 | s) == 0) |
| 2880 | { /* check failed */ | 3118 | { /* check failed */ |
| 2881 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_BAD_ECC_CERT); | 3119 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3120 | SSL_R_BAD_ECC_CERT); | ||
| 2882 | goto f_err; | 3121 | goto f_err; |
| 2883 | } else { | 3122 | } else { |
| 2884 | return 1; | 3123 | return 1; |
| @@ -2892,59 +3131,71 @@ ssl3_check_cert_and_algorithm(SSL *s) | |||
| 2892 | 3131 | ||
| 2893 | /* Check that we have a certificate if we require one */ | 3132 | /* Check that we have a certificate if we require one */ |
| 2894 | if ((alg_a & SSL_aRSA) && !has_bits(i, EVP_PK_RSA|EVP_PKT_SIGN)) { | 3133 | if ((alg_a & SSL_aRSA) && !has_bits(i, EVP_PK_RSA|EVP_PKT_SIGN)) { |
| 2895 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_RSA_SIGNING_CERT); | 3134 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3135 | SSL_R_MISSING_RSA_SIGNING_CERT); | ||
| 2896 | goto f_err; | 3136 | goto f_err; |
| 2897 | } | 3137 | } |
| 2898 | else if ((alg_a & SSL_aDSS) && !has_bits(i, EVP_PK_DSA|EVP_PKT_SIGN)) { | 3138 | else if ((alg_a & SSL_aDSS) && !has_bits(i, EVP_PK_DSA|EVP_PKT_SIGN)) { |
| 2899 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_DSA_SIGNING_CERT); | 3139 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3140 | SSL_R_MISSING_DSA_SIGNING_CERT); | ||
| 2900 | goto f_err; | 3141 | goto f_err; |
| 2901 | } | 3142 | } |
| 2902 | if ((alg_k & SSL_kRSA) && | 3143 | if ((alg_k & SSL_kRSA) && |
| 2903 | !(has_bits(i, EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL))) { | 3144 | !(has_bits(i, EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL))) { |
| 2904 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_RSA_ENCRYPTING_CERT); | 3145 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3146 | SSL_R_MISSING_RSA_ENCRYPTING_CERT); | ||
| 2905 | goto f_err; | 3147 | goto f_err; |
| 2906 | } | 3148 | } |
| 2907 | #ifndef OPENSSL_NO_DH | 3149 | #ifndef OPENSSL_NO_DH |
| 2908 | if ((alg_k & SSL_kEDH) && | 3150 | if ((alg_k & SSL_kEDH) && |
| 2909 | !(has_bits(i, EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL))) { | 3151 | !(has_bits(i, EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL))) { |
| 2910 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_DH_KEY); | 3152 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3153 | SSL_R_MISSING_DH_KEY); | ||
| 2911 | goto f_err; | 3154 | goto f_err; |
| 2912 | } else if ((alg_k & SSL_kDHr) && !has_bits(i, EVP_PK_DH|EVP_PKS_RSA)) { | 3155 | } else if ((alg_k & SSL_kDHr) && !has_bits(i, EVP_PK_DH|EVP_PKS_RSA)) { |
| 2913 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_DH_RSA_CERT); | 3156 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3157 | SSL_R_MISSING_DH_RSA_CERT); | ||
| 2914 | goto f_err; | 3158 | goto f_err; |
| 2915 | } | 3159 | } |
| 2916 | else if ((alg_k & SSL_kDHd) && !has_bits(i, EVP_PK_DH|EVP_PKS_DSA)) { | 3160 | else if ((alg_k & SSL_kDHd) && !has_bits(i, EVP_PK_DH|EVP_PKS_DSA)) { |
| 2917 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_DH_DSA_CERT); | 3161 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3162 | SSL_R_MISSING_DH_DSA_CERT); | ||
| 2918 | goto f_err; | 3163 | goto f_err; |
| 2919 | } | 3164 | } |
| 2920 | #endif | 3165 | #endif |
| 2921 | 3166 | ||
| 2922 | if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && !has_bits(i, EVP_PKT_EXP)) { | 3167 | if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && |
| 3168 | !has_bits(i, EVP_PKT_EXP)) { | ||
| 2923 | if (alg_k & SSL_kRSA) { | 3169 | if (alg_k & SSL_kRSA) { |
| 2924 | if (rsa == NULL || | 3170 | if (rsa == NULL || RSA_size(rsa) * 8 > |
| 2925 | RSA_size(rsa) * 8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) { | 3171 | SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) { |
| 2926 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_EXPORT_TMP_RSA_KEY); | 3172 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3173 | SSL_R_MISSING_EXPORT_TMP_RSA_KEY); | ||
| 2927 | goto f_err; | 3174 | goto f_err; |
| 2928 | } | 3175 | } |
| 2929 | } else | 3176 | } else |
| 2930 | #ifndef OPENSSL_NO_DH | 3177 | #ifndef OPENSSL_NO_DH |
| 2931 | if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { | 3178 | if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { |
| 2932 | if (dh == NULL || | 3179 | if (dh == NULL || DH_size(dh) * 8 > |
| 2933 | DH_size(dh) * 8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) { | 3180 | SSL_C_EXPORT_PKEYLENGTH( |
| 2934 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_EXPORT_TMP_DH_KEY); | 3181 | s->s3->tmp.new_cipher)) { |
| 3182 | SSLerr( | ||
| 3183 | SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, | ||
| 3184 | SSL_R_MISSING_EXPORT_TMP_DH_KEY); | ||
| 3185 | goto f_err; | ||
| 3186 | } | ||
| 3187 | } else | ||
| 3188 | #endif | ||
| 3189 | { | ||
| 3190 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, | ||
| 3191 | SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE); | ||
| 2935 | goto f_err; | 3192 | goto f_err; |
| 2936 | } | 3193 | } |
| 2937 | } else | ||
| 2938 | #endif | ||
| 2939 | { | ||
| 2940 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE); | ||
| 2941 | goto f_err; | ||
| 2942 | } | ||
| 2943 | } | 3194 | } |
| 2944 | return (1); | 3195 | return (1); |
| 2945 | f_err: | 3196 | f_err: |
| 2946 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 3197 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); |
| 2947 | err: | 3198 | err: |
| 2948 | return (0); | 3199 | return (0); |
| 2949 | } | 3200 | } |
| 2950 | 3201 | ||
| @@ -2952,8 +3203,8 @@ err: | |||
| 2952 | int | 3203 | int |
| 2953 | ssl3_send_next_proto(SSL *s) | 3204 | ssl3_send_next_proto(SSL *s) |
| 2954 | { | 3205 | { |
| 2955 | unsigned int len, padding_len; | 3206 | unsigned int len, padding_len; |
| 2956 | unsigned char *d; | 3207 | unsigned char *d; |
| 2957 | 3208 | ||
| 2958 | if (s->state == SSL3_ST_CW_NEXT_PROTO_A) { | 3209 | if (s->state == SSL3_ST_CW_NEXT_PROTO_A) { |
| 2959 | len = s->next_proto_negotiated_len; | 3210 | len = s->next_proto_negotiated_len; |
| @@ -2974,7 +3225,8 @@ ssl3_send_next_proto(SSL *s) | |||
| 2974 | } | 3225 | } |
| 2975 | #endif /* !OPENSSL_NO_TLSEXT && !OPENSSL_NO_NEXTPROTONEG */ | 3226 | #endif /* !OPENSSL_NO_TLSEXT && !OPENSSL_NO_NEXTPROTONEG */ |
| 2976 | 3227 | ||
| 2977 | /* Check to see if handshake is full or resumed. Usually this is just a | 3228 | /* |
| 3229 | * Check to see if handshake is full or resumed. Usually this is just a | ||
| 2978 | * case of checking to see if a cache hit has occurred. In the case of | 3230 | * case of checking to see if a cache hit has occurred. In the case of |
| 2979 | * session tickets we have to check the next message to be sure. | 3231 | * session tickets we have to check the next message to be sure. |
| 2980 | */ | 3232 | */ |
| @@ -2983,8 +3235,9 @@ ssl3_send_next_proto(SSL *s) | |||
| 2983 | int | 3235 | int |
| 2984 | ssl3_check_finished(SSL *s) | 3236 | ssl3_check_finished(SSL *s) |
| 2985 | { | 3237 | { |
| 2986 | int ok; | 3238 | int ok; |
| 2987 | long n; | 3239 | long n; |
| 3240 | |||
| 2988 | /* If we have no ticket it cannot be a resumed session. */ | 3241 | /* If we have no ticket it cannot be a resumed session. */ |
| 2989 | if (!s->session->tlsext_tick) | 3242 | if (!s->session->tlsext_tick) |
| 2990 | return 1; | 3243 | return 1; |
| @@ -3006,7 +3259,8 @@ ssl3_check_finished(SSL *s) | |||
| 3006 | int | 3259 | int |
| 3007 | ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey) | 3260 | ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey) |
| 3008 | { | 3261 | { |
| 3009 | int i = 0; | 3262 | int i = 0; |
| 3263 | |||
| 3010 | #ifndef OPENSSL_NO_ENGINE | 3264 | #ifndef OPENSSL_NO_ENGINE |
| 3011 | if (s->ctx->client_cert_engine) { | 3265 | if (s->ctx->client_cert_engine) { |
| 3012 | i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s, | 3266 | i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s, |
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index c79464da55..28a3d51b9e 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c | |||
| @@ -2743,9 +2743,11 @@ SSL3_ENC_METHOD SSLv3_enc_data = { | |||
| 2743 | long | 2743 | long |
| 2744 | ssl3_default_timeout(void) | 2744 | ssl3_default_timeout(void) |
| 2745 | { | 2745 | { |
| 2746 | /* 2 hours, the 24 hours mentioned in the SSLv3 spec | 2746 | /* |
| 2747 | * is way too long for http, the cache would over fill */ | 2747 | * 2 hours, the 24 hours mentioned in the SSLv3 spec |
| 2748 | return (60*60*2); | 2748 | * is way too long for http, the cache would over fill |
| 2749 | */ | ||
| 2750 | return (60 * 60 * 2); | ||
| 2749 | } | 2751 | } |
| 2750 | 2752 | ||
| 2751 | int | 2753 | int |
| @@ -2769,13 +2771,14 @@ ssl3_pending(const SSL *s) | |||
| 2769 | if (s->rstate == SSL_ST_READ_BODY) | 2771 | if (s->rstate == SSL_ST_READ_BODY) |
| 2770 | return 0; | 2772 | return 0; |
| 2771 | 2773 | ||
| 2772 | return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? s->s3->rrec.length : 0; | 2774 | return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? |
| 2775 | s->s3->rrec.length : 0; | ||
| 2773 | } | 2776 | } |
| 2774 | 2777 | ||
| 2775 | int | 2778 | int |
| 2776 | ssl3_new(SSL *s) | 2779 | ssl3_new(SSL *s) |
| 2777 | { | 2780 | { |
| 2778 | SSL3_STATE *s3; | 2781 | SSL3_STATE *s3; |
| 2779 | 2782 | ||
| 2780 | if ((s3 = calloc(1, sizeof *s3)) == NULL) | 2783 | if ((s3 = calloc(1, sizeof *s3)) == NULL) |
| 2781 | goto err; | 2784 | goto err; |
| @@ -2840,9 +2843,9 @@ ssl3_free(SSL *s) | |||
| 2840 | void | 2843 | void |
| 2841 | ssl3_clear(SSL *s) | 2844 | ssl3_clear(SSL *s) |
| 2842 | { | 2845 | { |
| 2843 | unsigned char *rp, *wp; | 2846 | unsigned char *rp, *wp; |
| 2844 | size_t rlen, wlen; | 2847 | size_t rlen, wlen; |
| 2845 | int init_extra; | 2848 | int init_extra; |
| 2846 | 2849 | ||
| 2847 | #ifdef TLSEXT_TYPE_opaque_prf_input | 2850 | #ifdef TLSEXT_TYPE_opaque_prf_input |
| 2848 | if (s->s3->client_opaque_prf_input != NULL) | 2851 | if (s->s3->client_opaque_prf_input != NULL) |
| @@ -2932,7 +2935,8 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 2932 | if (cmd == SSL_CTRL_SET_TMP_RSA || cmd == SSL_CTRL_SET_TMP_RSA_CB || | 2935 | if (cmd == SSL_CTRL_SET_TMP_RSA || cmd == SSL_CTRL_SET_TMP_RSA_CB || |
| 2933 | cmd == SSL_CTRL_SET_TMP_DH || cmd == SSL_CTRL_SET_TMP_DH_CB) { | 2936 | cmd == SSL_CTRL_SET_TMP_DH || cmd == SSL_CTRL_SET_TMP_DH_CB) { |
| 2934 | if (!ssl_cert_inst(&s->cert)) { | 2937 | if (!ssl_cert_inst(&s->cert)) { |
| 2935 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_MALLOC_FAILURE); | 2938 | SSLerr(SSL_F_SSL3_CTRL, |
| 2939 | ERR_R_MALLOC_FAILURE); | ||
| 2936 | return (0); | 2940 | return (0); |
| 2937 | } | 2941 | } |
| 2938 | } | 2942 | } |
| @@ -2959,18 +2963,21 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 2959 | case SSL_CTRL_NEED_TMP_RSA: | 2963 | case SSL_CTRL_NEED_TMP_RSA: |
| 2960 | if ((s->cert != NULL) && (s->cert->rsa_tmp == NULL) && | 2964 | if ((s->cert != NULL) && (s->cert->rsa_tmp == NULL) && |
| 2961 | ((s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || | 2965 | ((s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || |
| 2962 | (EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512 / 8)))) | 2966 | (EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) |
| 2967 | > (512 / 8)))) | ||
| 2963 | ret = 1; | 2968 | ret = 1; |
| 2964 | break; | 2969 | break; |
| 2965 | case SSL_CTRL_SET_TMP_RSA: | 2970 | case SSL_CTRL_SET_TMP_RSA: |
| 2966 | { | 2971 | { |
| 2967 | RSA *rsa = (RSA *)parg; | 2972 | RSA *rsa = (RSA *)parg; |
| 2968 | if (rsa == NULL) { | 2973 | if (rsa == NULL) { |
| 2969 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER); | 2974 | SSLerr(SSL_F_SSL3_CTRL, |
| 2975 | ERR_R_PASSED_NULL_PARAMETER); | ||
| 2970 | return (ret); | 2976 | return (ret); |
| 2971 | } | 2977 | } |
| 2972 | if ((rsa = RSAPrivateKey_dup(rsa)) == NULL) { | 2978 | if ((rsa = RSAPrivateKey_dup(rsa)) == NULL) { |
| 2973 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_RSA_LIB); | 2979 | SSLerr(SSL_F_SSL3_CTRL, |
| 2980 | ERR_R_RSA_LIB); | ||
| 2974 | return (ret); | 2981 | return (ret); |
| 2975 | } | 2982 | } |
| 2976 | if (s->cert->rsa_tmp != NULL) | 2983 | if (s->cert->rsa_tmp != NULL) |
| @@ -2981,7 +2988,8 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 2981 | break; | 2988 | break; |
| 2982 | case SSL_CTRL_SET_TMP_RSA_CB: | 2989 | case SSL_CTRL_SET_TMP_RSA_CB: |
| 2983 | { | 2990 | { |
| 2984 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 2991 | SSLerr(SSL_F_SSL3_CTRL, |
| 2992 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 2985 | return (ret); | 2993 | return (ret); |
| 2986 | } | 2994 | } |
| 2987 | break; | 2995 | break; |
| @@ -2990,17 +2998,20 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 2990 | { | 2998 | { |
| 2991 | DH *dh = (DH *)parg; | 2999 | DH *dh = (DH *)parg; |
| 2992 | if (dh == NULL) { | 3000 | if (dh == NULL) { |
| 2993 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER); | 3001 | SSLerr(SSL_F_SSL3_CTRL, |
| 3002 | ERR_R_PASSED_NULL_PARAMETER); | ||
| 2994 | return (ret); | 3003 | return (ret); |
| 2995 | } | 3004 | } |
| 2996 | if ((dh = DHparams_dup(dh)) == NULL) { | 3005 | if ((dh = DHparams_dup(dh)) == NULL) { |
| 2997 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB); | 3006 | SSLerr(SSL_F_SSL3_CTRL, |
| 3007 | ERR_R_DH_LIB); | ||
| 2998 | return (ret); | 3008 | return (ret); |
| 2999 | } | 3009 | } |
| 3000 | if (!(s->options & SSL_OP_SINGLE_DH_USE)) { | 3010 | if (!(s->options & SSL_OP_SINGLE_DH_USE)) { |
| 3001 | if (!DH_generate_key(dh)) { | 3011 | if (!DH_generate_key(dh)) { |
| 3002 | DH_free(dh); | 3012 | DH_free(dh); |
| 3003 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB); | 3013 | SSLerr(SSL_F_SSL3_CTRL, |
| 3014 | ERR_R_DH_LIB); | ||
| 3004 | return (ret); | 3015 | return (ret); |
| 3005 | } | 3016 | } |
| 3006 | } | 3017 | } |
| @@ -3012,7 +3023,8 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3012 | break; | 3023 | break; |
| 3013 | case SSL_CTRL_SET_TMP_DH_CB: | 3024 | case SSL_CTRL_SET_TMP_DH_CB: |
| 3014 | { | 3025 | { |
| 3015 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 3026 | SSLerr(SSL_F_SSL3_CTRL, |
| 3027 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 3016 | return (ret); | 3028 | return (ret); |
| 3017 | } | 3029 | } |
| 3018 | break; | 3030 | break; |
| @@ -3023,18 +3035,21 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3023 | EC_KEY *ecdh = NULL; | 3035 | EC_KEY *ecdh = NULL; |
| 3024 | 3036 | ||
| 3025 | if (parg == NULL) { | 3037 | if (parg == NULL) { |
| 3026 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER); | 3038 | SSLerr(SSL_F_SSL3_CTRL, |
| 3039 | ERR_R_PASSED_NULL_PARAMETER); | ||
| 3027 | return (ret); | 3040 | return (ret); |
| 3028 | } | 3041 | } |
| 3029 | if (!EC_KEY_up_ref((EC_KEY *)parg)) { | 3042 | if (!EC_KEY_up_ref((EC_KEY *)parg)) { |
| 3030 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_ECDH_LIB); | 3043 | SSLerr(SSL_F_SSL3_CTRL, |
| 3044 | ERR_R_ECDH_LIB); | ||
| 3031 | return (ret); | 3045 | return (ret); |
| 3032 | } | 3046 | } |
| 3033 | ecdh = (EC_KEY *)parg; | 3047 | ecdh = (EC_KEY *)parg; |
| 3034 | if (!(s->options & SSL_OP_SINGLE_ECDH_USE)) { | 3048 | if (!(s->options & SSL_OP_SINGLE_ECDH_USE)) { |
| 3035 | if (!EC_KEY_generate_key(ecdh)) { | 3049 | if (!EC_KEY_generate_key(ecdh)) { |
| 3036 | EC_KEY_free(ecdh); | 3050 | EC_KEY_free(ecdh); |
| 3037 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_ECDH_LIB); | 3051 | SSLerr(SSL_F_SSL3_CTRL, |
| 3052 | ERR_R_ECDH_LIB); | ||
| 3038 | return (ret); | 3053 | return (ret); |
| 3039 | } | 3054 | } |
| 3040 | } | 3055 | } |
| @@ -3046,7 +3061,8 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3046 | break; | 3061 | break; |
| 3047 | case SSL_CTRL_SET_TMP_ECDH_CB: | 3062 | case SSL_CTRL_SET_TMP_ECDH_CB: |
| 3048 | { | 3063 | { |
| 3049 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 3064 | SSLerr(SSL_F_SSL3_CTRL, |
| 3065 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 3050 | return (ret); | 3066 | return (ret); |
| 3051 | } | 3067 | } |
| 3052 | break; | 3068 | break; |
| @@ -3062,15 +3078,19 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3062 | if (parg == NULL) | 3078 | if (parg == NULL) |
| 3063 | break; | 3079 | break; |
| 3064 | if (strlen((char *)parg) > TLSEXT_MAXLEN_host_name) { | 3080 | if (strlen((char *)parg) > TLSEXT_MAXLEN_host_name) { |
| 3065 | SSLerr(SSL_F_SSL3_CTRL, SSL_R_SSL3_EXT_INVALID_SERVERNAME); | 3081 | SSLerr(SSL_F_SSL3_CTRL, |
| 3082 | SSL_R_SSL3_EXT_INVALID_SERVERNAME); | ||
| 3066 | return 0; | 3083 | return 0; |
| 3067 | } | 3084 | } |
| 3068 | if ((s->tlsext_hostname = BUF_strdup((char *)parg)) == NULL) { | 3085 | if ((s->tlsext_hostname = BUF_strdup((char *)parg)) |
| 3069 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_INTERNAL_ERROR); | 3086 | == NULL) { |
| 3087 | SSLerr(SSL_F_SSL3_CTRL, | ||
| 3088 | ERR_R_INTERNAL_ERROR); | ||
| 3070 | return 0; | 3089 | return 0; |
| 3071 | } | 3090 | } |
| 3072 | } else { | 3091 | } else { |
| 3073 | SSLerr(SSL_F_SSL3_CTRL, SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE); | 3092 | SSLerr(SSL_F_SSL3_CTRL, |
| 3093 | SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE); | ||
| 3074 | return 0; | 3094 | return 0; |
| 3075 | } | 3095 | } |
| 3076 | break; | 3096 | break; |
| @@ -3082,9 +3102,13 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3082 | #ifdef TLSEXT_TYPE_opaque_prf_input | 3102 | #ifdef TLSEXT_TYPE_opaque_prf_input |
| 3083 | case SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT: | 3103 | case SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT: |
| 3084 | if (larg > 12288) { | 3104 | if (larg > 12288) { |
| 3085 | /* actual internal limit is 2^16 for the complete hello message | 3105 | /* |
| 3086 | * (including the cert chain and everything) */ | 3106 | * Actual internal limit is 2^16 for the complete |
| 3087 | SSLerr(SSL_F_SSL3_CTRL, SSL_R_OPAQUE_PRF_INPUT_TOO_LONG); | 3107 | * hello message (including the cert chain and |
| 3108 | * everything) | ||
| 3109 | */ | ||
| 3110 | SSLerr(SSL_F_SSL3_CTRL, | ||
| 3111 | SSL_R_OPAQUE_PRF_INPUT_TOO_LONG); | ||
| 3088 | break; | 3112 | break; |
| 3089 | } | 3113 | } |
| 3090 | if (s->tlsext_opaque_prf_input != NULL) | 3114 | if (s->tlsext_opaque_prf_input != NULL) |
| @@ -3148,11 +3172,12 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3148 | long | 3172 | long |
| 3149 | ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | 3173 | ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) |
| 3150 | { | 3174 | { |
| 3151 | int ret = 0; | 3175 | int ret = 0; |
| 3152 | 3176 | ||
| 3153 | if (cmd == SSL_CTRL_SET_TMP_RSA_CB || cmd == SSL_CTRL_SET_TMP_DH_CB) { | 3177 | if (cmd == SSL_CTRL_SET_TMP_RSA_CB || cmd == SSL_CTRL_SET_TMP_DH_CB) { |
| 3154 | if (!ssl_cert_inst(&s->cert)) { | 3178 | if (!ssl_cert_inst(&s->cert)) { |
| 3155 | SSLerr(SSL_F_SSL3_CALLBACK_CTRL, ERR_R_MALLOC_FAILURE); | 3179 | SSLerr(SSL_F_SSL3_CALLBACK_CTRL, |
| 3180 | ERR_R_MALLOC_FAILURE); | ||
| 3156 | return (0); | 3181 | return (0); |
| 3157 | } | 3182 | } |
| 3158 | } | 3183 | } |
| @@ -3173,14 +3198,15 @@ ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | |||
| 3173 | #ifndef OPENSSL_NO_ECDH | 3198 | #ifndef OPENSSL_NO_ECDH |
| 3174 | case SSL_CTRL_SET_TMP_ECDH_CB: | 3199 | case SSL_CTRL_SET_TMP_ECDH_CB: |
| 3175 | { | 3200 | { |
| 3176 | s->cert->ecdh_tmp_cb = (EC_KEY *(*)(SSL *, int, int))fp; | 3201 | s->cert->ecdh_tmp_cb = |
| 3202 | (EC_KEY *(*)(SSL *, int, int))fp; | ||
| 3177 | } | 3203 | } |
| 3178 | break; | 3204 | break; |
| 3179 | #endif | 3205 | #endif |
| 3180 | #ifndef OPENSSL_NO_TLSEXT | 3206 | #ifndef OPENSSL_NO_TLSEXT |
| 3181 | case SSL_CTRL_SET_TLSEXT_DEBUG_CB: | 3207 | case SSL_CTRL_SET_TLSEXT_DEBUG_CB: |
| 3182 | s->tlsext_debug_cb = (void (*)(SSL *, int , int, | 3208 | s->tlsext_debug_cb = (void (*)(SSL *, int , int, |
| 3183 | unsigned char *, int, void *))fp; | 3209 | unsigned char *, int, void *))fp; |
| 3184 | break; | 3210 | break; |
| 3185 | #endif | 3211 | #endif |
| 3186 | default: | 3212 | default: |
| @@ -3192,7 +3218,7 @@ ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | |||
| 3192 | long | 3218 | long |
| 3193 | ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | 3219 | ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) |
| 3194 | { | 3220 | { |
| 3195 | CERT *cert; | 3221 | CERT *cert; |
| 3196 | 3222 | ||
| 3197 | cert = ctx->cert; | 3223 | cert = ctx->cert; |
| 3198 | 3224 | ||
| @@ -3200,7 +3226,8 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3200 | case SSL_CTRL_NEED_TMP_RSA: | 3226 | case SSL_CTRL_NEED_TMP_RSA: |
| 3201 | if ((cert->rsa_tmp == NULL) && | 3227 | if ((cert->rsa_tmp == NULL) && |
| 3202 | ((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || | 3228 | ((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || |
| 3203 | (EVP_PKEY_size(cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512 / 8)))) | 3229 | (EVP_PKEY_size(cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > |
| 3230 | (512 / 8)))) | ||
| 3204 | return (1); | 3231 | return (1); |
| 3205 | else | 3232 | else |
| 3206 | return (0); | 3233 | return (0); |
| @@ -3219,7 +3246,8 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3219 | i = 0; | 3246 | i = 0; |
| 3220 | } | 3247 | } |
| 3221 | if (!i) { | 3248 | if (!i) { |
| 3222 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_RSA_LIB); | 3249 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3250 | ERR_R_RSA_LIB); | ||
| 3223 | return (0); | 3251 | return (0); |
| 3224 | } else { | 3252 | } else { |
| 3225 | if (cert->rsa_tmp != NULL) | 3253 | if (cert->rsa_tmp != NULL) |
| @@ -3231,7 +3259,8 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3231 | /* break; */ | 3259 | /* break; */ |
| 3232 | case SSL_CTRL_SET_TMP_RSA_CB: | 3260 | case SSL_CTRL_SET_TMP_RSA_CB: |
| 3233 | { | 3261 | { |
| 3234 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 3262 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3263 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 3235 | return (0); | 3264 | return (0); |
| 3236 | } | 3265 | } |
| 3237 | break; | 3266 | break; |
| @@ -3242,12 +3271,14 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3242 | 3271 | ||
| 3243 | dh = (DH *)parg; | 3272 | dh = (DH *)parg; |
| 3244 | if ((new = DHparams_dup(dh)) == NULL) { | 3273 | if ((new = DHparams_dup(dh)) == NULL) { |
| 3245 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_DH_LIB); | 3274 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3275 | ERR_R_DH_LIB); | ||
| 3246 | return 0; | 3276 | return 0; |
| 3247 | } | 3277 | } |
| 3248 | if (!(ctx->options & SSL_OP_SINGLE_DH_USE)) { | 3278 | if (!(ctx->options & SSL_OP_SINGLE_DH_USE)) { |
| 3249 | if (!DH_generate_key(new)) { | 3279 | if (!DH_generate_key(new)) { |
| 3250 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_DH_LIB); | 3280 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3281 | ERR_R_DH_LIB); | ||
| 3251 | DH_free(new); | 3282 | DH_free(new); |
| 3252 | return 0; | 3283 | return 0; |
| 3253 | } | 3284 | } |
| @@ -3260,7 +3291,8 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3260 | /*break; */ | 3291 | /*break; */ |
| 3261 | case SSL_CTRL_SET_TMP_DH_CB: | 3292 | case SSL_CTRL_SET_TMP_DH_CB: |
| 3262 | { | 3293 | { |
| 3263 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 3294 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3295 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 3264 | return (0); | 3296 | return (0); |
| 3265 | } | 3297 | } |
| 3266 | break; | 3298 | break; |
| @@ -3271,18 +3303,21 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3271 | EC_KEY *ecdh = NULL; | 3303 | EC_KEY *ecdh = NULL; |
| 3272 | 3304 | ||
| 3273 | if (parg == NULL) { | 3305 | if (parg == NULL) { |
| 3274 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_ECDH_LIB); | 3306 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3307 | ERR_R_ECDH_LIB); | ||
| 3275 | return 0; | 3308 | return 0; |
| 3276 | } | 3309 | } |
| 3277 | ecdh = EC_KEY_dup((EC_KEY *)parg); | 3310 | ecdh = EC_KEY_dup((EC_KEY *)parg); |
| 3278 | if (ecdh == NULL) { | 3311 | if (ecdh == NULL) { |
| 3279 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_EC_LIB); | 3312 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3313 | ERR_R_EC_LIB); | ||
| 3280 | return 0; | 3314 | return 0; |
| 3281 | } | 3315 | } |
| 3282 | if (!(ctx->options & SSL_OP_SINGLE_ECDH_USE)) { | 3316 | if (!(ctx->options & SSL_OP_SINGLE_ECDH_USE)) { |
| 3283 | if (!EC_KEY_generate_key(ecdh)) { | 3317 | if (!EC_KEY_generate_key(ecdh)) { |
| 3284 | EC_KEY_free(ecdh); | 3318 | EC_KEY_free(ecdh); |
| 3285 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_ECDH_LIB); | 3319 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3320 | ERR_R_ECDH_LIB); | ||
| 3286 | return 0; | 3321 | return 0; |
| 3287 | } | 3322 | } |
| 3288 | } | 3323 | } |
| @@ -3296,7 +3331,8 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3296 | /* break; */ | 3331 | /* break; */ |
| 3297 | case SSL_CTRL_SET_TMP_ECDH_CB: | 3332 | case SSL_CTRL_SET_TMP_ECDH_CB: |
| 3298 | { | 3333 | { |
| 3299 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 3334 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3335 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 3300 | return (0); | 3336 | return (0); |
| 3301 | } | 3337 | } |
| 3302 | break; | 3338 | break; |
| @@ -3312,17 +3348,21 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3312 | if (!keys) | 3348 | if (!keys) |
| 3313 | return 48; | 3349 | return 48; |
| 3314 | if (larg != 48) { | 3350 | if (larg != 48) { |
| 3315 | SSLerr(SSL_F_SSL3_CTX_CTRL, SSL_R_INVALID_TICKET_KEYS_LENGTH); | 3351 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3352 | SSL_R_INVALID_TICKET_KEYS_LENGTH); | ||
| 3316 | return 0; | 3353 | return 0; |
| 3317 | } | 3354 | } |
| 3318 | if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) { | 3355 | if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) { |
| 3319 | memcpy(ctx->tlsext_tick_key_name, keys, 16); | 3356 | memcpy(ctx->tlsext_tick_key_name, keys, 16); |
| 3320 | memcpy(ctx->tlsext_tick_hmac_key, keys + 16, 16); | 3357 | memcpy(ctx->tlsext_tick_hmac_key, |
| 3358 | keys + 16, 16); | ||
| 3321 | memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16); | 3359 | memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16); |
| 3322 | } else { | 3360 | } else { |
| 3323 | memcpy(keys, ctx->tlsext_tick_key_name, 16); | 3361 | memcpy(keys, ctx->tlsext_tick_key_name, 16); |
| 3324 | memcpy(keys + 16, ctx->tlsext_tick_hmac_key, 16); | 3362 | memcpy(keys + 16, |
| 3325 | memcpy(keys + 32, ctx->tlsext_tick_aes_key, 16); | 3363 | ctx->tlsext_tick_hmac_key, 16); |
| 3364 | memcpy(keys + 32, | ||
| 3365 | ctx->tlsext_tick_aes_key, 16); | ||
| 3326 | } | 3366 | } |
| 3327 | return 1; | 3367 | return 1; |
| 3328 | } | 3368 | } |
| @@ -3346,17 +3386,21 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3346 | ctx->srp_ctx.login = NULL; | 3386 | ctx->srp_ctx.login = NULL; |
| 3347 | if (parg == NULL) | 3387 | if (parg == NULL) |
| 3348 | break; | 3388 | break; |
| 3349 | if (strlen((const char *)parg) > 255 || strlen((const char *)parg) < 1) { | 3389 | if (strlen((const char *)parg) > 255 || |
| 3350 | SSLerr(SSL_F_SSL3_CTX_CTRL, SSL_R_INVALID_SRP_USERNAME); | 3390 | strlen((const char *)parg) < 1) { |
| 3391 | SSLerr(SSL_F_SSL3_CTX_CTRL, | ||
| 3392 | SSL_R_INVALID_SRP_USERNAME); | ||
| 3351 | return 0; | 3393 | return 0; |
| 3352 | } | 3394 | } |
| 3353 | if ((ctx->srp_ctx.login = BUF_strdup((char *)parg)) == NULL) { | 3395 | if ((ctx->srp_ctx.login = BUF_strdup((char *)parg)) == NULL) { |
| 3354 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_INTERNAL_ERROR); | 3396 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3397 | ERR_R_INTERNAL_ERROR); | ||
| 3355 | return 0; | 3398 | return 0; |
| 3356 | } | 3399 | } |
| 3357 | break; | 3400 | break; |
| 3358 | case SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD: | 3401 | case SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD: |
| 3359 | ctx->srp_ctx.SRP_give_srp_client_pwd_callback = srp_password_from_info_cb; | 3402 | ctx->srp_ctx.SRP_give_srp_client_pwd_callback = |
| 3403 | srp_password_from_info_cb; | ||
| 3360 | ctx->srp_ctx.info = parg; | 3404 | ctx->srp_ctx.info = parg; |
| 3361 | break; | 3405 | break; |
| 3362 | case SSL_CTRL_SET_SRP_ARG: | 3406 | case SSL_CTRL_SET_SRP_ARG: |
| @@ -3399,7 +3443,7 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3399 | long | 3443 | long |
| 3400 | ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | 3444 | ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) |
| 3401 | { | 3445 | { |
| 3402 | CERT *cert; | 3446 | CERT *cert; |
| 3403 | 3447 | ||
| 3404 | cert = ctx->cert; | 3448 | cert = ctx->cert; |
| 3405 | 3449 | ||
| @@ -3425,12 +3469,14 @@ ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | |||
| 3425 | #endif | 3469 | #endif |
| 3426 | #ifndef OPENSSL_NO_TLSEXT | 3470 | #ifndef OPENSSL_NO_TLSEXT |
| 3427 | case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB: | 3471 | case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB: |
| 3428 | ctx->tlsext_servername_callback = (int (*)(SSL *, int *, void *))fp; | 3472 | ctx->tlsext_servername_callback = |
| 3473 | (int (*)(SSL *, int *, void *))fp; | ||
| 3429 | break; | 3474 | break; |
| 3430 | 3475 | ||
| 3431 | #ifdef TLSEXT_TYPE_opaque_prf_input | 3476 | #ifdef TLSEXT_TYPE_opaque_prf_input |
| 3432 | case SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB: | 3477 | case SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB: |
| 3433 | ctx->tlsext_opaque_prf_input_callback = (int (*)(SSL *, void *, size_t, void *))fp; | 3478 | ctx->tlsext_opaque_prf_input_callback = |
| 3479 | (int (*)(SSL *, void *, size_t, void *))fp; | ||
| 3434 | break; | 3480 | break; |
| 3435 | #endif | 3481 | #endif |
| 3436 | 3482 | ||
| @@ -3472,9 +3518,9 @@ ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | |||
| 3472 | const SSL_CIPHER * | 3518 | const SSL_CIPHER * |
| 3473 | ssl3_get_cipher_by_char(const unsigned char *p) | 3519 | ssl3_get_cipher_by_char(const unsigned char *p) |
| 3474 | { | 3520 | { |
| 3475 | SSL_CIPHER c; | 3521 | SSL_CIPHER c; |
| 3476 | const SSL_CIPHER *cp; | 3522 | const SSL_CIPHER *cp; |
| 3477 | unsigned long id; | 3523 | unsigned long id; |
| 3478 | 3524 | ||
| 3479 | id = 0x03000000L | ((unsigned long)p[0] << 8L) | (unsigned long)p[1]; | 3525 | id = 0x03000000L | ((unsigned long)p[0] << 8L) | (unsigned long)p[1]; |
| 3480 | c.id = id; | 3526 | c.id = id; |
| @@ -3492,7 +3538,7 @@ ssl3_get_cipher_by_char(const unsigned char *p) | |||
| 3492 | int | 3538 | int |
| 3493 | ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) | 3539 | ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) |
| 3494 | { | 3540 | { |
| 3495 | long l; | 3541 | long l; |
| 3496 | 3542 | ||
| 3497 | if (p != NULL) { | 3543 | if (p != NULL) { |
| 3498 | l = c->id; | 3544 | l = c->id; |
| @@ -3507,9 +3553,9 @@ ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) | |||
| 3507 | SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | 3553 | SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, |
| 3508 | STACK_OF(SSL_CIPHER) *srvr) | 3554 | STACK_OF(SSL_CIPHER) *srvr) |
| 3509 | { | 3555 | { |
| 3510 | SSL_CIPHER *c, *ret = NULL; | 3556 | SSL_CIPHER *c, *ret = NULL; |
| 3511 | STACK_OF(SSL_CIPHER) *prio, *allow; | 3557 | STACK_OF(SSL_CIPHER) *prio, *allow; |
| 3512 | int i, ii, ok; | 3558 | int i, ii, ok; |
| 3513 | #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_EC) | 3559 | #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_EC) |
| 3514 | unsigned int j; | 3560 | unsigned int j; |
| 3515 | int ec_ok, ec_nid; | 3561 | int ec_ok, ec_nid; |
| @@ -3522,7 +3568,8 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3522 | cert = s->cert; | 3568 | cert = s->cert; |
| 3523 | 3569 | ||
| 3524 | #if 0 | 3570 | #if 0 |
| 3525 | /* Do not set the compare functions, because this may lead to a | 3571 | /* |
| 3572 | * Do not set the compare functions, because this may lead to a | ||
| 3526 | * reordering by "id". We want to keep the original ordering. | 3573 | * reordering by "id". We want to keep the original ordering. |
| 3527 | * We may pay a price in performance during sk_SSL_CIPHER_find(), | 3574 | * We may pay a price in performance during sk_SSL_CIPHER_find(), |
| 3528 | * but would have to pay with the price of sk_SSL_CIPHER_dup(). | 3575 | * but would have to pay with the price of sk_SSL_CIPHER_dup(). |
| @@ -3532,12 +3579,14 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3532 | #endif | 3579 | #endif |
| 3533 | 3580 | ||
| 3534 | #ifdef CIPHER_DEBUG | 3581 | #ifdef CIPHER_DEBUG |
| 3535 | printf("Server has %d from %p:\n", sk_SSL_CIPHER_num(srvr), (void *)srvr); | 3582 | printf("Server has %d from %p:\n", sk_SSL_CIPHER_num(srvr), |
| 3583 | (void *)srvr); | ||
| 3536 | for (i = 0; i < sk_SSL_CIPHER_num(srvr); ++i) { | 3584 | for (i = 0; i < sk_SSL_CIPHER_num(srvr); ++i) { |
| 3537 | c = sk_SSL_CIPHER_value(srvr, i); | 3585 | c = sk_SSL_CIPHER_value(srvr, i); |
| 3538 | printf("%p:%s\n",(void *)c, c->name); | 3586 | printf("%p:%s\n",(void *)c, c->name); |
| 3539 | } | 3587 | } |
| 3540 | printf("Client sent %d from %p:\n", sk_SSL_CIPHER_num(clnt), (void *)clnt); | 3588 | printf("Client sent %d from %p:\n", sk_SSL_CIPHER_num(clnt), |
| 3589 | (void *)clnt); | ||
| 3541 | for (i = 0; i < sk_SSL_CIPHER_num(clnt); ++i) { | 3590 | for (i = 0; i < sk_SSL_CIPHER_num(clnt); ++i) { |
| 3542 | c = sk_SSL_CIPHER_value(clnt, i); | 3591 | c = sk_SSL_CIPHER_value(clnt, i); |
| 3543 | printf("%p:%s\n",(void *)c, c->name); | 3592 | printf("%p:%s\n",(void *)c, c->name); |
| @@ -3592,26 +3641,35 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3592 | if (SSL_C_IS_EXPORT(c)) { | 3641 | if (SSL_C_IS_EXPORT(c)) { |
| 3593 | ok = (alg_k & emask_k) && (alg_a & emask_a); | 3642 | ok = (alg_k & emask_k) && (alg_a & emask_a); |
| 3594 | #ifdef CIPHER_DEBUG | 3643 | #ifdef CIPHER_DEBUG |
| 3595 | printf("%d:[%08lX:%08lX:%08lX:%08lX]%p:%s (export)\n", ok, alg_k, alg_a, emask_k, emask_a, | 3644 | printf("%d:[%08lX:%08lX:%08lX:%08lX]%p:%s (export)\n", |
| 3596 | (void *)c, c->name); | 3645 | ok, alg_k, alg_a, emask_k, emask_a, (void *)c, |
| 3646 | c->name); | ||
| 3597 | #endif | 3647 | #endif |
| 3598 | } else { | 3648 | } else { |
| 3599 | ok = (alg_k & mask_k) && (alg_a & mask_a); | 3649 | ok = (alg_k & mask_k) && (alg_a & mask_a); |
| 3600 | #ifdef CIPHER_DEBUG | 3650 | #ifdef CIPHER_DEBUG |
| 3601 | printf("%d:[%08lX:%08lX:%08lX:%08lX]%p:%s\n", ok, alg_k, alg_a, mask_k, mask_a,(void *)c, | 3651 | printf("%d:[%08lX:%08lX:%08lX:%08lX]%p:%s\n", |
| 3602 | c->name); | 3652 | ok, alg_k, alg_a, mask_k, mask_a,(void *)c, |
| 3653 | c->name); | ||
| 3603 | #endif | 3654 | #endif |
| 3604 | } | 3655 | } |
| 3605 | 3656 | ||
| 3606 | #ifndef OPENSSL_NO_TLSEXT | 3657 | #ifndef OPENSSL_NO_TLSEXT |
| 3607 | #ifndef OPENSSL_NO_EC | 3658 | #ifndef OPENSSL_NO_EC |
| 3608 | if ( | 3659 | if ( |
| 3609 | /* if we are considering an ECC cipher suite that uses our certificate */ | 3660 | /* |
| 3661 | * if we are considering an ECC cipher suite that uses our | ||
| 3662 | * certificate | ||
| 3663 | */ | ||
| 3610 | (alg_a & SSL_aECDSA || alg_a & SSL_aECDH) | 3664 | (alg_a & SSL_aECDSA || alg_a & SSL_aECDH) |
| 3611 | /* and we have an ECC certificate */ | 3665 | /* and we have an ECC certificate */ |
| 3612 | && (s->cert->pkeys[SSL_PKEY_ECC].x509 != NULL) | 3666 | && (s->cert->pkeys[SSL_PKEY_ECC].x509 != NULL) |
| 3613 | /* and the client specified a Supported Point Formats extension */ | 3667 | /* |
| 3614 | && ((s->session->tlsext_ecpointformatlist_length > 0) && (s->session->tlsext_ecpointformatlist != NULL)) | 3668 | * and the client specified a Supported Point Formats |
| 3669 | * extension | ||
| 3670 | */ | ||
| 3671 | && ((s->session->tlsext_ecpointformatlist_length > 0) && | ||
| 3672 | (s->session->tlsext_ecpointformatlist != NULL)) | ||
| 3615 | /* and our certificate's point is compressed */ | 3673 | /* and our certificate's point is compressed */ |
| 3616 | && ( | 3674 | && ( |
| 3617 | (s->cert->pkeys[SSL_PKEY_ECC].x509->cert_info != NULL) | 3675 | (s->cert->pkeys[SSL_PKEY_ECC].x509->cert_info != NULL) |
| @@ -3625,8 +3683,11 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3625 | ) | 3683 | ) |
| 3626 | ) { | 3684 | ) { |
| 3627 | ec_ok = 0; | 3685 | ec_ok = 0; |
| 3628 | /* if our certificate's curve is over a field type that the client does not support | 3686 | /* |
| 3629 | * then do not allow this cipher suite to be negotiated */ | 3687 | * If our certificate's curve is over a field type |
| 3688 | * that the client does not support then do not allow | ||
| 3689 | * this cipher suite to be negotiated | ||
| 3690 | */ | ||
| 3630 | if ( | 3691 | if ( |
| 3631 | (s->cert->pkeys[SSL_PKEY_ECC].privatekey->pkey.ec != NULL) | 3692 | (s->cert->pkeys[SSL_PKEY_ECC].privatekey->pkey.ec != NULL) |
| 3632 | && (s->cert->pkeys[SSL_PKEY_ECC].privatekey->pkey.ec->group != NULL) | 3693 | && (s->cert->pkeys[SSL_PKEY_ECC].privatekey->pkey.ec->group != NULL) |
| @@ -3650,7 +3711,10 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3650 | ok = ok && ec_ok; | 3711 | ok = ok && ec_ok; |
| 3651 | } | 3712 | } |
| 3652 | if ( | 3713 | if ( |
| 3653 | /* if we are considering an ECC cipher suite that uses our certificate */ | 3714 | /* |
| 3715 | * If we are considering an ECC cipher suite that uses our | ||
| 3716 | * certificate | ||
| 3717 | */ | ||
| 3654 | (alg_a & SSL_aECDSA || alg_a & SSL_aECDH) | 3718 | (alg_a & SSL_aECDSA || alg_a & SSL_aECDH) |
| 3655 | /* and we have an ECC certificate */ | 3719 | /* and we have an ECC certificate */ |
| 3656 | && (s->cert->pkeys[SSL_PKEY_ECC].x509 != NULL) | 3720 | && (s->cert->pkeys[SSL_PKEY_ECC].x509 != NULL) |
| @@ -3689,7 +3753,10 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3689 | ok = ok && ec_ok; | 3753 | ok = ok && ec_ok; |
| 3690 | } | 3754 | } |
| 3691 | if ( | 3755 | if ( |
| 3692 | /* if we are considering an ECC cipher suite that uses an ephemeral EC key */ | 3756 | /* |
| 3757 | * if we are considering an ECC cipher suite that uses an | ||
| 3758 | * ephemeral EC key | ||
| 3759 | */ | ||
| 3693 | (alg_k & SSL_kEECDH) | 3760 | (alg_k & SSL_kEECDH) |
| 3694 | /* and we have an ephemeral EC key */ | 3761 | /* and we have an ephemeral EC key */ |
| 3695 | && (s->cert->ecdh_tmp != NULL) | 3762 | && (s->cert->ecdh_tmp != NULL) |
| @@ -3732,7 +3799,8 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3732 | ii = sk_SSL_CIPHER_find(allow, c); | 3799 | ii = sk_SSL_CIPHER_find(allow, c); |
| 3733 | if (ii >= 0) { | 3800 | if (ii >= 0) { |
| 3734 | #if !defined(OPENSSL_NO_EC) && !defined(OPENSSL_NO_TLSEXT) | 3801 | #if !defined(OPENSSL_NO_EC) && !defined(OPENSSL_NO_TLSEXT) |
| 3735 | if ((alg_k & SSL_kEECDH) && (alg_a & SSL_aECDSA) && s->s3->is_probably_safari) { | 3802 | if ((alg_k & SSL_kEECDH) && |
| 3803 | (alg_a & SSL_aECDSA) && s->s3->is_probably_safari) { | ||
| 3736 | if (!ret) | 3804 | if (!ret) |
| 3737 | ret = sk_SSL_CIPHER_value(allow, ii); | 3805 | ret = sk_SSL_CIPHER_value(allow, ii); |
| 3738 | continue; | 3806 | continue; |
| @@ -3748,8 +3816,8 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3748 | int | 3816 | int |
| 3749 | ssl3_get_req_cert_type(SSL *s, unsigned char *p) | 3817 | ssl3_get_req_cert_type(SSL *s, unsigned char *p) |
| 3750 | { | 3818 | { |
| 3751 | int ret = 0; | 3819 | int ret = 0; |
| 3752 | unsigned long alg_k; | 3820 | unsigned long alg_k; |
| 3753 | 3821 | ||
| 3754 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; | 3822 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; |
| 3755 | 3823 | ||
| @@ -3784,7 +3852,8 @@ ssl3_get_req_cert_type(SSL *s, unsigned char *p) | |||
| 3784 | #endif | 3852 | #endif |
| 3785 | 3853 | ||
| 3786 | #ifndef OPENSSL_NO_ECDSA | 3854 | #ifndef OPENSSL_NO_ECDSA |
| 3787 | /* ECDSA certs can be used with RSA cipher suites as well | 3855 | /* |
| 3856 | * ECDSA certs can be used with RSA cipher suites as well | ||
| 3788 | * so we don't need to check for SSL_kECDH or SSL_kEECDH | 3857 | * so we don't need to check for SSL_kECDH or SSL_kEECDH |
| 3789 | */ | 3858 | */ |
| 3790 | if (s->version >= TLS1_VERSION) { | 3859 | if (s->version >= TLS1_VERSION) { |
| @@ -3797,10 +3866,12 @@ ssl3_get_req_cert_type(SSL *s, unsigned char *p) | |||
| 3797 | int | 3866 | int |
| 3798 | ssl3_shutdown(SSL *s) | 3867 | ssl3_shutdown(SSL *s) |
| 3799 | { | 3868 | { |
| 3800 | int ret; | 3869 | int ret; |
| 3801 | 3870 | ||
| 3802 | /* Don't do anything much if we have not done the handshake or | 3871 | /* |
| 3803 | * we don't want to send messages :-) */ | 3872 | * Don't do anything much if we have not done the handshake or |
| 3873 | * we don't want to send messages :-) | ||
| 3874 | */ | ||
| 3804 | if ((s->quiet_shutdown) || (s->state == SSL_ST_BEFORE)) { | 3875 | if ((s->quiet_shutdown) || (s->state == SSL_ST_BEFORE)) { |
| 3805 | s->shutdown = (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); | 3876 | s->shutdown = (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); |
| 3806 | return (1); | 3877 | return (1); |
| @@ -3811,8 +3882,10 @@ ssl3_shutdown(SSL *s) | |||
| 3811 | #if 1 | 3882 | #if 1 |
| 3812 | ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_CLOSE_NOTIFY); | 3883 | ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_CLOSE_NOTIFY); |
| 3813 | #endif | 3884 | #endif |
| 3814 | /* our shutdown alert has been sent now, and if it still needs | 3885 | /* |
| 3815 | * to be written, s->s3->alert_dispatch will be true */ | 3886 | * Our shutdown alert has been sent now, and if it still needs |
| 3887 | * to be written, s->s3->alert_dispatch will be true | ||
| 3888 | */ | ||
| 3816 | if (s->s3->alert_dispatch) | 3889 | if (s->s3->alert_dispatch) |
| 3817 | return(-1); /* return WANT_WRITE */ | 3890 | return(-1); /* return WANT_WRITE */ |
| 3818 | } else if (s->s3->alert_dispatch) { | 3891 | } else if (s->s3->alert_dispatch) { |
| @@ -3820,10 +3893,12 @@ ssl3_shutdown(SSL *s) | |||
| 3820 | #if 1 | 3893 | #if 1 |
| 3821 | ret = s->method->ssl_dispatch_alert(s); | 3894 | ret = s->method->ssl_dispatch_alert(s); |
| 3822 | if (ret == -1) { | 3895 | if (ret == -1) { |
| 3823 | /* we only get to return -1 here the 2nd/Nth | 3896 | /* |
| 3897 | * We only get to return -1 here the 2nd/Nth | ||
| 3824 | * invocation, we must have already signalled | 3898 | * invocation, we must have already signalled |
| 3825 | * return 0 upon a previous invoation, | 3899 | * return 0 upon a previous invoation, |
| 3826 | * return WANT_WRITE */ | 3900 | * return WANT_WRITE |
| 3901 | */ | ||
| 3827 | return (ret); | 3902 | return (ret); |
| 3828 | } | 3903 | } |
| 3829 | #endif | 3904 | #endif |
| @@ -3845,7 +3920,7 @@ ssl3_shutdown(SSL *s) | |||
| 3845 | int | 3920 | int |
| 3846 | ssl3_write(SSL *s, const void *buf, int len) | 3921 | ssl3_write(SSL *s, const void *buf, int len) |
| 3847 | { | 3922 | { |
| 3848 | int ret, n; | 3923 | int ret, n; |
| 3849 | 3924 | ||
| 3850 | #if 0 | 3925 | #if 0 |
| 3851 | if (s->shutdown & SSL_SEND_SHUTDOWN) { | 3926 | if (s->shutdown & SSL_SEND_SHUTDOWN) { |
| @@ -3857,16 +3932,18 @@ ssl3_write(SSL *s, const void *buf, int len) | |||
| 3857 | if (s->s3->renegotiate) | 3932 | if (s->s3->renegotiate) |
| 3858 | ssl3_renegotiate_check(s); | 3933 | ssl3_renegotiate_check(s); |
| 3859 | 3934 | ||
| 3860 | /* This is an experimental flag that sends the | 3935 | /* |
| 3936 | * This is an experimental flag that sends the | ||
| 3861 | * last handshake message in the same packet as the first | 3937 | * last handshake message in the same packet as the first |
| 3862 | * use data - used to see if it helps the TCP protocol during | 3938 | * use data - used to see if it helps the TCP protocol during |
| 3863 | * session-id reuse */ | 3939 | * session-id reuse |
| 3940 | */ | ||
| 3864 | /* The second test is because the buffer may have been removed */ | 3941 | /* The second test is because the buffer may have been removed */ |
| 3865 | if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio)) { | 3942 | if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio)) { |
| 3866 | /* First time through, we write into the buffer */ | 3943 | /* First time through, we write into the buffer */ |
| 3867 | if (s->s3->delay_buf_pop_ret == 0) { | 3944 | if (s->s3->delay_buf_pop_ret == 0) { |
| 3868 | ret = ssl3_write_bytes(s, SSL3_RT_APPLICATION_DATA, | 3945 | ret = ssl3_write_bytes(s, SSL3_RT_APPLICATION_DATA, |
| 3869 | buf, len); | 3946 | buf, len); |
| 3870 | if (ret <= 0) | 3947 | if (ret <= 0) |
| 3871 | return (ret); | 3948 | return (ret); |
| 3872 | 3949 | ||
| @@ -3887,7 +3964,7 @@ ssl3_write(SSL *s, const void *buf, int len) | |||
| 3887 | s->s3->delay_buf_pop_ret = 0; | 3964 | s->s3->delay_buf_pop_ret = 0; |
| 3888 | } else { | 3965 | } else { |
| 3889 | ret = s->method->ssl_write_bytes(s, SSL3_RT_APPLICATION_DATA, | 3966 | ret = s->method->ssl_write_bytes(s, SSL3_RT_APPLICATION_DATA, |
| 3890 | buf, len); | 3967 | buf, len); |
| 3891 | if (ret <= 0) | 3968 | if (ret <= 0) |
| 3892 | return (ret); | 3969 | return (ret); |
| 3893 | } | 3970 | } |
| @@ -3898,21 +3975,25 @@ ssl3_write(SSL *s, const void *buf, int len) | |||
| 3898 | static int | 3975 | static int |
| 3899 | ssl3_read_internal(SSL *s, void *buf, int len, int peek) | 3976 | ssl3_read_internal(SSL *s, void *buf, int len, int peek) |
| 3900 | { | 3977 | { |
| 3901 | int ret; | 3978 | int ret; |
| 3902 | 3979 | ||
| 3903 | errno = 0; | 3980 | errno = 0; |
| 3904 | if (s->s3->renegotiate) | 3981 | if (s->s3->renegotiate) |
| 3905 | ssl3_renegotiate_check(s); | 3982 | ssl3_renegotiate_check(s); |
| 3906 | s->s3->in_read_app_data = 1; | 3983 | s->s3->in_read_app_data = 1; |
| 3907 | ret = s->method->ssl_read_bytes(s, SSL3_RT_APPLICATION_DATA, buf, len, peek); | 3984 | ret = s->method->ssl_read_bytes(s, |
| 3985 | SSL3_RT_APPLICATION_DATA, buf, len, peek); | ||
| 3908 | if ((ret == -1) && (s->s3->in_read_app_data == 2)) { | 3986 | if ((ret == -1) && (s->s3->in_read_app_data == 2)) { |
| 3909 | /* ssl3_read_bytes decided to call s->handshake_func, which | 3987 | /* |
| 3988 | * ssl3_read_bytes decided to call s->handshake_func, which | ||
| 3910 | * called ssl3_read_bytes to read handshake data. | 3989 | * called ssl3_read_bytes to read handshake data. |
| 3911 | * However, ssl3_read_bytes actually found application data | 3990 | * However, ssl3_read_bytes actually found application data |
| 3912 | * and thinks that application data makes sense here; so disable | 3991 | * and thinks that application data makes sense here; so disable |
| 3913 | * handshake processing and try to read application data again. */ | 3992 | * handshake processing and try to read application data again. |
| 3993 | */ | ||
| 3914 | s->in_handshake++; | 3994 | s->in_handshake++; |
| 3915 | ret = s->method->ssl_read_bytes(s, SSL3_RT_APPLICATION_DATA, buf, len, peek); | 3995 | ret = s->method->ssl_read_bytes(s, |
| 3996 | SSL3_RT_APPLICATION_DATA, buf, len, peek); | ||
| 3916 | s->in_handshake--; | 3997 | s->in_handshake--; |
| 3917 | } else | 3998 | } else |
| 3918 | s->s3->in_read_app_data = 0; | 3999 | s->s3->in_read_app_data = 0; |
| @@ -3948,7 +4029,7 @@ ssl3_renegotiate(SSL *s) | |||
| 3948 | int | 4029 | int |
| 3949 | ssl3_renegotiate_check(SSL *s) | 4030 | ssl3_renegotiate_check(SSL *s) |
| 3950 | { | 4031 | { |
| 3951 | int ret = 0; | 4032 | int ret = 0; |
| 3952 | 4033 | ||
| 3953 | if (s->s3->renegotiate) { | 4034 | if (s->s3->renegotiate) { |
| 3954 | if ((s->s3->rbuf.left == 0) && (s->s3->wbuf.left == 0) && | 4035 | if ((s->s3->rbuf.left == 0) && (s->s3->wbuf.left == 0) && |
| @@ -3968,13 +4049,14 @@ ssl3_renegotiate_check(SSL *s) | |||
| 3968 | } | 4049 | } |
| 3969 | return (ret); | 4050 | return (ret); |
| 3970 | } | 4051 | } |
| 3971 | /* If we are using TLS v1.2 or later and default SHA1+MD5 algorithms switch | 4052 | /* |
| 4053 | * If we are using TLS v1.2 or later and default SHA1+MD5 algorithms switch | ||
| 3972 | * to new SHA256 PRF and handshake macs | 4054 | * to new SHA256 PRF and handshake macs |
| 3973 | */ | 4055 | */ |
| 3974 | long | 4056 | long |
| 3975 | ssl_get_algorithm2(SSL *s) | 4057 | ssl_get_algorithm2(SSL *s) |
| 3976 | { | 4058 | { |
| 3977 | long alg2 = s->s3->tmp.new_cipher->algorithm2; | 4059 | long alg2 = s->s3->tmp.new_cipher->algorithm2; |
| 3978 | 4060 | ||
| 3979 | if (s->method->version == TLS1_2_VERSION && | 4061 | if (s->method->version == TLS1_2_VERSION && |
| 3980 | alg2 == (SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF)) | 4062 | alg2 == (SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF)) |
diff --git a/src/lib/libssl/src/ssl/s3_clnt.c b/src/lib/libssl/src/ssl/s3_clnt.c index 0cd40f3a2d..b63f0bf0c9 100644 --- a/src/lib/libssl/src/ssl/s3_clnt.c +++ b/src/lib/libssl/src/ssl/s3_clnt.c | |||
| @@ -181,10 +181,10 @@ IMPLEMENT_ssl3_meth_func(SSLv3_client_method, | |||
| 181 | int | 181 | int |
| 182 | ssl3_connect(SSL *s) | 182 | ssl3_connect(SSL *s) |
| 183 | { | 183 | { |
| 184 | BUF_MEM *buf = NULL; | 184 | BUF_MEM *buf = NULL; |
| 185 | void (*cb)(const SSL *ssl, int type, int val) = NULL; | 185 | void (*cb)(const SSL *ssl, int type, int val) = NULL; |
| 186 | int ret = -1; | 186 | int ret = -1; |
| 187 | int new_state, state, skip = 0; | 187 | int new_state, state, skip = 0; |
| 188 | 188 | ||
| 189 | ERR_clear_error(); | 189 | ERR_clear_error(); |
| 190 | errno = 0; | 190 | errno = 0; |
| @@ -217,7 +217,8 @@ ssl3_connect(SSL *s) | |||
| 217 | cb(s, SSL_CB_HANDSHAKE_START, 1); | 217 | cb(s, SSL_CB_HANDSHAKE_START, 1); |
| 218 | 218 | ||
| 219 | if ((s->version & 0xff00 ) != 0x0300) { | 219 | if ((s->version & 0xff00 ) != 0x0300) { |
| 220 | SSLerr(SSL_F_SSL3_CONNECT, ERR_R_INTERNAL_ERROR); | 220 | SSLerr(SSL_F_SSL3_CONNECT, |
| 221 | ERR_R_INTERNAL_ERROR); | ||
| 221 | ret = -1; | 222 | ret = -1; |
| 222 | goto end; | 223 | goto end; |
| 223 | } | 224 | } |
| @@ -230,7 +231,8 @@ ssl3_connect(SSL *s) | |||
| 230 | ret = -1; | 231 | ret = -1; |
| 231 | goto end; | 232 | goto end; |
| 232 | } | 233 | } |
| 233 | if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) { | 234 | if (!BUF_MEM_grow(buf, |
| 235 | SSL3_RT_MAX_PLAIN_LENGTH)) { | ||
| 234 | ret = -1; | 236 | ret = -1; |
| 235 | goto end; | 237 | goto end; |
| 236 | } | 238 | } |
| @@ -309,10 +311,11 @@ ssl3_connect(SSL *s) | |||
| 309 | break; | 311 | break; |
| 310 | } | 312 | } |
| 311 | #endif | 313 | #endif |
| 312 | /* Check if it is anon DH/ECDH */ | 314 | /* Check if it is anon DH/ECDH or PSK */ |
| 313 | /* or PSK */ | 315 | if (!(s->s3->tmp.new_cipher->algorithm_auth & |
| 314 | if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) && | 316 | SSL_aNULL) && |
| 315 | !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) { | 317 | !(s->s3->tmp.new_cipher->algorithm_mkey & |
| 318 | SSL_kPSK)) { | ||
| 316 | ret = ssl3_get_server_certificate(s); | 319 | ret = ssl3_get_server_certificate(s); |
| 317 | if (ret <= 0) | 320 | if (ret <= 0) |
| 318 | goto end; | 321 | goto end; |
| @@ -342,8 +345,10 @@ ssl3_connect(SSL *s) | |||
| 342 | s->state = SSL3_ST_CR_CERT_REQ_A; | 345 | s->state = SSL3_ST_CR_CERT_REQ_A; |
| 343 | s->init_num = 0; | 346 | s->init_num = 0; |
| 344 | 347 | ||
| 345 | /* at this point we check that we have the | 348 | /* |
| 346 | * required stuff from the server */ | 349 | * At this point we check that we have the |
| 350 | * required stuff from the server. | ||
| 351 | */ | ||
| 347 | if (!ssl3_check_cert_and_algorithm(s)) { | 352 | if (!ssl3_check_cert_and_algorithm(s)) { |
| 348 | ret = -1; | 353 | ret = -1; |
| 349 | goto end; | 354 | goto end; |
| @@ -367,8 +372,10 @@ ssl3_connect(SSL *s) | |||
| 367 | #ifndef OPENSSL_NO_SRP | 372 | #ifndef OPENSSL_NO_SRP |
| 368 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) { | 373 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) { |
| 369 | if ((ret = SRP_Calc_A_param(s)) <= 0) { | 374 | if ((ret = SRP_Calc_A_param(s)) <= 0) { |
| 370 | SSLerr(SSL_F_SSL3_CONNECT, SSL_R_SRP_A_CALC); | 375 | SSLerr(SSL_F_SSL3_CONNECT, |
| 371 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); | 376 | SSL_R_SRP_A_CALC); |
| 377 | ssl3_send_alert(s, SSL3_AL_FATAL, | ||
| 378 | SSL_AD_INTERNAL_ERROR); | ||
| 372 | goto end; | 379 | goto end; |
| 373 | } | 380 | } |
| 374 | } | 381 | } |
| @@ -397,11 +404,16 @@ ssl3_connect(SSL *s) | |||
| 397 | ret = ssl3_send_client_key_exchange(s); | 404 | ret = ssl3_send_client_key_exchange(s); |
| 398 | if (ret <= 0) | 405 | if (ret <= 0) |
| 399 | goto end; | 406 | goto end; |
| 400 | /* EAY EAY EAY need to check for DH fix cert | 407 | /* |
| 401 | * sent back */ | 408 | * EAY EAY EAY need to check for DH fix cert |
| 402 | /* For TLS, cert_req is set to 2, so a cert chain | 409 | * sent back |
| 403 | * of nothing is sent, but no verify packet is sent */ | 410 | */ |
| 404 | /* XXX: For now, we do not support client | 411 | /* |
| 412 | * For TLS, cert_req is set to 2, so a cert chain | ||
| 413 | * of nothing is sent, but no verify packet is sent | ||
| 414 | */ | ||
| 415 | /* | ||
| 416 | * XXX: For now, we do not support client | ||
| 405 | * authentication in ECDH cipher suites with | 417 | * authentication in ECDH cipher suites with |
| 406 | * ECDH (rather than ECDSA) certificates. | 418 | * ECDH (rather than ECDSA) certificates. |
| 407 | * We need to skip the certificate verify | 419 | * We need to skip the certificate verify |
| @@ -457,7 +469,7 @@ ssl3_connect(SSL *s) | |||
| 457 | s->session->compress_meth = 0; | 469 | s->session->compress_meth = 0; |
| 458 | else | 470 | else |
| 459 | s->session->compress_meth = | 471 | s->session->compress_meth = |
| 460 | s->s3->tmp.new_compression->id; | 472 | s->s3->tmp.new_compression->id; |
| 461 | #endif | 473 | #endif |
| 462 | if (!s->method->ssl3_enc->setup_key_block(s)) { | 474 | if (!s->method->ssl3_enc->setup_key_block(s)) { |
| 463 | ret = -1; | 475 | ret = -1; |
| @@ -465,7 +477,7 @@ ssl3_connect(SSL *s) | |||
| 465 | } | 477 | } |
| 466 | 478 | ||
| 467 | if (!s->method->ssl3_enc->change_cipher_state(s, | 479 | if (!s->method->ssl3_enc->change_cipher_state(s, |
| 468 | SSL3_CHANGE_CIPHER_CLIENT_WRITE)) { | 480 | SSL3_CHANGE_CIPHER_CLIENT_WRITE)) { |
| 469 | ret = -1; | 481 | ret = -1; |
| 470 | goto end; | 482 | goto end; |
| 471 | } | 483 | } |
| @@ -496,7 +508,8 @@ ssl3_connect(SSL *s) | |||
| 496 | s->s3->flags &= ~SSL3_FLAGS_POP_BUFFER; | 508 | s->s3->flags &= ~SSL3_FLAGS_POP_BUFFER; |
| 497 | if (s->hit) { | 509 | if (s->hit) { |
| 498 | s->s3->tmp.next_state = SSL_ST_OK; | 510 | s->s3->tmp.next_state = SSL_ST_OK; |
| 499 | if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED) { | 511 | if (s->s3->flags & |
| 512 | SSL3_FLAGS_DELAY_CLIENT_FINISHED) { | ||
| 500 | s->state = SSL_ST_OK; | 513 | s->state = SSL_ST_OK; |
| 501 | s->s3->flags|=SSL3_FLAGS_POP_BUFFER; | 514 | s->s3->flags|=SSL3_FLAGS_POP_BUFFER; |
| 502 | s->s3->delay_buf_pop_ret = 0; | 515 | s->s3->delay_buf_pop_ret = 0; |
| @@ -505,7 +518,8 @@ ssl3_connect(SSL *s) | |||
| 505 | #ifndef OPENSSL_NO_TLSEXT | 518 | #ifndef OPENSSL_NO_TLSEXT |
| 506 | /* Allow NewSessionTicket if ticket expected */ | 519 | /* Allow NewSessionTicket if ticket expected */ |
| 507 | if (s->tlsext_ticket_expected) | 520 | if (s->tlsext_ticket_expected) |
| 508 | s->s3->tmp.next_state = SSL3_ST_CR_SESSION_TICKET_A; | 521 | s->s3->tmp.next_state = |
| 522 | SSL3_ST_CR_SESSION_TICKET_A; | ||
| 509 | else | 523 | else |
| 510 | #endif | 524 | #endif |
| 511 | 525 | ||
| @@ -568,8 +582,10 @@ ssl3_connect(SSL *s) | |||
| 568 | s->init_buf = NULL; | 582 | s->init_buf = NULL; |
| 569 | } | 583 | } |
| 570 | 584 | ||
| 571 | /* If we are not 'joining' the last two packets, | 585 | /* |
| 572 | * remove the buffering now */ | 586 | * If we are not 'joining' the last two packets, |
| 587 | * remove the buffering now | ||
| 588 | */ | ||
| 573 | if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER)) | 589 | if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER)) |
| 574 | ssl_free_wbio_buffer(s); | 590 | ssl_free_wbio_buffer(s); |
| 575 | /* else do it later in ssl3_write */ | 591 | /* else do it later in ssl3_write */ |
| @@ -594,7 +610,8 @@ ssl3_connect(SSL *s) | |||
| 594 | /* break; */ | 610 | /* break; */ |
| 595 | 611 | ||
| 596 | default: | 612 | default: |
| 597 | SSLerr(SSL_F_SSL3_CONNECT, SSL_R_UNKNOWN_STATE); | 613 | SSLerr(SSL_F_SSL3_CONNECT, |
| 614 | SSL_R_UNKNOWN_STATE); | ||
| 598 | ret = -1; | 615 | ret = -1; |
| 599 | goto end; | 616 | goto end; |
| 600 | /* break; */ | 617 | /* break; */ |
| @@ -616,7 +633,7 @@ ssl3_connect(SSL *s) | |||
| 616 | } | 633 | } |
| 617 | skip = 0; | 634 | skip = 0; |
| 618 | } | 635 | } |
| 619 | end: | 636 | end: |
| 620 | s->in_handshake--; | 637 | s->in_handshake--; |
| 621 | if (buf != NULL) | 638 | if (buf != NULL) |
| 622 | BUF_MEM_free(buf); | 639 | BUF_MEM_free(buf); |
| @@ -629,13 +646,13 @@ end: | |||
| 629 | int | 646 | int |
| 630 | ssl3_client_hello(SSL *s) | 647 | ssl3_client_hello(SSL *s) |
| 631 | { | 648 | { |
| 632 | unsigned char *buf; | 649 | unsigned char *buf; |
| 633 | unsigned char *p, *d; | 650 | unsigned char *p, *d; |
| 634 | int i; | 651 | int i; |
| 635 | unsigned long l; | 652 | unsigned long l; |
| 636 | #ifndef OPENSSL_NO_COMP | 653 | #ifndef OPENSSL_NO_COMP |
| 637 | int j; | 654 | int j; |
| 638 | SSL_COMP *comp; | 655 | SSL_COMP *comp; |
| 639 | #endif | 656 | #endif |
| 640 | 657 | ||
| 641 | buf = (unsigned char *)s->init_buf->data; | 658 | buf = (unsigned char *)s->init_buf->data; |
| @@ -660,9 +677,10 @@ ssl3_client_hello(SSL *s) | |||
| 660 | goto err; | 677 | goto err; |
| 661 | 678 | ||
| 662 | /* Do the message type and length last */ | 679 | /* Do the message type and length last */ |
| 663 | d = p= &(buf[4]); | 680 | d = p = &(buf[4]); |
| 664 | 681 | ||
| 665 | /* version indicates the negotiated version: for example from | 682 | /* |
| 683 | * Version indicates the negotiated version: for example from | ||
| 666 | * an SSLv2/v3 compatible client hello). The client_version | 684 | * an SSLv2/v3 compatible client hello). The client_version |
| 667 | * field is the maximum version we permit and it is also | 685 | * field is the maximum version we permit and it is also |
| 668 | * used in RSA encrypted premaster secrets. Some servers can | 686 | * used in RSA encrypted premaster secrets. Some servers can |
| @@ -697,7 +715,7 @@ ssl3_client_hello(SSL *s) | |||
| 697 | s->client_version = s->version; | 715 | s->client_version = s->version; |
| 698 | #else | 716 | #else |
| 699 | *(p++) = s->client_version >> 8; | 717 | *(p++) = s->client_version >> 8; |
| 700 | *(p++) = s->client_version&0xff; | 718 | *(p++) = s->client_version & 0xff; |
| 701 | #endif | 719 | #endif |
| 702 | 720 | ||
| 703 | /* Random stuff */ | 721 | /* Random stuff */ |
| @@ -712,7 +730,8 @@ ssl3_client_hello(SSL *s) | |||
| 712 | *(p++) = i; | 730 | *(p++) = i; |
| 713 | if (i != 0) { | 731 | if (i != 0) { |
| 714 | if (i > (int)sizeof(s->session->session_id)) { | 732 | if (i > (int)sizeof(s->session->session_id)) { |
| 715 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); | 733 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, |
| 734 | ERR_R_INTERNAL_ERROR); | ||
| 716 | goto err; | 735 | goto err; |
| 717 | } | 736 | } |
| 718 | memcpy(p, s->session->session_id, i); | 737 | memcpy(p, s->session->session_id, i); |
| @@ -722,11 +741,13 @@ ssl3_client_hello(SSL *s) | |||
| 722 | /* Ciphers supported */ | 741 | /* Ciphers supported */ |
| 723 | i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &(p[2]), 0); | 742 | i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &(p[2]), 0); |
| 724 | if (i == 0) { | 743 | if (i == 0) { |
| 725 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, SSL_R_NO_CIPHERS_AVAILABLE); | 744 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, |
| 745 | SSL_R_NO_CIPHERS_AVAILABLE); | ||
| 726 | goto err; | 746 | goto err; |
| 727 | } | 747 | } |
| 728 | #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH | 748 | #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH |
| 729 | /* Some servers hang if client hello > 256 bytes | 749 | /* |
| 750 | * Some servers hang if client hello > 256 bytes | ||
| 730 | * as hack workaround chop number of supported ciphers | 751 | * as hack workaround chop number of supported ciphers |
| 731 | * to keep it well below this if we use TLS v1.2 | 752 | * to keep it well below this if we use TLS v1.2 |
| 732 | */ | 753 | */ |
| @@ -758,11 +779,14 @@ ssl3_client_hello(SSL *s) | |||
| 758 | #ifndef OPENSSL_NO_TLSEXT | 779 | #ifndef OPENSSL_NO_TLSEXT |
| 759 | /* TLS extensions*/ | 780 | /* TLS extensions*/ |
| 760 | if (ssl_prepare_clienthello_tlsext(s) <= 0) { | 781 | if (ssl_prepare_clienthello_tlsext(s) <= 0) { |
| 761 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, SSL_R_CLIENTHELLO_TLSEXT); | 782 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, |
| 783 | SSL_R_CLIENTHELLO_TLSEXT); | ||
| 762 | goto err; | 784 | goto err; |
| 763 | } | 785 | } |
| 764 | if ((p = ssl_add_clienthello_tlsext(s, p, buf + SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) { | 786 | if ((p = ssl_add_clienthello_tlsext(s, p, |
| 765 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); | 787 | buf + SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) { |
| 788 | SSLerr(SSL_F_SSL3_CLIENT_HELLO, | ||
| 789 | ERR_R_INTERNAL_ERROR); | ||
| 766 | goto err; | 790 | goto err; |
| 767 | } | 791 | } |
| 768 | #endif | 792 | #endif |
| @@ -780,21 +804,21 @@ ssl3_client_hello(SSL *s) | |||
| 780 | 804 | ||
| 781 | /* SSL3_ST_CW_CLNT_HELLO_B */ | 805 | /* SSL3_ST_CW_CLNT_HELLO_B */ |
| 782 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); | 806 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); |
| 783 | err: | 807 | err: |
| 784 | return (-1); | 808 | return (-1); |
| 785 | } | 809 | } |
| 786 | 810 | ||
| 787 | int | 811 | int |
| 788 | ssl3_get_server_hello(SSL *s) | 812 | ssl3_get_server_hello(SSL *s) |
| 789 | { | 813 | { |
| 790 | STACK_OF(SSL_CIPHER) *sk; | 814 | STACK_OF(SSL_CIPHER) *sk; |
| 791 | const SSL_CIPHER *c; | 815 | const SSL_CIPHER *c; |
| 792 | unsigned char *p, *d; | 816 | unsigned char *p, *d; |
| 793 | int i, al, ok; | 817 | int i, al, ok; |
| 794 | unsigned int j; | 818 | unsigned int j; |
| 795 | long n; | 819 | long n; |
| 796 | #ifndef OPENSSL_NO_COMP | 820 | #ifndef OPENSSL_NO_COMP |
| 797 | SSL_COMP *comp; | 821 | SSL_COMP *comp; |
| 798 | #endif | 822 | #endif |
| 799 | 823 | ||
| 800 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SRVR_HELLO_A, | 824 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SRVR_HELLO_A, |
| @@ -803,7 +827,8 @@ ssl3_get_server_hello(SSL *s) | |||
| 803 | if (!ok) | 827 | if (!ok) |
| 804 | return ((int)n); | 828 | return ((int)n); |
| 805 | 829 | ||
| 806 | if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER) { | 830 | if (SSL_version(s) == DTLS1_VERSION || |
| 831 | SSL_version(s) == DTLS1_BAD_VER) { | ||
| 807 | if (s->s3->tmp.message_type == DTLS1_MT_HELLO_VERIFY_REQUEST) { | 832 | if (s->s3->tmp.message_type == DTLS1_MT_HELLO_VERIFY_REQUEST) { |
| 808 | if (s->d1->send_cookie == 0) { | 833 | if (s->d1->send_cookie == 0) { |
| 809 | s->s3->tmp.reuse_message = 1; | 834 | s->s3->tmp.reuse_message = 1; |
| @@ -812,7 +837,8 @@ ssl3_get_server_hello(SSL *s) | |||
| 812 | else /* already sent a cookie */ | 837 | else /* already sent a cookie */ |
| 813 | { | 838 | { |
| 814 | al = SSL_AD_UNEXPECTED_MESSAGE; | 839 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 815 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_BAD_MESSAGE_TYPE); | 840 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 841 | SSL_R_BAD_MESSAGE_TYPE); | ||
| 816 | goto f_err; | 842 | goto f_err; |
| 817 | } | 843 | } |
| 818 | } | 844 | } |
| @@ -820,14 +846,16 @@ ssl3_get_server_hello(SSL *s) | |||
| 820 | 846 | ||
| 821 | if (s->s3->tmp.message_type != SSL3_MT_SERVER_HELLO) { | 847 | if (s->s3->tmp.message_type != SSL3_MT_SERVER_HELLO) { |
| 822 | al = SSL_AD_UNEXPECTED_MESSAGE; | 848 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 823 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_BAD_MESSAGE_TYPE); | 849 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 850 | SSL_R_BAD_MESSAGE_TYPE); | ||
| 824 | goto f_err; | 851 | goto f_err; |
| 825 | } | 852 | } |
| 826 | 853 | ||
| 827 | d = p=(unsigned char *)s->init_msg; | 854 | d = p=(unsigned char *)s->init_msg; |
| 828 | 855 | ||
| 829 | if ((p[0] != (s->version >> 8)) || (p[1] != (s->version & 0xff))) { | 856 | if ((p[0] != (s->version >> 8)) || (p[1] != (s->version & 0xff))) { |
| 830 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_SSL_VERSION); | 857 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 858 | SSL_R_WRONG_SSL_VERSION); | ||
| 831 | s->version = (s->version&0xff00)|p[1]; | 859 | s->version = (s->version&0xff00)|p[1]; |
| 832 | al = SSL_AD_PROTOCOL_VERSION; | 860 | al = SSL_AD_PROTOCOL_VERSION; |
| 833 | goto f_err; | 861 | goto f_err; |
| @@ -842,14 +870,19 @@ ssl3_get_server_hello(SSL *s) | |||
| 842 | /* get the session-id */ | 870 | /* get the session-id */ |
| 843 | j= *(p++); | 871 | j= *(p++); |
| 844 | 872 | ||
| 845 | if ((j > sizeof s->session->session_id) || (j > SSL3_SESSION_ID_SIZE)) { | 873 | if ((j > sizeof s->session->session_id) || |
| 874 | (j > SSL3_SESSION_ID_SIZE)) { | ||
| 846 | al = SSL_AD_ILLEGAL_PARAMETER; | 875 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 847 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_SSL3_SESSION_ID_TOO_LONG); | 876 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 877 | SSL_R_SSL3_SESSION_ID_TOO_LONG); | ||
| 848 | goto f_err; | 878 | goto f_err; |
| 849 | } | 879 | } |
| 850 | 880 | ||
| 851 | #ifndef OPENSSL_NO_TLSEXT | 881 | #ifndef OPENSSL_NO_TLSEXT |
| 852 | /* check if we want to resume the session based on external pre-shared secret */ | 882 | /* |
| 883 | * Check if we want to resume the session based on external | ||
| 884 | * pre-shared secret | ||
| 885 | */ | ||
| 853 | if (s->version >= TLS1_VERSION && s->tls_session_secret_cb) { | 886 | if (s->version >= TLS1_VERSION && s->tls_session_secret_cb) { |
| 854 | SSL_CIPHER *pref_cipher = NULL; | 887 | SSL_CIPHER *pref_cipher = NULL; |
| 855 | s->session->master_key_length = sizeof(s->session->master_key); | 888 | s->session->master_key_length = sizeof(s->session->master_key); |
| @@ -865,16 +898,17 @@ ssl3_get_server_hello(SSL *s) | |||
| 865 | if (j != 0 && j == s->session->session_id_length && | 898 | if (j != 0 && j == s->session->session_id_length && |
| 866 | memcmp(p, s->session->session_id, j) == 0) { | 899 | memcmp(p, s->session->session_id, j) == 0) { |
| 867 | if (s->sid_ctx_length != s->session->sid_ctx_length || | 900 | if (s->sid_ctx_length != s->session->sid_ctx_length || |
| 868 | memcmp(s->session->sid_ctx, s->sid_ctx, s->sid_ctx_length)) { | 901 | memcmp(s->session->sid_ctx, |
| 902 | s->sid_ctx, s->sid_ctx_length)) { | ||
| 869 | /* actually a client application bug */ | 903 | /* actually a client application bug */ |
| 870 | al = SSL_AD_ILLEGAL_PARAMETER; | 904 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 871 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT); | 905 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 906 | SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT); | ||
| 872 | goto f_err; | 907 | goto f_err; |
| 873 | } | 908 | } |
| 874 | s->hit = 1; | 909 | s->hit = 1; |
| 875 | } | 910 | } else { /* a miss or crap from the other end */ |
| 876 | else /* a miss or crap from the other end */ | 911 | |
| 877 | { | ||
| 878 | /* If we were trying for session-id reuse, make a new | 912 | /* If we were trying for session-id reuse, make a new |
| 879 | * SSL_SESSION so we don't stuff up other people */ | 913 | * SSL_SESSION so we don't stuff up other people */ |
| 880 | s->hit = 0; | 914 | s->hit = 0; |
| @@ -892,14 +926,16 @@ ssl3_get_server_hello(SSL *s) | |||
| 892 | if (c == NULL) { | 926 | if (c == NULL) { |
| 893 | /* unknown cipher */ | 927 | /* unknown cipher */ |
| 894 | al = SSL_AD_ILLEGAL_PARAMETER; | 928 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 895 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_UNKNOWN_CIPHER_RETURNED); | 929 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 930 | SSL_R_UNKNOWN_CIPHER_RETURNED); | ||
| 896 | goto f_err; | 931 | goto f_err; |
| 897 | } | 932 | } |
| 898 | /* TLS v1.2 only ciphersuites require v1.2 or later */ | 933 | /* TLS v1.2 only ciphersuites require v1.2 or later */ |
| 899 | if ((c->algorithm_ssl & SSL_TLSV1_2) && | 934 | if ((c->algorithm_ssl & SSL_TLSV1_2) && |
| 900 | (TLS1_get_version(s) < TLS1_2_VERSION)) { | 935 | (TLS1_get_version(s) < TLS1_2_VERSION)) { |
| 901 | al = SSL_AD_ILLEGAL_PARAMETER; | 936 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 902 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_CIPHER_RETURNED); | 937 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 938 | SSL_R_WRONG_CIPHER_RETURNED); | ||
| 903 | goto f_err; | 939 | goto f_err; |
| 904 | } | 940 | } |
| 905 | p += ssl_put_cipher_by_char(s, NULL, NULL); | 941 | p += ssl_put_cipher_by_char(s, NULL, NULL); |
| @@ -909,25 +945,31 @@ ssl3_get_server_hello(SSL *s) | |||
| 909 | if (i < 0) { | 945 | if (i < 0) { |
| 910 | /* we did not say we would use this cipher */ | 946 | /* we did not say we would use this cipher */ |
| 911 | al = SSL_AD_ILLEGAL_PARAMETER; | 947 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 912 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_CIPHER_RETURNED); | 948 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 949 | SSL_R_WRONG_CIPHER_RETURNED); | ||
| 913 | goto f_err; | 950 | goto f_err; |
| 914 | } | 951 | } |
| 915 | 952 | ||
| 916 | /* Depending on the session caching (internal/external), the cipher | 953 | /* |
| 917 | and/or cipher_id values may not be set. Make sure that | 954 | * Depending on the session caching (internal/external), the cipher |
| 918 | cipher_id is set and use it for comparison. */ | 955 | * and/or cipher_id values may not be set. Make sure that |
| 956 | * cipher_id is set and use it for comparison. | ||
| 957 | */ | ||
| 919 | if (s->session->cipher) | 958 | if (s->session->cipher) |
| 920 | s->session->cipher_id = s->session->cipher->id; | 959 | s->session->cipher_id = s->session->cipher->id; |
| 921 | if (s->hit && (s->session->cipher_id != c->id)) { | 960 | if (s->hit && (s->session->cipher_id != c->id)) { |
| 922 | al = SSL_AD_ILLEGAL_PARAMETER; | 961 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 923 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED); | 962 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 963 | SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED); | ||
| 924 | goto f_err; | 964 | goto f_err; |
| 925 | } | 965 | } |
| 926 | s->s3->tmp.new_cipher = c; | 966 | s->s3->tmp.new_cipher = c; |
| 927 | /* Don't digest cached records if TLS v1.2: we may need them for | 967 | /* |
| 968 | * Don't digest cached records if TLS v1.2: we may need them for | ||
| 928 | * client authentication. | 969 | * client authentication. |
| 929 | */ | 970 | */ |
| 930 | if (TLS1_get_version(s) < TLS1_2_VERSION && !ssl3_digest_cached_records(s)) { | 971 | if (TLS1_get_version(s) < TLS1_2_VERSION && |
| 972 | !ssl3_digest_cached_records(s)) { | ||
| 931 | al = SSL_AD_INTERNAL_ERROR; | 973 | al = SSL_AD_INTERNAL_ERROR; |
| 932 | goto f_err; | 974 | goto f_err; |
| 933 | } | 975 | } |
| @@ -936,36 +978,42 @@ ssl3_get_server_hello(SSL *s) | |||
| 936 | #ifdef OPENSSL_NO_COMP | 978 | #ifdef OPENSSL_NO_COMP |
| 937 | if (*(p++) != 0) { | 979 | if (*(p++) != 0) { |
| 938 | al = SSL_AD_ILLEGAL_PARAMETER; | 980 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 939 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | 981 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 982 | SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | ||
| 940 | goto f_err; | 983 | goto f_err; |
| 941 | } | 984 | } |
| 942 | /* If compression is disabled we'd better not try to resume a session | 985 | /* |
| 986 | * If compression is disabled we'd better not try to resume a session | ||
| 943 | * using compression. | 987 | * using compression. |
| 944 | */ | 988 | */ |
| 945 | if (s->session->compress_meth != 0) { | 989 | if (s->session->compress_meth != 0) { |
| 946 | al = SSL_AD_INTERNAL_ERROR; | 990 | al = SSL_AD_INTERNAL_ERROR; |
| 947 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_INCONSISTENT_COMPRESSION); | 991 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 992 | SSL_R_INCONSISTENT_COMPRESSION); | ||
| 948 | goto f_err; | 993 | goto f_err; |
| 949 | } | 994 | } |
| 950 | #else | 995 | #else |
| 951 | j= *(p++); | 996 | j= *(p++); |
| 952 | if (s->hit && j != s->session->compress_meth) { | 997 | if (s->hit && j != s->session->compress_meth) { |
| 953 | al = SSL_AD_ILLEGAL_PARAMETER; | 998 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 954 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED); | 999 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1000 | SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED); | ||
| 955 | goto f_err; | 1001 | goto f_err; |
| 956 | } | 1002 | } |
| 957 | if (j == 0) | 1003 | if (j == 0) |
| 958 | comp = NULL; | 1004 | comp = NULL; |
| 959 | else if (s->options & SSL_OP_NO_COMPRESSION) { | 1005 | else if (s->options & SSL_OP_NO_COMPRESSION) { |
| 960 | al = SSL_AD_ILLEGAL_PARAMETER; | 1006 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 961 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_COMPRESSION_DISABLED); | 1007 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1008 | SSL_R_COMPRESSION_DISABLED); | ||
| 962 | goto f_err; | 1009 | goto f_err; |
| 963 | } else | 1010 | } else |
| 964 | comp = ssl3_comp_find(s->ctx->comp_methods, j); | 1011 | comp = ssl3_comp_find(s->ctx->comp_methods, j); |
| 965 | 1012 | ||
| 966 | if ((j != 0) && (comp == NULL)) { | 1013 | if ((j != 0) && (comp == NULL)) { |
| 967 | al = SSL_AD_ILLEGAL_PARAMETER; | 1014 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 968 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | 1015 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1016 | SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | ||
| 969 | goto f_err; | 1017 | goto f_err; |
| 970 | } else { | 1018 | } else { |
| 971 | s->s3->tmp.new_compression = comp; | 1019 | s->s3->tmp.new_compression = comp; |
| @@ -977,12 +1025,14 @@ ssl3_get_server_hello(SSL *s) | |||
| 977 | if (s->version >= SSL3_VERSION) { | 1025 | if (s->version >= SSL3_VERSION) { |
| 978 | if (!ssl_parse_serverhello_tlsext(s, &p, d, n, &al)) { | 1026 | if (!ssl_parse_serverhello_tlsext(s, &p, d, n, &al)) { |
| 979 | /* 'al' set by ssl_parse_serverhello_tlsext */ | 1027 | /* 'al' set by ssl_parse_serverhello_tlsext */ |
| 980 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_PARSE_TLSEXT); | 1028 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1029 | SSL_R_PARSE_TLSEXT); | ||
| 981 | goto f_err; | 1030 | goto f_err; |
| 982 | 1031 | ||
| 983 | } | 1032 | } |
| 984 | if (ssl_check_serverhello_tlsext(s) <= 0) { | 1033 | if (ssl_check_serverhello_tlsext(s) <= 0) { |
| 985 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_SERVERHELLO_TLSEXT); | 1034 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1035 | SSL_R_SERVERHELLO_TLSEXT); | ||
| 986 | goto err; | 1036 | goto err; |
| 987 | } | 1037 | } |
| 988 | } | 1038 | } |
| @@ -991,29 +1041,32 @@ ssl3_get_server_hello(SSL *s) | |||
| 991 | if (p != (d + n)) { | 1041 | if (p != (d + n)) { |
| 992 | /* wrong packet length */ | 1042 | /* wrong packet length */ |
| 993 | al = SSL_AD_DECODE_ERROR; | 1043 | al = SSL_AD_DECODE_ERROR; |
| 994 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_BAD_PACKET_LENGTH); | 1044 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| 1045 | SSL_R_BAD_PACKET_LENGTH); | ||
| 995 | goto f_err; | 1046 | goto f_err; |
| 996 | } | 1047 | } |
| 997 | 1048 | ||
| 998 | return (1); | 1049 | return (1); |
| 999 | f_err: | 1050 | f_err: |
| 1000 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1051 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1001 | err: | 1052 | err: |
| 1002 | return (-1); | 1053 | return (-1); |
| 1003 | } | 1054 | } |
| 1004 | 1055 | ||
| 1005 | int | 1056 | int |
| 1006 | ssl3_get_server_certificate(SSL *s) | 1057 | ssl3_get_server_certificate(SSL *s) |
| 1007 | { | 1058 | { |
| 1008 | int al, i, ok, ret = -1; | 1059 | int al, i, ok, ret = -1; |
| 1009 | unsigned long n, nc, llen, l; | 1060 | unsigned long n, nc, llen, l; |
| 1010 | X509 *x = NULL; | 1061 | X509 *x = NULL; |
| 1011 | const unsigned char *q, *p; | 1062 | const unsigned char *q, *p; |
| 1012 | unsigned char *d; | 1063 | unsigned char *d; |
| 1013 | STACK_OF(X509) *sk = NULL; | 1064 | STACK_OF(X509) *sk = NULL; |
| 1014 | SESS_CERT *sc; | 1065 | SESS_CERT *sc; |
| 1015 | EVP_PKEY *pkey = NULL; | 1066 | EVP_PKEY *pkey = NULL; |
| 1016 | int need_cert = 1; /* VRS: 0=> will allow null cert if auth == KRB5 */ | 1067 | |
| 1068 | /* VRS: 0=> will allow null cert if auth == KRB5 */ | ||
| 1069 | int need_cert = 1; | ||
| 1017 | 1070 | ||
| 1018 | n = s->method->ssl_get_message(s, SSL3_ST_CR_CERT_A, | 1071 | n = s->method->ssl_get_message(s, SSL3_ST_CR_CERT_A, |
| 1019 | SSL3_ST_CR_CERT_B, -1, s->max_cert_list, &ok); | 1072 | SSL3_ST_CR_CERT_B, -1, s->max_cert_list, &ok); |
| @@ -1030,27 +1083,31 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1030 | 1083 | ||
| 1031 | if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE) { | 1084 | if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE) { |
| 1032 | al = SSL_AD_UNEXPECTED_MESSAGE; | 1085 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 1033 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_BAD_MESSAGE_TYPE); | 1086 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1087 | SSL_R_BAD_MESSAGE_TYPE); | ||
| 1034 | goto f_err; | 1088 | goto f_err; |
| 1035 | } | 1089 | } |
| 1036 | p = d = (unsigned char *)s->init_msg; | 1090 | p = d = (unsigned char *)s->init_msg; |
| 1037 | 1091 | ||
| 1038 | if ((sk = sk_X509_new_null()) == NULL) { | 1092 | if ((sk = sk_X509_new_null()) == NULL) { |
| 1039 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_MALLOC_FAILURE); | 1093 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1094 | ERR_R_MALLOC_FAILURE); | ||
| 1040 | goto err; | 1095 | goto err; |
| 1041 | } | 1096 | } |
| 1042 | 1097 | ||
| 1043 | n2l3(p, llen); | 1098 | n2l3(p, llen); |
| 1044 | if (llen + 3 != n) { | 1099 | if (llen + 3 != n) { |
| 1045 | al = SSL_AD_DECODE_ERROR; | 1100 | al = SSL_AD_DECODE_ERROR; |
| 1046 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_LENGTH_MISMATCH); | 1101 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1102 | SSL_R_LENGTH_MISMATCH); | ||
| 1047 | goto f_err; | 1103 | goto f_err; |
| 1048 | } | 1104 | } |
| 1049 | for (nc = 0; nc < llen; ) { | 1105 | for (nc = 0; nc < llen; ) { |
| 1050 | n2l3(p, l); | 1106 | n2l3(p, l); |
| 1051 | if ((l + nc + 3) > llen) { | 1107 | if ((l + nc + 3) > llen) { |
| 1052 | al = SSL_AD_DECODE_ERROR; | 1108 | al = SSL_AD_DECODE_ERROR; |
| 1053 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_CERT_LENGTH_MISMATCH); | 1109 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1110 | SSL_R_CERT_LENGTH_MISMATCH); | ||
| 1054 | goto f_err; | 1111 | goto f_err; |
| 1055 | } | 1112 | } |
| 1056 | 1113 | ||
| @@ -1058,16 +1115,19 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1058 | x = d2i_X509(NULL, &q, l); | 1115 | x = d2i_X509(NULL, &q, l); |
| 1059 | if (x == NULL) { | 1116 | if (x == NULL) { |
| 1060 | al = SSL_AD_BAD_CERTIFICATE; | 1117 | al = SSL_AD_BAD_CERTIFICATE; |
| 1061 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_ASN1_LIB); | 1118 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1119 | ERR_R_ASN1_LIB); | ||
| 1062 | goto f_err; | 1120 | goto f_err; |
| 1063 | } | 1121 | } |
| 1064 | if (q != (p + l)) { | 1122 | if (q != (p + l)) { |
| 1065 | al = SSL_AD_DECODE_ERROR; | 1123 | al = SSL_AD_DECODE_ERROR; |
| 1066 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_CERT_LENGTH_MISMATCH); | 1124 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1125 | SSL_R_CERT_LENGTH_MISMATCH); | ||
| 1067 | goto f_err; | 1126 | goto f_err; |
| 1068 | } | 1127 | } |
| 1069 | if (!sk_X509_push(sk, x)) { | 1128 | if (!sk_X509_push(sk, x)) { |
| 1070 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_MALLOC_FAILURE); | 1129 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1130 | ERR_R_MALLOC_FAILURE); | ||
| 1071 | goto err; | 1131 | goto err; |
| 1072 | } | 1132 | } |
| 1073 | x = NULL; | 1133 | x = NULL; |
| @@ -1083,7 +1143,8 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1083 | #endif /* OPENSSL_NO_KRB5 */ | 1143 | #endif /* OPENSSL_NO_KRB5 */ |
| 1084 | ) { | 1144 | ) { |
| 1085 | al = ssl_verify_alarm_type(s->verify_result); | 1145 | al = ssl_verify_alarm_type(s->verify_result); |
| 1086 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_CERTIFICATE_VERIFY_FAILED); | 1146 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1147 | SSL_R_CERTIFICATE_VERIFY_FAILED); | ||
| 1087 | goto f_err; | 1148 | goto f_err; |
| 1088 | 1149 | ||
| 1089 | } | 1150 | } |
| @@ -1098,8 +1159,10 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1098 | s->session->sess_cert = sc; | 1159 | s->session->sess_cert = sc; |
| 1099 | 1160 | ||
| 1100 | sc->cert_chain = sk; | 1161 | sc->cert_chain = sk; |
| 1101 | /* Inconsistency alert: cert_chain does include the peer's | 1162 | /* |
| 1102 | * certificate, which we don't include in s3_srvr.c */ | 1163 | * Inconsistency alert: cert_chain does include the peer's |
| 1164 | * certificate, which we don't include in s3_srvr.c | ||
| 1165 | */ | ||
| 1103 | x = sk_X509_value(sk, 0); | 1166 | x = sk_X509_value(sk, 0); |
| 1104 | sk = NULL; | 1167 | sk = NULL; |
| 1105 | /* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/ | 1168 | /* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/ |
| @@ -1108,17 +1171,19 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1108 | 1171 | ||
| 1109 | /* VRS: allow null cert if auth == KRB5 */ | 1172 | /* VRS: allow null cert if auth == KRB5 */ |
| 1110 | need_cert = ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kKRB5) && | 1173 | need_cert = ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kKRB5) && |
| 1111 | (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5)) | 1174 | (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5)) |
| 1112 | ? 0 : 1; | 1175 | ? 0 : 1; |
| 1113 | 1176 | ||
| 1114 | #ifdef KSSL_DEBUG | 1177 | #ifdef KSSL_DEBUG |
| 1115 | printf("pkey, x = %p, %p\n", pkey, x); | 1178 | printf("pkey, x = %p, %p\n", pkey, x); |
| 1116 | printf("ssl_cert_type(x, pkey) = %d\n", ssl_cert_type(x, pkey)); | 1179 | printf("ssl_cert_type(x, pkey) = %d\n", ssl_cert_type(x, pkey)); |
| 1117 | printf("cipher, alg, nc = %s, %lx, %lx, %d\n", s->s3->tmp.new_cipher->name, | 1180 | printf("cipher, alg, nc = %s, %lx, %lx, %d\n", |
| 1118 | s->s3->tmp.new_cipher->algorithm_mkey, s->s3->tmp.new_cipher->algorithm_auth, need_cert); | 1181 | s->s3->tmp.new_cipher->name, s->s3->tmp.new_cipher->algorithm_mkey, |
| 1182 | s->s3->tmp.new_cipher->algorithm_auth, need_cert); | ||
| 1119 | #endif /* KSSL_DEBUG */ | 1183 | #endif /* KSSL_DEBUG */ |
| 1120 | 1184 | ||
| 1121 | if (need_cert && ((pkey == NULL) || EVP_PKEY_missing_parameters(pkey))) { | 1185 | if (need_cert && ((pkey == NULL) || |
| 1186 | EVP_PKEY_missing_parameters(pkey))) { | ||
| 1122 | x = NULL; | 1187 | x = NULL; |
| 1123 | al = SSL3_AL_FATAL; | 1188 | al = SSL3_AL_FATAL; |
| 1124 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, | 1189 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| @@ -1138,8 +1203,10 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1138 | if (need_cert) { | 1203 | if (need_cert) { |
| 1139 | sc->peer_cert_type = i; | 1204 | sc->peer_cert_type = i; |
| 1140 | CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); | 1205 | CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); |
| 1141 | /* Why would the following ever happen? | 1206 | /* |
| 1142 | * We just created sc a couple of lines ago. */ | 1207 | * Why would the following ever happen? |
| 1208 | * We just created sc a couple of lines ago. | ||
| 1209 | */ | ||
| 1143 | if (sc->peer_pkeys[i].x509 != NULL) | 1210 | if (sc->peer_pkeys[i].x509 != NULL) |
| 1144 | X509_free(sc->peer_pkeys[i].x509); | 1211 | X509_free(sc->peer_pkeys[i].x509); |
| 1145 | sc->peer_pkeys[i].x509 = x; | 1212 | sc->peer_pkeys[i].x509 = x; |
| @@ -1163,10 +1230,10 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1163 | ret = 1; | 1230 | ret = 1; |
| 1164 | 1231 | ||
| 1165 | if (0) { | 1232 | if (0) { |
| 1166 | f_err: | 1233 | f_err: |
| 1167 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1234 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1168 | } | 1235 | } |
| 1169 | err: | 1236 | err: |
| 1170 | EVP_PKEY_free(pkey); | 1237 | EVP_PKEY_free(pkey); |
| 1171 | X509_free(x); | 1238 | X509_free(x); |
| 1172 | sk_X509_pop_free(sk, X509_free); | 1239 | sk_X509_pop_free(sk, X509_free); |
| @@ -1176,27 +1243,29 @@ err: | |||
| 1176 | int | 1243 | int |
| 1177 | ssl3_get_key_exchange(SSL *s) | 1244 | ssl3_get_key_exchange(SSL *s) |
| 1178 | { | 1245 | { |
| 1179 | unsigned char *q, md_buf[EVP_MAX_MD_SIZE*2]; | 1246 | unsigned char *q, md_buf[EVP_MAX_MD_SIZE*2]; |
| 1180 | EVP_MD_CTX md_ctx; | 1247 | EVP_MD_CTX md_ctx; |
| 1181 | unsigned char *param, *p; | 1248 | unsigned char *param, *p; |
| 1182 | int al, i, j, param_len, ok; | 1249 | int al, i, j, param_len, ok; |
| 1183 | long n, alg_k, alg_a; | 1250 | long n, alg_k, alg_a; |
| 1184 | EVP_PKEY *pkey = NULL; | 1251 | EVP_PKEY *pkey = NULL; |
| 1185 | const EVP_MD *md = NULL; | 1252 | const EVP_MD *md = NULL; |
| 1186 | RSA *rsa = NULL; | 1253 | RSA *rsa = NULL; |
| 1187 | #ifndef OPENSSL_NO_DH | 1254 | #ifndef OPENSSL_NO_DH |
| 1188 | DH *dh = NULL; | 1255 | DH *dh = NULL; |
| 1189 | #endif | 1256 | #endif |
| 1190 | #ifndef OPENSSL_NO_ECDH | 1257 | #ifndef OPENSSL_NO_ECDH |
| 1191 | EC_KEY *ecdh = NULL; | 1258 | EC_KEY *ecdh = NULL; |
| 1192 | BN_CTX *bn_ctx = NULL; | 1259 | BN_CTX *bn_ctx = NULL; |
| 1193 | EC_POINT *srvr_ecpoint = NULL; | 1260 | EC_POINT *srvr_ecpoint = NULL; |
| 1194 | int curve_nid = 0; | 1261 | int curve_nid = 0; |
| 1195 | int encoded_pt_len = 0; | 1262 | int encoded_pt_len = 0; |
| 1196 | #endif | 1263 | #endif |
| 1197 | 1264 | ||
| 1198 | /* use same message size as in ssl3_get_certificate_request() | 1265 | /* |
| 1199 | * as ServerKeyExchange message may be skipped */ | 1266 | * Use same message size as in ssl3_get_certificate_request() |
| 1267 | * as ServerKeyExchange message may be skipped. | ||
| 1268 | */ | ||
| 1200 | n = s->method->ssl_get_message(s, SSL3_ST_CR_KEY_EXCH_A, | 1269 | n = s->method->ssl_get_message(s, SSL3_ST_CR_KEY_EXCH_A, |
| 1201 | SSL3_ST_CR_KEY_EXCH_B, -1, s->max_cert_list, &ok); | 1270 | SSL3_ST_CR_KEY_EXCH_B, -1, s->max_cert_list, &ok); |
| 1202 | if (!ok) | 1271 | if (!ok) |
| @@ -1204,10 +1273,11 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1204 | 1273 | ||
| 1205 | if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) { | 1274 | if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) { |
| 1206 | #ifndef OPENSSL_NO_PSK | 1275 | #ifndef OPENSSL_NO_PSK |
| 1207 | /* In plain PSK ciphersuite, ServerKeyExchange can be | 1276 | /* |
| 1208 | omitted if no identity hint is sent. Set | 1277 | * In plain PSK ciphersuite, ServerKeyExchange can be |
| 1209 | session->sess_cert anyway to avoid problems | 1278 | * omitted if no identity hint is sent. Set session->sess_cert |
| 1210 | later.*/ | 1279 | * anyway to avoid problems later. |
| 1280 | */ | ||
| 1211 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK) { | 1281 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK) { |
| 1212 | s->session->sess_cert = ssl_sess_cert_new(); | 1282 | s->session->sess_cert = ssl_sess_cert_new(); |
| 1213 | if (s->ctx->psk_identity_hint) | 1283 | if (s->ctx->psk_identity_hint) |
| @@ -1253,32 +1323,37 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1253 | al = SSL_AD_HANDSHAKE_FAILURE; | 1323 | al = SSL_AD_HANDSHAKE_FAILURE; |
| 1254 | n2s(p, i); | 1324 | n2s(p, i); |
| 1255 | param_len = i + 2; | 1325 | param_len = i + 2; |
| 1256 | /* Store PSK identity hint for later use, hint is used | 1326 | /* |
| 1327 | * Store PSK identity hint for later use, hint is used | ||
| 1257 | * in ssl3_send_client_key_exchange. Assume that the | 1328 | * in ssl3_send_client_key_exchange. Assume that the |
| 1258 | * maximum length of a PSK identity hint can be as | 1329 | * maximum length of a PSK identity hint can be as |
| 1259 | * long as the maximum length of a PSK identity. */ | 1330 | * long as the maximum length of a PSK identity. |
| 1331 | */ | ||
| 1260 | if (i > PSK_MAX_IDENTITY_LEN) { | 1332 | if (i > PSK_MAX_IDENTITY_LEN) { |
| 1261 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1333 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1262 | SSL_R_DATA_LENGTH_TOO_LONG); | 1334 | SSL_R_DATA_LENGTH_TOO_LONG); |
| 1263 | goto f_err; | 1335 | goto f_err; |
| 1264 | } | 1336 | } |
| 1265 | if (param_len > n) { | 1337 | if (param_len > n) { |
| 1266 | al = SSL_AD_DECODE_ERROR; | 1338 | al = SSL_AD_DECODE_ERROR; |
| 1267 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1339 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1268 | SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH); | 1340 | SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH); |
| 1269 | goto f_err; | 1341 | goto f_err; |
| 1270 | } | 1342 | } |
| 1271 | /* If received PSK identity hint contains NULL | 1343 | /* |
| 1344 | * If received PSK identity hint contains NULL | ||
| 1272 | * characters, the hint is truncated from the first | 1345 | * characters, the hint is truncated from the first |
| 1273 | * NULL. p may not be ending with NULL, so create a | 1346 | * NULL. p may not be ending with NULL, so create a |
| 1274 | * NULL-terminated string. */ | 1347 | * NULL-terminated string. |
| 1348 | */ | ||
| 1275 | memcpy(tmp_id_hint, p, i); | 1349 | memcpy(tmp_id_hint, p, i); |
| 1276 | memset(tmp_id_hint + i, 0, PSK_MAX_IDENTITY_LEN + 1 - i); | 1350 | memset(tmp_id_hint + i, 0, PSK_MAX_IDENTITY_LEN + 1 - i); |
| 1277 | if (s->ctx->psk_identity_hint != NULL) | 1351 | if (s->ctx->psk_identity_hint != NULL) |
| 1278 | free(s->ctx->psk_identity_hint); | 1352 | free(s->ctx->psk_identity_hint); |
| 1279 | s->ctx->psk_identity_hint = BUF_strdup(tmp_id_hint); | 1353 | s->ctx->psk_identity_hint = BUF_strdup(tmp_id_hint); |
| 1280 | if (s->ctx->psk_identity_hint == NULL) { | 1354 | if (s->ctx->psk_identity_hint == NULL) { |
| 1281 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 1355 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1356 | ERR_R_MALLOC_FAILURE); | ||
| 1282 | goto f_err; | 1357 | goto f_err; |
| 1283 | } | 1358 | } |
| 1284 | 1359 | ||
| @@ -1292,11 +1367,13 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1292 | param_len = i + 2; | 1367 | param_len = i + 2; |
| 1293 | if (param_len > n) { | 1368 | if (param_len > n) { |
| 1294 | al = SSL_AD_DECODE_ERROR; | 1369 | al = SSL_AD_DECODE_ERROR; |
| 1295 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SRP_N_LENGTH); | 1370 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1371 | SSL_R_BAD_SRP_N_LENGTH); | ||
| 1296 | goto f_err; | 1372 | goto f_err; |
| 1297 | } | 1373 | } |
| 1298 | if (!(s->srp_ctx.N = BN_bin2bn(p, i, NULL))) { | 1374 | if (!(s->srp_ctx.N = BN_bin2bn(p, i, NULL))) { |
| 1299 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1375 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1376 | ERR_R_BN_LIB); | ||
| 1300 | goto err; | 1377 | goto err; |
| 1301 | } | 1378 | } |
| 1302 | p += i; | 1379 | p += i; |
| @@ -1305,11 +1382,13 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1305 | param_len += i + 2; | 1382 | param_len += i + 2; |
| 1306 | if (param_len > n) { | 1383 | if (param_len > n) { |
| 1307 | al = SSL_AD_DECODE_ERROR; | 1384 | al = SSL_AD_DECODE_ERROR; |
| 1308 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SRP_G_LENGTH); | 1385 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1386 | SSL_R_BAD_SRP_G_LENGTH); | ||
| 1309 | goto f_err; | 1387 | goto f_err; |
| 1310 | } | 1388 | } |
| 1311 | if (!(s->srp_ctx.g = BN_bin2bn(p, i, NULL))) { | 1389 | if (!(s->srp_ctx.g = BN_bin2bn(p, i, NULL))) { |
| 1312 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1390 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1391 | ERR_R_BN_LIB); | ||
| 1313 | goto err; | 1392 | goto err; |
| 1314 | } | 1393 | } |
| 1315 | p += i; | 1394 | p += i; |
| @@ -1319,11 +1398,13 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1319 | param_len += i + 1; | 1398 | param_len += i + 1; |
| 1320 | if (param_len > n) { | 1399 | if (param_len > n) { |
| 1321 | al = SSL_AD_DECODE_ERROR; | 1400 | al = SSL_AD_DECODE_ERROR; |
| 1322 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SRP_S_LENGTH); | 1401 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1402 | SSL_R_BAD_SRP_S_LENGTH); | ||
| 1323 | goto f_err; | 1403 | goto f_err; |
| 1324 | } | 1404 | } |
| 1325 | if (!(s->srp_ctx.s = BN_bin2bn(p, i, NULL))) { | 1405 | if (!(s->srp_ctx.s = BN_bin2bn(p, i, NULL))) { |
| 1326 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1406 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1407 | ERR_R_BN_LIB); | ||
| 1327 | goto err; | 1408 | goto err; |
| 1328 | } | 1409 | } |
| 1329 | p += i; | 1410 | p += i; |
| @@ -1332,224 +1413,268 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1332 | param_len += i + 2; | 1413 | param_len += i + 2; |
| 1333 | if (param_len > n) { | 1414 | if (param_len > n) { |
| 1334 | al = SSL_AD_DECODE_ERROR; | 1415 | al = SSL_AD_DECODE_ERROR; |
| 1335 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SRP_B_LENGTH); | 1416 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1417 | SSL_R_BAD_SRP_B_LENGTH); | ||
| 1336 | goto f_err; | 1418 | goto f_err; |
| 1337 | } | 1419 | } |
| 1338 | if (!(s->srp_ctx.B = BN_bin2bn(p, i, NULL))) { | 1420 | if (!(s->srp_ctx.B = BN_bin2bn(p, i, NULL))) { |
| 1339 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1421 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1422 | ERR_R_BN_LIB); | ||
| 1340 | goto err; | 1423 | goto err; |
| 1341 | } | 1424 | } |
| 1342 | p += i; | 1425 | p += i; |
| 1343 | n -= param_len; | 1426 | n -= param_len; |
| 1344 | 1427 | ||
| 1345 | /* We must check if there is a certificate */ | 1428 | /* We must check if there is a certificate */ |
| 1346 | if (alg_a & SSL_aRSA) | 1429 | if (alg_a & SSL_aRSA) |
| 1347 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509); | 1430 | pkey = X509_get_pubkey( |
| 1431 | s->session->sess_cert->peer_pkeys[ | ||
| 1432 | SSL_PKEY_RSA_ENC].x509); | ||
| 1348 | else if (alg_a & SSL_aDSS) | 1433 | else if (alg_a & SSL_aDSS) |
| 1349 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509); | 1434 | pkey = X509_get_pubkey( |
| 1435 | s->session->sess_cert->peer_pkeys[ | ||
| 1436 | SSL_PKEY_DSA_SIGN].x509); | ||
| 1350 | } else | 1437 | } else |
| 1351 | #endif /* !OPENSSL_NO_SRP */ | 1438 | #endif /* !OPENSSL_NO_SRP */ |
| 1352 | if (alg_k & SSL_kRSA) { | 1439 | if (alg_k & SSL_kRSA) { |
| 1353 | if ((rsa = RSA_new()) == NULL) { | 1440 | if ((rsa = RSA_new()) == NULL) { |
| 1354 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 1441 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1355 | goto err; | 1442 | ERR_R_MALLOC_FAILURE); |
| 1356 | } | 1443 | goto err; |
| 1357 | n2s(p, i); | 1444 | } |
| 1358 | param_len = i + 2; | 1445 | n2s(p, i); |
| 1359 | if (param_len > n) { | 1446 | param_len = i + 2; |
| 1360 | al = SSL_AD_DECODE_ERROR; | 1447 | if (param_len > n) { |
| 1361 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_RSA_MODULUS_LENGTH); | 1448 | al = SSL_AD_DECODE_ERROR; |
| 1362 | goto f_err; | 1449 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1363 | } | 1450 | SSL_R_BAD_RSA_MODULUS_LENGTH); |
| 1364 | if (!(rsa->n = BN_bin2bn(p, i, rsa->n))) { | 1451 | goto f_err; |
| 1365 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1452 | } |
| 1366 | goto err; | 1453 | if (!(rsa->n = BN_bin2bn(p, i, rsa->n))) { |
| 1367 | } | 1454 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1368 | p += i; | 1455 | ERR_R_BN_LIB); |
| 1456 | goto err; | ||
| 1457 | } | ||
| 1458 | p += i; | ||
| 1369 | 1459 | ||
| 1370 | n2s(p, i); | 1460 | n2s(p, i); |
| 1371 | param_len += i + 2; | 1461 | param_len += i + 2; |
| 1372 | if (param_len > n) { | 1462 | if (param_len > n) { |
| 1373 | al = SSL_AD_DECODE_ERROR; | 1463 | al = SSL_AD_DECODE_ERROR; |
| 1374 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_RSA_E_LENGTH); | 1464 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1375 | goto f_err; | 1465 | SSL_R_BAD_RSA_E_LENGTH); |
| 1376 | } | 1466 | goto f_err; |
| 1377 | if (!(rsa->e = BN_bin2bn(p, i, rsa->e))) { | 1467 | } |
| 1378 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1468 | if (!(rsa->e = BN_bin2bn(p, i, rsa->e))) { |
| 1379 | goto err; | 1469 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1380 | } | 1470 | ERR_R_BN_LIB); |
| 1381 | p += i; | 1471 | goto err; |
| 1382 | n -= param_len; | 1472 | } |
| 1473 | p += i; | ||
| 1474 | n -= param_len; | ||
| 1383 | 1475 | ||
| 1384 | /* this should be because we are using an export cipher */ | 1476 | /* |
| 1385 | if (alg_a & SSL_aRSA) | 1477 | * This should be because we are using an |
| 1386 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509); | 1478 | * export cipher |
| 1387 | else { | 1479 | */ |
| 1388 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 1480 | if (alg_a & SSL_aRSA) |
| 1389 | goto err; | 1481 | pkey = X509_get_pubkey( |
| 1482 | s->session->sess_cert->peer_pkeys[ | ||
| 1483 | SSL_PKEY_RSA_ENC].x509); | ||
| 1484 | else { | ||
| 1485 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1486 | ERR_R_INTERNAL_ERROR); | ||
| 1487 | goto err; | ||
| 1488 | } | ||
| 1489 | s->session->sess_cert->peer_rsa_tmp = rsa; | ||
| 1490 | rsa = NULL; | ||
| 1390 | } | 1491 | } |
| 1391 | s->session->sess_cert->peer_rsa_tmp = rsa; | ||
| 1392 | rsa = NULL; | ||
| 1393 | } | ||
| 1394 | #ifndef OPENSSL_NO_DH | 1492 | #ifndef OPENSSL_NO_DH |
| 1395 | else if (alg_k & SSL_kEDH) { | 1493 | else if (alg_k & SSL_kEDH) { |
| 1396 | if ((dh = DH_new()) == NULL) { | 1494 | if ((dh = DH_new()) == NULL) { |
| 1397 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_DH_LIB); | 1495 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1398 | goto err; | 1496 | ERR_R_DH_LIB); |
| 1399 | } | 1497 | goto err; |
| 1400 | n2s(p, i); | 1498 | } |
| 1401 | param_len = i + 2; | 1499 | n2s(p, i); |
| 1402 | if (param_len > n) { | 1500 | param_len = i + 2; |
| 1403 | al = SSL_AD_DECODE_ERROR; | 1501 | if (param_len > n) { |
| 1404 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_P_LENGTH); | 1502 | al = SSL_AD_DECODE_ERROR; |
| 1405 | goto f_err; | 1503 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1406 | } | 1504 | SSL_R_BAD_DH_P_LENGTH); |
| 1407 | if (!(dh->p = BN_bin2bn(p, i, NULL))) { | 1505 | goto f_err; |
| 1408 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1506 | } |
| 1409 | goto err; | 1507 | if (!(dh->p = BN_bin2bn(p, i, NULL))) { |
| 1410 | } | 1508 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1411 | p += i; | 1509 | ERR_R_BN_LIB); |
| 1510 | goto err; | ||
| 1511 | } | ||
| 1512 | p += i; | ||
| 1412 | 1513 | ||
| 1413 | n2s(p, i); | 1514 | n2s(p, i); |
| 1414 | param_len += i + 2; | 1515 | param_len += i + 2; |
| 1415 | if (param_len > n) { | 1516 | if (param_len > n) { |
| 1416 | al = SSL_AD_DECODE_ERROR; | 1517 | al = SSL_AD_DECODE_ERROR; |
| 1417 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_G_LENGTH); | 1518 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1418 | goto f_err; | 1519 | SSL_R_BAD_DH_G_LENGTH); |
| 1419 | } | 1520 | goto f_err; |
| 1420 | if (!(dh->g = BN_bin2bn(p, i, NULL))) { | 1521 | } |
| 1421 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1522 | if (!(dh->g = BN_bin2bn(p, i, NULL))) { |
| 1422 | goto err; | 1523 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1423 | } | 1524 | ERR_R_BN_LIB); |
| 1424 | p += i; | 1525 | goto err; |
| 1526 | } | ||
| 1527 | p += i; | ||
| 1425 | 1528 | ||
| 1426 | n2s(p, i); | 1529 | n2s(p, i); |
| 1427 | param_len += i + 2; | 1530 | param_len += i + 2; |
| 1428 | if (param_len > n) { | 1531 | if (param_len > n) { |
| 1429 | al = SSL_AD_DECODE_ERROR; | 1532 | al = SSL_AD_DECODE_ERROR; |
| 1430 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_PUB_KEY_LENGTH); | 1533 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1534 | SSL_R_BAD_DH_PUB_KEY_LENGTH); | ||
| 1535 | goto f_err; | ||
| 1536 | } | ||
| 1537 | if (!(dh->pub_key = BN_bin2bn(p, i, NULL))) { | ||
| 1538 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1539 | ERR_R_BN_LIB); | ||
| 1540 | goto err; | ||
| 1541 | } | ||
| 1542 | p += i; | ||
| 1543 | n -= param_len; | ||
| 1544 | |||
| 1545 | if (alg_a & SSL_aRSA) | ||
| 1546 | pkey = X509_get_pubkey( | ||
| 1547 | s->session->sess_cert->peer_pkeys[ | ||
| 1548 | SSL_PKEY_RSA_ENC].x509); | ||
| 1549 | else if (alg_a & SSL_aDSS) | ||
| 1550 | pkey = X509_get_pubkey( | ||
| 1551 | s->session->sess_cert->peer_pkeys[ | ||
| 1552 | SSL_PKEY_DSA_SIGN].x509); | ||
| 1553 | /* else anonymous DH, so no certificate or pkey. */ | ||
| 1554 | |||
| 1555 | s->session->sess_cert->peer_dh_tmp = dh; | ||
| 1556 | dh = NULL; | ||
| 1557 | } else if ((alg_k & SSL_kDHr) || (alg_k & SSL_kDHd)) { | ||
| 1558 | al = SSL_AD_ILLEGAL_PARAMETER; | ||
| 1559 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1560 | SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER); | ||
| 1431 | goto f_err; | 1561 | goto f_err; |
| 1432 | } | 1562 | } |
| 1433 | if (!(dh->pub_key = BN_bin2bn(p, i, NULL))) { | ||
| 1434 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | ||
| 1435 | goto err; | ||
| 1436 | } | ||
| 1437 | p += i; | ||
| 1438 | n -= param_len; | ||
| 1439 | |||
| 1440 | if (alg_a & SSL_aRSA) | ||
| 1441 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509); | ||
| 1442 | else if (alg_a & SSL_aDSS) | ||
| 1443 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509); | ||
| 1444 | /* else anonymous DH, so no certificate or pkey. */ | ||
| 1445 | |||
| 1446 | s->session->sess_cert->peer_dh_tmp = dh; | ||
| 1447 | dh = NULL; | ||
| 1448 | } else if ((alg_k & SSL_kDHr) || (alg_k & SSL_kDHd)) { | ||
| 1449 | al = SSL_AD_ILLEGAL_PARAMETER; | ||
| 1450 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER); | ||
| 1451 | goto f_err; | ||
| 1452 | } | ||
| 1453 | #endif /* !OPENSSL_NO_DH */ | 1563 | #endif /* !OPENSSL_NO_DH */ |
| 1454 | 1564 | ||
| 1455 | #ifndef OPENSSL_NO_ECDH | 1565 | #ifndef OPENSSL_NO_ECDH |
| 1456 | else if (alg_k & SSL_kEECDH) { | 1566 | else if (alg_k & SSL_kEECDH) { |
| 1457 | EC_GROUP *ngroup; | 1567 | EC_GROUP *ngroup; |
| 1458 | const EC_GROUP *group; | 1568 | const EC_GROUP *group; |
| 1459 | 1569 | ||
| 1460 | if ((ecdh = EC_KEY_new()) == NULL) { | 1570 | if ((ecdh = EC_KEY_new()) == NULL) { |
| 1461 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 1571 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1462 | goto err; | 1572 | ERR_R_MALLOC_FAILURE); |
| 1463 | } | 1573 | goto err; |
| 1574 | } | ||
| 1464 | 1575 | ||
| 1465 | /* Extract elliptic curve parameters and the | 1576 | /* |
| 1466 | * server's ephemeral ECDH public key. | 1577 | * Extract elliptic curve parameters and the |
| 1467 | * Keep accumulating lengths of various components in | 1578 | * server's ephemeral ECDH public key. |
| 1468 | * param_len and make sure it never exceeds n. | 1579 | * Keep accumulating lengths of various components in |
| 1469 | */ | 1580 | * param_len and make sure it never exceeds n. |
| 1581 | */ | ||
| 1470 | 1582 | ||
| 1471 | /* XXX: For now we only support named (not generic) curves | 1583 | /* |
| 1472 | * and the ECParameters in this case is just three bytes. | 1584 | * XXX: For now we only support named (not generic) |
| 1473 | */ | 1585 | * curves and the ECParameters in this case is just |
| 1474 | param_len = 3; | 1586 | * three bytes. |
| 1475 | if ((param_len > n) || | 1587 | */ |
| 1476 | (*p != NAMED_CURVE_TYPE) || | 1588 | param_len = 3; |
| 1477 | ((curve_nid = tls1_ec_curve_id2nid(*(p + 2))) == 0)) { | 1589 | if ((param_len > n) || (*p != NAMED_CURVE_TYPE) || |
| 1478 | al = SSL_AD_INTERNAL_ERROR; | 1590 | ((curve_nid = tls1_ec_curve_id2nid(*(p + 2))) |
| 1479 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS); | 1591 | == 0)) { |
| 1480 | goto f_err; | 1592 | al = SSL_AD_INTERNAL_ERROR; |
| 1481 | } | 1593 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1594 | SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS); | ||
| 1595 | goto f_err; | ||
| 1596 | } | ||
| 1482 | 1597 | ||
| 1483 | ngroup = EC_GROUP_new_by_curve_name(curve_nid); | 1598 | ngroup = EC_GROUP_new_by_curve_name(curve_nid); |
| 1484 | if (ngroup == NULL) { | 1599 | if (ngroup == NULL) { |
| 1485 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EC_LIB); | 1600 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1486 | goto err; | 1601 | ERR_R_EC_LIB); |
| 1487 | } | 1602 | goto err; |
| 1488 | if (EC_KEY_set_group(ecdh, ngroup) == 0) { | 1603 | } |
| 1489 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EC_LIB); | 1604 | if (EC_KEY_set_group(ecdh, ngroup) == 0) { |
| 1490 | goto err; | 1605 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1491 | } | 1606 | ERR_R_EC_LIB); |
| 1492 | EC_GROUP_free(ngroup); | 1607 | goto err; |
| 1608 | } | ||
| 1609 | EC_GROUP_free(ngroup); | ||
| 1493 | 1610 | ||
| 1494 | group = EC_KEY_get0_group(ecdh); | 1611 | group = EC_KEY_get0_group(ecdh); |
| 1495 | 1612 | ||
| 1496 | if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && | 1613 | if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && |
| 1497 | (EC_GROUP_get_degree(group) > 163)) { | 1614 | (EC_GROUP_get_degree(group) > 163)) { |
| 1498 | al = SSL_AD_EXPORT_RESTRICTION; | 1615 | al = SSL_AD_EXPORT_RESTRICTION; |
| 1499 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER); | 1616 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1500 | goto f_err; | 1617 | SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER); |
| 1501 | } | 1618 | goto f_err; |
| 1619 | } | ||
| 1502 | 1620 | ||
| 1503 | p += 3; | 1621 | p += 3; |
| 1504 | 1622 | ||
| 1505 | /* Next, get the encoded ECPoint */ | 1623 | /* Next, get the encoded ECPoint */ |
| 1506 | if (((srvr_ecpoint = EC_POINT_new(group)) == NULL) || | 1624 | if (((srvr_ecpoint = EC_POINT_new(group)) == NULL) || |
| 1507 | ((bn_ctx = BN_CTX_new()) == NULL)) { | 1625 | ((bn_ctx = BN_CTX_new()) == NULL)) { |
| 1508 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 1626 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1509 | goto err; | 1627 | ERR_R_MALLOC_FAILURE); |
| 1510 | } | 1628 | goto err; |
| 1629 | } | ||
| 1511 | 1630 | ||
| 1512 | encoded_pt_len = *p; | 1631 | encoded_pt_len = *p; |
| 1513 | /* length of encoded point */ | 1632 | /* length of encoded point */ |
| 1514 | p += 1; | 1633 | p += 1; |
| 1515 | param_len += (1 + encoded_pt_len); | 1634 | param_len += (1 + encoded_pt_len); |
| 1516 | if ((param_len > n) || | 1635 | if ((param_len > n) || |
| 1517 | (EC_POINT_oct2point(group, srvr_ecpoint, | 1636 | (EC_POINT_oct2point(group, srvr_ecpoint, |
| 1518 | p, encoded_pt_len, bn_ctx) == 0)) { | 1637 | p, encoded_pt_len, bn_ctx) == 0)) { |
| 1519 | al = SSL_AD_DECODE_ERROR; | 1638 | al = SSL_AD_DECODE_ERROR; |
| 1520 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_ECPOINT); | 1639 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1521 | goto f_err; | 1640 | SSL_R_BAD_ECPOINT); |
| 1522 | } | 1641 | goto f_err; |
| 1642 | } | ||
| 1523 | 1643 | ||
| 1524 | n -= param_len; | 1644 | n -= param_len; |
| 1525 | p += encoded_pt_len; | 1645 | p += encoded_pt_len; |
| 1526 | 1646 | ||
| 1527 | /* The ECC/TLS specification does not mention | 1647 | /* |
| 1528 | * the use of DSA to sign ECParameters in the server | 1648 | * The ECC/TLS specification does not mention the use |
| 1529 | * key exchange message. We do support RSA and ECDSA. | 1649 | * of DSA to sign ECParameters in the server key |
| 1530 | */ | 1650 | * exchange message. We do support RSA and ECDSA. |
| 1531 | if (alg_a & SSL_aRSA) | 1651 | */ |
| 1532 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509); | 1652 | if (alg_a & SSL_aRSA) |
| 1653 | pkey = X509_get_pubkey( | ||
| 1654 | s->session->sess_cert->peer_pkeys[ | ||
| 1655 | SSL_PKEY_RSA_ENC].x509); | ||
| 1533 | #ifndef OPENSSL_NO_ECDSA | 1656 | #ifndef OPENSSL_NO_ECDSA |
| 1534 | else if (alg_a & SSL_aECDSA) | 1657 | else if (alg_a & SSL_aECDSA) |
| 1535 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_ECC].x509); | 1658 | pkey = X509_get_pubkey( |
| 1659 | s->session->sess_cert->peer_pkeys[ | ||
| 1660 | SSL_PKEY_ECC].x509); | ||
| 1536 | #endif | 1661 | #endif |
| 1537 | /* else anonymous ECDH, so no certificate or pkey. */ | 1662 | /* Else anonymous ECDH, so no certificate or pkey. */ |
| 1538 | EC_KEY_set_public_key(ecdh, srvr_ecpoint); | 1663 | EC_KEY_set_public_key(ecdh, srvr_ecpoint); |
| 1539 | s->session->sess_cert->peer_ecdh_tmp = ecdh; | 1664 | s->session->sess_cert->peer_ecdh_tmp = ecdh; |
| 1540 | ecdh = NULL; | 1665 | ecdh = NULL; |
| 1541 | BN_CTX_free(bn_ctx); | 1666 | BN_CTX_free(bn_ctx); |
| 1542 | bn_ctx = NULL; | 1667 | bn_ctx = NULL; |
| 1543 | EC_POINT_free(srvr_ecpoint); | 1668 | EC_POINT_free(srvr_ecpoint); |
| 1544 | srvr_ecpoint = NULL; | 1669 | srvr_ecpoint = NULL; |
| 1545 | } else if (alg_k) { | 1670 | } else if (alg_k) { |
| 1546 | al = SSL_AD_UNEXPECTED_MESSAGE; | 1671 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 1547 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNEXPECTED_MESSAGE); | 1672 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1548 | goto f_err; | 1673 | SSL_R_UNEXPECTED_MESSAGE); |
| 1549 | } | 1674 | goto f_err; |
| 1675 | } | ||
| 1550 | #endif /* !OPENSSL_NO_ECDH */ | 1676 | #endif /* !OPENSSL_NO_ECDH */ |
| 1551 | 1677 | ||
| 1552 | |||
| 1553 | /* p points to the next byte, there are 'n' bytes left */ | 1678 | /* p points to the next byte, there are 'n' bytes left */ |
| 1554 | 1679 | ||
| 1555 | /* if it was signed, check the signature */ | 1680 | /* if it was signed, check the signature */ |
| @@ -1558,23 +1683,30 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1558 | int sigalg = tls12_get_sigid(pkey); | 1683 | int sigalg = tls12_get_sigid(pkey); |
| 1559 | /* Should never happen */ | 1684 | /* Should never happen */ |
| 1560 | if (sigalg == -1) { | 1685 | if (sigalg == -1) { |
| 1561 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 1686 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1687 | ERR_R_INTERNAL_ERROR); | ||
| 1562 | goto err; | 1688 | goto err; |
| 1563 | } | 1689 | } |
| 1564 | /* Check key type is consistent with signature */ | 1690 | /* |
| 1691 | * Check key type is consistent | ||
| 1692 | * with signature | ||
| 1693 | */ | ||
| 1565 | if (sigalg != (int)p[1]) { | 1694 | if (sigalg != (int)p[1]) { |
| 1566 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_WRONG_SIGNATURE_TYPE); | 1695 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1696 | SSL_R_WRONG_SIGNATURE_TYPE); | ||
| 1567 | al = SSL_AD_DECODE_ERROR; | 1697 | al = SSL_AD_DECODE_ERROR; |
| 1568 | goto f_err; | 1698 | goto f_err; |
| 1569 | } | 1699 | } |
| 1570 | md = tls12_get_hash(p[0]); | 1700 | md = tls12_get_hash(p[0]); |
| 1571 | if (md == NULL) { | 1701 | if (md == NULL) { |
| 1572 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNKNOWN_DIGEST); | 1702 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1703 | SSL_R_UNKNOWN_DIGEST); | ||
| 1573 | al = SSL_AD_DECODE_ERROR; | 1704 | al = SSL_AD_DECODE_ERROR; |
| 1574 | goto f_err; | 1705 | goto f_err; |
| 1575 | } | 1706 | } |
| 1576 | #ifdef SSL_DEBUG | 1707 | #ifdef SSL_DEBUG |
| 1577 | fprintf(stderr, "USING TLSv1.2 HASH %s\n", EVP_MD_name(md)); | 1708 | fprintf(stderr, "USING TLSv1.2 HASH %s\n", |
| 1709 | EVP_MD_name(md)); | ||
| 1578 | #endif | 1710 | #endif |
| 1579 | p += 2; | 1711 | p += 2; |
| 1580 | n -= 2; | 1712 | n -= 2; |
| @@ -1588,11 +1720,13 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1588 | if ((i != n) || (n > j) || (n <= 0)) { | 1720 | if ((i != n) || (n > j) || (n <= 0)) { |
| 1589 | /* wrong packet length */ | 1721 | /* wrong packet length */ |
| 1590 | al = SSL_AD_DECODE_ERROR; | 1722 | al = SSL_AD_DECODE_ERROR; |
| 1591 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_WRONG_SIGNATURE_LENGTH); | 1723 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1724 | SSL_R_WRONG_SIGNATURE_LENGTH); | ||
| 1592 | goto f_err; | 1725 | goto f_err; |
| 1593 | } | 1726 | } |
| 1594 | 1727 | ||
| 1595 | if (pkey->type == EVP_PKEY_RSA && TLS1_get_version(s) < TLS1_2_VERSION) { | 1728 | if (pkey->type == EVP_PKEY_RSA && |
| 1729 | TLS1_get_version(s) < TLS1_2_VERSION) { | ||
| 1596 | int num; | 1730 | int num; |
| 1597 | 1731 | ||
| 1598 | j = 0; | 1732 | j = 0; |
| @@ -1600,61 +1734,72 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1600 | for (num = 2; num > 0; num--) { | 1734 | for (num = 2; num > 0; num--) { |
| 1601 | EVP_MD_CTX_set_flags(&md_ctx, | 1735 | EVP_MD_CTX_set_flags(&md_ctx, |
| 1602 | EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); | 1736 | EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); |
| 1603 | EVP_DigestInit_ex(&md_ctx,(num == 2) | 1737 | EVP_DigestInit_ex(&md_ctx, |
| 1604 | ?s->ctx->md5 : s->ctx->sha1, NULL); | 1738 | (num == 2) ? s->ctx->md5 : s->ctx->sha1, |
| 1605 | EVP_DigestUpdate(&md_ctx, &(s->s3->client_random[0]), SSL3_RANDOM_SIZE); | 1739 | NULL); |
| 1606 | EVP_DigestUpdate(&md_ctx, &(s->s3->server_random[0]), SSL3_RANDOM_SIZE); | 1740 | EVP_DigestUpdate(&md_ctx, |
| 1741 | &(s->s3->client_random[0]), | ||
| 1742 | SSL3_RANDOM_SIZE); | ||
| 1743 | EVP_DigestUpdate(&md_ctx, | ||
| 1744 | &(s->s3->server_random[0]), | ||
| 1745 | SSL3_RANDOM_SIZE); | ||
| 1607 | EVP_DigestUpdate(&md_ctx, param, param_len); | 1746 | EVP_DigestUpdate(&md_ctx, param, param_len); |
| 1608 | EVP_DigestFinal_ex(&md_ctx, q,(unsigned int *)&i); | 1747 | EVP_DigestFinal_ex(&md_ctx, q, |
| 1748 | (unsigned int *)&i); | ||
| 1609 | q += i; | 1749 | q += i; |
| 1610 | j += i; | 1750 | j += i; |
| 1611 | } | 1751 | } |
| 1612 | i = RSA_verify(NID_md5_sha1, md_buf, j, p, n, | 1752 | i = RSA_verify(NID_md5_sha1, md_buf, j, |
| 1613 | pkey->pkey.rsa); | 1753 | p, n, pkey->pkey.rsa); |
| 1614 | if (i < 0) { | 1754 | if (i < 0) { |
| 1615 | al = SSL_AD_DECRYPT_ERROR; | 1755 | al = SSL_AD_DECRYPT_ERROR; |
| 1616 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_RSA_DECRYPT); | 1756 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1757 | SSL_R_BAD_RSA_DECRYPT); | ||
| 1617 | goto f_err; | 1758 | goto f_err; |
| 1618 | } | 1759 | } |
| 1619 | if (i == 0) { | 1760 | if (i == 0) { |
| 1620 | /* bad signature */ | 1761 | /* bad signature */ |
| 1621 | al = SSL_AD_DECRYPT_ERROR; | 1762 | al = SSL_AD_DECRYPT_ERROR; |
| 1622 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SIGNATURE); | 1763 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1764 | SSL_R_BAD_SIGNATURE); | ||
| 1623 | goto f_err; | 1765 | goto f_err; |
| 1624 | } | 1766 | } |
| 1625 | } else | 1767 | } else { |
| 1626 | { | ||
| 1627 | EVP_VerifyInit_ex(&md_ctx, md, NULL); | 1768 | EVP_VerifyInit_ex(&md_ctx, md, NULL); |
| 1628 | EVP_VerifyUpdate(&md_ctx, &(s->s3->client_random[0]), SSL3_RANDOM_SIZE); | 1769 | EVP_VerifyUpdate(&md_ctx, &(s->s3->client_random[0]), |
| 1629 | EVP_VerifyUpdate(&md_ctx, &(s->s3->server_random[0]), SSL3_RANDOM_SIZE); | 1770 | SSL3_RANDOM_SIZE); |
| 1771 | EVP_VerifyUpdate(&md_ctx, &(s->s3->server_random[0]), | ||
| 1772 | SSL3_RANDOM_SIZE); | ||
| 1630 | EVP_VerifyUpdate(&md_ctx, param, param_len); | 1773 | EVP_VerifyUpdate(&md_ctx, param, param_len); |
| 1631 | if (EVP_VerifyFinal(&md_ctx, p,(int)n, pkey) <= 0) { | 1774 | if (EVP_VerifyFinal(&md_ctx, p,(int)n, pkey) <= 0) { |
| 1632 | /* bad signature */ | 1775 | /* bad signature */ |
| 1633 | al = SSL_AD_DECRYPT_ERROR; | 1776 | al = SSL_AD_DECRYPT_ERROR; |
| 1634 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SIGNATURE); | 1777 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1778 | SSL_R_BAD_SIGNATURE); | ||
| 1635 | goto f_err; | 1779 | goto f_err; |
| 1636 | } | 1780 | } |
| 1637 | } | 1781 | } |
| 1638 | } else { | 1782 | } else { |
| 1639 | if (!(alg_a & SSL_aNULL) && !(alg_k & SSL_kPSK)) | 1783 | /* aNULL or kPSK do not need public keys */ |
| 1640 | /* aNULL or kPSK do not need public keys */ | 1784 | if (!(alg_a & SSL_aNULL) && !(alg_k & SSL_kPSK)) { |
| 1641 | { | 1785 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1642 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 1786 | ERR_R_INTERNAL_ERROR); |
| 1643 | goto err; | 1787 | goto err; |
| 1644 | } | 1788 | } |
| 1645 | /* still data left over */ | 1789 | /* still data left over */ |
| 1646 | if (n != 0) { | 1790 | if (n != 0) { |
| 1647 | al = SSL_AD_DECODE_ERROR; | 1791 | al = SSL_AD_DECODE_ERROR; |
| 1648 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_EXTRA_DATA_IN_MESSAGE); | 1792 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1793 | SSL_R_EXTRA_DATA_IN_MESSAGE); | ||
| 1649 | goto f_err; | 1794 | goto f_err; |
| 1650 | } | 1795 | } |
| 1651 | } | 1796 | } |
| 1652 | EVP_PKEY_free(pkey); | 1797 | EVP_PKEY_free(pkey); |
| 1653 | EVP_MD_CTX_cleanup(&md_ctx); | 1798 | EVP_MD_CTX_cleanup(&md_ctx); |
| 1654 | return (1); | 1799 | return (1); |
| 1655 | f_err: | 1800 | f_err: |
| 1656 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1801 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1657 | err: | 1802 | err: |
| 1658 | EVP_PKEY_free(pkey); | 1803 | EVP_PKEY_free(pkey); |
| 1659 | if (rsa != NULL) | 1804 | if (rsa != NULL) |
| 1660 | RSA_free(rsa); | 1805 | RSA_free(rsa); |
| @@ -1675,20 +1820,16 @@ err: | |||
| 1675 | int | 1820 | int |
| 1676 | ssl3_get_certificate_request(SSL *s) | 1821 | ssl3_get_certificate_request(SSL *s) |
| 1677 | { | 1822 | { |
| 1678 | int ok, ret = 0; | 1823 | int ok, ret = 0; |
| 1679 | unsigned long n, nc, l; | 1824 | unsigned long n, nc, l; |
| 1680 | unsigned int llen, ctype_num, i; | 1825 | unsigned int llen, ctype_num, i; |
| 1681 | X509_NAME *xn = NULL; | 1826 | X509_NAME *xn = NULL; |
| 1682 | const unsigned char *p, *q; | 1827 | const unsigned char *p, *q; |
| 1683 | unsigned char *d; | 1828 | unsigned char *d; |
| 1684 | STACK_OF(X509_NAME) *ca_sk = NULL; | 1829 | STACK_OF(X509_NAME) *ca_sk = NULL; |
| 1685 | 1830 | ||
| 1686 | n = s->method->ssl_get_message(s, | 1831 | n = s->method->ssl_get_message(s, SSL3_ST_CR_CERT_REQ_A, |
| 1687 | SSL3_ST_CR_CERT_REQ_A, | 1832 | SSL3_ST_CR_CERT_REQ_B, -1, s->max_cert_list, &ok); |
| 1688 | SSL3_ST_CR_CERT_REQ_B, | ||
| 1689 | -1, | ||
| 1690 | s->max_cert_list, | ||
| 1691 | &ok); | ||
| 1692 | 1833 | ||
| 1693 | if (!ok) | 1834 | if (!ok) |
| 1694 | return ((int)n); | 1835 | return ((int)n); |
| @@ -1697,7 +1838,8 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1697 | 1838 | ||
| 1698 | if (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE) { | 1839 | if (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE) { |
| 1699 | s->s3->tmp.reuse_message = 1; | 1840 | s->s3->tmp.reuse_message = 1; |
| 1700 | /* If we get here we don't need any cached handshake records | 1841 | /* |
| 1842 | * If we get here we don't need any cached handshake records | ||
| 1701 | * as we wont be doing client auth. | 1843 | * as we wont be doing client auth. |
| 1702 | */ | 1844 | */ |
| 1703 | if (s->s3->handshake_buffer) { | 1845 | if (s->s3->handshake_buffer) { |
| @@ -1709,15 +1851,18 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1709 | 1851 | ||
| 1710 | if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST) { | 1852 | if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST) { |
| 1711 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); | 1853 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); |
| 1712 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_WRONG_MESSAGE_TYPE); | 1854 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1855 | SSL_R_WRONG_MESSAGE_TYPE); | ||
| 1713 | goto err; | 1856 | goto err; |
| 1714 | } | 1857 | } |
| 1715 | 1858 | ||
| 1716 | /* TLS does not like anon-DH with client cert */ | 1859 | /* TLS does not like anon-DH with client cert */ |
| 1717 | if (s->version > SSL3_VERSION) { | 1860 | if (s->version > SSL3_VERSION) { |
| 1718 | if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) { | 1861 | if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) { |
| 1719 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); | 1862 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 1720 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER); | 1863 | SSL_AD_UNEXPECTED_MESSAGE); |
| 1864 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1865 | SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER); | ||
| 1721 | goto err; | 1866 | goto err; |
| 1722 | } | 1867 | } |
| 1723 | } | 1868 | } |
| @@ -1725,7 +1870,8 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1725 | p = d=(unsigned char *)s->init_msg; | 1870 | p = d=(unsigned char *)s->init_msg; |
| 1726 | 1871 | ||
| 1727 | if ((ca_sk = sk_X509_NAME_new(ca_dn_cmp)) == NULL) { | 1872 | if ((ca_sk = sk_X509_NAME_new(ca_dn_cmp)) == NULL) { |
| 1728 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, ERR_R_MALLOC_FAILURE); | 1873 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1874 | ERR_R_MALLOC_FAILURE); | ||
| 1729 | goto err; | 1875 | goto err; |
| 1730 | } | 1876 | } |
| 1731 | 1877 | ||
| @@ -1743,12 +1889,14 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1743 | */ | 1889 | */ |
| 1744 | if ((unsigned long)(p - d + llen + 2) > n) { | 1890 | if ((unsigned long)(p - d + llen + 2) > n) { |
| 1745 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1891 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1746 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_DATA_LENGTH_TOO_LONG); | 1892 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1893 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 1747 | goto err; | 1894 | goto err; |
| 1748 | } | 1895 | } |
| 1749 | if ((llen & 1) || !tls1_process_sigalgs(s, p, llen)) { | 1896 | if ((llen & 1) || !tls1_process_sigalgs(s, p, llen)) { |
| 1750 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1897 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1751 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_SIGNATURE_ALGORITHMS_ERROR); | 1898 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1899 | SSL_R_SIGNATURE_ALGORITHMS_ERROR); | ||
| 1752 | goto err; | 1900 | goto err; |
| 1753 | } | 1901 | } |
| 1754 | p += llen; | 1902 | p += llen; |
| @@ -1759,7 +1907,8 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1759 | 1907 | ||
| 1760 | if ((unsigned long)(p - d + llen) != n) { | 1908 | if ((unsigned long)(p - d + llen) != n) { |
| 1761 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1909 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1762 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_LENGTH_MISMATCH); | 1910 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1911 | SSL_R_LENGTH_MISMATCH); | ||
| 1763 | goto err; | 1912 | goto err; |
| 1764 | } | 1913 | } |
| 1765 | 1914 | ||
| @@ -1769,7 +1918,8 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1769 | if ((s->options & SSL_OP_NETSCAPE_CA_DN_BUG)) | 1918 | if ((s->options & SSL_OP_NETSCAPE_CA_DN_BUG)) |
| 1770 | goto cont; /* netscape bugs */ | 1919 | goto cont; /* netscape bugs */ |
| 1771 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1920 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1772 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_CA_DN_TOO_LONG); | 1921 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1922 | SSL_R_CA_DN_TOO_LONG); | ||
| 1773 | goto err; | 1923 | goto err; |
| 1774 | } | 1924 | } |
| 1775 | 1925 | ||
| @@ -1780,19 +1930,23 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1780 | if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG) | 1930 | if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG) |
| 1781 | goto cont; | 1931 | goto cont; |
| 1782 | else { | 1932 | else { |
| 1783 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1933 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 1784 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, ERR_R_ASN1_LIB); | 1934 | SSL_AD_DECODE_ERROR); |
| 1935 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1936 | ERR_R_ASN1_LIB); | ||
| 1785 | goto err; | 1937 | goto err; |
| 1786 | } | 1938 | } |
| 1787 | } | 1939 | } |
| 1788 | 1940 | ||
| 1789 | if (q != (p + l)) { | 1941 | if (q != (p + l)) { |
| 1790 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1942 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1791 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_CA_DN_LENGTH_MISMATCH); | 1943 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1944 | SSL_R_CA_DN_LENGTH_MISMATCH); | ||
| 1792 | goto err; | 1945 | goto err; |
| 1793 | } | 1946 | } |
| 1794 | if (!sk_X509_NAME_push(ca_sk, xn)) { | 1947 | if (!sk_X509_NAME_push(ca_sk, xn)) { |
| 1795 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, ERR_R_MALLOC_FAILURE); | 1948 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, |
| 1949 | ERR_R_MALLOC_FAILURE); | ||
| 1796 | goto err; | 1950 | goto err; |
| 1797 | } | 1951 | } |
| 1798 | 1952 | ||
| @@ -1801,7 +1955,7 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1801 | } | 1955 | } |
| 1802 | 1956 | ||
| 1803 | if (0) { | 1957 | if (0) { |
| 1804 | cont: | 1958 | cont: |
| 1805 | ERR_clear_error(); | 1959 | ERR_clear_error(); |
| 1806 | } | 1960 | } |
| 1807 | 1961 | ||
| @@ -1814,7 +1968,7 @@ cont: | |||
| 1814 | ca_sk = NULL; | 1968 | ca_sk = NULL; |
| 1815 | 1969 | ||
| 1816 | ret = 1; | 1970 | ret = 1; |
| 1817 | err: | 1971 | err: |
| 1818 | if (ca_sk != NULL) | 1972 | if (ca_sk != NULL) |
| 1819 | sk_X509_NAME_pop_free(ca_sk, X509_NAME_free); | 1973 | sk_X509_NAME_pop_free(ca_sk, X509_NAME_free); |
| 1820 | return (ret); | 1974 | return (ret); |
| @@ -1830,10 +1984,10 @@ ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b) | |||
| 1830 | int | 1984 | int |
| 1831 | ssl3_get_new_session_ticket(SSL *s) | 1985 | ssl3_get_new_session_ticket(SSL *s) |
| 1832 | { | 1986 | { |
| 1833 | int ok, al, ret = 0, ticklen; | 1987 | int ok, al, ret = 0, ticklen; |
| 1834 | long n; | 1988 | long n; |
| 1835 | const unsigned char *p; | 1989 | const unsigned char *p; |
| 1836 | unsigned char *d; | 1990 | unsigned char *d; |
| 1837 | 1991 | ||
| 1838 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SESSION_TICKET_A, | 1992 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SESSION_TICKET_A, |
| 1839 | SSL3_ST_CR_SESSION_TICKET_B, -1, 16384, &ok); | 1993 | SSL3_ST_CR_SESSION_TICKET_B, -1, 16384, &ok); |
| @@ -1846,13 +2000,15 @@ ssl3_get_new_session_ticket(SSL *s) | |||
| 1846 | } | 2000 | } |
| 1847 | if (s->s3->tmp.message_type != SSL3_MT_NEWSESSION_TICKET) { | 2001 | if (s->s3->tmp.message_type != SSL3_MT_NEWSESSION_TICKET) { |
| 1848 | al = SSL_AD_UNEXPECTED_MESSAGE; | 2002 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 1849 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_BAD_MESSAGE_TYPE); | 2003 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, |
| 2004 | SSL_R_BAD_MESSAGE_TYPE); | ||
| 1850 | goto f_err; | 2005 | goto f_err; |
| 1851 | } | 2006 | } |
| 1852 | if (n < 6) { | 2007 | if (n < 6) { |
| 1853 | /* need at least ticket_lifetime_hint + ticket length */ | 2008 | /* need at least ticket_lifetime_hint + ticket length */ |
| 1854 | al = SSL_AD_DECODE_ERROR; | 2009 | al = SSL_AD_DECODE_ERROR; |
| 1855 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_LENGTH_MISMATCH); | 2010 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, |
| 2011 | SSL_R_LENGTH_MISMATCH); | ||
| 1856 | goto f_err; | 2012 | goto f_err; |
| 1857 | } | 2013 | } |
| 1858 | 2014 | ||
| @@ -1862,7 +2018,8 @@ ssl3_get_new_session_ticket(SSL *s) | |||
| 1862 | /* ticket_lifetime_hint + ticket_length + ticket */ | 2018 | /* ticket_lifetime_hint + ticket_length + ticket */ |
| 1863 | if (ticklen + 6 != n) { | 2019 | if (ticklen + 6 != n) { |
| 1864 | al = SSL_AD_DECODE_ERROR; | 2020 | al = SSL_AD_DECODE_ERROR; |
| 1865 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_LENGTH_MISMATCH); | 2021 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, |
| 2022 | SSL_R_LENGTH_MISMATCH); | ||
| 1866 | goto f_err; | 2023 | goto f_err; |
| 1867 | } | 2024 | } |
| 1868 | if (s->session->tlsext_tick) { | 2025 | if (s->session->tlsext_tick) { |
| @@ -1871,12 +2028,14 @@ ssl3_get_new_session_ticket(SSL *s) | |||
| 1871 | } | 2028 | } |
| 1872 | s->session->tlsext_tick = malloc(ticklen); | 2029 | s->session->tlsext_tick = malloc(ticklen); |
| 1873 | if (!s->session->tlsext_tick) { | 2030 | if (!s->session->tlsext_tick) { |
| 1874 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, ERR_R_MALLOC_FAILURE); | 2031 | SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, |
| 2032 | ERR_R_MALLOC_FAILURE); | ||
| 1875 | goto err; | 2033 | goto err; |
| 1876 | } | 2034 | } |
| 1877 | memcpy(s->session->tlsext_tick, p, ticklen); | 2035 | memcpy(s->session->tlsext_tick, p, ticklen); |
| 1878 | s->session->tlsext_ticklen = ticklen; | 2036 | s->session->tlsext_ticklen = ticklen; |
| 1879 | /* There are two ways to detect a resumed ticket sesion. | 2037 | /* |
| 2038 | * There are two ways to detect a resumed ticket sesion. | ||
| 1880 | * One is to set an appropriate session ID and then the server | 2039 | * One is to set an appropriate session ID and then the server |
| 1881 | * must return a match in ServerHello. This allows the normal | 2040 | * must return a match in ServerHello. This allows the normal |
| 1882 | * client session ID matching to work and we know much | 2041 | * client session ID matching to work and we know much |
| @@ -1891,23 +2050,22 @@ ssl3_get_new_session_ticket(SSL *s) | |||
| 1891 | * to the SHA256 (or SHA1 is SHA256 is disabled) hash of the | 2050 | * to the SHA256 (or SHA1 is SHA256 is disabled) hash of the |
| 1892 | * ticket. | 2051 | * ticket. |
| 1893 | */ | 2052 | */ |
| 1894 | EVP_Digest(p, ticklen, | 2053 | EVP_Digest(p, ticklen, s->session->session_id, |
| 1895 | s->session->session_id, &s->session->session_id_length, | 2054 | &s->session->session_id_length, EVP_sha256(), NULL); |
| 1896 | EVP_sha256(), NULL); | ||
| 1897 | ret = 1; | 2055 | ret = 1; |
| 1898 | return (ret); | 2056 | return (ret); |
| 1899 | f_err: | 2057 | f_err: |
| 1900 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2058 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1901 | err: | 2059 | err: |
| 1902 | return (-1); | 2060 | return (-1); |
| 1903 | } | 2061 | } |
| 1904 | 2062 | ||
| 1905 | int | 2063 | int |
| 1906 | ssl3_get_cert_status(SSL *s) | 2064 | ssl3_get_cert_status(SSL *s) |
| 1907 | { | 2065 | { |
| 1908 | int ok, al; | 2066 | int ok, al; |
| 1909 | unsigned long resplen, n; | 2067 | unsigned long resplen, n; |
| 1910 | const unsigned char *p; | 2068 | const unsigned char *p; |
| 1911 | 2069 | ||
| 1912 | n = s->method->ssl_get_message(s, | 2070 | n = s->method->ssl_get_message(s, |
| 1913 | SSL3_ST_CR_CERT_STATUS_A, | 2071 | SSL3_ST_CR_CERT_STATUS_A, |
| @@ -1921,19 +2079,22 @@ ssl3_get_cert_status(SSL *s) | |||
| 1921 | if (n < 4) { | 2079 | if (n < 4) { |
| 1922 | /* need at least status type + length */ | 2080 | /* need at least status type + length */ |
| 1923 | al = SSL_AD_DECODE_ERROR; | 2081 | al = SSL_AD_DECODE_ERROR; |
| 1924 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_LENGTH_MISMATCH); | 2082 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2083 | SSL_R_LENGTH_MISMATCH); | ||
| 1925 | goto f_err; | 2084 | goto f_err; |
| 1926 | } | 2085 | } |
| 1927 | p = (unsigned char *)s->init_msg; | 2086 | p = (unsigned char *)s->init_msg; |
| 1928 | if (*p++ != TLSEXT_STATUSTYPE_ocsp) { | 2087 | if (*p++ != TLSEXT_STATUSTYPE_ocsp) { |
| 1929 | al = SSL_AD_DECODE_ERROR; | 2088 | al = SSL_AD_DECODE_ERROR; |
| 1930 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_UNSUPPORTED_STATUS_TYPE); | 2089 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2090 | SSL_R_UNSUPPORTED_STATUS_TYPE); | ||
| 1931 | goto f_err; | 2091 | goto f_err; |
| 1932 | } | 2092 | } |
| 1933 | n2l3(p, resplen); | 2093 | n2l3(p, resplen); |
| 1934 | if (resplen + 4 != n) { | 2094 | if (resplen + 4 != n) { |
| 1935 | al = SSL_AD_DECODE_ERROR; | 2095 | al = SSL_AD_DECODE_ERROR; |
| 1936 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_LENGTH_MISMATCH); | 2096 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2097 | SSL_R_LENGTH_MISMATCH); | ||
| 1937 | goto f_err; | 2098 | goto f_err; |
| 1938 | } | 2099 | } |
| 1939 | if (s->tlsext_ocsp_resp) | 2100 | if (s->tlsext_ocsp_resp) |
| @@ -1941,7 +2102,8 @@ ssl3_get_cert_status(SSL *s) | |||
| 1941 | s->tlsext_ocsp_resp = BUF_memdup(p, resplen); | 2102 | s->tlsext_ocsp_resp = BUF_memdup(p, resplen); |
| 1942 | if (!s->tlsext_ocsp_resp) { | 2103 | if (!s->tlsext_ocsp_resp) { |
| 1943 | al = SSL_AD_INTERNAL_ERROR; | 2104 | al = SSL_AD_INTERNAL_ERROR; |
| 1944 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, ERR_R_MALLOC_FAILURE); | 2105 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2106 | ERR_R_MALLOC_FAILURE); | ||
| 1945 | goto f_err; | 2107 | goto f_err; |
| 1946 | } | 2108 | } |
| 1947 | s->tlsext_ocsp_resplen = resplen; | 2109 | s->tlsext_ocsp_resplen = resplen; |
| @@ -1950,17 +2112,19 @@ ssl3_get_cert_status(SSL *s) | |||
| 1950 | ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg); | 2112 | ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg); |
| 1951 | if (ret == 0) { | 2113 | if (ret == 0) { |
| 1952 | al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE; | 2114 | al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE; |
| 1953 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_INVALID_STATUS_RESPONSE); | 2115 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2116 | SSL_R_INVALID_STATUS_RESPONSE); | ||
| 1954 | goto f_err; | 2117 | goto f_err; |
| 1955 | } | 2118 | } |
| 1956 | if (ret < 0) { | 2119 | if (ret < 0) { |
| 1957 | al = SSL_AD_INTERNAL_ERROR; | 2120 | al = SSL_AD_INTERNAL_ERROR; |
| 1958 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, ERR_R_MALLOC_FAILURE); | 2121 | SSLerr(SSL_F_SSL3_GET_CERT_STATUS, |
| 2122 | ERR_R_MALLOC_FAILURE); | ||
| 1959 | goto f_err; | 2123 | goto f_err; |
| 1960 | } | 2124 | } |
| 1961 | } | 2125 | } |
| 1962 | return 1; | 2126 | return 1; |
| 1963 | f_err: | 2127 | f_err: |
| 1964 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2128 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1965 | return (-1); | 2129 | return (-1); |
| 1966 | } | 2130 | } |
| @@ -1969,8 +2133,8 @@ f_err: | |||
| 1969 | int | 2133 | int |
| 1970 | ssl3_get_server_done(SSL *s) | 2134 | ssl3_get_server_done(SSL *s) |
| 1971 | { | 2135 | { |
| 1972 | int ok, ret = 0; | 2136 | int ok, ret = 0; |
| 1973 | long n; | 2137 | long n; |
| 1974 | 2138 | ||
| 1975 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SRVR_DONE_A, | 2139 | n = s->method->ssl_get_message(s, SSL3_ST_CR_SRVR_DONE_A, |
| 1976 | SSL3_ST_CR_SRVR_DONE_B, SSL3_MT_SERVER_DONE, | 2140 | SSL3_ST_CR_SRVR_DONE_B, SSL3_MT_SERVER_DONE, |
| @@ -1981,7 +2145,8 @@ ssl3_get_server_done(SSL *s) | |||
| 1981 | if (n > 0) { | 2145 | if (n > 0) { |
| 1982 | /* should contain no data */ | 2146 | /* should contain no data */ |
| 1983 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 2147 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1984 | SSLerr(SSL_F_SSL3_GET_SERVER_DONE, SSL_R_LENGTH_MISMATCH); | 2148 | SSLerr(SSL_F_SSL3_GET_SERVER_DONE, |
| 2149 | SSL_R_LENGTH_MISMATCH); | ||
| 1985 | return -1; | 2150 | return -1; |
| 1986 | } | 2151 | } |
| 1987 | ret = 1; | 2152 | ret = 1; |
| @@ -1992,21 +2157,21 @@ ssl3_get_server_done(SSL *s) | |||
| 1992 | int | 2157 | int |
| 1993 | ssl3_send_client_key_exchange(SSL *s) | 2158 | ssl3_send_client_key_exchange(SSL *s) |
| 1994 | { | 2159 | { |
| 1995 | unsigned char *p, *d; | 2160 | unsigned char *p, *d; |
| 1996 | int n; | 2161 | int n; |
| 1997 | unsigned long alg_k; | 2162 | unsigned long alg_k; |
| 1998 | unsigned char *q; | 2163 | unsigned char *q; |
| 1999 | EVP_PKEY *pkey = NULL; | 2164 | EVP_PKEY *pkey = NULL; |
| 2000 | #ifndef OPENSSL_NO_KRB5 | 2165 | #ifndef OPENSSL_NO_KRB5 |
| 2001 | KSSL_ERR kssl_err; | 2166 | KSSL_ERR kssl_err; |
| 2002 | #endif /* OPENSSL_NO_KRB5 */ | 2167 | #endif /* OPENSSL_NO_KRB5 */ |
| 2003 | #ifndef OPENSSL_NO_ECDH | 2168 | #ifndef OPENSSL_NO_ECDH |
| 2004 | EC_KEY *clnt_ecdh = NULL; | 2169 | EC_KEY *clnt_ecdh = NULL; |
| 2005 | const EC_POINT *srvr_ecpoint = NULL; | 2170 | const EC_POINT *srvr_ecpoint = NULL; |
| 2006 | EVP_PKEY *srvr_pub_pkey = NULL; | 2171 | EVP_PKEY *srvr_pub_pkey = NULL; |
| 2007 | unsigned char *encodedPoint = NULL; | 2172 | unsigned char *encodedPoint = NULL; |
| 2008 | int encoded_pt_len = 0; | 2173 | int encoded_pt_len = 0; |
| 2009 | BN_CTX * bn_ctx = NULL; | 2174 | BN_CTX *bn_ctx = NULL; |
| 2010 | #endif | 2175 | #endif |
| 2011 | 2176 | ||
| 2012 | if (s->state == SSL3_ST_CW_KEY_EXCH_A) { | 2177 | if (s->state == SSL3_ST_CW_KEY_EXCH_A) { |
| @@ -2022,11 +2187,15 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2022 | if (s->session->sess_cert->peer_rsa_tmp != NULL) | 2187 | if (s->session->sess_cert->peer_rsa_tmp != NULL) |
| 2023 | rsa = s->session->sess_cert->peer_rsa_tmp; | 2188 | rsa = s->session->sess_cert->peer_rsa_tmp; |
| 2024 | else { | 2189 | else { |
| 2025 | pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509); | 2190 | pkey = X509_get_pubkey( |
| 2191 | s->session->sess_cert->peer_pkeys[ | ||
| 2192 | SSL_PKEY_RSA_ENC].x509); | ||
| 2026 | if ((pkey == NULL) || | 2193 | if ((pkey == NULL) || |
| 2027 | (pkey->type != EVP_PKEY_RSA) || | 2194 | (pkey->type != EVP_PKEY_RSA) || |
| 2028 | (pkey->pkey.rsa == NULL)) { | 2195 | (pkey->pkey.rsa == NULL)) { |
| 2029 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 2196 | SSLerr( |
| 2197 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2198 | ERR_R_INTERNAL_ERROR); | ||
| 2030 | goto err; | 2199 | goto err; |
| 2031 | } | 2200 | } |
| 2032 | rsa = pkey->pkey.rsa; | 2201 | rsa = pkey->pkey.rsa; |
| @@ -2047,7 +2216,8 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2047 | n = RSA_public_encrypt(sizeof tmp_buf, | 2216 | n = RSA_public_encrypt(sizeof tmp_buf, |
| 2048 | tmp_buf, p, rsa, RSA_PKCS1_PADDING); | 2217 | tmp_buf, p, rsa, RSA_PKCS1_PADDING); |
| 2049 | if (n <= 0) { | 2218 | if (n <= 0) { |
| 2050 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, SSL_R_BAD_RSA_ENCRYPT); | 2219 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2220 | SSL_R_BAD_RSA_ENCRYPT); | ||
| 2051 | goto err; | 2221 | goto err; |
| 2052 | } | 2222 | } |
| 2053 | 2223 | ||
| @@ -2075,14 +2245,14 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2075 | unsigned char iv[EVP_MAX_IV_LENGTH]; | 2245 | unsigned char iv[EVP_MAX_IV_LENGTH]; |
| 2076 | unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH]; | 2246 | unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH]; |
| 2077 | unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH | 2247 | unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH |
| 2078 | + EVP_MAX_IV_LENGTH]; | 2248 | + EVP_MAX_IV_LENGTH]; |
| 2079 | int padl, outl = sizeof(epms); | 2249 | int padl, outl = sizeof(epms); |
| 2080 | 2250 | ||
| 2081 | EVP_CIPHER_CTX_init(&ciph_ctx); | 2251 | EVP_CIPHER_CTX_init(&ciph_ctx); |
| 2082 | 2252 | ||
| 2083 | #ifdef KSSL_DEBUG | 2253 | #ifdef KSSL_DEBUG |
| 2084 | printf("ssl3_send_client_key_exchange(%lx & %lx)\n", | 2254 | printf("ssl3_send_client_key_exchange(%lx & %lx)\n", |
| 2085 | alg_k, SSL_kKRB5); | 2255 | alg_k, SSL_kKRB5); |
| 2086 | #endif /* KSSL_DEBUG */ | 2256 | #endif /* KSSL_DEBUG */ |
| 2087 | 2257 | ||
| 2088 | authp = NULL; | 2258 | authp = NULL; |
| @@ -2100,44 +2270,46 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2100 | { | 2270 | { |
| 2101 | printf("kssl_cget_tkt rtn %d\n", krb5rc); | 2271 | printf("kssl_cget_tkt rtn %d\n", krb5rc); |
| 2102 | if (krb5rc && kssl_err.text) | 2272 | if (krb5rc && kssl_err.text) |
| 2103 | printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text); | 2273 | printf("kssl_cget_tkt kssl_err=%s\n", |
| 2274 | kssl_err.text); | ||
| 2104 | } | 2275 | } |
| 2105 | #endif /* KSSL_DEBUG */ | 2276 | #endif /* KSSL_DEBUG */ |
| 2106 | 2277 | ||
| 2107 | if (krb5rc) { | 2278 | if (krb5rc) { |
| 2108 | ssl3_send_alert(s, SSL3_AL_FATAL, | 2279 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 2109 | SSL_AD_HANDSHAKE_FAILURE); | 2280 | SSL_AD_HANDSHAKE_FAILURE); |
| 2110 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2281 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2111 | kssl_err.reason); | 2282 | kssl_err.reason); |
| 2112 | goto err; | 2283 | goto err; |
| 2113 | } | 2284 | } |
| 2114 | 2285 | ||
| 2115 | /* 20010406 VRS - Earlier versions used KRB5 AP_REQ | 2286 | /* |
| 2116 | ** in place of RFC 2712 KerberosWrapper, as in: | 2287 | * 20010406 VRS - Earlier versions used KRB5 AP_REQ |
| 2117 | ** | 2288 | * in place of RFC 2712 KerberosWrapper, as in: |
| 2118 | ** Send ticket (copy to *p, set n = length) | 2289 | * |
| 2119 | ** n = krb5_ap_req.length; | 2290 | * Send ticket (copy to *p, set n = length) |
| 2120 | ** memcpy(p, krb5_ap_req.data, krb5_ap_req.length); | 2291 | * n = krb5_ap_req.length; |
| 2121 | ** if (krb5_ap_req.data) | 2292 | * memcpy(p, krb5_ap_req.data, krb5_ap_req.length); |
| 2122 | ** kssl_krb5_free_data_contents(NULL,&krb5_ap_req); | 2293 | * if (krb5_ap_req.data) |
| 2123 | ** | 2294 | * kssl_krb5_free_data_contents(NULL,&krb5_ap_req); |
| 2124 | ** Now using real RFC 2712 KerberosWrapper | 2295 | * |
| 2125 | ** (Thanks to Simon Wilkinson <sxw@sxw.org.uk>) | 2296 | * Now using real RFC 2712 KerberosWrapper |
| 2126 | ** Note: 2712 "opaque" types are here replaced | 2297 | * (Thanks to Simon Wilkinson <sxw@sxw.org.uk>) |
| 2127 | ** with a 2-byte length followed by the value. | 2298 | * Note: 2712 "opaque" types are here replaced |
| 2128 | ** Example: | 2299 | * with a 2-byte length followed by the value. |
| 2129 | ** KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms | 2300 | * Example: |
| 2130 | ** Where "xx xx" = length bytes. Shown here with | 2301 | * KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms |
| 2131 | ** optional authenticator omitted. | 2302 | * Where "xx xx" = length bytes. Shown here with |
| 2132 | */ | 2303 | * optional authenticator omitted. |
| 2133 | 2304 | */ | |
| 2134 | /* KerberosWrapper.Ticket */ | 2305 | |
| 2306 | /* KerberosWrapper.Ticket */ | ||
| 2135 | s2n(enc_ticket->length, p); | 2307 | s2n(enc_ticket->length, p); |
| 2136 | memcpy(p, enc_ticket->data, enc_ticket->length); | 2308 | memcpy(p, enc_ticket->data, enc_ticket->length); |
| 2137 | p += enc_ticket->length; | 2309 | p += enc_ticket->length; |
| 2138 | n = enc_ticket->length + 2; | 2310 | n = enc_ticket->length + 2; |
| 2139 | 2311 | ||
| 2140 | /* KerberosWrapper.Authenticator */ | 2312 | /* KerberosWrapper.Authenticator */ |
| 2141 | if (authp && authp->length) { | 2313 | if (authp && authp->length) { |
| 2142 | s2n(authp->length, p); | 2314 | s2n(authp->length, p); |
| 2143 | memcpy(p, authp->data, authp->length); | 2315 | memcpy(p, authp->data, authp->length); |
| @@ -2153,32 +2325,34 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2153 | } | 2325 | } |
| 2154 | 2326 | ||
| 2155 | tmp_buf[0] = s->client_version >> 8; | 2327 | tmp_buf[0] = s->client_version >> 8; |
| 2156 | tmp_buf[1] = s->client_version&0xff; | 2328 | tmp_buf[1] = s->client_version & 0xff; |
| 2157 | if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= 0) | 2329 | if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= 0) |
| 2158 | goto err; | 2330 | goto err; |
| 2159 | 2331 | ||
| 2160 | /* 20010420 VRS. Tried it this way; failed. | 2332 | /* |
| 2161 | ** EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL); | 2333 | * 20010420 VRS. Tried it this way; failed. |
| 2162 | ** EVP_CIPHER_CTX_set_key_length(&ciph_ctx, | 2334 | * EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL); |
| 2163 | ** kssl_ctx->length); | 2335 | * EVP_CIPHER_CTX_set_key_length(&ciph_ctx, |
| 2164 | ** EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv); | 2336 | * kssl_ctx->length); |
| 2165 | */ | 2337 | * EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv); |
| 2338 | */ | ||
| 2166 | 2339 | ||
| 2167 | memset(iv, 0, sizeof iv); | 2340 | memset(iv, 0, sizeof iv); |
| 2168 | /* per RFC 1510 */ | 2341 | /* per RFC 1510 */ |
| 2169 | EVP_EncryptInit_ex(&ciph_ctx, enc, NULL, | 2342 | EVP_EncryptInit_ex(&ciph_ctx, enc, NULL, |
| 2170 | kssl_ctx->key, iv); | 2343 | kssl_ctx->key, iv); |
| 2171 | EVP_EncryptUpdate(&ciph_ctx, epms, &outl, tmp_buf, | 2344 | EVP_EncryptUpdate(&ciph_ctx, epms, &outl, tmp_buf, |
| 2172 | sizeof tmp_buf); | 2345 | sizeof tmp_buf); |
| 2173 | EVP_EncryptFinal_ex(&ciph_ctx, &(epms[outl]), &padl); | 2346 | EVP_EncryptFinal_ex(&ciph_ctx, &(epms[outl]), &padl); |
| 2174 | outl += padl; | 2347 | outl += padl; |
| 2175 | if (outl > (int)sizeof epms) { | 2348 | if (outl > (int)sizeof epms) { |
| 2176 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 2349 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2350 | ERR_R_INTERNAL_ERROR); | ||
| 2177 | goto err; | 2351 | goto err; |
| 2178 | } | 2352 | } |
| 2179 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | 2353 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); |
| 2180 | 2354 | ||
| 2181 | /* KerberosWrapper.EncryptedPreMasterSecret */ | 2355 | /* KerberosWrapper.EncryptedPreMasterSecret */ |
| 2182 | s2n(outl, p); | 2356 | s2n(outl, p); |
| 2183 | memcpy(p, epms, outl); | 2357 | memcpy(p, epms, outl); |
| 2184 | p += outl; | 2358 | p += outl; |
| @@ -2198,50 +2372,58 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2198 | DH *dh_srvr, *dh_clnt; | 2372 | DH *dh_srvr, *dh_clnt; |
| 2199 | 2373 | ||
| 2200 | if (s->session->sess_cert == NULL) { | 2374 | if (s->session->sess_cert == NULL) { |
| 2201 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); | 2375 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 2202 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, SSL_R_UNEXPECTED_MESSAGE); | 2376 | SSL_AD_UNEXPECTED_MESSAGE); |
| 2377 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2378 | SSL_R_UNEXPECTED_MESSAGE); | ||
| 2203 | goto err; | 2379 | goto err; |
| 2204 | } | 2380 | } |
| 2205 | 2381 | ||
| 2206 | if (s->session->sess_cert->peer_dh_tmp != NULL) | 2382 | if (s->session->sess_cert->peer_dh_tmp != NULL) |
| 2207 | dh_srvr = s->session->sess_cert->peer_dh_tmp; | 2383 | dh_srvr = s->session->sess_cert->peer_dh_tmp; |
| 2208 | else { | 2384 | else { |
| 2209 | /* we get them from the cert */ | 2385 | /* We get them from the cert. */ |
| 2210 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 2386 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 2211 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, SSL_R_UNABLE_TO_FIND_DH_PARAMETERS); | 2387 | SSL_AD_HANDSHAKE_FAILURE); |
| 2388 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2389 | SSL_R_UNABLE_TO_FIND_DH_PARAMETERS); | ||
| 2212 | goto err; | 2390 | goto err; |
| 2213 | } | 2391 | } |
| 2214 | 2392 | ||
| 2215 | /* generate a new random key */ | 2393 | /* Generate a new random key. */ |
| 2216 | if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) { | 2394 | if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) { |
| 2217 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB); | 2395 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2396 | ERR_R_DH_LIB); | ||
| 2218 | goto err; | 2397 | goto err; |
| 2219 | } | 2398 | } |
| 2220 | if (!DH_generate_key(dh_clnt)) { | 2399 | if (!DH_generate_key(dh_clnt)) { |
| 2221 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB); | 2400 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2401 | ERR_R_DH_LIB); | ||
| 2222 | DH_free(dh_clnt); | 2402 | DH_free(dh_clnt); |
| 2223 | goto err; | 2403 | goto err; |
| 2224 | } | 2404 | } |
| 2225 | 2405 | ||
| 2226 | /* use the 'p' output buffer for the DH key, but | 2406 | /* |
| 2227 | * make sure to clear it out afterwards */ | 2407 | * Use the 'p' output buffer for the DH key, but |
| 2228 | 2408 | * make sure to clear it out afterwards. | |
| 2409 | */ | ||
| 2229 | n = DH_compute_key(p, dh_srvr->pub_key, dh_clnt); | 2410 | n = DH_compute_key(p, dh_srvr->pub_key, dh_clnt); |
| 2230 | 2411 | ||
| 2231 | if (n <= 0) { | 2412 | if (n <= 0) { |
| 2232 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB); | 2413 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2414 | ERR_R_DH_LIB); | ||
| 2233 | DH_free(dh_clnt); | 2415 | DH_free(dh_clnt); |
| 2234 | goto err; | 2416 | goto err; |
| 2235 | } | 2417 | } |
| 2236 | 2418 | ||
| 2237 | /* generate master key from the result */ | 2419 | /* Generate master key from the result. */ |
| 2238 | s->session->master_key_length = | 2420 | s->session->master_key_length = |
| 2239 | s->method->ssl3_enc->generate_master_secret(s, | 2421 | s->method->ssl3_enc->generate_master_secret(s, |
| 2240 | s->session->master_key, p, n); | 2422 | s->session->master_key, p, n); |
| 2241 | /* clean up */ | 2423 | /* Clean up. */ |
| 2242 | memset(p, 0, n); | 2424 | memset(p, 0, n); |
| 2243 | 2425 | ||
| 2244 | /* send off the data */ | 2426 | /* Send off the data. */ |
| 2245 | n = BN_num_bytes(dh_clnt->pub_key); | 2427 | n = BN_num_bytes(dh_clnt->pub_key); |
| 2246 | s2n(n, p); | 2428 | s2n(n, p); |
| 2247 | BN_bn2bin(dh_clnt->pub_key, p); | 2429 | BN_bn2bin(dh_clnt->pub_key, p); |
| @@ -2260,13 +2442,15 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2260 | int ecdh_clnt_cert = 0; | 2442 | int ecdh_clnt_cert = 0; |
| 2261 | int field_size = 0; | 2443 | int field_size = 0; |
| 2262 | 2444 | ||
| 2263 | /* Did we send out the client's | 2445 | /* |
| 2264 | * ECDH share for use in premaster | 2446 | * Did we send out the client's ECDH share for use |
| 2265 | * computation as part of client certificate? | 2447 | * in premaster computation as part of client |
| 2266 | * If so, set ecdh_clnt_cert to 1. | 2448 | * certificate? If so, set ecdh_clnt_cert to 1. |
| 2267 | */ | 2449 | */ |
| 2268 | if ((alg_k & (SSL_kECDHr|SSL_kECDHe)) && (s->cert != NULL)) { | 2450 | if ((alg_k & (SSL_kECDHr|SSL_kECDHe)) && |
| 2269 | /* XXX: For now, we do not support client | 2451 | (s->cert != NULL)) { |
| 2452 | /* | ||
| 2453 | * XXX: For now, we do not support client | ||
| 2270 | * authentication using ECDH certificates. | 2454 | * authentication using ECDH certificates. |
| 2271 | * To add such support, one needs to add | 2455 | * To add such support, one needs to add |
| 2272 | * code that checks for appropriate | 2456 | * code that checks for appropriate |
| @@ -2294,10 +2478,11 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2294 | srvr_pub_pkey = X509_get_pubkey(s->session-> \ | 2478 | srvr_pub_pkey = X509_get_pubkey(s->session-> \ |
| 2295 | sess_cert->peer_pkeys[SSL_PKEY_ECC].x509); | 2479 | sess_cert->peer_pkeys[SSL_PKEY_ECC].x509); |
| 2296 | if ((srvr_pub_pkey == NULL) || | 2480 | if ((srvr_pub_pkey == NULL) || |
| 2297 | (srvr_pub_pkey->type != EVP_PKEY_EC) || | 2481 | (srvr_pub_pkey->type != EVP_PKEY_EC) || |
| 2298 | (srvr_pub_pkey->pkey.ec == NULL)) { | 2482 | (srvr_pub_pkey->pkey.ec == NULL)) { |
| 2299 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2483 | SSLerr( |
| 2300 | ERR_R_INTERNAL_ERROR); | 2484 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2485 | ERR_R_INTERNAL_ERROR); | ||
| 2301 | goto err; | 2486 | goto err; |
| 2302 | } | 2487 | } |
| 2303 | 2488 | ||
| @@ -2309,21 +2494,24 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2309 | 2494 | ||
| 2310 | if ((srvr_group == NULL) || (srvr_ecpoint == NULL)) { | 2495 | if ((srvr_group == NULL) || (srvr_ecpoint == NULL)) { |
| 2311 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2496 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2312 | ERR_R_INTERNAL_ERROR); | 2497 | ERR_R_INTERNAL_ERROR); |
| 2313 | goto err; | 2498 | goto err; |
| 2314 | } | 2499 | } |
| 2315 | 2500 | ||
| 2316 | if ((clnt_ecdh = EC_KEY_new()) == NULL) { | 2501 | if ((clnt_ecdh = EC_KEY_new()) == NULL) { |
| 2317 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 2502 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2503 | ERR_R_MALLOC_FAILURE); | ||
| 2318 | goto err; | 2504 | goto err; |
| 2319 | } | 2505 | } |
| 2320 | 2506 | ||
| 2321 | if (!EC_KEY_set_group(clnt_ecdh, srvr_group)) { | 2507 | if (!EC_KEY_set_group(clnt_ecdh, srvr_group)) { |
| 2322 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_EC_LIB); | 2508 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2509 | ERR_R_EC_LIB); | ||
| 2323 | goto err; | 2510 | goto err; |
| 2324 | } | 2511 | } |
| 2325 | if (ecdh_clnt_cert) { | 2512 | if (ecdh_clnt_cert) { |
| 2326 | /* Reuse key info from our certificate | 2513 | /* |
| 2514 | * Reuse key info from our certificate | ||
| 2327 | * We only need our private key to perform | 2515 | * We only need our private key to perform |
| 2328 | * the ECDH computation. | 2516 | * the ECDH computation. |
| 2329 | */ | 2517 | */ |
| @@ -2331,73 +2519,83 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2331 | tkey = s->cert->key->privatekey->pkey.ec; | 2519 | tkey = s->cert->key->privatekey->pkey.ec; |
| 2332 | priv_key = EC_KEY_get0_private_key(tkey); | 2520 | priv_key = EC_KEY_get0_private_key(tkey); |
| 2333 | if (priv_key == NULL) { | 2521 | if (priv_key == NULL) { |
| 2334 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 2522 | SSLerr( |
| 2523 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2524 | ERR_R_MALLOC_FAILURE); | ||
| 2335 | goto err; | 2525 | goto err; |
| 2336 | } | 2526 | } |
| 2337 | if (!EC_KEY_set_private_key(clnt_ecdh, priv_key)) { | 2527 | if (!EC_KEY_set_private_key(clnt_ecdh, |
| 2338 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_EC_LIB); | 2528 | priv_key)) { |
| 2529 | SSLerr( | ||
| 2530 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2531 | ERR_R_EC_LIB); | ||
| 2339 | goto err; | 2532 | goto err; |
| 2340 | } | 2533 | } |
| 2341 | } else { | 2534 | } else { |
| 2342 | /* Generate a new ECDH key pair */ | 2535 | /* Generate a new ECDH key pair */ |
| 2343 | if (!(EC_KEY_generate_key(clnt_ecdh))) { | 2536 | if (!(EC_KEY_generate_key(clnt_ecdh))) { |
| 2344 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB); | 2537 | SSLerr( |
| 2538 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2539 | ERR_R_ECDH_LIB); | ||
| 2345 | goto err; | 2540 | goto err; |
| 2346 | } | 2541 | } |
| 2347 | } | 2542 | } |
| 2348 | 2543 | ||
| 2349 | /* use the 'p' output buffer for the ECDH key, but | 2544 | /* |
| 2350 | * make sure to clear it out afterwards | 2545 | * Use the 'p' output buffer for the ECDH key, but |
| 2546 | * make sure to clear it out afterwards. | ||
| 2351 | */ | 2547 | */ |
| 2352 | |||
| 2353 | field_size = EC_GROUP_get_degree(srvr_group); | 2548 | field_size = EC_GROUP_get_degree(srvr_group); |
| 2354 | if (field_size <= 0) { | 2549 | if (field_size <= 0) { |
| 2355 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2550 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2356 | ERR_R_ECDH_LIB); | 2551 | ERR_R_ECDH_LIB); |
| 2357 | goto err; | 2552 | goto err; |
| 2358 | } | 2553 | } |
| 2359 | n = ECDH_compute_key(p, (field_size + 7)/8, srvr_ecpoint, clnt_ecdh, NULL); | 2554 | n = ECDH_compute_key(p, (field_size + 7)/8, |
| 2555 | srvr_ecpoint, clnt_ecdh, NULL); | ||
| 2360 | if (n <= 0) { | 2556 | if (n <= 0) { |
| 2361 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2557 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2362 | ERR_R_ECDH_LIB); | 2558 | ERR_R_ECDH_LIB); |
| 2363 | goto err; | 2559 | goto err; |
| 2364 | } | 2560 | } |
| 2365 | 2561 | ||
| 2366 | /* generate master key from the result */ | 2562 | /* generate master key from the result */ |
| 2367 | s->session->master_key_length = s->method->ssl3_enc \ | 2563 | s->session->master_key_length = s->method->ssl3_enc \ |
| 2368 | -> generate_master_secret(s, | 2564 | -> generate_master_secret(s, |
| 2369 | s->session->master_key, | 2565 | s->session->master_key, p, n); |
| 2370 | p, n); | ||
| 2371 | 2566 | ||
| 2372 | memset(p, 0, n); /* clean up */ | 2567 | memset(p, 0, n); /* clean up */ |
| 2373 | 2568 | ||
| 2374 | if (ecdh_clnt_cert) { | 2569 | if (ecdh_clnt_cert) { |
| 2375 | /* Send empty client key exch message */ | 2570 | /* Send empty client key exch message. */ |
| 2376 | n = 0; | 2571 | n = 0; |
| 2377 | } else { | 2572 | } else { |
| 2378 | /* First check the size of encoding and | 2573 | /* |
| 2574 | * First check the size of encoding and | ||
| 2379 | * allocate memory accordingly. | 2575 | * allocate memory accordingly. |
| 2380 | */ | 2576 | */ |
| 2381 | encoded_pt_len = | 2577 | encoded_pt_len = EC_POINT_point2oct( |
| 2382 | EC_POINT_point2oct(srvr_group, | 2578 | srvr_group, |
| 2383 | EC_KEY_get0_public_key(clnt_ecdh), | 2579 | EC_KEY_get0_public_key(clnt_ecdh), |
| 2384 | POINT_CONVERSION_UNCOMPRESSED, | 2580 | POINT_CONVERSION_UNCOMPRESSED, |
| 2385 | NULL, 0, NULL); | 2581 | NULL, 0, NULL); |
| 2386 | 2582 | ||
| 2387 | encodedPoint = malloc(encoded_pt_len); | 2583 | encodedPoint = malloc(encoded_pt_len); |
| 2388 | 2584 | ||
| 2389 | bn_ctx = BN_CTX_new(); | 2585 | bn_ctx = BN_CTX_new(); |
| 2390 | if ((encodedPoint == NULL) || | 2586 | if ((encodedPoint == NULL) || |
| 2391 | (bn_ctx == NULL)) { | 2587 | (bn_ctx == NULL)) { |
| 2392 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | 2588 | SSLerr( |
| 2589 | SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2590 | ERR_R_MALLOC_FAILURE); | ||
| 2393 | goto err; | 2591 | goto err; |
| 2394 | } | 2592 | } |
| 2395 | 2593 | ||
| 2396 | /* Encode the public key */ | 2594 | /* Encode the public key */ |
| 2397 | n = EC_POINT_point2oct(srvr_group, | 2595 | n = EC_POINT_point2oct(srvr_group, |
| 2398 | EC_KEY_get0_public_key(clnt_ecdh), | 2596 | EC_KEY_get0_public_key(clnt_ecdh), |
| 2399 | POINT_CONVERSION_UNCOMPRESSED, | 2597 | POINT_CONVERSION_UNCOMPRESSED, |
| 2400 | encodedPoint, encoded_pt_len, bn_ctx); | 2598 | encodedPoint, encoded_pt_len, bn_ctx); |
| 2401 | 2599 | ||
| 2402 | *p = n; /* length of encoded point */ | 2600 | *p = n; /* length of encoded point */ |
| 2403 | /* Encoded point will be copied here */ | 2601 | /* Encoded point will be copied here */ |
| @@ -2427,61 +2625,80 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2427 | size_t msglen; | 2625 | size_t msglen; |
| 2428 | unsigned int md_len; | 2626 | unsigned int md_len; |
| 2429 | int keytype; | 2627 | int keytype; |
| 2430 | unsigned char premaster_secret[32], shared_ukm[32], tmp[256]; | 2628 | unsigned char premaster_secret[32], shared_ukm[32], |
| 2629 | tmp[256]; | ||
| 2431 | EVP_MD_CTX *ukm_hash; | 2630 | EVP_MD_CTX *ukm_hash; |
| 2432 | EVP_PKEY *pub_key; | 2631 | EVP_PKEY *pub_key; |
| 2433 | 2632 | ||
| 2434 | /* Get server sertificate PKEY and create ctx from it */ | 2633 | /* Get server sertificate PKEY and create ctx from it */ |
| 2435 | peer_cert = s->session->sess_cert->peer_pkeys[(keytype = SSL_PKEY_GOST01)].x509; | 2634 | peer_cert = s->session->sess_cert->peer_pkeys[( |
| 2635 | keytype = SSL_PKEY_GOST01)].x509; | ||
| 2436 | if (!peer_cert) | 2636 | if (!peer_cert) |
| 2437 | peer_cert = s->session->sess_cert->peer_pkeys[(keytype = SSL_PKEY_GOST94)].x509; | 2637 | peer_cert = s->session->sess_cert->peer_pkeys[ |
| 2638 | (keytype = SSL_PKEY_GOST94)].x509; | ||
| 2438 | if (!peer_cert) { | 2639 | if (!peer_cert) { |
| 2439 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER); | 2640 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2641 | SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER); | ||
| 2440 | goto err; | 2642 | goto err; |
| 2441 | } | 2643 | } |
| 2442 | 2644 | ||
| 2443 | pkey_ctx = EVP_PKEY_CTX_new(pub_key = X509_get_pubkey(peer_cert), NULL); | 2645 | pkey_ctx = EVP_PKEY_CTX_new( |
| 2444 | /* If we have send a certificate, and certificate key | 2646 | pub_key = X509_get_pubkey(peer_cert), |
| 2445 | 2647 | NULL); | |
| 2648 | /* | ||
| 2649 | * If we have send a certificate, and certificate key | ||
| 2446 | * parameters match those of server certificate, use | 2650 | * parameters match those of server certificate, use |
| 2447 | * certificate key for key exchange | 2651 | * certificate key for key exchange. |
| 2652 | * Otherwise, generate ephemeral key pair. | ||
| 2448 | */ | 2653 | */ |
| 2449 | 2654 | ||
| 2450 | /* Otherwise, generate ephemeral key pair */ | ||
| 2451 | |||
| 2452 | EVP_PKEY_encrypt_init(pkey_ctx); | 2655 | EVP_PKEY_encrypt_init(pkey_ctx); |
| 2453 | /* Generate session key */ | 2656 | /* Generate session key. */ |
| 2454 | RAND_bytes(premaster_secret, 32); | 2657 | RAND_bytes(premaster_secret, 32); |
| 2455 | /* If we have client certificate, use its secret as peer key */ | 2658 | /* |
| 2659 | * If we have client certificate, use its secret | ||
| 2660 | * as peer key. | ||
| 2661 | */ | ||
| 2456 | if (s->s3->tmp.cert_req && s->cert->key->privatekey) { | 2662 | if (s->s3->tmp.cert_req && s->cert->key->privatekey) { |
| 2457 | if (EVP_PKEY_derive_set_peer(pkey_ctx, s->cert->key->privatekey) <=0) { | 2663 | if (EVP_PKEY_derive_set_peer(pkey_ctx, |
| 2458 | /* If there was an error - just ignore it. Ephemeral key | 2664 | s->cert->key->privatekey) <=0) { |
| 2459 | * would be used | 2665 | /* |
| 2460 | */ | 2666 | * If there was an error - |
| 2667 | * just ignore it. Ephemeral key | ||
| 2668 | * would be used | ||
| 2669 | */ | ||
| 2461 | ERR_clear_error(); | 2670 | ERR_clear_error(); |
| 2462 | } | 2671 | } |
| 2463 | } | 2672 | } |
| 2464 | /* Compute shared IV and store it in algorithm-specific | 2673 | /* |
| 2465 | * context data */ | 2674 | * Compute shared IV and store it in algorithm-specific |
| 2675 | * context data | ||
| 2676 | */ | ||
| 2466 | ukm_hash = EVP_MD_CTX_create(); | 2677 | ukm_hash = EVP_MD_CTX_create(); |
| 2467 | EVP_DigestInit(ukm_hash, EVP_get_digestbynid(NID_id_GostR3411_94)); | 2678 | EVP_DigestInit(ukm_hash, |
| 2468 | EVP_DigestUpdate(ukm_hash, s->s3->client_random, SSL3_RANDOM_SIZE); | 2679 | EVP_get_digestbynid(NID_id_GostR3411_94)); |
| 2469 | EVP_DigestUpdate(ukm_hash, s->s3->server_random, SSL3_RANDOM_SIZE); | 2680 | EVP_DigestUpdate(ukm_hash, |
| 2681 | s->s3->client_random, SSL3_RANDOM_SIZE); | ||
| 2682 | EVP_DigestUpdate(ukm_hash, | ||
| 2683 | s->s3->server_random, SSL3_RANDOM_SIZE); | ||
| 2470 | EVP_DigestFinal_ex(ukm_hash, shared_ukm, &md_len); | 2684 | EVP_DigestFinal_ex(ukm_hash, shared_ukm, &md_len); |
| 2471 | EVP_MD_CTX_destroy(ukm_hash); | 2685 | EVP_MD_CTX_destroy(ukm_hash); |
| 2472 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, EVP_PKEY_OP_ENCRYPT, EVP_PKEY_CTRL_SET_IV, | 2686 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, EVP_PKEY_OP_ENCRYPT, |
| 2473 | 8, shared_ukm) < 0) { | 2687 | EVP_PKEY_CTRL_SET_IV, 8, shared_ukm) < 0) { |
| 2474 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2688 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2475 | SSL_R_LIBRARY_BUG); | 2689 | SSL_R_LIBRARY_BUG); |
| 2476 | goto err; | 2690 | goto err; |
| 2477 | } | 2691 | } |
| 2478 | /* Make GOST keytransport blob message */ | 2692 | /* |
| 2479 | /*Encapsulate it into sequence */ | 2693 | * Make GOST keytransport blob message, |
| 2694 | * encapsulate it into sequence. | ||
| 2695 | */ | ||
| 2480 | *(p++) = V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED; | 2696 | *(p++) = V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED; |
| 2481 | msglen = 255; | 2697 | msglen = 255; |
| 2482 | if (EVP_PKEY_encrypt(pkey_ctx, tmp, &msglen, premaster_secret, 32) < 0) { | 2698 | if (EVP_PKEY_encrypt(pkey_ctx, tmp, &msglen, |
| 2699 | premaster_secret, 32) < 0) { | ||
| 2483 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2700 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2484 | SSL_R_LIBRARY_BUG); | 2701 | SSL_R_LIBRARY_BUG); |
| 2485 | goto err; | 2702 | goto err; |
| 2486 | } | 2703 | } |
| 2487 | if (msglen >= 0x80) { | 2704 | if (msglen >= 0x80) { |
| @@ -2493,16 +2710,17 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2493 | n = msglen + 2; | 2710 | n = msglen + 2; |
| 2494 | } | 2711 | } |
| 2495 | memcpy(p, tmp, msglen); | 2712 | memcpy(p, tmp, msglen); |
| 2496 | /* Check if pubkey from client certificate was used */ | 2713 | /* Check if pubkey from client certificate was used. */ |
| 2497 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, EVP_PKEY_CTRL_PEER_KEY, 2, NULL) > 0) { | 2714 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, |
| 2498 | /* Set flag "skip certificate verify" */ | 2715 | EVP_PKEY_CTRL_PEER_KEY, 2, NULL) > 0) { |
| 2716 | /* Set flag "skip certificate verify". */ | ||
| 2499 | s->s3->flags |= TLS1_FLAGS_SKIP_CERT_VERIFY; | 2717 | s->s3->flags |= TLS1_FLAGS_SKIP_CERT_VERIFY; |
| 2500 | } | 2718 | } |
| 2501 | EVP_PKEY_CTX_free(pkey_ctx); | 2719 | EVP_PKEY_CTX_free(pkey_ctx); |
| 2502 | s->session->master_key_length = | 2720 | s->session->master_key_length = |
| 2503 | s->method->ssl3_enc->generate_master_secret(s, | 2721 | s->method->ssl3_enc->generate_master_secret(s, |
| 2504 | s->session->master_key, premaster_secret, 32); | 2722 | s->session->master_key, premaster_secret, 32); |
| 2505 | EVP_PKEY_free(pub_key); | 2723 | EVP_PKEY_free(pub_key); |
| 2506 | 2724 | ||
| 2507 | } | 2725 | } |
| 2508 | #ifndef OPENSSL_NO_SRP | 2726 | #ifndef OPENSSL_NO_SRP |
| @@ -2514,7 +2732,8 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2514 | BN_bn2bin(s->srp_ctx.A, p); | 2732 | BN_bn2bin(s->srp_ctx.A, p); |
| 2515 | n += 2; | 2733 | n += 2; |
| 2516 | } else { | 2734 | } else { |
| 2517 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 2735 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2736 | ERR_R_INTERNAL_ERROR); | ||
| 2518 | goto err; | 2737 | goto err; |
| 2519 | } | 2738 | } |
| 2520 | if (s->session->srp_username != NULL) | 2739 | if (s->session->srp_username != NULL) |
| @@ -2522,12 +2741,15 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2522 | s->session->srp_username = BUF_strdup(s->srp_ctx.login); | 2741 | s->session->srp_username = BUF_strdup(s->srp_ctx.login); |
| 2523 | if (s->session->srp_username == NULL) { | 2742 | if (s->session->srp_username == NULL) { |
| 2524 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2743 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2525 | ERR_R_MALLOC_FAILURE); | 2744 | ERR_R_MALLOC_FAILURE); |
| 2526 | goto err; | 2745 | goto err; |
| 2527 | } | 2746 | } |
| 2528 | 2747 | ||
| 2529 | if ((s->session->master_key_length = SRP_generate_client_master_secret(s, s->session->master_key)) < 0) { | 2748 | if ((s->session->master_key_length = |
| 2530 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | 2749 | SRP_generate_client_master_secret(s, |
| 2750 | s->session->master_key)) < 0) { | ||
| 2751 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2752 | ERR_R_INTERNAL_ERROR); | ||
| 2531 | goto err; | 2753 | goto err; |
| 2532 | } | 2754 | } |
| 2533 | } | 2755 | } |
| @@ -2543,27 +2765,29 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2543 | n = 0; | 2765 | n = 0; |
| 2544 | if (s->psk_client_callback == NULL) { | 2766 | if (s->psk_client_callback == NULL) { |
| 2545 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2767 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2546 | SSL_R_PSK_NO_CLIENT_CB); | 2768 | SSL_R_PSK_NO_CLIENT_CB); |
| 2547 | goto err; | 2769 | goto err; |
| 2548 | } | 2770 | } |
| 2549 | 2771 | ||
| 2550 | psk_len = s->psk_client_callback(s, s->ctx->psk_identity_hint, | 2772 | psk_len = s->psk_client_callback(s, |
| 2551 | identity, PSK_MAX_IDENTITY_LEN, | 2773 | s->ctx->psk_identity_hint, identity, |
| 2552 | psk_or_pre_ms, sizeof(psk_or_pre_ms)); | 2774 | PSK_MAX_IDENTITY_LEN, psk_or_pre_ms, |
| 2775 | sizeof(psk_or_pre_ms)); | ||
| 2553 | if (psk_len > PSK_MAX_PSK_LEN) { | 2776 | if (psk_len > PSK_MAX_PSK_LEN) { |
| 2554 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2777 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2555 | ERR_R_INTERNAL_ERROR); | 2778 | ERR_R_INTERNAL_ERROR); |
| 2556 | goto psk_err; | 2779 | goto psk_err; |
| 2557 | } else if (psk_len == 0) { | 2780 | } else if (psk_len == 0) { |
| 2558 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2781 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2559 | SSL_R_PSK_IDENTITY_NOT_FOUND); | 2782 | SSL_R_PSK_IDENTITY_NOT_FOUND); |
| 2560 | goto psk_err; | 2783 | goto psk_err; |
| 2561 | } | 2784 | } |
| 2562 | 2785 | ||
| 2563 | /* create PSK pre_master_secret */ | 2786 | /* create PSK pre_master_secret */ |
| 2564 | pre_ms_len = 2 + psk_len + 2 + psk_len; | 2787 | pre_ms_len = 2 + psk_len + 2 + psk_len; |
| 2565 | t = psk_or_pre_ms; | 2788 | t = psk_or_pre_ms; |
| 2566 | memmove(psk_or_pre_ms + psk_len + 4, psk_or_pre_ms, psk_len); | 2789 | memmove(psk_or_pre_ms + psk_len + 4, |
| 2790 | psk_or_pre_ms, psk_len); | ||
| 2567 | s2n(psk_len, t); | 2791 | s2n(psk_len, t); |
| 2568 | memset(t, 0, psk_len); | 2792 | memset(t, 0, psk_len); |
| 2569 | t += psk_len; | 2793 | t += psk_len; |
| @@ -2571,11 +2795,12 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2571 | 2795 | ||
| 2572 | if (s->session->psk_identity_hint != NULL) | 2796 | if (s->session->psk_identity_hint != NULL) |
| 2573 | free(s->session->psk_identity_hint); | 2797 | free(s->session->psk_identity_hint); |
| 2574 | s->session->psk_identity_hint = BUF_strdup(s->ctx->psk_identity_hint); | 2798 | s->session->psk_identity_hint = |
| 2799 | BUF_strdup(s->ctx->psk_identity_hint); | ||
| 2575 | if (s->ctx->psk_identity_hint != NULL && | 2800 | if (s->ctx->psk_identity_hint != NULL && |
| 2576 | s->session->psk_identity_hint == NULL) { | 2801 | s->session->psk_identity_hint == NULL) { |
| 2577 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2802 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2578 | ERR_R_MALLOC_FAILURE); | 2803 | ERR_R_MALLOC_FAILURE); |
| 2579 | goto psk_err; | 2804 | goto psk_err; |
| 2580 | } | 2805 | } |
| 2581 | 2806 | ||
| @@ -2584,25 +2809,26 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2584 | s->session->psk_identity = BUF_strdup(identity); | 2809 | s->session->psk_identity = BUF_strdup(identity); |
| 2585 | if (s->session->psk_identity == NULL) { | 2810 | if (s->session->psk_identity == NULL) { |
| 2586 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2811 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
| 2587 | ERR_R_MALLOC_FAILURE); | 2812 | ERR_R_MALLOC_FAILURE); |
| 2588 | goto psk_err; | 2813 | goto psk_err; |
| 2589 | } | 2814 | } |
| 2590 | 2815 | ||
| 2591 | s->session->master_key_length = | 2816 | s->session->master_key_length = |
| 2592 | s->method->ssl3_enc->generate_master_secret( | 2817 | s->method->ssl3_enc->generate_master_secret( |
| 2593 | s, s->session->master_key, psk_or_pre_ms, | 2818 | s, s->session->master_key, psk_or_pre_ms, |
| 2594 | pre_ms_len); | 2819 | pre_ms_len); |
| 2595 | 2820 | ||
| 2596 | n = strlen(identity); | 2821 | n = strlen(identity); |
| 2597 | s2n(n, p); | 2822 | s2n(n, p); |
| 2598 | memcpy(p, identity, n); | 2823 | memcpy(p, identity, n); |
| 2599 | n += 2; | 2824 | n += 2; |
| 2600 | psk_err = 0; | 2825 | psk_err = 0; |
| 2601 | psk_err: | 2826 | psk_err: |
| 2602 | OPENSSL_cleanse(identity, PSK_MAX_IDENTITY_LEN); | 2827 | OPENSSL_cleanse(identity, PSK_MAX_IDENTITY_LEN); |
| 2603 | OPENSSL_cleanse(psk_or_pre_ms, sizeof(psk_or_pre_ms)); | 2828 | OPENSSL_cleanse(psk_or_pre_ms, sizeof(psk_or_pre_ms)); |
| 2604 | if (psk_err != 0) { | 2829 | if (psk_err != 0) { |
| 2605 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 2830 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 2831 | SSL_AD_HANDSHAKE_FAILURE); | ||
| 2606 | goto err; | 2832 | goto err; |
| 2607 | } | 2833 | } |
| 2608 | } | 2834 | } |
| @@ -2626,7 +2852,7 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2626 | 2852 | ||
| 2627 | /* SSL3_ST_CW_KEY_EXCH_B */ | 2853 | /* SSL3_ST_CW_KEY_EXCH_B */ |
| 2628 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); | 2854 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); |
| 2629 | err: | 2855 | err: |
| 2630 | #ifndef OPENSSL_NO_ECDH | 2856 | #ifndef OPENSSL_NO_ECDH |
| 2631 | BN_CTX_free(bn_ctx); | 2857 | BN_CTX_free(bn_ctx); |
| 2632 | if (encodedPoint != NULL) | 2858 | if (encodedPoint != NULL) |
| @@ -2641,14 +2867,14 @@ err: | |||
| 2641 | int | 2867 | int |
| 2642 | ssl3_send_client_verify(SSL *s) | 2868 | ssl3_send_client_verify(SSL *s) |
| 2643 | { | 2869 | { |
| 2644 | unsigned char *p, *d; | 2870 | unsigned char *p, *d; |
| 2645 | unsigned char data[MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH]; | 2871 | unsigned char data[MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH]; |
| 2646 | EVP_PKEY *pkey; | 2872 | EVP_PKEY *pkey; |
| 2647 | EVP_PKEY_CTX *pctx = NULL; | 2873 | EVP_PKEY_CTX *pctx = NULL; |
| 2648 | EVP_MD_CTX mctx; | 2874 | EVP_MD_CTX mctx; |
| 2649 | unsigned u = 0; | 2875 | unsigned u = 0; |
| 2650 | unsigned long n; | 2876 | unsigned long n; |
| 2651 | int j; | 2877 | int j; |
| 2652 | 2878 | ||
| 2653 | EVP_MD_CTX_init(&mctx); | 2879 | EVP_MD_CTX_init(&mctx); |
| 2654 | 2880 | ||
| @@ -2656,18 +2882,21 @@ ssl3_send_client_verify(SSL *s) | |||
| 2656 | d = (unsigned char *)s->init_buf->data; | 2882 | d = (unsigned char *)s->init_buf->data; |
| 2657 | p = &(d[4]); | 2883 | p = &(d[4]); |
| 2658 | pkey = s->cert->key->privatekey; | 2884 | pkey = s->cert->key->privatekey; |
| 2659 | /* Create context from key and test if sha1 is allowed as digest */ | 2885 | /* |
| 2886 | * Create context from key and test if sha1 is allowed as | ||
| 2887 | * digest. | ||
| 2888 | */ | ||
| 2660 | pctx = EVP_PKEY_CTX_new(pkey, NULL); | 2889 | pctx = EVP_PKEY_CTX_new(pkey, NULL); |
| 2661 | EVP_PKEY_sign_init(pctx); | 2890 | EVP_PKEY_sign_init(pctx); |
| 2662 | if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1()) > 0) { | 2891 | if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1()) > 0) { |
| 2663 | if (TLS1_get_version(s) < TLS1_2_VERSION) | 2892 | if (TLS1_get_version(s) < TLS1_2_VERSION) |
| 2664 | s->method->ssl3_enc->cert_verify_mac(s, | 2893 | s->method->ssl3_enc->cert_verify_mac(s, |
| 2665 | NID_sha1, | 2894 | NID_sha1, &(data[MD5_DIGEST_LENGTH])); |
| 2666 | &(data[MD5_DIGEST_LENGTH])); | ||
| 2667 | } else { | 2895 | } else { |
| 2668 | ERR_clear_error(); | 2896 | ERR_clear_error(); |
| 2669 | } | 2897 | } |
| 2670 | /* For TLS v1.2 send signature algorithm and signature | 2898 | /* |
| 2899 | * For TLS v1.2 send signature algorithm and signature | ||
| 2671 | * using agreed digest and cached handshake records. | 2900 | * using agreed digest and cached handshake records. |
| 2672 | */ | 2901 | */ |
| 2673 | if (TLS1_get_version(s) >= TLS1_2_VERSION) { | 2902 | if (TLS1_get_version(s) >= TLS1_2_VERSION) { |
| @@ -2675,10 +2904,11 @@ ssl3_send_client_verify(SSL *s) | |||
| 2675 | void *hdata; | 2904 | void *hdata; |
| 2676 | const EVP_MD *md = s->cert->key->digest; | 2905 | const EVP_MD *md = s->cert->key->digest; |
| 2677 | hdatalen = BIO_get_mem_data(s->s3->handshake_buffer, | 2906 | hdatalen = BIO_get_mem_data(s->s3->handshake_buffer, |
| 2678 | &hdata); | 2907 | &hdata); |
| 2679 | if (hdatalen <= 0 || !tls12_get_sigandhash(p, pkey, md)) { | 2908 | if (hdatalen <= 0 || |
| 2909 | !tls12_get_sigandhash(p, pkey, md)) { | ||
| 2680 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, | 2910 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2681 | ERR_R_INTERNAL_ERROR); | 2911 | ERR_R_INTERNAL_ERROR); |
| 2682 | goto err; | 2912 | goto err; |
| 2683 | } | 2913 | } |
| 2684 | p += 2; | 2914 | p += 2; |
| @@ -2690,7 +2920,7 @@ ssl3_send_client_verify(SSL *s) | |||
| 2690 | !EVP_SignUpdate(&mctx, hdata, hdatalen) || | 2920 | !EVP_SignUpdate(&mctx, hdata, hdatalen) || |
| 2691 | !EVP_SignFinal(&mctx, p + 2, &u, pkey)) { | 2921 | !EVP_SignFinal(&mctx, p + 2, &u, pkey)) { |
| 2692 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, | 2922 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2693 | ERR_R_EVP_LIB); | 2923 | ERR_R_EVP_LIB); |
| 2694 | goto err; | 2924 | goto err; |
| 2695 | } | 2925 | } |
| 2696 | s2n(u, p); | 2926 | s2n(u, p); |
| @@ -2704,7 +2934,8 @@ ssl3_send_client_verify(SSL *s) | |||
| 2704 | if (RSA_sign(NID_md5_sha1, data, | 2934 | if (RSA_sign(NID_md5_sha1, data, |
| 2705 | MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH, &(p[2]), | 2935 | MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH, &(p[2]), |
| 2706 | &u, pkey->pkey.rsa) <= 0 ) { | 2936 | &u, pkey->pkey.rsa) <= 0 ) { |
| 2707 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_RSA_LIB); | 2937 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2938 | ERR_R_RSA_LIB); | ||
| 2708 | goto err; | 2939 | goto err; |
| 2709 | } | 2940 | } |
| 2710 | s2n(u, p); | 2941 | s2n(u, p); |
| @@ -2715,7 +2946,8 @@ ssl3_send_client_verify(SSL *s) | |||
| 2715 | &(data[MD5_DIGEST_LENGTH]), | 2946 | &(data[MD5_DIGEST_LENGTH]), |
| 2716 | SHA_DIGEST_LENGTH, &(p[2]), | 2947 | SHA_DIGEST_LENGTH, &(p[2]), |
| 2717 | (unsigned int *)&j, pkey->pkey.dsa)) { | 2948 | (unsigned int *)&j, pkey->pkey.dsa)) { |
| 2718 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_DSA_LIB); | 2949 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2950 | ERR_R_DSA_LIB); | ||
| 2719 | goto err; | 2951 | goto err; |
| 2720 | } | 2952 | } |
| 2721 | s2n(j, p); | 2953 | s2n(j, p); |
| @@ -2728,23 +2960,24 @@ ssl3_send_client_verify(SSL *s) | |||
| 2728 | SHA_DIGEST_LENGTH, &(p[2]), | 2960 | SHA_DIGEST_LENGTH, &(p[2]), |
| 2729 | (unsigned int *)&j, pkey->pkey.ec)) { | 2961 | (unsigned int *)&j, pkey->pkey.ec)) { |
| 2730 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, | 2962 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2731 | ERR_R_ECDSA_LIB); | 2963 | ERR_R_ECDSA_LIB); |
| 2732 | goto err; | 2964 | goto err; |
| 2733 | } | 2965 | } |
| 2734 | s2n(j, p); | 2966 | s2n(j, p); |
| 2735 | n = j + 2; | 2967 | n = j + 2; |
| 2736 | } else | 2968 | } else |
| 2737 | #endif | 2969 | #endif |
| 2738 | if (pkey->type == NID_id_GostR3410_94 || pkey->type == NID_id_GostR3410_2001) { | 2970 | if (pkey->type == NID_id_GostR3410_94 || |
| 2971 | pkey->type == NID_id_GostR3410_2001) { | ||
| 2739 | unsigned char signbuf[64]; | 2972 | unsigned char signbuf[64]; |
| 2740 | int i; | 2973 | int i; |
| 2741 | size_t sigsize = 64; | 2974 | size_t sigsize = 64; |
| 2742 | s->method->ssl3_enc->cert_verify_mac(s, | 2975 | s->method->ssl3_enc->cert_verify_mac(s, |
| 2743 | NID_id_GostR3411_94, | 2976 | NID_id_GostR3411_94, data); |
| 2744 | data); | 2977 | if (EVP_PKEY_sign(pctx, signbuf, &sigsize, data, 32) |
| 2745 | if (EVP_PKEY_sign(pctx, signbuf, &sigsize, data, 32) <= 0) { | 2978 | <= 0) { |
| 2746 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, | 2979 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2747 | ERR_R_INTERNAL_ERROR); | 2980 | ERR_R_INTERNAL_ERROR); |
| 2748 | goto err; | 2981 | goto err; |
| 2749 | } | 2982 | } |
| 2750 | for (i = 63, j = 0; i >= 0; j++, i--) { | 2983 | for (i = 63, j = 0; i >= 0; j++, i--) { |
| @@ -2753,7 +2986,8 @@ ssl3_send_client_verify(SSL *s) | |||
| 2753 | s2n(j, p); | 2986 | s2n(j, p); |
| 2754 | n = j + 2; | 2987 | n = j + 2; |
| 2755 | } else { | 2988 | } else { |
| 2756 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_INTERNAL_ERROR); | 2989 | SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, |
| 2990 | ERR_R_INTERNAL_ERROR); | ||
| 2757 | goto err; | 2991 | goto err; |
| 2758 | } | 2992 | } |
| 2759 | *(d++) = SSL3_MT_CERTIFICATE_VERIFY; | 2993 | *(d++) = SSL3_MT_CERTIFICATE_VERIFY; |
| @@ -2766,7 +3000,7 @@ ssl3_send_client_verify(SSL *s) | |||
| 2766 | EVP_MD_CTX_cleanup(&mctx); | 3000 | EVP_MD_CTX_cleanup(&mctx); |
| 2767 | EVP_PKEY_CTX_free(pctx); | 3001 | EVP_PKEY_CTX_free(pctx); |
| 2768 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); | 3002 | return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); |
| 2769 | err: | 3003 | err: |
| 2770 | EVP_MD_CTX_cleanup(&mctx); | 3004 | EVP_MD_CTX_cleanup(&mctx); |
| 2771 | EVP_PKEY_CTX_free(pctx); | 3005 | EVP_PKEY_CTX_free(pctx); |
| 2772 | return (-1); | 3006 | return (-1); |
| @@ -2775,10 +3009,10 @@ err: | |||
| 2775 | int | 3009 | int |
| 2776 | ssl3_send_client_certificate(SSL *s) | 3010 | ssl3_send_client_certificate(SSL *s) |
| 2777 | { | 3011 | { |
| 2778 | X509 *x509 = NULL; | 3012 | X509 *x509 = NULL; |
| 2779 | EVP_PKEY *pkey = NULL; | 3013 | EVP_PKEY *pkey = NULL; |
| 2780 | int i; | 3014 | int i; |
| 2781 | unsigned long l; | 3015 | unsigned long l; |
| 2782 | 3016 | ||
| 2783 | if (s->state == SSL3_ST_CW_CERT_A) { | 3017 | if (s->state == SSL3_ST_CW_CERT_A) { |
| 2784 | if ((s->cert == NULL) || (s->cert->key->x509 == NULL) || | 3018 | if ((s->cert == NULL) || (s->cert->key->x509 == NULL) || |
| @@ -2792,7 +3026,8 @@ ssl3_send_client_certificate(SSL *s) | |||
| 2792 | if (s->state == SSL3_ST_CW_CERT_B) { | 3026 | if (s->state == SSL3_ST_CW_CERT_B) { |
| 2793 | /* If we get an error, we need to | 3027 | /* If we get an error, we need to |
| 2794 | * ssl->rwstate=SSL_X509_LOOKUP; return(-1); | 3028 | * ssl->rwstate=SSL_X509_LOOKUP; return(-1); |
| 2795 | * We then get retied later */ | 3029 | * We then get retied later |
| 3030 | */ | ||
| 2796 | i = ssl_do_client_cert_cb(s, &x509, &pkey); | 3031 | i = ssl_do_client_cert_cb(s, &x509, &pkey); |
| 2797 | if (i < 0) { | 3032 | if (i < 0) { |
| 2798 | s->rwstate = SSL_X509_LOOKUP; | 3033 | s->rwstate = SSL_X509_LOOKUP; |
| @@ -2806,7 +3041,8 @@ ssl3_send_client_certificate(SSL *s) | |||
| 2806 | i = 0; | 3041 | i = 0; |
| 2807 | } else if (i == 1) { | 3042 | } else if (i == 1) { |
| 2808 | i = 0; | 3043 | i = 0; |
| 2809 | SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE, SSL_R_BAD_DATA_RETURNED_BY_CALLBACK); | 3044 | SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE, |
| 3045 | SSL_R_BAD_DATA_RETURNED_BY_CALLBACK); | ||
| 2810 | } | 3046 | } |
| 2811 | 3047 | ||
| 2812 | if (x509 != NULL) | 3048 | if (x509 != NULL) |
| @@ -2816,7 +3052,8 @@ ssl3_send_client_certificate(SSL *s) | |||
| 2816 | if (i == 0) { | 3052 | if (i == 0) { |
| 2817 | if (s->version == SSL3_VERSION) { | 3053 | if (s->version == SSL3_VERSION) { |
| 2818 | s->s3->tmp.cert_req = 0; | 3054 | s->s3->tmp.cert_req = 0; |
| 2819 | ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_NO_CERTIFICATE); | 3055 | ssl3_send_alert(s, SSL3_AL_WARNING, |
| 3056 | SSL_AD_NO_CERTIFICATE); | ||
| 2820 | return (1); | 3057 | return (1); |
| 2821 | } else { | 3058 | } else { |
| 2822 | s->s3->tmp.cert_req = 2; | 3059 | s->s3->tmp.cert_req = 2; |
| @@ -2830,7 +3067,7 @@ ssl3_send_client_certificate(SSL *s) | |||
| 2830 | if (s->state == SSL3_ST_CW_CERT_C) { | 3067 | if (s->state == SSL3_ST_CW_CERT_C) { |
| 2831 | s->state = SSL3_ST_CW_CERT_D; | 3068 | s->state = SSL3_ST_CW_CERT_D; |
| 2832 | l = ssl3_output_cert_chain(s, | 3069 | l = ssl3_output_cert_chain(s, |
| 2833 | (s->s3->tmp.cert_req == 2) ? NULL : s->cert->key->x509); | 3070 | (s->s3->tmp.cert_req == 2) ? NULL : s->cert->key->x509); |
| 2834 | s->init_num = (int)l; | 3071 | s->init_num = (int)l; |
| 2835 | s->init_off = 0; | 3072 | s->init_off = 0; |
| 2836 | } | 3073 | } |
| @@ -2843,25 +3080,26 @@ ssl3_send_client_certificate(SSL *s) | |||
| 2843 | int | 3080 | int |
| 2844 | ssl3_check_cert_and_algorithm(SSL *s) | 3081 | ssl3_check_cert_and_algorithm(SSL *s) |
| 2845 | { | 3082 | { |
| 2846 | int i, idx; | 3083 | int i, idx; |
| 2847 | long alg_k, alg_a; | 3084 | long alg_k, alg_a; |
| 2848 | EVP_PKEY *pkey = NULL; | 3085 | EVP_PKEY *pkey = NULL; |
| 2849 | SESS_CERT *sc; | 3086 | SESS_CERT *sc; |
| 2850 | RSA *rsa; | 3087 | RSA *rsa; |
| 2851 | #ifndef OPENSSL_NO_DH | 3088 | #ifndef OPENSSL_NO_DH |
| 2852 | DH *dh; | 3089 | DH *dh; |
| 2853 | #endif | 3090 | #endif |
| 2854 | 3091 | ||
| 2855 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; | 3092 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; |
| 2856 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; | 3093 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; |
| 2857 | 3094 | ||
| 2858 | /* we don't have a certificate */ | 3095 | /* We don't have a certificate. */ |
| 2859 | if ((alg_a & (SSL_aDH|SSL_aNULL|SSL_aKRB5)) || (alg_k & SSL_kPSK)) | 3096 | if ((alg_a & (SSL_aDH|SSL_aNULL|SSL_aKRB5)) || (alg_k & SSL_kPSK)) |
| 2860 | return (1); | 3097 | return (1); |
| 2861 | 3098 | ||
| 2862 | sc = s->session->sess_cert; | 3099 | sc = s->session->sess_cert; |
| 2863 | if (sc == NULL) { | 3100 | if (sc == NULL) { |
| 2864 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, ERR_R_INTERNAL_ERROR); | 3101 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3102 | ERR_R_INTERNAL_ERROR); | ||
| 2865 | goto err; | 3103 | goto err; |
| 2866 | } | 3104 | } |
| 2867 | 3105 | ||
| @@ -2870,15 +3108,16 @@ ssl3_check_cert_and_algorithm(SSL *s) | |||
| 2870 | dh = s->session->sess_cert->peer_dh_tmp; | 3108 | dh = s->session->sess_cert->peer_dh_tmp; |
| 2871 | #endif | 3109 | #endif |
| 2872 | 3110 | ||
| 2873 | /* This is the passed certificate */ | 3111 | /* This is the passed certificate. */ |
| 2874 | 3112 | ||
| 2875 | idx = sc->peer_cert_type; | 3113 | idx = sc->peer_cert_type; |
| 2876 | #ifndef OPENSSL_NO_ECDH | 3114 | #ifndef OPENSSL_NO_ECDH |
| 2877 | if (idx == SSL_PKEY_ECC) { | 3115 | if (idx == SSL_PKEY_ECC) { |
| 2878 | if (ssl_check_srvr_ecc_cert_and_alg(sc->peer_pkeys[idx].x509, | 3116 | if (ssl_check_srvr_ecc_cert_and_alg(sc->peer_pkeys[idx].x509, |
| 2879 | s) == 0) | 3117 | s) == 0) |
| 2880 | { /* check failed */ | 3118 | { /* check failed */ |
| 2881 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_BAD_ECC_CERT); | 3119 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3120 | SSL_R_BAD_ECC_CERT); | ||
| 2882 | goto f_err; | 3121 | goto f_err; |
| 2883 | } else { | 3122 | } else { |
| 2884 | return 1; | 3123 | return 1; |
| @@ -2892,59 +3131,71 @@ ssl3_check_cert_and_algorithm(SSL *s) | |||
| 2892 | 3131 | ||
| 2893 | /* Check that we have a certificate if we require one */ | 3132 | /* Check that we have a certificate if we require one */ |
| 2894 | if ((alg_a & SSL_aRSA) && !has_bits(i, EVP_PK_RSA|EVP_PKT_SIGN)) { | 3133 | if ((alg_a & SSL_aRSA) && !has_bits(i, EVP_PK_RSA|EVP_PKT_SIGN)) { |
| 2895 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_RSA_SIGNING_CERT); | 3134 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3135 | SSL_R_MISSING_RSA_SIGNING_CERT); | ||
| 2896 | goto f_err; | 3136 | goto f_err; |
| 2897 | } | 3137 | } |
| 2898 | else if ((alg_a & SSL_aDSS) && !has_bits(i, EVP_PK_DSA|EVP_PKT_SIGN)) { | 3138 | else if ((alg_a & SSL_aDSS) && !has_bits(i, EVP_PK_DSA|EVP_PKT_SIGN)) { |
| 2899 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_DSA_SIGNING_CERT); | 3139 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3140 | SSL_R_MISSING_DSA_SIGNING_CERT); | ||
| 2900 | goto f_err; | 3141 | goto f_err; |
| 2901 | } | 3142 | } |
| 2902 | if ((alg_k & SSL_kRSA) && | 3143 | if ((alg_k & SSL_kRSA) && |
| 2903 | !(has_bits(i, EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL))) { | 3144 | !(has_bits(i, EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL))) { |
| 2904 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_RSA_ENCRYPTING_CERT); | 3145 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3146 | SSL_R_MISSING_RSA_ENCRYPTING_CERT); | ||
| 2905 | goto f_err; | 3147 | goto f_err; |
| 2906 | } | 3148 | } |
| 2907 | #ifndef OPENSSL_NO_DH | 3149 | #ifndef OPENSSL_NO_DH |
| 2908 | if ((alg_k & SSL_kEDH) && | 3150 | if ((alg_k & SSL_kEDH) && |
| 2909 | !(has_bits(i, EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL))) { | 3151 | !(has_bits(i, EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL))) { |
| 2910 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_DH_KEY); | 3152 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3153 | SSL_R_MISSING_DH_KEY); | ||
| 2911 | goto f_err; | 3154 | goto f_err; |
| 2912 | } else if ((alg_k & SSL_kDHr) && !has_bits(i, EVP_PK_DH|EVP_PKS_RSA)) { | 3155 | } else if ((alg_k & SSL_kDHr) && !has_bits(i, EVP_PK_DH|EVP_PKS_RSA)) { |
| 2913 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_DH_RSA_CERT); | 3156 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3157 | SSL_R_MISSING_DH_RSA_CERT); | ||
| 2914 | goto f_err; | 3158 | goto f_err; |
| 2915 | } | 3159 | } |
| 2916 | else if ((alg_k & SSL_kDHd) && !has_bits(i, EVP_PK_DH|EVP_PKS_DSA)) { | 3160 | else if ((alg_k & SSL_kDHd) && !has_bits(i, EVP_PK_DH|EVP_PKS_DSA)) { |
| 2917 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_DH_DSA_CERT); | 3161 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3162 | SSL_R_MISSING_DH_DSA_CERT); | ||
| 2918 | goto f_err; | 3163 | goto f_err; |
| 2919 | } | 3164 | } |
| 2920 | #endif | 3165 | #endif |
| 2921 | 3166 | ||
| 2922 | if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && !has_bits(i, EVP_PKT_EXP)) { | 3167 | if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && |
| 3168 | !has_bits(i, EVP_PKT_EXP)) { | ||
| 2923 | if (alg_k & SSL_kRSA) { | 3169 | if (alg_k & SSL_kRSA) { |
| 2924 | if (rsa == NULL || | 3170 | if (rsa == NULL || RSA_size(rsa) * 8 > |
| 2925 | RSA_size(rsa) * 8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) { | 3171 | SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) { |
| 2926 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_EXPORT_TMP_RSA_KEY); | 3172 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, |
| 3173 | SSL_R_MISSING_EXPORT_TMP_RSA_KEY); | ||
| 2927 | goto f_err; | 3174 | goto f_err; |
| 2928 | } | 3175 | } |
| 2929 | } else | 3176 | } else |
| 2930 | #ifndef OPENSSL_NO_DH | 3177 | #ifndef OPENSSL_NO_DH |
| 2931 | if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { | 3178 | if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { |
| 2932 | if (dh == NULL || | 3179 | if (dh == NULL || DH_size(dh) * 8 > |
| 2933 | DH_size(dh) * 8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) { | 3180 | SSL_C_EXPORT_PKEYLENGTH( |
| 2934 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_EXPORT_TMP_DH_KEY); | 3181 | s->s3->tmp.new_cipher)) { |
| 3182 | SSLerr( | ||
| 3183 | SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, | ||
| 3184 | SSL_R_MISSING_EXPORT_TMP_DH_KEY); | ||
| 3185 | goto f_err; | ||
| 3186 | } | ||
| 3187 | } else | ||
| 3188 | #endif | ||
| 3189 | { | ||
| 3190 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, | ||
| 3191 | SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE); | ||
| 2935 | goto f_err; | 3192 | goto f_err; |
| 2936 | } | 3193 | } |
| 2937 | } else | ||
| 2938 | #endif | ||
| 2939 | { | ||
| 2940 | SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE); | ||
| 2941 | goto f_err; | ||
| 2942 | } | ||
| 2943 | } | 3194 | } |
| 2944 | return (1); | 3195 | return (1); |
| 2945 | f_err: | 3196 | f_err: |
| 2946 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 3197 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); |
| 2947 | err: | 3198 | err: |
| 2948 | return (0); | 3199 | return (0); |
| 2949 | } | 3200 | } |
| 2950 | 3201 | ||
| @@ -2952,8 +3203,8 @@ err: | |||
| 2952 | int | 3203 | int |
| 2953 | ssl3_send_next_proto(SSL *s) | 3204 | ssl3_send_next_proto(SSL *s) |
| 2954 | { | 3205 | { |
| 2955 | unsigned int len, padding_len; | 3206 | unsigned int len, padding_len; |
| 2956 | unsigned char *d; | 3207 | unsigned char *d; |
| 2957 | 3208 | ||
| 2958 | if (s->state == SSL3_ST_CW_NEXT_PROTO_A) { | 3209 | if (s->state == SSL3_ST_CW_NEXT_PROTO_A) { |
| 2959 | len = s->next_proto_negotiated_len; | 3210 | len = s->next_proto_negotiated_len; |
| @@ -2974,7 +3225,8 @@ ssl3_send_next_proto(SSL *s) | |||
| 2974 | } | 3225 | } |
| 2975 | #endif /* !OPENSSL_NO_TLSEXT && !OPENSSL_NO_NEXTPROTONEG */ | 3226 | #endif /* !OPENSSL_NO_TLSEXT && !OPENSSL_NO_NEXTPROTONEG */ |
| 2976 | 3227 | ||
| 2977 | /* Check to see if handshake is full or resumed. Usually this is just a | 3228 | /* |
| 3229 | * Check to see if handshake is full or resumed. Usually this is just a | ||
| 2978 | * case of checking to see if a cache hit has occurred. In the case of | 3230 | * case of checking to see if a cache hit has occurred. In the case of |
| 2979 | * session tickets we have to check the next message to be sure. | 3231 | * session tickets we have to check the next message to be sure. |
| 2980 | */ | 3232 | */ |
| @@ -2983,8 +3235,9 @@ ssl3_send_next_proto(SSL *s) | |||
| 2983 | int | 3235 | int |
| 2984 | ssl3_check_finished(SSL *s) | 3236 | ssl3_check_finished(SSL *s) |
| 2985 | { | 3237 | { |
| 2986 | int ok; | 3238 | int ok; |
| 2987 | long n; | 3239 | long n; |
| 3240 | |||
| 2988 | /* If we have no ticket it cannot be a resumed session. */ | 3241 | /* If we have no ticket it cannot be a resumed session. */ |
| 2989 | if (!s->session->tlsext_tick) | 3242 | if (!s->session->tlsext_tick) |
| 2990 | return 1; | 3243 | return 1; |
| @@ -3006,7 +3259,8 @@ ssl3_check_finished(SSL *s) | |||
| 3006 | int | 3259 | int |
| 3007 | ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey) | 3260 | ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey) |
| 3008 | { | 3261 | { |
| 3009 | int i = 0; | 3262 | int i = 0; |
| 3263 | |||
| 3010 | #ifndef OPENSSL_NO_ENGINE | 3264 | #ifndef OPENSSL_NO_ENGINE |
| 3011 | if (s->ctx->client_cert_engine) { | 3265 | if (s->ctx->client_cert_engine) { |
| 3012 | i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s, | 3266 | i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s, |
diff --git a/src/lib/libssl/src/ssl/s3_lib.c b/src/lib/libssl/src/ssl/s3_lib.c index c79464da55..28a3d51b9e 100644 --- a/src/lib/libssl/src/ssl/s3_lib.c +++ b/src/lib/libssl/src/ssl/s3_lib.c | |||
| @@ -2743,9 +2743,11 @@ SSL3_ENC_METHOD SSLv3_enc_data = { | |||
| 2743 | long | 2743 | long |
| 2744 | ssl3_default_timeout(void) | 2744 | ssl3_default_timeout(void) |
| 2745 | { | 2745 | { |
| 2746 | /* 2 hours, the 24 hours mentioned in the SSLv3 spec | 2746 | /* |
| 2747 | * is way too long for http, the cache would over fill */ | 2747 | * 2 hours, the 24 hours mentioned in the SSLv3 spec |
| 2748 | return (60*60*2); | 2748 | * is way too long for http, the cache would over fill |
| 2749 | */ | ||
| 2750 | return (60 * 60 * 2); | ||
| 2749 | } | 2751 | } |
| 2750 | 2752 | ||
| 2751 | int | 2753 | int |
| @@ -2769,13 +2771,14 @@ ssl3_pending(const SSL *s) | |||
| 2769 | if (s->rstate == SSL_ST_READ_BODY) | 2771 | if (s->rstate == SSL_ST_READ_BODY) |
| 2770 | return 0; | 2772 | return 0; |
| 2771 | 2773 | ||
| 2772 | return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? s->s3->rrec.length : 0; | 2774 | return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? |
| 2775 | s->s3->rrec.length : 0; | ||
| 2773 | } | 2776 | } |
| 2774 | 2777 | ||
| 2775 | int | 2778 | int |
| 2776 | ssl3_new(SSL *s) | 2779 | ssl3_new(SSL *s) |
| 2777 | { | 2780 | { |
| 2778 | SSL3_STATE *s3; | 2781 | SSL3_STATE *s3; |
| 2779 | 2782 | ||
| 2780 | if ((s3 = calloc(1, sizeof *s3)) == NULL) | 2783 | if ((s3 = calloc(1, sizeof *s3)) == NULL) |
| 2781 | goto err; | 2784 | goto err; |
| @@ -2840,9 +2843,9 @@ ssl3_free(SSL *s) | |||
| 2840 | void | 2843 | void |
| 2841 | ssl3_clear(SSL *s) | 2844 | ssl3_clear(SSL *s) |
| 2842 | { | 2845 | { |
| 2843 | unsigned char *rp, *wp; | 2846 | unsigned char *rp, *wp; |
| 2844 | size_t rlen, wlen; | 2847 | size_t rlen, wlen; |
| 2845 | int init_extra; | 2848 | int init_extra; |
| 2846 | 2849 | ||
| 2847 | #ifdef TLSEXT_TYPE_opaque_prf_input | 2850 | #ifdef TLSEXT_TYPE_opaque_prf_input |
| 2848 | if (s->s3->client_opaque_prf_input != NULL) | 2851 | if (s->s3->client_opaque_prf_input != NULL) |
| @@ -2932,7 +2935,8 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 2932 | if (cmd == SSL_CTRL_SET_TMP_RSA || cmd == SSL_CTRL_SET_TMP_RSA_CB || | 2935 | if (cmd == SSL_CTRL_SET_TMP_RSA || cmd == SSL_CTRL_SET_TMP_RSA_CB || |
| 2933 | cmd == SSL_CTRL_SET_TMP_DH || cmd == SSL_CTRL_SET_TMP_DH_CB) { | 2936 | cmd == SSL_CTRL_SET_TMP_DH || cmd == SSL_CTRL_SET_TMP_DH_CB) { |
| 2934 | if (!ssl_cert_inst(&s->cert)) { | 2937 | if (!ssl_cert_inst(&s->cert)) { |
| 2935 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_MALLOC_FAILURE); | 2938 | SSLerr(SSL_F_SSL3_CTRL, |
| 2939 | ERR_R_MALLOC_FAILURE); | ||
| 2936 | return (0); | 2940 | return (0); |
| 2937 | } | 2941 | } |
| 2938 | } | 2942 | } |
| @@ -2959,18 +2963,21 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 2959 | case SSL_CTRL_NEED_TMP_RSA: | 2963 | case SSL_CTRL_NEED_TMP_RSA: |
| 2960 | if ((s->cert != NULL) && (s->cert->rsa_tmp == NULL) && | 2964 | if ((s->cert != NULL) && (s->cert->rsa_tmp == NULL) && |
| 2961 | ((s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || | 2965 | ((s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || |
| 2962 | (EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512 / 8)))) | 2966 | (EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) |
| 2967 | > (512 / 8)))) | ||
| 2963 | ret = 1; | 2968 | ret = 1; |
| 2964 | break; | 2969 | break; |
| 2965 | case SSL_CTRL_SET_TMP_RSA: | 2970 | case SSL_CTRL_SET_TMP_RSA: |
| 2966 | { | 2971 | { |
| 2967 | RSA *rsa = (RSA *)parg; | 2972 | RSA *rsa = (RSA *)parg; |
| 2968 | if (rsa == NULL) { | 2973 | if (rsa == NULL) { |
| 2969 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER); | 2974 | SSLerr(SSL_F_SSL3_CTRL, |
| 2975 | ERR_R_PASSED_NULL_PARAMETER); | ||
| 2970 | return (ret); | 2976 | return (ret); |
| 2971 | } | 2977 | } |
| 2972 | if ((rsa = RSAPrivateKey_dup(rsa)) == NULL) { | 2978 | if ((rsa = RSAPrivateKey_dup(rsa)) == NULL) { |
| 2973 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_RSA_LIB); | 2979 | SSLerr(SSL_F_SSL3_CTRL, |
| 2980 | ERR_R_RSA_LIB); | ||
| 2974 | return (ret); | 2981 | return (ret); |
| 2975 | } | 2982 | } |
| 2976 | if (s->cert->rsa_tmp != NULL) | 2983 | if (s->cert->rsa_tmp != NULL) |
| @@ -2981,7 +2988,8 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 2981 | break; | 2988 | break; |
| 2982 | case SSL_CTRL_SET_TMP_RSA_CB: | 2989 | case SSL_CTRL_SET_TMP_RSA_CB: |
| 2983 | { | 2990 | { |
| 2984 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 2991 | SSLerr(SSL_F_SSL3_CTRL, |
| 2992 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 2985 | return (ret); | 2993 | return (ret); |
| 2986 | } | 2994 | } |
| 2987 | break; | 2995 | break; |
| @@ -2990,17 +2998,20 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 2990 | { | 2998 | { |
| 2991 | DH *dh = (DH *)parg; | 2999 | DH *dh = (DH *)parg; |
| 2992 | if (dh == NULL) { | 3000 | if (dh == NULL) { |
| 2993 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER); | 3001 | SSLerr(SSL_F_SSL3_CTRL, |
| 3002 | ERR_R_PASSED_NULL_PARAMETER); | ||
| 2994 | return (ret); | 3003 | return (ret); |
| 2995 | } | 3004 | } |
| 2996 | if ((dh = DHparams_dup(dh)) == NULL) { | 3005 | if ((dh = DHparams_dup(dh)) == NULL) { |
| 2997 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB); | 3006 | SSLerr(SSL_F_SSL3_CTRL, |
| 3007 | ERR_R_DH_LIB); | ||
| 2998 | return (ret); | 3008 | return (ret); |
| 2999 | } | 3009 | } |
| 3000 | if (!(s->options & SSL_OP_SINGLE_DH_USE)) { | 3010 | if (!(s->options & SSL_OP_SINGLE_DH_USE)) { |
| 3001 | if (!DH_generate_key(dh)) { | 3011 | if (!DH_generate_key(dh)) { |
| 3002 | DH_free(dh); | 3012 | DH_free(dh); |
| 3003 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB); | 3013 | SSLerr(SSL_F_SSL3_CTRL, |
| 3014 | ERR_R_DH_LIB); | ||
| 3004 | return (ret); | 3015 | return (ret); |
| 3005 | } | 3016 | } |
| 3006 | } | 3017 | } |
| @@ -3012,7 +3023,8 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3012 | break; | 3023 | break; |
| 3013 | case SSL_CTRL_SET_TMP_DH_CB: | 3024 | case SSL_CTRL_SET_TMP_DH_CB: |
| 3014 | { | 3025 | { |
| 3015 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 3026 | SSLerr(SSL_F_SSL3_CTRL, |
| 3027 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 3016 | return (ret); | 3028 | return (ret); |
| 3017 | } | 3029 | } |
| 3018 | break; | 3030 | break; |
| @@ -3023,18 +3035,21 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3023 | EC_KEY *ecdh = NULL; | 3035 | EC_KEY *ecdh = NULL; |
| 3024 | 3036 | ||
| 3025 | if (parg == NULL) { | 3037 | if (parg == NULL) { |
| 3026 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER); | 3038 | SSLerr(SSL_F_SSL3_CTRL, |
| 3039 | ERR_R_PASSED_NULL_PARAMETER); | ||
| 3027 | return (ret); | 3040 | return (ret); |
| 3028 | } | 3041 | } |
| 3029 | if (!EC_KEY_up_ref((EC_KEY *)parg)) { | 3042 | if (!EC_KEY_up_ref((EC_KEY *)parg)) { |
| 3030 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_ECDH_LIB); | 3043 | SSLerr(SSL_F_SSL3_CTRL, |
| 3044 | ERR_R_ECDH_LIB); | ||
| 3031 | return (ret); | 3045 | return (ret); |
| 3032 | } | 3046 | } |
| 3033 | ecdh = (EC_KEY *)parg; | 3047 | ecdh = (EC_KEY *)parg; |
| 3034 | if (!(s->options & SSL_OP_SINGLE_ECDH_USE)) { | 3048 | if (!(s->options & SSL_OP_SINGLE_ECDH_USE)) { |
| 3035 | if (!EC_KEY_generate_key(ecdh)) { | 3049 | if (!EC_KEY_generate_key(ecdh)) { |
| 3036 | EC_KEY_free(ecdh); | 3050 | EC_KEY_free(ecdh); |
| 3037 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_ECDH_LIB); | 3051 | SSLerr(SSL_F_SSL3_CTRL, |
| 3052 | ERR_R_ECDH_LIB); | ||
| 3038 | return (ret); | 3053 | return (ret); |
| 3039 | } | 3054 | } |
| 3040 | } | 3055 | } |
| @@ -3046,7 +3061,8 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3046 | break; | 3061 | break; |
| 3047 | case SSL_CTRL_SET_TMP_ECDH_CB: | 3062 | case SSL_CTRL_SET_TMP_ECDH_CB: |
| 3048 | { | 3063 | { |
| 3049 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 3064 | SSLerr(SSL_F_SSL3_CTRL, |
| 3065 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 3050 | return (ret); | 3066 | return (ret); |
| 3051 | } | 3067 | } |
| 3052 | break; | 3068 | break; |
| @@ -3062,15 +3078,19 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3062 | if (parg == NULL) | 3078 | if (parg == NULL) |
| 3063 | break; | 3079 | break; |
| 3064 | if (strlen((char *)parg) > TLSEXT_MAXLEN_host_name) { | 3080 | if (strlen((char *)parg) > TLSEXT_MAXLEN_host_name) { |
| 3065 | SSLerr(SSL_F_SSL3_CTRL, SSL_R_SSL3_EXT_INVALID_SERVERNAME); | 3081 | SSLerr(SSL_F_SSL3_CTRL, |
| 3082 | SSL_R_SSL3_EXT_INVALID_SERVERNAME); | ||
| 3066 | return 0; | 3083 | return 0; |
| 3067 | } | 3084 | } |
| 3068 | if ((s->tlsext_hostname = BUF_strdup((char *)parg)) == NULL) { | 3085 | if ((s->tlsext_hostname = BUF_strdup((char *)parg)) |
| 3069 | SSLerr(SSL_F_SSL3_CTRL, ERR_R_INTERNAL_ERROR); | 3086 | == NULL) { |
| 3087 | SSLerr(SSL_F_SSL3_CTRL, | ||
| 3088 | ERR_R_INTERNAL_ERROR); | ||
| 3070 | return 0; | 3089 | return 0; |
| 3071 | } | 3090 | } |
| 3072 | } else { | 3091 | } else { |
| 3073 | SSLerr(SSL_F_SSL3_CTRL, SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE); | 3092 | SSLerr(SSL_F_SSL3_CTRL, |
| 3093 | SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE); | ||
| 3074 | return 0; | 3094 | return 0; |
| 3075 | } | 3095 | } |
| 3076 | break; | 3096 | break; |
| @@ -3082,9 +3102,13 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3082 | #ifdef TLSEXT_TYPE_opaque_prf_input | 3102 | #ifdef TLSEXT_TYPE_opaque_prf_input |
| 3083 | case SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT: | 3103 | case SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT: |
| 3084 | if (larg > 12288) { | 3104 | if (larg > 12288) { |
| 3085 | /* actual internal limit is 2^16 for the complete hello message | 3105 | /* |
| 3086 | * (including the cert chain and everything) */ | 3106 | * Actual internal limit is 2^16 for the complete |
| 3087 | SSLerr(SSL_F_SSL3_CTRL, SSL_R_OPAQUE_PRF_INPUT_TOO_LONG); | 3107 | * hello message (including the cert chain and |
| 3108 | * everything) | ||
| 3109 | */ | ||
| 3110 | SSLerr(SSL_F_SSL3_CTRL, | ||
| 3111 | SSL_R_OPAQUE_PRF_INPUT_TOO_LONG); | ||
| 3088 | break; | 3112 | break; |
| 3089 | } | 3113 | } |
| 3090 | if (s->tlsext_opaque_prf_input != NULL) | 3114 | if (s->tlsext_opaque_prf_input != NULL) |
| @@ -3148,11 +3172,12 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 3148 | long | 3172 | long |
| 3149 | ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | 3173 | ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) |
| 3150 | { | 3174 | { |
| 3151 | int ret = 0; | 3175 | int ret = 0; |
| 3152 | 3176 | ||
| 3153 | if (cmd == SSL_CTRL_SET_TMP_RSA_CB || cmd == SSL_CTRL_SET_TMP_DH_CB) { | 3177 | if (cmd == SSL_CTRL_SET_TMP_RSA_CB || cmd == SSL_CTRL_SET_TMP_DH_CB) { |
| 3154 | if (!ssl_cert_inst(&s->cert)) { | 3178 | if (!ssl_cert_inst(&s->cert)) { |
| 3155 | SSLerr(SSL_F_SSL3_CALLBACK_CTRL, ERR_R_MALLOC_FAILURE); | 3179 | SSLerr(SSL_F_SSL3_CALLBACK_CTRL, |
| 3180 | ERR_R_MALLOC_FAILURE); | ||
| 3156 | return (0); | 3181 | return (0); |
| 3157 | } | 3182 | } |
| 3158 | } | 3183 | } |
| @@ -3173,14 +3198,15 @@ ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | |||
| 3173 | #ifndef OPENSSL_NO_ECDH | 3198 | #ifndef OPENSSL_NO_ECDH |
| 3174 | case SSL_CTRL_SET_TMP_ECDH_CB: | 3199 | case SSL_CTRL_SET_TMP_ECDH_CB: |
| 3175 | { | 3200 | { |
| 3176 | s->cert->ecdh_tmp_cb = (EC_KEY *(*)(SSL *, int, int))fp; | 3201 | s->cert->ecdh_tmp_cb = |
| 3202 | (EC_KEY *(*)(SSL *, int, int))fp; | ||
| 3177 | } | 3203 | } |
| 3178 | break; | 3204 | break; |
| 3179 | #endif | 3205 | #endif |
| 3180 | #ifndef OPENSSL_NO_TLSEXT | 3206 | #ifndef OPENSSL_NO_TLSEXT |
| 3181 | case SSL_CTRL_SET_TLSEXT_DEBUG_CB: | 3207 | case SSL_CTRL_SET_TLSEXT_DEBUG_CB: |
| 3182 | s->tlsext_debug_cb = (void (*)(SSL *, int , int, | 3208 | s->tlsext_debug_cb = (void (*)(SSL *, int , int, |
| 3183 | unsigned char *, int, void *))fp; | 3209 | unsigned char *, int, void *))fp; |
| 3184 | break; | 3210 | break; |
| 3185 | #endif | 3211 | #endif |
| 3186 | default: | 3212 | default: |
| @@ -3192,7 +3218,7 @@ ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | |||
| 3192 | long | 3218 | long |
| 3193 | ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | 3219 | ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) |
| 3194 | { | 3220 | { |
| 3195 | CERT *cert; | 3221 | CERT *cert; |
| 3196 | 3222 | ||
| 3197 | cert = ctx->cert; | 3223 | cert = ctx->cert; |
| 3198 | 3224 | ||
| @@ -3200,7 +3226,8 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3200 | case SSL_CTRL_NEED_TMP_RSA: | 3226 | case SSL_CTRL_NEED_TMP_RSA: |
| 3201 | if ((cert->rsa_tmp == NULL) && | 3227 | if ((cert->rsa_tmp == NULL) && |
| 3202 | ((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || | 3228 | ((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || |
| 3203 | (EVP_PKEY_size(cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > (512 / 8)))) | 3229 | (EVP_PKEY_size(cert->pkeys[SSL_PKEY_RSA_ENC].privatekey) > |
| 3230 | (512 / 8)))) | ||
| 3204 | return (1); | 3231 | return (1); |
| 3205 | else | 3232 | else |
| 3206 | return (0); | 3233 | return (0); |
| @@ -3219,7 +3246,8 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3219 | i = 0; | 3246 | i = 0; |
| 3220 | } | 3247 | } |
| 3221 | if (!i) { | 3248 | if (!i) { |
| 3222 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_RSA_LIB); | 3249 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3250 | ERR_R_RSA_LIB); | ||
| 3223 | return (0); | 3251 | return (0); |
| 3224 | } else { | 3252 | } else { |
| 3225 | if (cert->rsa_tmp != NULL) | 3253 | if (cert->rsa_tmp != NULL) |
| @@ -3231,7 +3259,8 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3231 | /* break; */ | 3259 | /* break; */ |
| 3232 | case SSL_CTRL_SET_TMP_RSA_CB: | 3260 | case SSL_CTRL_SET_TMP_RSA_CB: |
| 3233 | { | 3261 | { |
| 3234 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 3262 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3263 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 3235 | return (0); | 3264 | return (0); |
| 3236 | } | 3265 | } |
| 3237 | break; | 3266 | break; |
| @@ -3242,12 +3271,14 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3242 | 3271 | ||
| 3243 | dh = (DH *)parg; | 3272 | dh = (DH *)parg; |
| 3244 | if ((new = DHparams_dup(dh)) == NULL) { | 3273 | if ((new = DHparams_dup(dh)) == NULL) { |
| 3245 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_DH_LIB); | 3274 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3275 | ERR_R_DH_LIB); | ||
| 3246 | return 0; | 3276 | return 0; |
| 3247 | } | 3277 | } |
| 3248 | if (!(ctx->options & SSL_OP_SINGLE_DH_USE)) { | 3278 | if (!(ctx->options & SSL_OP_SINGLE_DH_USE)) { |
| 3249 | if (!DH_generate_key(new)) { | 3279 | if (!DH_generate_key(new)) { |
| 3250 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_DH_LIB); | 3280 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3281 | ERR_R_DH_LIB); | ||
| 3251 | DH_free(new); | 3282 | DH_free(new); |
| 3252 | return 0; | 3283 | return 0; |
| 3253 | } | 3284 | } |
| @@ -3260,7 +3291,8 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3260 | /*break; */ | 3291 | /*break; */ |
| 3261 | case SSL_CTRL_SET_TMP_DH_CB: | 3292 | case SSL_CTRL_SET_TMP_DH_CB: |
| 3262 | { | 3293 | { |
| 3263 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 3294 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3295 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 3264 | return (0); | 3296 | return (0); |
| 3265 | } | 3297 | } |
| 3266 | break; | 3298 | break; |
| @@ -3271,18 +3303,21 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3271 | EC_KEY *ecdh = NULL; | 3303 | EC_KEY *ecdh = NULL; |
| 3272 | 3304 | ||
| 3273 | if (parg == NULL) { | 3305 | if (parg == NULL) { |
| 3274 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_ECDH_LIB); | 3306 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3307 | ERR_R_ECDH_LIB); | ||
| 3275 | return 0; | 3308 | return 0; |
| 3276 | } | 3309 | } |
| 3277 | ecdh = EC_KEY_dup((EC_KEY *)parg); | 3310 | ecdh = EC_KEY_dup((EC_KEY *)parg); |
| 3278 | if (ecdh == NULL) { | 3311 | if (ecdh == NULL) { |
| 3279 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_EC_LIB); | 3312 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3313 | ERR_R_EC_LIB); | ||
| 3280 | return 0; | 3314 | return 0; |
| 3281 | } | 3315 | } |
| 3282 | if (!(ctx->options & SSL_OP_SINGLE_ECDH_USE)) { | 3316 | if (!(ctx->options & SSL_OP_SINGLE_ECDH_USE)) { |
| 3283 | if (!EC_KEY_generate_key(ecdh)) { | 3317 | if (!EC_KEY_generate_key(ecdh)) { |
| 3284 | EC_KEY_free(ecdh); | 3318 | EC_KEY_free(ecdh); |
| 3285 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_ECDH_LIB); | 3319 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3320 | ERR_R_ECDH_LIB); | ||
| 3286 | return 0; | 3321 | return 0; |
| 3287 | } | 3322 | } |
| 3288 | } | 3323 | } |
| @@ -3296,7 +3331,8 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3296 | /* break; */ | 3331 | /* break; */ |
| 3297 | case SSL_CTRL_SET_TMP_ECDH_CB: | 3332 | case SSL_CTRL_SET_TMP_ECDH_CB: |
| 3298 | { | 3333 | { |
| 3299 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 3334 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3335 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 3300 | return (0); | 3336 | return (0); |
| 3301 | } | 3337 | } |
| 3302 | break; | 3338 | break; |
| @@ -3312,17 +3348,21 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3312 | if (!keys) | 3348 | if (!keys) |
| 3313 | return 48; | 3349 | return 48; |
| 3314 | if (larg != 48) { | 3350 | if (larg != 48) { |
| 3315 | SSLerr(SSL_F_SSL3_CTX_CTRL, SSL_R_INVALID_TICKET_KEYS_LENGTH); | 3351 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3352 | SSL_R_INVALID_TICKET_KEYS_LENGTH); | ||
| 3316 | return 0; | 3353 | return 0; |
| 3317 | } | 3354 | } |
| 3318 | if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) { | 3355 | if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) { |
| 3319 | memcpy(ctx->tlsext_tick_key_name, keys, 16); | 3356 | memcpy(ctx->tlsext_tick_key_name, keys, 16); |
| 3320 | memcpy(ctx->tlsext_tick_hmac_key, keys + 16, 16); | 3357 | memcpy(ctx->tlsext_tick_hmac_key, |
| 3358 | keys + 16, 16); | ||
| 3321 | memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16); | 3359 | memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16); |
| 3322 | } else { | 3360 | } else { |
| 3323 | memcpy(keys, ctx->tlsext_tick_key_name, 16); | 3361 | memcpy(keys, ctx->tlsext_tick_key_name, 16); |
| 3324 | memcpy(keys + 16, ctx->tlsext_tick_hmac_key, 16); | 3362 | memcpy(keys + 16, |
| 3325 | memcpy(keys + 32, ctx->tlsext_tick_aes_key, 16); | 3363 | ctx->tlsext_tick_hmac_key, 16); |
| 3364 | memcpy(keys + 32, | ||
| 3365 | ctx->tlsext_tick_aes_key, 16); | ||
| 3326 | } | 3366 | } |
| 3327 | return 1; | 3367 | return 1; |
| 3328 | } | 3368 | } |
| @@ -3346,17 +3386,21 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3346 | ctx->srp_ctx.login = NULL; | 3386 | ctx->srp_ctx.login = NULL; |
| 3347 | if (parg == NULL) | 3387 | if (parg == NULL) |
| 3348 | break; | 3388 | break; |
| 3349 | if (strlen((const char *)parg) > 255 || strlen((const char *)parg) < 1) { | 3389 | if (strlen((const char *)parg) > 255 || |
| 3350 | SSLerr(SSL_F_SSL3_CTX_CTRL, SSL_R_INVALID_SRP_USERNAME); | 3390 | strlen((const char *)parg) < 1) { |
| 3391 | SSLerr(SSL_F_SSL3_CTX_CTRL, | ||
| 3392 | SSL_R_INVALID_SRP_USERNAME); | ||
| 3351 | return 0; | 3393 | return 0; |
| 3352 | } | 3394 | } |
| 3353 | if ((ctx->srp_ctx.login = BUF_strdup((char *)parg)) == NULL) { | 3395 | if ((ctx->srp_ctx.login = BUF_strdup((char *)parg)) == NULL) { |
| 3354 | SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_INTERNAL_ERROR); | 3396 | SSLerr(SSL_F_SSL3_CTX_CTRL, |
| 3397 | ERR_R_INTERNAL_ERROR); | ||
| 3355 | return 0; | 3398 | return 0; |
| 3356 | } | 3399 | } |
| 3357 | break; | 3400 | break; |
| 3358 | case SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD: | 3401 | case SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD: |
| 3359 | ctx->srp_ctx.SRP_give_srp_client_pwd_callback = srp_password_from_info_cb; | 3402 | ctx->srp_ctx.SRP_give_srp_client_pwd_callback = |
| 3403 | srp_password_from_info_cb; | ||
| 3360 | ctx->srp_ctx.info = parg; | 3404 | ctx->srp_ctx.info = parg; |
| 3361 | break; | 3405 | break; |
| 3362 | case SSL_CTRL_SET_SRP_ARG: | 3406 | case SSL_CTRL_SET_SRP_ARG: |
| @@ -3399,7 +3443,7 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3399 | long | 3443 | long |
| 3400 | ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | 3444 | ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) |
| 3401 | { | 3445 | { |
| 3402 | CERT *cert; | 3446 | CERT *cert; |
| 3403 | 3447 | ||
| 3404 | cert = ctx->cert; | 3448 | cert = ctx->cert; |
| 3405 | 3449 | ||
| @@ -3425,12 +3469,14 @@ ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | |||
| 3425 | #endif | 3469 | #endif |
| 3426 | #ifndef OPENSSL_NO_TLSEXT | 3470 | #ifndef OPENSSL_NO_TLSEXT |
| 3427 | case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB: | 3471 | case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB: |
| 3428 | ctx->tlsext_servername_callback = (int (*)(SSL *, int *, void *))fp; | 3472 | ctx->tlsext_servername_callback = |
| 3473 | (int (*)(SSL *, int *, void *))fp; | ||
| 3429 | break; | 3474 | break; |
| 3430 | 3475 | ||
| 3431 | #ifdef TLSEXT_TYPE_opaque_prf_input | 3476 | #ifdef TLSEXT_TYPE_opaque_prf_input |
| 3432 | case SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB: | 3477 | case SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB: |
| 3433 | ctx->tlsext_opaque_prf_input_callback = (int (*)(SSL *, void *, size_t, void *))fp; | 3478 | ctx->tlsext_opaque_prf_input_callback = |
| 3479 | (int (*)(SSL *, void *, size_t, void *))fp; | ||
| 3434 | break; | 3480 | break; |
| 3435 | #endif | 3481 | #endif |
| 3436 | 3482 | ||
| @@ -3472,9 +3518,9 @@ ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | |||
| 3472 | const SSL_CIPHER * | 3518 | const SSL_CIPHER * |
| 3473 | ssl3_get_cipher_by_char(const unsigned char *p) | 3519 | ssl3_get_cipher_by_char(const unsigned char *p) |
| 3474 | { | 3520 | { |
| 3475 | SSL_CIPHER c; | 3521 | SSL_CIPHER c; |
| 3476 | const SSL_CIPHER *cp; | 3522 | const SSL_CIPHER *cp; |
| 3477 | unsigned long id; | 3523 | unsigned long id; |
| 3478 | 3524 | ||
| 3479 | id = 0x03000000L | ((unsigned long)p[0] << 8L) | (unsigned long)p[1]; | 3525 | id = 0x03000000L | ((unsigned long)p[0] << 8L) | (unsigned long)p[1]; |
| 3480 | c.id = id; | 3526 | c.id = id; |
| @@ -3492,7 +3538,7 @@ ssl3_get_cipher_by_char(const unsigned char *p) | |||
| 3492 | int | 3538 | int |
| 3493 | ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) | 3539 | ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) |
| 3494 | { | 3540 | { |
| 3495 | long l; | 3541 | long l; |
| 3496 | 3542 | ||
| 3497 | if (p != NULL) { | 3543 | if (p != NULL) { |
| 3498 | l = c->id; | 3544 | l = c->id; |
| @@ -3507,9 +3553,9 @@ ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) | |||
| 3507 | SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | 3553 | SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, |
| 3508 | STACK_OF(SSL_CIPHER) *srvr) | 3554 | STACK_OF(SSL_CIPHER) *srvr) |
| 3509 | { | 3555 | { |
| 3510 | SSL_CIPHER *c, *ret = NULL; | 3556 | SSL_CIPHER *c, *ret = NULL; |
| 3511 | STACK_OF(SSL_CIPHER) *prio, *allow; | 3557 | STACK_OF(SSL_CIPHER) *prio, *allow; |
| 3512 | int i, ii, ok; | 3558 | int i, ii, ok; |
| 3513 | #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_EC) | 3559 | #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_EC) |
| 3514 | unsigned int j; | 3560 | unsigned int j; |
| 3515 | int ec_ok, ec_nid; | 3561 | int ec_ok, ec_nid; |
| @@ -3522,7 +3568,8 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3522 | cert = s->cert; | 3568 | cert = s->cert; |
| 3523 | 3569 | ||
| 3524 | #if 0 | 3570 | #if 0 |
| 3525 | /* Do not set the compare functions, because this may lead to a | 3571 | /* |
| 3572 | * Do not set the compare functions, because this may lead to a | ||
| 3526 | * reordering by "id". We want to keep the original ordering. | 3573 | * reordering by "id". We want to keep the original ordering. |
| 3527 | * We may pay a price in performance during sk_SSL_CIPHER_find(), | 3574 | * We may pay a price in performance during sk_SSL_CIPHER_find(), |
| 3528 | * but would have to pay with the price of sk_SSL_CIPHER_dup(). | 3575 | * but would have to pay with the price of sk_SSL_CIPHER_dup(). |
| @@ -3532,12 +3579,14 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3532 | #endif | 3579 | #endif |
| 3533 | 3580 | ||
| 3534 | #ifdef CIPHER_DEBUG | 3581 | #ifdef CIPHER_DEBUG |
| 3535 | printf("Server has %d from %p:\n", sk_SSL_CIPHER_num(srvr), (void *)srvr); | 3582 | printf("Server has %d from %p:\n", sk_SSL_CIPHER_num(srvr), |
| 3583 | (void *)srvr); | ||
| 3536 | for (i = 0; i < sk_SSL_CIPHER_num(srvr); ++i) { | 3584 | for (i = 0; i < sk_SSL_CIPHER_num(srvr); ++i) { |
| 3537 | c = sk_SSL_CIPHER_value(srvr, i); | 3585 | c = sk_SSL_CIPHER_value(srvr, i); |
| 3538 | printf("%p:%s\n",(void *)c, c->name); | 3586 | printf("%p:%s\n",(void *)c, c->name); |
| 3539 | } | 3587 | } |
| 3540 | printf("Client sent %d from %p:\n", sk_SSL_CIPHER_num(clnt), (void *)clnt); | 3588 | printf("Client sent %d from %p:\n", sk_SSL_CIPHER_num(clnt), |
| 3589 | (void *)clnt); | ||
| 3541 | for (i = 0; i < sk_SSL_CIPHER_num(clnt); ++i) { | 3590 | for (i = 0; i < sk_SSL_CIPHER_num(clnt); ++i) { |
| 3542 | c = sk_SSL_CIPHER_value(clnt, i); | 3591 | c = sk_SSL_CIPHER_value(clnt, i); |
| 3543 | printf("%p:%s\n",(void *)c, c->name); | 3592 | printf("%p:%s\n",(void *)c, c->name); |
| @@ -3592,26 +3641,35 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3592 | if (SSL_C_IS_EXPORT(c)) { | 3641 | if (SSL_C_IS_EXPORT(c)) { |
| 3593 | ok = (alg_k & emask_k) && (alg_a & emask_a); | 3642 | ok = (alg_k & emask_k) && (alg_a & emask_a); |
| 3594 | #ifdef CIPHER_DEBUG | 3643 | #ifdef CIPHER_DEBUG |
| 3595 | printf("%d:[%08lX:%08lX:%08lX:%08lX]%p:%s (export)\n", ok, alg_k, alg_a, emask_k, emask_a, | 3644 | printf("%d:[%08lX:%08lX:%08lX:%08lX]%p:%s (export)\n", |
| 3596 | (void *)c, c->name); | 3645 | ok, alg_k, alg_a, emask_k, emask_a, (void *)c, |
| 3646 | c->name); | ||
| 3597 | #endif | 3647 | #endif |
| 3598 | } else { | 3648 | } else { |
| 3599 | ok = (alg_k & mask_k) && (alg_a & mask_a); | 3649 | ok = (alg_k & mask_k) && (alg_a & mask_a); |
| 3600 | #ifdef CIPHER_DEBUG | 3650 | #ifdef CIPHER_DEBUG |
| 3601 | printf("%d:[%08lX:%08lX:%08lX:%08lX]%p:%s\n", ok, alg_k, alg_a, mask_k, mask_a,(void *)c, | 3651 | printf("%d:[%08lX:%08lX:%08lX:%08lX]%p:%s\n", |
| 3602 | c->name); | 3652 | ok, alg_k, alg_a, mask_k, mask_a,(void *)c, |
| 3653 | c->name); | ||
| 3603 | #endif | 3654 | #endif |
| 3604 | } | 3655 | } |
| 3605 | 3656 | ||
| 3606 | #ifndef OPENSSL_NO_TLSEXT | 3657 | #ifndef OPENSSL_NO_TLSEXT |
| 3607 | #ifndef OPENSSL_NO_EC | 3658 | #ifndef OPENSSL_NO_EC |
| 3608 | if ( | 3659 | if ( |
| 3609 | /* if we are considering an ECC cipher suite that uses our certificate */ | 3660 | /* |
| 3661 | * if we are considering an ECC cipher suite that uses our | ||
| 3662 | * certificate | ||
| 3663 | */ | ||
| 3610 | (alg_a & SSL_aECDSA || alg_a & SSL_aECDH) | 3664 | (alg_a & SSL_aECDSA || alg_a & SSL_aECDH) |
| 3611 | /* and we have an ECC certificate */ | 3665 | /* and we have an ECC certificate */ |
| 3612 | && (s->cert->pkeys[SSL_PKEY_ECC].x509 != NULL) | 3666 | && (s->cert->pkeys[SSL_PKEY_ECC].x509 != NULL) |
| 3613 | /* and the client specified a Supported Point Formats extension */ | 3667 | /* |
| 3614 | && ((s->session->tlsext_ecpointformatlist_length > 0) && (s->session->tlsext_ecpointformatlist != NULL)) | 3668 | * and the client specified a Supported Point Formats |
| 3669 | * extension | ||
| 3670 | */ | ||
| 3671 | && ((s->session->tlsext_ecpointformatlist_length > 0) && | ||
| 3672 | (s->session->tlsext_ecpointformatlist != NULL)) | ||
| 3615 | /* and our certificate's point is compressed */ | 3673 | /* and our certificate's point is compressed */ |
| 3616 | && ( | 3674 | && ( |
| 3617 | (s->cert->pkeys[SSL_PKEY_ECC].x509->cert_info != NULL) | 3675 | (s->cert->pkeys[SSL_PKEY_ECC].x509->cert_info != NULL) |
| @@ -3625,8 +3683,11 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3625 | ) | 3683 | ) |
| 3626 | ) { | 3684 | ) { |
| 3627 | ec_ok = 0; | 3685 | ec_ok = 0; |
| 3628 | /* if our certificate's curve is over a field type that the client does not support | 3686 | /* |
| 3629 | * then do not allow this cipher suite to be negotiated */ | 3687 | * If our certificate's curve is over a field type |
| 3688 | * that the client does not support then do not allow | ||
| 3689 | * this cipher suite to be negotiated | ||
| 3690 | */ | ||
| 3630 | if ( | 3691 | if ( |
| 3631 | (s->cert->pkeys[SSL_PKEY_ECC].privatekey->pkey.ec != NULL) | 3692 | (s->cert->pkeys[SSL_PKEY_ECC].privatekey->pkey.ec != NULL) |
| 3632 | && (s->cert->pkeys[SSL_PKEY_ECC].privatekey->pkey.ec->group != NULL) | 3693 | && (s->cert->pkeys[SSL_PKEY_ECC].privatekey->pkey.ec->group != NULL) |
| @@ -3650,7 +3711,10 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3650 | ok = ok && ec_ok; | 3711 | ok = ok && ec_ok; |
| 3651 | } | 3712 | } |
| 3652 | if ( | 3713 | if ( |
| 3653 | /* if we are considering an ECC cipher suite that uses our certificate */ | 3714 | /* |
| 3715 | * If we are considering an ECC cipher suite that uses our | ||
| 3716 | * certificate | ||
| 3717 | */ | ||
| 3654 | (alg_a & SSL_aECDSA || alg_a & SSL_aECDH) | 3718 | (alg_a & SSL_aECDSA || alg_a & SSL_aECDH) |
| 3655 | /* and we have an ECC certificate */ | 3719 | /* and we have an ECC certificate */ |
| 3656 | && (s->cert->pkeys[SSL_PKEY_ECC].x509 != NULL) | 3720 | && (s->cert->pkeys[SSL_PKEY_ECC].x509 != NULL) |
| @@ -3689,7 +3753,10 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3689 | ok = ok && ec_ok; | 3753 | ok = ok && ec_ok; |
| 3690 | } | 3754 | } |
| 3691 | if ( | 3755 | if ( |
| 3692 | /* if we are considering an ECC cipher suite that uses an ephemeral EC key */ | 3756 | /* |
| 3757 | * if we are considering an ECC cipher suite that uses an | ||
| 3758 | * ephemeral EC key | ||
| 3759 | */ | ||
| 3693 | (alg_k & SSL_kEECDH) | 3760 | (alg_k & SSL_kEECDH) |
| 3694 | /* and we have an ephemeral EC key */ | 3761 | /* and we have an ephemeral EC key */ |
| 3695 | && (s->cert->ecdh_tmp != NULL) | 3762 | && (s->cert->ecdh_tmp != NULL) |
| @@ -3732,7 +3799,8 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3732 | ii = sk_SSL_CIPHER_find(allow, c); | 3799 | ii = sk_SSL_CIPHER_find(allow, c); |
| 3733 | if (ii >= 0) { | 3800 | if (ii >= 0) { |
| 3734 | #if !defined(OPENSSL_NO_EC) && !defined(OPENSSL_NO_TLSEXT) | 3801 | #if !defined(OPENSSL_NO_EC) && !defined(OPENSSL_NO_TLSEXT) |
| 3735 | if ((alg_k & SSL_kEECDH) && (alg_a & SSL_aECDSA) && s->s3->is_probably_safari) { | 3802 | if ((alg_k & SSL_kEECDH) && |
| 3803 | (alg_a & SSL_aECDSA) && s->s3->is_probably_safari) { | ||
| 3736 | if (!ret) | 3804 | if (!ret) |
| 3737 | ret = sk_SSL_CIPHER_value(allow, ii); | 3805 | ret = sk_SSL_CIPHER_value(allow, ii); |
| 3738 | continue; | 3806 | continue; |
| @@ -3748,8 +3816,8 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3748 | int | 3816 | int |
| 3749 | ssl3_get_req_cert_type(SSL *s, unsigned char *p) | 3817 | ssl3_get_req_cert_type(SSL *s, unsigned char *p) |
| 3750 | { | 3818 | { |
| 3751 | int ret = 0; | 3819 | int ret = 0; |
| 3752 | unsigned long alg_k; | 3820 | unsigned long alg_k; |
| 3753 | 3821 | ||
| 3754 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; | 3822 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; |
| 3755 | 3823 | ||
| @@ -3784,7 +3852,8 @@ ssl3_get_req_cert_type(SSL *s, unsigned char *p) | |||
| 3784 | #endif | 3852 | #endif |
| 3785 | 3853 | ||
| 3786 | #ifndef OPENSSL_NO_ECDSA | 3854 | #ifndef OPENSSL_NO_ECDSA |
| 3787 | /* ECDSA certs can be used with RSA cipher suites as well | 3855 | /* |
| 3856 | * ECDSA certs can be used with RSA cipher suites as well | ||
| 3788 | * so we don't need to check for SSL_kECDH or SSL_kEECDH | 3857 | * so we don't need to check for SSL_kECDH or SSL_kEECDH |
| 3789 | */ | 3858 | */ |
| 3790 | if (s->version >= TLS1_VERSION) { | 3859 | if (s->version >= TLS1_VERSION) { |
| @@ -3797,10 +3866,12 @@ ssl3_get_req_cert_type(SSL *s, unsigned char *p) | |||
| 3797 | int | 3866 | int |
| 3798 | ssl3_shutdown(SSL *s) | 3867 | ssl3_shutdown(SSL *s) |
| 3799 | { | 3868 | { |
| 3800 | int ret; | 3869 | int ret; |
| 3801 | 3870 | ||
| 3802 | /* Don't do anything much if we have not done the handshake or | 3871 | /* |
| 3803 | * we don't want to send messages :-) */ | 3872 | * Don't do anything much if we have not done the handshake or |
| 3873 | * we don't want to send messages :-) | ||
| 3874 | */ | ||
| 3804 | if ((s->quiet_shutdown) || (s->state == SSL_ST_BEFORE)) { | 3875 | if ((s->quiet_shutdown) || (s->state == SSL_ST_BEFORE)) { |
| 3805 | s->shutdown = (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); | 3876 | s->shutdown = (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); |
| 3806 | return (1); | 3877 | return (1); |
| @@ -3811,8 +3882,10 @@ ssl3_shutdown(SSL *s) | |||
| 3811 | #if 1 | 3882 | #if 1 |
| 3812 | ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_CLOSE_NOTIFY); | 3883 | ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_CLOSE_NOTIFY); |
| 3813 | #endif | 3884 | #endif |
| 3814 | /* our shutdown alert has been sent now, and if it still needs | 3885 | /* |
| 3815 | * to be written, s->s3->alert_dispatch will be true */ | 3886 | * Our shutdown alert has been sent now, and if it still needs |
| 3887 | * to be written, s->s3->alert_dispatch will be true | ||
| 3888 | */ | ||
| 3816 | if (s->s3->alert_dispatch) | 3889 | if (s->s3->alert_dispatch) |
| 3817 | return(-1); /* return WANT_WRITE */ | 3890 | return(-1); /* return WANT_WRITE */ |
| 3818 | } else if (s->s3->alert_dispatch) { | 3891 | } else if (s->s3->alert_dispatch) { |
| @@ -3820,10 +3893,12 @@ ssl3_shutdown(SSL *s) | |||
| 3820 | #if 1 | 3893 | #if 1 |
| 3821 | ret = s->method->ssl_dispatch_alert(s); | 3894 | ret = s->method->ssl_dispatch_alert(s); |
| 3822 | if (ret == -1) { | 3895 | if (ret == -1) { |
| 3823 | /* we only get to return -1 here the 2nd/Nth | 3896 | /* |
| 3897 | * We only get to return -1 here the 2nd/Nth | ||
| 3824 | * invocation, we must have already signalled | 3898 | * invocation, we must have already signalled |
| 3825 | * return 0 upon a previous invoation, | 3899 | * return 0 upon a previous invoation, |
| 3826 | * return WANT_WRITE */ | 3900 | * return WANT_WRITE |
| 3901 | */ | ||
| 3827 | return (ret); | 3902 | return (ret); |
| 3828 | } | 3903 | } |
| 3829 | #endif | 3904 | #endif |
| @@ -3845,7 +3920,7 @@ ssl3_shutdown(SSL *s) | |||
| 3845 | int | 3920 | int |
| 3846 | ssl3_write(SSL *s, const void *buf, int len) | 3921 | ssl3_write(SSL *s, const void *buf, int len) |
| 3847 | { | 3922 | { |
| 3848 | int ret, n; | 3923 | int ret, n; |
| 3849 | 3924 | ||
| 3850 | #if 0 | 3925 | #if 0 |
| 3851 | if (s->shutdown & SSL_SEND_SHUTDOWN) { | 3926 | if (s->shutdown & SSL_SEND_SHUTDOWN) { |
| @@ -3857,16 +3932,18 @@ ssl3_write(SSL *s, const void *buf, int len) | |||
| 3857 | if (s->s3->renegotiate) | 3932 | if (s->s3->renegotiate) |
| 3858 | ssl3_renegotiate_check(s); | 3933 | ssl3_renegotiate_check(s); |
| 3859 | 3934 | ||
| 3860 | /* This is an experimental flag that sends the | 3935 | /* |
| 3936 | * This is an experimental flag that sends the | ||
| 3861 | * last handshake message in the same packet as the first | 3937 | * last handshake message in the same packet as the first |
| 3862 | * use data - used to see if it helps the TCP protocol during | 3938 | * use data - used to see if it helps the TCP protocol during |
| 3863 | * session-id reuse */ | 3939 | * session-id reuse |
| 3940 | */ | ||
| 3864 | /* The second test is because the buffer may have been removed */ | 3941 | /* The second test is because the buffer may have been removed */ |
| 3865 | if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio)) { | 3942 | if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio)) { |
| 3866 | /* First time through, we write into the buffer */ | 3943 | /* First time through, we write into the buffer */ |
| 3867 | if (s->s3->delay_buf_pop_ret == 0) { | 3944 | if (s->s3->delay_buf_pop_ret == 0) { |
| 3868 | ret = ssl3_write_bytes(s, SSL3_RT_APPLICATION_DATA, | 3945 | ret = ssl3_write_bytes(s, SSL3_RT_APPLICATION_DATA, |
| 3869 | buf, len); | 3946 | buf, len); |
| 3870 | if (ret <= 0) | 3947 | if (ret <= 0) |
| 3871 | return (ret); | 3948 | return (ret); |
| 3872 | 3949 | ||
| @@ -3887,7 +3964,7 @@ ssl3_write(SSL *s, const void *buf, int len) | |||
| 3887 | s->s3->delay_buf_pop_ret = 0; | 3964 | s->s3->delay_buf_pop_ret = 0; |
| 3888 | } else { | 3965 | } else { |
| 3889 | ret = s->method->ssl_write_bytes(s, SSL3_RT_APPLICATION_DATA, | 3966 | ret = s->method->ssl_write_bytes(s, SSL3_RT_APPLICATION_DATA, |
| 3890 | buf, len); | 3967 | buf, len); |
| 3891 | if (ret <= 0) | 3968 | if (ret <= 0) |
| 3892 | return (ret); | 3969 | return (ret); |
| 3893 | } | 3970 | } |
| @@ -3898,21 +3975,25 @@ ssl3_write(SSL *s, const void *buf, int len) | |||
| 3898 | static int | 3975 | static int |
| 3899 | ssl3_read_internal(SSL *s, void *buf, int len, int peek) | 3976 | ssl3_read_internal(SSL *s, void *buf, int len, int peek) |
| 3900 | { | 3977 | { |
| 3901 | int ret; | 3978 | int ret; |
| 3902 | 3979 | ||
| 3903 | errno = 0; | 3980 | errno = 0; |
| 3904 | if (s->s3->renegotiate) | 3981 | if (s->s3->renegotiate) |
| 3905 | ssl3_renegotiate_check(s); | 3982 | ssl3_renegotiate_check(s); |
| 3906 | s->s3->in_read_app_data = 1; | 3983 | s->s3->in_read_app_data = 1; |
| 3907 | ret = s->method->ssl_read_bytes(s, SSL3_RT_APPLICATION_DATA, buf, len, peek); | 3984 | ret = s->method->ssl_read_bytes(s, |
| 3985 | SSL3_RT_APPLICATION_DATA, buf, len, peek); | ||
| 3908 | if ((ret == -1) && (s->s3->in_read_app_data == 2)) { | 3986 | if ((ret == -1) && (s->s3->in_read_app_data == 2)) { |
| 3909 | /* ssl3_read_bytes decided to call s->handshake_func, which | 3987 | /* |
| 3988 | * ssl3_read_bytes decided to call s->handshake_func, which | ||
| 3910 | * called ssl3_read_bytes to read handshake data. | 3989 | * called ssl3_read_bytes to read handshake data. |
| 3911 | * However, ssl3_read_bytes actually found application data | 3990 | * However, ssl3_read_bytes actually found application data |
| 3912 | * and thinks that application data makes sense here; so disable | 3991 | * and thinks that application data makes sense here; so disable |
| 3913 | * handshake processing and try to read application data again. */ | 3992 | * handshake processing and try to read application data again. |
| 3993 | */ | ||
| 3914 | s->in_handshake++; | 3994 | s->in_handshake++; |
| 3915 | ret = s->method->ssl_read_bytes(s, SSL3_RT_APPLICATION_DATA, buf, len, peek); | 3995 | ret = s->method->ssl_read_bytes(s, |
| 3996 | SSL3_RT_APPLICATION_DATA, buf, len, peek); | ||
| 3916 | s->in_handshake--; | 3997 | s->in_handshake--; |
| 3917 | } else | 3998 | } else |
| 3918 | s->s3->in_read_app_data = 0; | 3999 | s->s3->in_read_app_data = 0; |
| @@ -3948,7 +4029,7 @@ ssl3_renegotiate(SSL *s) | |||
| 3948 | int | 4029 | int |
| 3949 | ssl3_renegotiate_check(SSL *s) | 4030 | ssl3_renegotiate_check(SSL *s) |
| 3950 | { | 4031 | { |
| 3951 | int ret = 0; | 4032 | int ret = 0; |
| 3952 | 4033 | ||
| 3953 | if (s->s3->renegotiate) { | 4034 | if (s->s3->renegotiate) { |
| 3954 | if ((s->s3->rbuf.left == 0) && (s->s3->wbuf.left == 0) && | 4035 | if ((s->s3->rbuf.left == 0) && (s->s3->wbuf.left == 0) && |
| @@ -3968,13 +4049,14 @@ ssl3_renegotiate_check(SSL *s) | |||
| 3968 | } | 4049 | } |
| 3969 | return (ret); | 4050 | return (ret); |
| 3970 | } | 4051 | } |
| 3971 | /* If we are using TLS v1.2 or later and default SHA1+MD5 algorithms switch | 4052 | /* |
| 4053 | * If we are using TLS v1.2 or later and default SHA1+MD5 algorithms switch | ||
| 3972 | * to new SHA256 PRF and handshake macs | 4054 | * to new SHA256 PRF and handshake macs |
| 3973 | */ | 4055 | */ |
| 3974 | long | 4056 | long |
| 3975 | ssl_get_algorithm2(SSL *s) | 4057 | ssl_get_algorithm2(SSL *s) |
| 3976 | { | 4058 | { |
| 3977 | long alg2 = s->s3->tmp.new_cipher->algorithm2; | 4059 | long alg2 = s->s3->tmp.new_cipher->algorithm2; |
| 3978 | 4060 | ||
| 3979 | if (s->method->version == TLS1_2_VERSION && | 4061 | if (s->method->version == TLS1_2_VERSION && |
| 3980 | alg2 == (SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF)) | 4062 | alg2 == (SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF)) |
diff --git a/src/lib/libssl/src/ssl/ssl_lib.c b/src/lib/libssl/src/ssl/ssl_lib.c index cde564cade..830f574183 100644 --- a/src/lib/libssl/src/ssl/ssl_lib.c +++ b/src/lib/libssl/src/ssl/ssl_lib.c | |||
| @@ -160,7 +160,10 @@ | |||
| 160 | const char *SSL_version_str = OPENSSL_VERSION_TEXT; | 160 | const char *SSL_version_str = OPENSSL_VERSION_TEXT; |
| 161 | 161 | ||
| 162 | SSL3_ENC_METHOD ssl3_undef_enc_method = { | 162 | SSL3_ENC_METHOD ssl3_undef_enc_method = { |
| 163 | /* evil casts, but these functions are only called if there's a library bug */ | 163 | /* |
| 164 | * Evil casts, but these functions are only called if there's a | ||
| 165 | * library bug. | ||
| 166 | */ | ||
| 164 | (int (*)(SSL *, int))ssl_undefined_function, | 167 | (int (*)(SSL *, int))ssl_undefined_function, |
| 165 | (int (*)(SSL *, unsigned char *, int))ssl_undefined_function, | 168 | (int (*)(SSL *, unsigned char *, int))ssl_undefined_function, |
| 166 | ssl_undefined_function, | 169 | ssl_undefined_function, |
| @@ -182,9 +185,9 @@ SSL3_ENC_METHOD ssl3_undef_enc_method = { | |||
| 182 | int | 185 | int |
| 183 | SSL_clear(SSL *s) | 186 | SSL_clear(SSL *s) |
| 184 | { | 187 | { |
| 185 | |||
| 186 | if (s->method == NULL) { | 188 | if (s->method == NULL) { |
| 187 | SSLerr(SSL_F_SSL_CLEAR, SSL_R_NO_METHOD_SPECIFIED); | 189 | SSLerr(SSL_F_SSL_CLEAR, |
| 190 | SSL_R_NO_METHOD_SPECIFIED); | ||
| 188 | return (0); | 191 | return (0); |
| 189 | } | 192 | } |
| 190 | 193 | ||
| @@ -198,7 +201,8 @@ SSL_clear(SSL *s) | |||
| 198 | s->shutdown = 0; | 201 | s->shutdown = 0; |
| 199 | 202 | ||
| 200 | if (s->renegotiate) { | 203 | if (s->renegotiate) { |
| 201 | SSLerr(SSL_F_SSL_CLEAR, ERR_R_INTERNAL_ERROR); | 204 | SSLerr(SSL_F_SSL_CLEAR, |
| 205 | ERR_R_INTERNAL_ERROR); | ||
| 202 | return 0; | 206 | return 0; |
| 203 | } | 207 | } |
| 204 | 208 | ||
| @@ -226,16 +230,19 @@ SSL_clear(SSL *s) | |||
| 226 | s->first_packet = 0; | 230 | s->first_packet = 0; |
| 227 | 231 | ||
| 228 | #if 1 | 232 | #if 1 |
| 229 | /* Check to see if we were changed into a different method, if | 233 | /* |
| 230 | * so, revert back if we are not doing session-id reuse. */ | 234 | * Check to see if we were changed into a different method, if |
| 231 | if (!s->in_handshake && (s->session == NULL) && (s->method != s->ctx->method)) { | 235 | * so, revert back if we are not doing session-id reuse. |
| 236 | */ | ||
| 237 | if (!s->in_handshake && (s->session == NULL) && | ||
| 238 | (s->method != s->ctx->method)) { | ||
| 232 | s->method->ssl_free(s); | 239 | s->method->ssl_free(s); |
| 233 | s->method = s->ctx->method; | 240 | s->method = s->ctx->method; |
| 234 | if (!s->method->ssl_new(s)) | 241 | if (!s->method->ssl_new(s)) |
| 235 | return (0); | 242 | return (0); |
| 236 | } else | 243 | } else |
| 237 | #endif | 244 | #endif |
| 238 | s->method->ssl_clear(s); | 245 | s->method->ssl_clear(s); |
| 239 | return (1); | 246 | return (1); |
| 240 | } | 247 | } |
| 241 | 248 | ||
| @@ -243,14 +250,15 @@ SSL_clear(SSL *s) | |||
| 243 | int | 250 | int |
| 244 | SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth) | 251 | SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth) |
| 245 | { | 252 | { |
| 246 | STACK_OF(SSL_CIPHER) *sk; | 253 | STACK_OF(SSL_CIPHER) *sk; |
| 247 | 254 | ||
| 248 | ctx->method = meth; | 255 | ctx->method = meth; |
| 249 | 256 | ||
| 250 | sk = ssl_create_cipher_list(ctx->method, &(ctx->cipher_list), | 257 | sk = ssl_create_cipher_list(ctx->method, &(ctx->cipher_list), |
| 251 | &(ctx->cipher_list_by_id), SSL_DEFAULT_CIPHER_LIST); | 258 | &(ctx->cipher_list_by_id), SSL_DEFAULT_CIPHER_LIST); |
| 252 | if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0)) { | 259 | if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0)) { |
| 253 | SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION, SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS); | 260 | SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION, |
| 261 | SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS); | ||
| 254 | return (0); | 262 | return (0); |
| 255 | } | 263 | } |
| 256 | return (1); | 264 | return (1); |
| @@ -259,14 +267,16 @@ SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth) | |||
| 259 | SSL * | 267 | SSL * |
| 260 | SSL_new(SSL_CTX *ctx) | 268 | SSL_new(SSL_CTX *ctx) |
| 261 | { | 269 | { |
| 262 | SSL *s; | 270 | SSL *s; |
| 263 | 271 | ||
| 264 | if (ctx == NULL) { | 272 | if (ctx == NULL) { |
| 265 | SSLerr(SSL_F_SSL_NEW, SSL_R_NULL_SSL_CTX); | 273 | SSLerr(SSL_F_SSL_NEW, |
| 274 | SSL_R_NULL_SSL_CTX); | ||
| 266 | return (NULL); | 275 | return (NULL); |
| 267 | } | 276 | } |
| 268 | if (ctx->method == NULL) { | 277 | if (ctx->method == NULL) { |
| 269 | SSLerr(SSL_F_SSL_NEW, SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION); | 278 | SSLerr(SSL_F_SSL_NEW, |
| 279 | SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION); | ||
| 270 | return (NULL); | 280 | return (NULL); |
| 271 | } | 281 | } |
| 272 | 282 | ||
| @@ -283,7 +293,8 @@ SSL_new(SSL_CTX *ctx) | |||
| 283 | s->max_cert_list = ctx->max_cert_list; | 293 | s->max_cert_list = ctx->max_cert_list; |
| 284 | 294 | ||
| 285 | if (ctx->cert != NULL) { | 295 | if (ctx->cert != NULL) { |
| 286 | /* Earlier library versions used to copy the pointer to | 296 | /* |
| 297 | * Earlier library versions used to copy the pointer to | ||
| 287 | * the CERT, not its contents; only when setting new | 298 | * the CERT, not its contents; only when setting new |
| 288 | * parameters for the per-SSL copy, ssl_cert_new would be | 299 | * parameters for the per-SSL copy, ssl_cert_new would be |
| 289 | * called (and the direct reference to the per-SSL_CTX | 300 | * called (and the direct reference to the per-SSL_CTX |
| @@ -291,8 +302,8 @@ SSL_new(SSL_CTX *ctx) | |||
| 291 | * accessed for various purposes, and for that reason they | 302 | * accessed for various purposes, and for that reason they |
| 292 | * used to be known as s->ctx->default_cert). | 303 | * used to be known as s->ctx->default_cert). |
| 293 | * Now we don't look at the SSL_CTX's CERT after having | 304 | * Now we don't look at the SSL_CTX's CERT after having |
| 294 | * duplicated it once. */ | 305 | * duplicated it once. |
| 295 | 306 | */ | |
| 296 | s->cert = ssl_cert_dup(ctx->cert); | 307 | s->cert = ssl_cert_dup(ctx->cert); |
| 297 | if (s->cert == NULL) | 308 | if (s->cert == NULL) |
| 298 | goto err; | 309 | goto err; |
| @@ -362,7 +373,7 @@ SSL_new(SSL_CTX *ctx) | |||
| 362 | #endif | 373 | #endif |
| 363 | 374 | ||
| 364 | return (s); | 375 | return (s); |
| 365 | err: | 376 | err: |
| 366 | if (s != NULL) { | 377 | if (s != NULL) { |
| 367 | if (s->cert != NULL) | 378 | if (s->cert != NULL) |
| 368 | ssl_cert_free(s->cert); | 379 | ssl_cert_free(s->cert); |
| @@ -370,7 +381,8 @@ err: | |||
| 370 | SSL_CTX_free(s->ctx); /* decrement reference count */ | 381 | SSL_CTX_free(s->ctx); /* decrement reference count */ |
| 371 | free(s); | 382 | free(s); |
| 372 | } | 383 | } |
| 373 | SSLerr(SSL_F_SSL_NEW, ERR_R_MALLOC_FAILURE); | 384 | SSLerr(SSL_F_SSL_NEW, |
| 385 | ERR_R_MALLOC_FAILURE); | ||
| 374 | return (NULL); | 386 | return (NULL); |
| 375 | } | 387 | } |
| 376 | 388 | ||
| @@ -379,7 +391,8 @@ SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, | |||
| 379 | unsigned int sid_ctx_len) | 391 | unsigned int sid_ctx_len) |
| 380 | { | 392 | { |
| 381 | if (sid_ctx_len > sizeof ctx->sid_ctx) { | 393 | if (sid_ctx_len > sizeof ctx->sid_ctx) { |
| 382 | SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT, SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); | 394 | SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT, |
| 395 | SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); | ||
| 383 | return 0; | 396 | return 0; |
| 384 | } | 397 | } |
| 385 | ctx->sid_ctx_length = sid_ctx_len; | 398 | ctx->sid_ctx_length = sid_ctx_len; |
| @@ -393,7 +406,8 @@ SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, | |||
| 393 | unsigned int sid_ctx_len) | 406 | unsigned int sid_ctx_len) |
| 394 | { | 407 | { |
| 395 | if (sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) { | 408 | if (sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) { |
| 396 | SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT, SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); | 409 | SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT, |
| 410 | SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); | ||
| 397 | return 0; | 411 | return 0; |
| 398 | } | 412 | } |
| 399 | ssl->sid_ctx_length = sid_ctx_len; | 413 | ssl->sid_ctx_length = sid_ctx_len; |
| @@ -485,7 +499,7 @@ SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm) | |||
| 485 | void | 499 | void |
| 486 | SSL_free(SSL *s) | 500 | SSL_free(SSL *s) |
| 487 | { | 501 | { |
| 488 | int i; | 502 | int i; |
| 489 | 503 | ||
| 490 | if (s == NULL) | 504 | if (s == NULL) |
| 491 | return; | 505 | return; |
| @@ -550,7 +564,7 @@ SSL_free(SSL *s) | |||
| 550 | free(s->tlsext_opaque_prf_input); | 564 | free(s->tlsext_opaque_prf_input); |
| 551 | if (s->tlsext_ocsp_exts) | 565 | if (s->tlsext_ocsp_exts) |
| 552 | sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts, | 566 | sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts, |
| 553 | X509_EXTENSION_free); | 567 | X509_EXTENSION_free); |
| 554 | if (s->tlsext_ocsp_ids) | 568 | if (s->tlsext_ocsp_ids) |
| 555 | sk_OCSP_RESPID_pop_free(s->tlsext_ocsp_ids, OCSP_RESPID_free); | 569 | sk_OCSP_RESPID_pop_free(s->tlsext_ocsp_ids, OCSP_RESPID_free); |
| 556 | if (s->tlsext_ocsp_resp) | 570 | if (s->tlsext_ocsp_resp) |
| @@ -587,8 +601,7 @@ SSL_free(SSL *s) | |||
| 587 | void | 601 | void |
| 588 | SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio) | 602 | SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio) |
| 589 | { | 603 | { |
| 590 | /* If the output buffering BIO is still in place, remove it | 604 | /* If the output buffering BIO is still in place, remove it */ |
| 591 | */ | ||
| 592 | if (s->bbio != NULL) { | 605 | if (s->bbio != NULL) { |
| 593 | if (s->wbio == s->bbio) { | 606 | if (s->wbio == s->bbio) { |
| 594 | s->wbio = s->wbio->next_bio; | 607 | s->wbio = s->wbio->next_bio; |
| @@ -624,8 +637,8 @@ SSL_get_fd(const SSL *s) | |||
| 624 | int | 637 | int |
| 625 | SSL_get_rfd(const SSL *s) | 638 | SSL_get_rfd(const SSL *s) |
| 626 | { | 639 | { |
| 627 | int ret = -1; | 640 | int ret = -1; |
| 628 | BIO *b, *r; | 641 | BIO *b, *r; |
| 629 | 642 | ||
| 630 | b = SSL_get_rbio(s); | 643 | b = SSL_get_rbio(s); |
| 631 | r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); | 644 | r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); |
| @@ -637,8 +650,8 @@ SSL_get_rfd(const SSL *s) | |||
| 637 | int | 650 | int |
| 638 | SSL_get_wfd(const SSL *s) | 651 | SSL_get_wfd(const SSL *s) |
| 639 | { | 652 | { |
| 640 | int ret = -1; | 653 | int ret = -1; |
| 641 | BIO *b, *r; | 654 | BIO *b, *r; |
| 642 | 655 | ||
| 643 | b = SSL_get_wbio(s); | 656 | b = SSL_get_wbio(s); |
| 644 | r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); | 657 | r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); |
| @@ -651,34 +664,36 @@ SSL_get_wfd(const SSL *s) | |||
| 651 | int | 664 | int |
| 652 | SSL_set_fd(SSL *s, int fd) | 665 | SSL_set_fd(SSL *s, int fd) |
| 653 | { | 666 | { |
| 654 | int ret = 0; | 667 | int ret = 0; |
| 655 | BIO *bio = NULL; | 668 | BIO *bio = NULL; |
| 656 | 669 | ||
| 657 | bio = BIO_new(BIO_s_socket()); | 670 | bio = BIO_new(BIO_s_socket()); |
| 658 | 671 | ||
| 659 | if (bio == NULL) { | 672 | if (bio == NULL) { |
| 660 | SSLerr(SSL_F_SSL_SET_FD, ERR_R_BUF_LIB); | 673 | SSLerr(SSL_F_SSL_SET_FD, |
| 674 | ERR_R_BUF_LIB); | ||
| 661 | goto err; | 675 | goto err; |
| 662 | } | 676 | } |
| 663 | BIO_set_fd(bio, fd, BIO_NOCLOSE); | 677 | BIO_set_fd(bio, fd, BIO_NOCLOSE); |
| 664 | SSL_set_bio(s, bio, bio); | 678 | SSL_set_bio(s, bio, bio); |
| 665 | ret = 1; | 679 | ret = 1; |
| 666 | err: | 680 | err: |
| 667 | return (ret); | 681 | return (ret); |
| 668 | } | 682 | } |
| 669 | 683 | ||
| 670 | int | 684 | int |
| 671 | SSL_set_wfd(SSL *s, int fd) | 685 | SSL_set_wfd(SSL *s, int fd) |
| 672 | { | 686 | { |
| 673 | int ret = 0; | 687 | int ret = 0; |
| 674 | BIO *bio = NULL; | 688 | BIO *bio = NULL; |
| 675 | 689 | ||
| 676 | if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET) | 690 | if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET) |
| 677 | || ((int)BIO_get_fd(s->rbio, NULL) != fd)) { | 691 | || ((int)BIO_get_fd(s->rbio, NULL) != fd)) { |
| 678 | bio = BIO_new(BIO_s_socket()); | 692 | bio = BIO_new(BIO_s_socket()); |
| 679 | 693 | ||
| 680 | if (bio == NULL) | 694 | if (bio == NULL) { |
| 681 | { SSLerr(SSL_F_SSL_SET_WFD, ERR_R_BUF_LIB); | 695 | SSLerr(SSL_F_SSL_SET_WFD, |
| 696 | ERR_R_BUF_LIB); | ||
| 682 | goto err; | 697 | goto err; |
| 683 | } | 698 | } |
| 684 | BIO_set_fd(bio, fd, BIO_NOCLOSE); | 699 | BIO_set_fd(bio, fd, BIO_NOCLOSE); |
| @@ -686,22 +701,23 @@ SSL_set_wfd(SSL *s, int fd) | |||
| 686 | } else | 701 | } else |
| 687 | SSL_set_bio(s, SSL_get_rbio(s), SSL_get_rbio(s)); | 702 | SSL_set_bio(s, SSL_get_rbio(s), SSL_get_rbio(s)); |
| 688 | ret = 1; | 703 | ret = 1; |
| 689 | err: | 704 | err: |
| 690 | return (ret); | 705 | return (ret); |
| 691 | } | 706 | } |
| 692 | 707 | ||
| 693 | int | 708 | int |
| 694 | SSL_set_rfd(SSL *s, int fd) | 709 | SSL_set_rfd(SSL *s, int fd) |
| 695 | { | 710 | { |
| 696 | int ret = 0; | 711 | int ret = 0; |
| 697 | BIO *bio = NULL; | 712 | BIO *bio = NULL; |
| 698 | 713 | ||
| 699 | if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET) | 714 | if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET) |
| 700 | || ((int)BIO_get_fd(s->wbio, NULL) != fd)) { | 715 | || ((int)BIO_get_fd(s->wbio, NULL) != fd)) { |
| 701 | bio = BIO_new(BIO_s_socket()); | 716 | bio = BIO_new(BIO_s_socket()); |
| 702 | 717 | ||
| 703 | if (bio == NULL) { | 718 | if (bio == NULL) { |
| 704 | SSLerr(SSL_F_SSL_SET_RFD, ERR_R_BUF_LIB); | 719 | SSLerr(SSL_F_SSL_SET_RFD, |
| 720 | ERR_R_BUF_LIB); | ||
| 705 | goto err; | 721 | goto err; |
| 706 | } | 722 | } |
| 707 | BIO_set_fd(bio, fd, BIO_NOCLOSE); | 723 | BIO_set_fd(bio, fd, BIO_NOCLOSE); |
| @@ -709,7 +725,7 @@ SSL_set_rfd(SSL *s, int fd) | |||
| 709 | } else | 725 | } else |
| 710 | SSL_set_bio(s, SSL_get_wbio(s), SSL_get_wbio(s)); | 726 | SSL_set_bio(s, SSL_get_wbio(s), SSL_get_wbio(s)); |
| 711 | ret = 1; | 727 | ret = 1; |
| 712 | err: | 728 | err: |
| 713 | return (ret); | 729 | return (ret); |
| 714 | } | 730 | } |
| 715 | #endif | 731 | #endif |
| @@ -719,7 +735,7 @@ err: | |||
| 719 | size_t | 735 | size_t |
| 720 | SSL_get_finished(const SSL *s, void *buf, size_t count) | 736 | SSL_get_finished(const SSL *s, void *buf, size_t count) |
| 721 | { | 737 | { |
| 722 | size_t ret = 0; | 738 | size_t ret = 0; |
| 723 | 739 | ||
| 724 | if (s->s3 != NULL) { | 740 | if (s->s3 != NULL) { |
| 725 | ret = s->s3->tmp.finish_md_len; | 741 | ret = s->s3->tmp.finish_md_len; |
| @@ -734,7 +750,7 @@ SSL_get_finished(const SSL *s, void *buf, size_t count) | |||
| 734 | size_t | 750 | size_t |
| 735 | SSL_get_peer_finished(const SSL *s, void *buf, size_t count) | 751 | SSL_get_peer_finished(const SSL *s, void *buf, size_t count) |
| 736 | { | 752 | { |
| 737 | size_t ret = 0; | 753 | size_t ret = 0; |
| 738 | 754 | ||
| 739 | if (s->s3 != NULL) { | 755 | if (s->s3 != NULL) { |
| 740 | ret = s->s3->tmp.peer_finish_md_len; | 756 | ret = s->s3->tmp.peer_finish_md_len; |
| @@ -810,7 +826,8 @@ SSL_get_read_ahead(const SSL *s) | |||
| 810 | int | 826 | int |
| 811 | SSL_pending(const SSL *s) | 827 | SSL_pending(const SSL *s) |
| 812 | { | 828 | { |
| 813 | /* SSL_pending cannot work properly if read-ahead is enabled | 829 | /* |
| 830 | * SSL_pending cannot work properly if read-ahead is enabled | ||
| 814 | * (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)), | 831 | * (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)), |
| 815 | * and it is impossible to fix since SSL_pending cannot report | 832 | * and it is impossible to fix since SSL_pending cannot report |
| 816 | * errors that may be observed while scanning the new data. | 833 | * errors that may be observed while scanning the new data. |
| @@ -823,7 +840,7 @@ SSL_pending(const SSL *s) | |||
| 823 | X509 * | 840 | X509 * |
| 824 | SSL_get_peer_certificate(const SSL *s) | 841 | SSL_get_peer_certificate(const SSL *s) |
| 825 | { | 842 | { |
| 826 | X509 *r; | 843 | X509 *r; |
| 827 | 844 | ||
| 828 | if ((s == NULL) || (s->session == NULL)) | 845 | if ((s == NULL) || (s->session == NULL)) |
| 829 | r = NULL; | 846 | r = NULL; |
| @@ -841,32 +858,38 @@ SSL_get_peer_certificate(const SSL *s) | |||
| 841 | STACK_OF(X509) * | 858 | STACK_OF(X509) * |
| 842 | SSL_get_peer_cert_chain(const SSL *s) | 859 | SSL_get_peer_cert_chain(const SSL *s) |
| 843 | { | 860 | { |
| 844 | STACK_OF(X509) *r; | 861 | STACK_OF(X509) *r; |
| 845 | 862 | ||
| 846 | if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL)) | 863 | if ((s == NULL) || (s->session == NULL) || |
| 864 | (s->session->sess_cert == NULL)) | ||
| 847 | r = NULL; | 865 | r = NULL; |
| 848 | else | 866 | else |
| 849 | r = s->session->sess_cert->cert_chain; | 867 | r = s->session->sess_cert->cert_chain; |
| 850 | 868 | ||
| 851 | /* If we are a client, cert_chain includes the peer's own | 869 | /* |
| 870 | * If we are a client, cert_chain includes the peer's own | ||
| 852 | * certificate; | 871 | * certificate; |
| 853 | if we are a server, it does not. */ | 872 | * if we are a server, it does not. |
| 854 | 873 | */ | |
| 855 | return (r); | 874 | return (r); |
| 856 | } | 875 | } |
| 857 | 876 | ||
| 858 | /* Now in theory, since the calling process own 't' it should be safe to | 877 | /* |
| 859 | * modify. We need to be able to read f without being hassled */ | 878 | * Now in theory, since the calling process own 't' it should be safe to |
| 879 | * modify. We need to be able to read f without being hassled | ||
| 880 | */ | ||
| 860 | void | 881 | void |
| 861 | SSL_copy_session_id(SSL *t, const SSL *f) | 882 | SSL_copy_session_id(SSL *t, const SSL *f) |
| 862 | { | 883 | { |
| 863 | CERT *tmp; | 884 | CERT *tmp; |
| 864 | 885 | ||
| 865 | /* Do we need to to SSL locking? */ | 886 | /* Do we need to to SSL locking? */ |
| 866 | SSL_set_session(t, SSL_get_session(f)); | 887 | SSL_set_session(t, SSL_get_session(f)); |
| 867 | 888 | ||
| 868 | /* what if we are setup as SSLv2 but want to talk SSLv3 or | 889 | /* |
| 869 | * vice-versa */ | 890 | * What if we are setup as SSLv2 but want to talk SSLv3 or |
| 891 | * vice-versa. | ||
| 892 | */ | ||
| 870 | if (t->method != f->method) { | 893 | if (t->method != f->method) { |
| 871 | t->method->ssl_free(t); /* cleanup current */ | 894 | t->method->ssl_free(t); /* cleanup current */ |
| 872 | t->method=f->method; /* change method */ | 895 | t->method=f->method; /* change method */ |
| @@ -888,17 +911,19 @@ SSL_copy_session_id(SSL *t, const SSL *f) | |||
| 888 | int | 911 | int |
| 889 | SSL_CTX_check_private_key(const SSL_CTX *ctx) | 912 | SSL_CTX_check_private_key(const SSL_CTX *ctx) |
| 890 | { | 913 | { |
| 891 | if ((ctx == NULL) || | 914 | if ((ctx == NULL) || (ctx->cert == NULL) || |
| 892 | (ctx->cert == NULL) || | 915 | (ctx->cert->key->x509 == NULL)) { |
| 893 | (ctx->cert->key->x509 == NULL)) { | 916 | SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY, |
| 894 | SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY, SSL_R_NO_CERTIFICATE_ASSIGNED); | 917 | SSL_R_NO_CERTIFICATE_ASSIGNED); |
| 895 | return (0); | 918 | return (0); |
| 896 | } | 919 | } |
| 897 | if (ctx->cert->key->privatekey == NULL) { | 920 | if (ctx->cert->key->privatekey == NULL) { |
| 898 | SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY, SSL_R_NO_PRIVATE_KEY_ASSIGNED); | 921 | SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY, |
| 922 | SSL_R_NO_PRIVATE_KEY_ASSIGNED); | ||
| 899 | return (0); | 923 | return (0); |
| 900 | } | 924 | } |
| 901 | return (X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey)); | 925 | return (X509_check_private_key(ctx->cert->key->x509, |
| 926 | ctx->cert->key->privatekey)); | ||
| 902 | } | 927 | } |
| 903 | 928 | ||
| 904 | /* Fix this function so that it takes an optional type parameter */ | 929 | /* Fix this function so that it takes an optional type parameter */ |
| @@ -906,31 +931,34 @@ int | |||
| 906 | SSL_check_private_key(const SSL *ssl) | 931 | SSL_check_private_key(const SSL *ssl) |
| 907 | { | 932 | { |
| 908 | if (ssl == NULL) { | 933 | if (ssl == NULL) { |
| 909 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, ERR_R_PASSED_NULL_PARAMETER); | 934 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, |
| 935 | ERR_R_PASSED_NULL_PARAMETER); | ||
| 910 | return (0); | 936 | return (0); |
| 911 | } | 937 | } |
| 912 | if (ssl->cert == NULL) { | 938 | if (ssl->cert == NULL) { |
| 913 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, SSL_R_NO_CERTIFICATE_ASSIGNED); | 939 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, |
| 940 | SSL_R_NO_CERTIFICATE_ASSIGNED); | ||
| 914 | return 0; | 941 | return 0; |
| 915 | } | 942 | } |
| 916 | if (ssl->cert->key->x509 == NULL) { | 943 | if (ssl->cert->key->x509 == NULL) { |
| 917 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, SSL_R_NO_CERTIFICATE_ASSIGNED); | 944 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, |
| 945 | SSL_R_NO_CERTIFICATE_ASSIGNED); | ||
| 918 | return (0); | 946 | return (0); |
| 919 | } | 947 | } |
| 920 | if (ssl->cert->key->privatekey == NULL) { | 948 | if (ssl->cert->key->privatekey == NULL) { |
| 921 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, SSL_R_NO_PRIVATE_KEY_ASSIGNED); | 949 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, |
| 950 | SSL_R_NO_PRIVATE_KEY_ASSIGNED); | ||
| 922 | return (0); | 951 | return (0); |
| 923 | } | 952 | } |
| 924 | return(X509_check_private_key(ssl->cert->key->x509, | 953 | return (X509_check_private_key(ssl->cert->key->x509, |
| 925 | ssl->cert->key->privatekey)); | 954 | ssl->cert->key->privatekey)); |
| 926 | } | 955 | } |
| 927 | 956 | ||
| 928 | int | 957 | int |
| 929 | SSL_accept(SSL *s) | 958 | SSL_accept(SSL *s) |
| 930 | { | 959 | { |
| 931 | if (s->handshake_func == 0) | 960 | if (s->handshake_func == 0) |
| 932 | /* Not properly initialized yet */ | 961 | SSL_set_accept_state(s); /* Not properly initialized yet */ |
| 933 | SSL_set_accept_state(s); | ||
| 934 | 962 | ||
| 935 | return (s->method->ssl_accept(s)); | 963 | return (s->method->ssl_accept(s)); |
| 936 | } | 964 | } |
| @@ -939,8 +967,7 @@ int | |||
| 939 | SSL_connect(SSL *s) | 967 | SSL_connect(SSL *s) |
| 940 | { | 968 | { |
| 941 | if (s->handshake_func == 0) | 969 | if (s->handshake_func == 0) |
| 942 | /* Not properly initialized yet */ | 970 | SSL_set_connect_state(s); /* Not properly initialized yet */ |
| 943 | SSL_set_connect_state(s); | ||
| 944 | 971 | ||
| 945 | return (s->method->ssl_connect(s)); | 972 | return (s->method->ssl_connect(s)); |
| 946 | } | 973 | } |
| @@ -955,7 +982,8 @@ int | |||
| 955 | SSL_read(SSL *s, void *buf, int num) | 982 | SSL_read(SSL *s, void *buf, int num) |
| 956 | { | 983 | { |
| 957 | if (s->handshake_func == 0) { | 984 | if (s->handshake_func == 0) { |
| 958 | SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED); | 985 | SSLerr(SSL_F_SSL_READ, |
| 986 | SSL_R_UNINITIALIZED); | ||
| 959 | return -1; | 987 | return -1; |
| 960 | } | 988 | } |
| 961 | 989 | ||
| @@ -970,7 +998,8 @@ int | |||
| 970 | SSL_peek(SSL *s, void *buf, int num) | 998 | SSL_peek(SSL *s, void *buf, int num) |
| 971 | { | 999 | { |
| 972 | if (s->handshake_func == 0) { | 1000 | if (s->handshake_func == 0) { |
| 973 | SSLerr(SSL_F_SSL_PEEK, SSL_R_UNINITIALIZED); | 1001 | SSLerr(SSL_F_SSL_PEEK, |
| 1002 | SSL_R_UNINITIALIZED); | ||
| 974 | return -1; | 1003 | return -1; |
| 975 | } | 1004 | } |
| 976 | 1005 | ||
| @@ -984,13 +1013,15 @@ int | |||
| 984 | SSL_write(SSL *s, const void *buf, int num) | 1013 | SSL_write(SSL *s, const void *buf, int num) |
| 985 | { | 1014 | { |
| 986 | if (s->handshake_func == 0) { | 1015 | if (s->handshake_func == 0) { |
| 987 | SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED); | 1016 | SSLerr(SSL_F_SSL_WRITE, |
| 1017 | SSL_R_UNINITIALIZED); | ||
| 988 | return -1; | 1018 | return -1; |
| 989 | } | 1019 | } |
| 990 | 1020 | ||
| 991 | if (s->shutdown & SSL_SENT_SHUTDOWN) { | 1021 | if (s->shutdown & SSL_SENT_SHUTDOWN) { |
| 992 | s->rwstate = SSL_NOTHING; | 1022 | s->rwstate = SSL_NOTHING; |
| 993 | SSLerr(SSL_F_SSL_WRITE, SSL_R_PROTOCOL_IS_SHUTDOWN); | 1023 | SSLerr(SSL_F_SSL_WRITE, |
| 1024 | SSL_R_PROTOCOL_IS_SHUTDOWN); | ||
| 994 | return (-1); | 1025 | return (-1); |
| 995 | } | 1026 | } |
| 996 | return (s->method->ssl_write(s, buf, num)); | 1027 | return (s->method->ssl_write(s, buf, num)); |
| @@ -999,14 +1030,16 @@ SSL_write(SSL *s, const void *buf, int num) | |||
| 999 | int | 1030 | int |
| 1000 | SSL_shutdown(SSL *s) | 1031 | SSL_shutdown(SSL *s) |
| 1001 | { | 1032 | { |
| 1002 | /* Note that this function behaves differently from what one might | 1033 | /* |
| 1034 | * Note that this function behaves differently from what one might | ||
| 1003 | * expect. Return values are 0 for no success (yet), | 1035 | * expect. Return values are 0 for no success (yet), |
| 1004 | * 1 for success; but calling it once is usually not enough, | 1036 | * 1 for success; but calling it once is usually not enough, |
| 1005 | * even if blocking I/O is used (see ssl3_shutdown). | 1037 | * even if blocking I/O is used (see ssl3_shutdown). |
| 1006 | */ | 1038 | */ |
| 1007 | 1039 | ||
| 1008 | if (s->handshake_func == 0) { | 1040 | if (s->handshake_func == 0) { |
| 1009 | SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED); | 1041 | SSLerr(SSL_F_SSL_SHUTDOWN, |
| 1042 | SSL_R_UNINITIALIZED); | ||
| 1010 | return -1; | 1043 | return -1; |
| 1011 | } | 1044 | } |
| 1012 | 1045 | ||
| @@ -1041,15 +1074,17 @@ SSL_renegotiate_abbreviated(SSL *s) | |||
| 1041 | int | 1074 | int |
| 1042 | SSL_renegotiate_pending(SSL *s) | 1075 | SSL_renegotiate_pending(SSL *s) |
| 1043 | { | 1076 | { |
| 1044 | /* becomes true when negotiation is requested; | 1077 | /* |
| 1045 | * false again once a handshake has finished */ | 1078 | * Becomes true when negotiation is requested; |
| 1079 | * false again once a handshake has finished. | ||
| 1080 | */ | ||
| 1046 | return (s->renegotiate != 0); | 1081 | return (s->renegotiate != 0); |
| 1047 | } | 1082 | } |
| 1048 | 1083 | ||
| 1049 | long | 1084 | long |
| 1050 | SSL_ctrl(SSL *s, int cmd, long larg, void *parg) | 1085 | SSL_ctrl(SSL *s, int cmd, long larg, void *parg) |
| 1051 | { | 1086 | { |
| 1052 | long l; | 1087 | long l; |
| 1053 | 1088 | ||
| 1054 | switch (cmd) { | 1089 | switch (cmd) { |
| 1055 | case SSL_CTRL_GET_READ_AHEAD: | 1090 | case SSL_CTRL_GET_READ_AHEAD: |
| @@ -1084,7 +1119,7 @@ SSL_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 1084 | #endif | 1119 | #endif |
| 1085 | 1120 | ||
| 1086 | if (SSL_version(s) == DTLS1_VERSION || | 1121 | if (SSL_version(s) == DTLS1_VERSION || |
| 1087 | SSL_version(s) == DTLS1_BAD_VER) { | 1122 | SSL_version(s) == DTLS1_BAD_VER) { |
| 1088 | s->d1->mtu = larg; | 1123 | s->d1->mtu = larg; |
| 1089 | return larg; | 1124 | return larg; |
| 1090 | } | 1125 | } |
| @@ -1108,7 +1143,9 @@ SSL_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | |||
| 1108 | { | 1143 | { |
| 1109 | switch (cmd) { | 1144 | switch (cmd) { |
| 1110 | case SSL_CTRL_SET_MSG_CALLBACK: | 1145 | case SSL_CTRL_SET_MSG_CALLBACK: |
| 1111 | s->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp); | 1146 | s->msg_callback = (void (*)(int write_p, int version, |
| 1147 | int content_type, const void *buf, size_t len, | ||
| 1148 | SSL *ssl, void *arg))(fp); | ||
| 1112 | return 1; | 1149 | return 1; |
| 1113 | 1150 | ||
| 1114 | default: | 1151 | default: |
| @@ -1125,7 +1162,7 @@ SSL_CTX_sessions(SSL_CTX *ctx) | |||
| 1125 | long | 1162 | long |
| 1126 | SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | 1163 | SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) |
| 1127 | { | 1164 | { |
| 1128 | long l; | 1165 | long l; |
| 1129 | 1166 | ||
| 1130 | switch (cmd) { | 1167 | switch (cmd) { |
| 1131 | case SSL_CTRL_GET_READ_AHEAD: | 1168 | case SSL_CTRL_GET_READ_AHEAD: |
| @@ -1206,7 +1243,9 @@ SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | |||
| 1206 | { | 1243 | { |
| 1207 | switch (cmd) { | 1244 | switch (cmd) { |
| 1208 | case SSL_CTRL_SET_MSG_CALLBACK: | 1245 | case SSL_CTRL_SET_MSG_CALLBACK: |
| 1209 | ctx->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp); | 1246 | ctx->msg_callback = (void (*)(int write_p, int version, |
| 1247 | int content_type, const void *buf, size_t len, SSL *ssl, | ||
| 1248 | void *arg))(fp); | ||
| 1210 | return 1; | 1249 | return 1; |
| 1211 | 1250 | ||
| 1212 | default: | 1251 | default: |
| @@ -1217,7 +1256,7 @@ SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | |||
| 1217 | int | 1256 | int |
| 1218 | ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b) | 1257 | ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b) |
| 1219 | { | 1258 | { |
| 1220 | long l; | 1259 | long l; |
| 1221 | 1260 | ||
| 1222 | l = a->id - b->id; | 1261 | l = a->id - b->id; |
| 1223 | if (l == 0L) | 1262 | if (l == 0L) |
| @@ -1230,7 +1269,7 @@ int | |||
| 1230 | ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap, | 1269 | ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap, |
| 1231 | const SSL_CIPHER * const *bp) | 1270 | const SSL_CIPHER * const *bp) |
| 1232 | { | 1271 | { |
| 1233 | long l; | 1272 | long l; |
| 1234 | 1273 | ||
| 1235 | l = (*ap)->id - (*bp)->id; | 1274 | l = (*ap)->id - (*bp)->id; |
| 1236 | if (l == 0L) | 1275 | if (l == 0L) |
| @@ -1239,24 +1278,27 @@ ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap, | |||
| 1239 | return ((l > 0) ? 1:-1); | 1278 | return ((l > 0) ? 1:-1); |
| 1240 | } | 1279 | } |
| 1241 | 1280 | ||
| 1242 | /** return a STACK of the ciphers available for the SSL and in order of | 1281 | /* |
| 1243 | * preference */ | 1282 | * Return a STACK of the ciphers available for the SSL and in order of |
| 1283 | * preference. | ||
| 1284 | */ | ||
| 1244 | STACK_OF(SSL_CIPHER) * | 1285 | STACK_OF(SSL_CIPHER) * |
| 1245 | SSL_get_ciphers(const SSL *s) | 1286 | SSL_get_ciphers(const SSL *s) |
| 1246 | { | 1287 | { |
| 1247 | if (s != NULL) { | 1288 | if (s != NULL) { |
| 1248 | if (s->cipher_list != NULL) { | 1289 | if (s->cipher_list != NULL) { |
| 1249 | return (s->cipher_list); | 1290 | return (s->cipher_list); |
| 1250 | } else if ((s->ctx != NULL) && | 1291 | } else if ((s->ctx != NULL) && (s->ctx->cipher_list != NULL)) { |
| 1251 | (s->ctx->cipher_list != NULL)) { | ||
| 1252 | return (s->ctx->cipher_list); | 1292 | return (s->ctx->cipher_list); |
| 1253 | } | 1293 | } |
| 1254 | } | 1294 | } |
| 1255 | return (NULL); | 1295 | return (NULL); |
| 1256 | } | 1296 | } |
| 1257 | 1297 | ||
| 1258 | /** return a STACK of the ciphers available for the SSL and in order of | 1298 | /* |
| 1259 | * algorithm id */ | 1299 | * Return a STACK of the ciphers available for the SSL and in order of |
| 1300 | * algorithm id. | ||
| 1301 | */ | ||
| 1260 | STACK_OF(SSL_CIPHER) * | 1302 | STACK_OF(SSL_CIPHER) * |
| 1261 | ssl_get_ciphers_by_id(SSL *s) | 1303 | ssl_get_ciphers_by_id(SSL *s) |
| 1262 | { | 1304 | { |
| @@ -1264,19 +1306,19 @@ ssl_get_ciphers_by_id(SSL *s) | |||
| 1264 | if (s->cipher_list_by_id != NULL) { | 1306 | if (s->cipher_list_by_id != NULL) { |
| 1265 | return (s->cipher_list_by_id); | 1307 | return (s->cipher_list_by_id); |
| 1266 | } else if ((s->ctx != NULL) && | 1308 | } else if ((s->ctx != NULL) && |
| 1267 | (s->ctx->cipher_list_by_id != NULL)) { | 1309 | (s->ctx->cipher_list_by_id != NULL)) { |
| 1268 | return (s->ctx->cipher_list_by_id); | 1310 | return (s->ctx->cipher_list_by_id); |
| 1269 | } | 1311 | } |
| 1270 | } | 1312 | } |
| 1271 | return (NULL); | 1313 | return (NULL); |
| 1272 | } | 1314 | } |
| 1273 | 1315 | ||
| 1274 | /** The old interface to get the same thing as SSL_get_ciphers() */ | 1316 | /* The old interface to get the same thing as SSL_get_ciphers(). */ |
| 1275 | const char * | 1317 | const char * |
| 1276 | SSL_get_cipher_list(const SSL *s, int n) | 1318 | SSL_get_cipher_list(const SSL *s, int n) |
| 1277 | { | 1319 | { |
| 1278 | SSL_CIPHER *c; | 1320 | SSL_CIPHER *c; |
| 1279 | STACK_OF(SSL_CIPHER) *sk; | 1321 | STACK_OF(SSL_CIPHER) *sk; |
| 1280 | 1322 | ||
| 1281 | if (s == NULL) | 1323 | if (s == NULL) |
| 1282 | return (NULL); | 1324 | return (NULL); |
| @@ -1289,35 +1331,38 @@ SSL_get_cipher_list(const SSL *s, int n) | |||
| 1289 | return (c->name); | 1331 | return (c->name); |
| 1290 | } | 1332 | } |
| 1291 | 1333 | ||
| 1292 | /** specify the ciphers to be used by default by the SSL_CTX */ | 1334 | /* Specify the ciphers to be used by default by the SSL_CTX. */ |
| 1293 | int | 1335 | int |
| 1294 | SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str) | 1336 | SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str) |
| 1295 | { | 1337 | { |
| 1296 | STACK_OF(SSL_CIPHER) *sk; | 1338 | STACK_OF(SSL_CIPHER) *sk; |
| 1297 | 1339 | ||
| 1298 | sk = ssl_create_cipher_list(ctx->method, &ctx->cipher_list, | 1340 | sk = ssl_create_cipher_list(ctx->method, &ctx->cipher_list, |
| 1299 | &ctx->cipher_list_by_id, str); | 1341 | &ctx->cipher_list_by_id, str); |
| 1300 | /* ssl_create_cipher_list may return an empty stack if it | 1342 | /* |
| 1343 | * ssl_create_cipher_list may return an empty stack if it | ||
| 1301 | * was unable to find a cipher matching the given rule string | 1344 | * was unable to find a cipher matching the given rule string |
| 1302 | * (for example if the rule string specifies a cipher which | 1345 | * (for example if the rule string specifies a cipher which |
| 1303 | * has been disabled). This is not an error as far as | 1346 | * has been disabled). This is not an error as far as |
| 1304 | * ssl_create_cipher_list is concerned, and hence | 1347 | * ssl_create_cipher_list is concerned, and hence |
| 1305 | * ctx->cipher_list and ctx->cipher_list_by_id has been | 1348 | * ctx->cipher_list and ctx->cipher_list_by_id has been |
| 1306 | * updated. */ | 1349 | * updated. |
| 1350 | */ | ||
| 1307 | if (sk == NULL) | 1351 | if (sk == NULL) |
| 1308 | return 0; | 1352 | return 0; |
| 1309 | else if (sk_SSL_CIPHER_num(sk) == 0) { | 1353 | else if (sk_SSL_CIPHER_num(sk) == 0) { |
| 1310 | SSLerr(SSL_F_SSL_CTX_SET_CIPHER_LIST, SSL_R_NO_CIPHER_MATCH); | 1354 | SSLerr(SSL_F_SSL_CTX_SET_CIPHER_LIST, |
| 1355 | SSL_R_NO_CIPHER_MATCH); | ||
| 1311 | return 0; | 1356 | return 0; |
| 1312 | } | 1357 | } |
| 1313 | return 1; | 1358 | return 1; |
| 1314 | } | 1359 | } |
| 1315 | 1360 | ||
| 1316 | /** specify the ciphers to be used by the SSL */ | 1361 | /* Specify the ciphers to be used by the SSL. */ |
| 1317 | int | 1362 | int |
| 1318 | SSL_set_cipher_list(SSL *s, const char *str) | 1363 | SSL_set_cipher_list(SSL *s, const char *str) |
| 1319 | { | 1364 | { |
| 1320 | STACK_OF(SSL_CIPHER) *sk; | 1365 | STACK_OF(SSL_CIPHER) *sk; |
| 1321 | 1366 | ||
| 1322 | sk = ssl_create_cipher_list(s->ctx->method, &s->cipher_list, | 1367 | sk = ssl_create_cipher_list(s->ctx->method, &s->cipher_list, |
| 1323 | &s->cipher_list_by_id, str); | 1368 | &s->cipher_list_by_id, str); |
| @@ -1325,7 +1370,8 @@ SSL_set_cipher_list(SSL *s, const char *str) | |||
| 1325 | if (sk == NULL) | 1370 | if (sk == NULL) |
| 1326 | return 0; | 1371 | return 0; |
| 1327 | else if (sk_SSL_CIPHER_num(sk) == 0) { | 1372 | else if (sk_SSL_CIPHER_num(sk) == 0) { |
| 1328 | SSLerr(SSL_F_SSL_SET_CIPHER_LIST, SSL_R_NO_CIPHER_MATCH); | 1373 | SSLerr(SSL_F_SSL_SET_CIPHER_LIST, |
| 1374 | SSL_R_NO_CIPHER_MATCH); | ||
| 1329 | return 0; | 1375 | return 0; |
| 1330 | } | 1376 | } |
| 1331 | return 1; | 1377 | return 1; |
| @@ -1335,11 +1381,11 @@ SSL_set_cipher_list(SSL *s, const char *str) | |||
| 1335 | char * | 1381 | char * |
| 1336 | SSL_get_shared_ciphers(const SSL *s, char *buf, int len) | 1382 | SSL_get_shared_ciphers(const SSL *s, char *buf, int len) |
| 1337 | { | 1383 | { |
| 1338 | char *end; | 1384 | char *end; |
| 1339 | STACK_OF(SSL_CIPHER) *sk; | 1385 | STACK_OF(SSL_CIPHER) *sk; |
| 1340 | SSL_CIPHER *c; | 1386 | SSL_CIPHER *c; |
| 1341 | size_t curlen = 0; | 1387 | size_t curlen = 0; |
| 1342 | int i; | 1388 | int i; |
| 1343 | 1389 | ||
| 1344 | if ((s->session == NULL) || (s->session->ciphers == NULL) || | 1390 | if ((s->session == NULL) || (s->session->ciphers == NULL) || |
| 1345 | (len < 2)) | 1391 | (len < 2)) |
| @@ -1351,7 +1397,7 @@ SSL_get_shared_ciphers(const SSL *s, char *buf, int len) | |||
| 1351 | c = sk_SSL_CIPHER_value(sk, i); | 1397 | c = sk_SSL_CIPHER_value(sk, i); |
| 1352 | end = buf + curlen; | 1398 | end = buf + curlen; |
| 1353 | if (strlcat(buf, c->name, len) >= len || | 1399 | if (strlcat(buf, c->name, len) >= len || |
| 1354 | (curlen = strlcat(buf, ":", len)) >= len) { | 1400 | (curlen = strlcat(buf, ":", len)) >= len) { |
| 1355 | /* remove truncated cipher from list */ | 1401 | /* remove truncated cipher from list */ |
| 1356 | *end = '\0'; | 1402 | *end = '\0'; |
| 1357 | break; | 1403 | break; |
| @@ -1367,11 +1413,11 @@ int | |||
| 1367 | ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, | 1413 | ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, |
| 1368 | int (*put_cb)(const SSL_CIPHER *, unsigned char *)) | 1414 | int (*put_cb)(const SSL_CIPHER *, unsigned char *)) |
| 1369 | { | 1415 | { |
| 1370 | int i, j = 0; | 1416 | int i, j = 0; |
| 1371 | SSL_CIPHER *c; | 1417 | SSL_CIPHER *c; |
| 1372 | unsigned char *q; | 1418 | unsigned char *q; |
| 1373 | #ifndef OPENSSL_NO_KRB5 | 1419 | #ifndef OPENSSL_NO_KRB5 |
| 1374 | int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx); | 1420 | int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx); |
| 1375 | #endif /* OPENSSL_NO_KRB5 */ | 1421 | #endif /* OPENSSL_NO_KRB5 */ |
| 1376 | 1422 | ||
| 1377 | if (sk == NULL) | 1423 | if (sk == NULL) |
| @@ -1382,30 +1428,33 @@ ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, | |||
| 1382 | c = sk_SSL_CIPHER_value(sk, i); | 1428 | c = sk_SSL_CIPHER_value(sk, i); |
| 1383 | /* Skip TLS v1.2 only ciphersuites if lower than v1.2 */ | 1429 | /* Skip TLS v1.2 only ciphersuites if lower than v1.2 */ |
| 1384 | if ((c->algorithm_ssl & SSL_TLSV1_2) && | 1430 | if ((c->algorithm_ssl & SSL_TLSV1_2) && |
| 1385 | (TLS1_get_client_version(s) < TLS1_2_VERSION)) | 1431 | (TLS1_get_client_version(s) < TLS1_2_VERSION)) |
| 1386 | continue; | 1432 | continue; |
| 1387 | #ifndef OPENSSL_NO_KRB5 | 1433 | #ifndef OPENSSL_NO_KRB5 |
| 1388 | if (((c->algorithm_mkey & SSL_kKRB5) || (c->algorithm_auth & SSL_aKRB5)) && | 1434 | if (((c->algorithm_mkey & SSL_kKRB5) || |
| 1389 | nokrb5) | 1435 | (c->algorithm_auth & SSL_aKRB5)) && nokrb5) |
| 1390 | continue; | 1436 | continue; |
| 1391 | #endif /* OPENSSL_NO_KRB5 */ | 1437 | #endif /* OPENSSL_NO_KRB5 */ |
| 1392 | #ifndef OPENSSL_NO_PSK | 1438 | #ifndef OPENSSL_NO_PSK |
| 1393 | /* with PSK there must be client callback set */ | 1439 | /* with PSK there must be client callback set */ |
| 1394 | if (((c->algorithm_mkey & SSL_kPSK) || (c->algorithm_auth & SSL_aPSK)) && | 1440 | if (((c->algorithm_mkey & SSL_kPSK) || |
| 1395 | s->psk_client_callback == NULL) | 1441 | (c->algorithm_auth & SSL_aPSK)) && |
| 1396 | continue; | 1442 | s->psk_client_callback == NULL) |
| 1443 | continue; | ||
| 1397 | #endif /* OPENSSL_NO_PSK */ | 1444 | #endif /* OPENSSL_NO_PSK */ |
| 1398 | j = put_cb ? put_cb(c, p) : ssl_put_cipher_by_char(s, c, p); | 1445 | j = put_cb ? put_cb(c, p) : ssl_put_cipher_by_char(s, c, p); |
| 1399 | p += j; | 1446 | p += j; |
| 1400 | } | 1447 | } |
| 1401 | /* If p == q, no ciphers and caller indicates an error. Otherwise | 1448 | /* |
| 1449 | * If p == q, no ciphers and caller indicates an error. Otherwise | ||
| 1402 | * add SCSV if not renegotiating. | 1450 | * add SCSV if not renegotiating. |
| 1403 | */ | 1451 | */ |
| 1404 | if (p != q && !s->renegotiate) { | 1452 | if (p != q && !s->renegotiate) { |
| 1405 | static SSL_CIPHER scsv = { | 1453 | static SSL_CIPHER scsv = { |
| 1406 | 0, NULL, SSL3_CK_SCSV, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 1454 | 0, NULL, SSL3_CK_SCSV, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
| 1407 | }; | 1455 | }; |
| 1408 | j = put_cb ? put_cb(&scsv, p) : ssl_put_cipher_by_char(s, &scsv, p); | 1456 | j = put_cb ? put_cb(&scsv, p) : |
| 1457 | ssl_put_cipher_by_char(s, &scsv, p); | ||
| 1409 | p += j; | 1458 | p += j; |
| 1410 | #ifdef OPENSSL_RI_DEBUG | 1459 | #ifdef OPENSSL_RI_DEBUG |
| 1411 | fprintf(stderr, "SCSV sent by client\n"); | 1460 | fprintf(stderr, "SCSV sent by client\n"); |
| @@ -1419,15 +1468,17 @@ STACK_OF(SSL_CIPHER) * | |||
| 1419 | ssl_bytes_to_cipher_list(SSL *s, unsigned char *p, int num, | 1468 | ssl_bytes_to_cipher_list(SSL *s, unsigned char *p, int num, |
| 1420 | STACK_OF(SSL_CIPHER) **skp) | 1469 | STACK_OF(SSL_CIPHER) **skp) |
| 1421 | { | 1470 | { |
| 1422 | const SSL_CIPHER *c; | 1471 | const SSL_CIPHER *c; |
| 1423 | STACK_OF(SSL_CIPHER) *sk; | 1472 | STACK_OF(SSL_CIPHER) *sk; |
| 1424 | int i, n; | 1473 | int i, n; |
| 1474 | |||
| 1425 | if (s->s3) | 1475 | if (s->s3) |
| 1426 | s->s3->send_connection_binding = 0; | 1476 | s->s3->send_connection_binding = 0; |
| 1427 | 1477 | ||
| 1428 | n = ssl_put_cipher_by_char(s, NULL, NULL); | 1478 | n = ssl_put_cipher_by_char(s, NULL, NULL); |
| 1429 | if ((num % n) != 0) { | 1479 | if ((num % n) != 0) { |
| 1430 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST); | 1480 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, |
| 1481 | SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST); | ||
| 1431 | return (NULL); | 1482 | return (NULL); |
| 1432 | } | 1483 | } |
| 1433 | if ((skp == NULL) || (*skp == NULL)) | 1484 | if ((skp == NULL) || (*skp == NULL)) |
| @@ -1440,12 +1491,14 @@ ssl_bytes_to_cipher_list(SSL *s, unsigned char *p, int num, | |||
| 1440 | for (i = 0; i < num; i += n) { | 1491 | for (i = 0; i < num; i += n) { |
| 1441 | /* Check for SCSV */ | 1492 | /* Check for SCSV */ |
| 1442 | if (s->s3 && (n != 3 || !p[0]) && | 1493 | if (s->s3 && (n != 3 || !p[0]) && |
| 1443 | (p[n - 2] == ((SSL3_CK_SCSV >> 8) & 0xff)) && | 1494 | (p[n - 2] == ((SSL3_CK_SCSV >> 8) & 0xff)) && |
| 1444 | (p[n - 1] == (SSL3_CK_SCSV & 0xff))) { | 1495 | (p[n - 1] == (SSL3_CK_SCSV & 0xff))) { |
| 1445 | /* SCSV fatal if renegotiating */ | 1496 | /* SCSV fatal if renegotiating */ |
| 1446 | if (s->renegotiate) { | 1497 | if (s->renegotiate) { |
| 1447 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING); | 1498 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, |
| 1448 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 1499 | SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING); |
| 1500 | ssl3_send_alert(s, SSL3_AL_FATAL, | ||
| 1501 | SSL_AD_HANDSHAKE_FAILURE); | ||
| 1449 | 1502 | ||
| 1450 | goto err; | 1503 | goto err; |
| 1451 | } | 1504 | } |
| @@ -1461,7 +1514,8 @@ ssl_bytes_to_cipher_list(SSL *s, unsigned char *p, int num, | |||
| 1461 | p += n; | 1514 | p += n; |
| 1462 | if (c != NULL) { | 1515 | if (c != NULL) { |
| 1463 | if (!sk_SSL_CIPHER_push(sk, c)) { | 1516 | if (!sk_SSL_CIPHER_push(sk, c)) { |
| 1464 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, ERR_R_MALLOC_FAILURE); | 1517 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, |
| 1518 | ERR_R_MALLOC_FAILURE); | ||
| 1465 | goto err; | 1519 | goto err; |
| 1466 | } | 1520 | } |
| 1467 | } | 1521 | } |
| @@ -1470,7 +1524,7 @@ ssl_bytes_to_cipher_list(SSL *s, unsigned char *p, int num, | |||
| 1470 | if (skp != NULL) | 1524 | if (skp != NULL) |
| 1471 | *skp = sk; | 1525 | *skp = sk; |
| 1472 | return (sk); | 1526 | return (sk); |
| 1473 | err: | 1527 | err: |
| 1474 | if ((skp == NULL) || (*skp == NULL)) | 1528 | if ((skp == NULL) || (*skp == NULL)) |
| 1475 | sk_SSL_CIPHER_free(sk); | 1529 | sk_SSL_CIPHER_free(sk); |
| 1476 | return (NULL); | 1530 | return (NULL); |
| @@ -1478,10 +1532,10 @@ err: | |||
| 1478 | 1532 | ||
| 1479 | 1533 | ||
| 1480 | #ifndef OPENSSL_NO_TLSEXT | 1534 | #ifndef OPENSSL_NO_TLSEXT |
| 1481 | /** return a servername extension value if provided in Client Hello, or NULL. | 1535 | /* |
| 1536 | * Return a servername extension value if provided in Client Hello, or NULL. | ||
| 1482 | * So far, only host_name types are defined (RFC 3546). | 1537 | * So far, only host_name types are defined (RFC 3546). |
| 1483 | */ | 1538 | */ |
| 1484 | |||
| 1485 | const char * | 1539 | const char * |
| 1486 | SSL_get_servername(const SSL *s, const int type) | 1540 | SSL_get_servername(const SSL *s, const int type) |
| 1487 | { | 1541 | { |
| @@ -1489,20 +1543,23 @@ SSL_get_servername(const SSL *s, const int type) | |||
| 1489 | return NULL; | 1543 | return NULL; |
| 1490 | 1544 | ||
| 1491 | return s->session && !s->tlsext_hostname ? | 1545 | return s->session && !s->tlsext_hostname ? |
| 1492 | s->session->tlsext_hostname : | 1546 | s->session->tlsext_hostname : |
| 1493 | s->tlsext_hostname; | 1547 | s->tlsext_hostname; |
| 1494 | } | 1548 | } |
| 1495 | 1549 | ||
| 1496 | int | 1550 | int |
| 1497 | SSL_get_servername_type(const SSL *s) | 1551 | SSL_get_servername_type(const SSL *s) |
| 1498 | { | 1552 | { |
| 1499 | if (s->session && (!s->tlsext_hostname ? s->session->tlsext_hostname : s->tlsext_hostname)) | 1553 | if (s->session && |
| 1554 | (!s->tlsext_hostname ? | ||
| 1555 | s->session->tlsext_hostname : s->tlsext_hostname)) | ||
| 1500 | return TLSEXT_NAMETYPE_host_name; | 1556 | return TLSEXT_NAMETYPE_host_name; |
| 1501 | return -1; | 1557 | return -1; |
| 1502 | } | 1558 | } |
| 1503 | 1559 | ||
| 1504 | # ifndef OPENSSL_NO_NEXTPROTONEG | 1560 | # ifndef OPENSSL_NO_NEXTPROTONEG |
| 1505 | /* SSL_select_next_proto implements the standard protocol selection. It is | 1561 | /* |
| 1562 | * SSL_select_next_proto implements the standard protocol selection. It is | ||
| 1506 | * expected that this function is called from the callback set by | 1563 | * expected that this function is called from the callback set by |
| 1507 | * SSL_CTX_set_next_proto_select_cb. | 1564 | * SSL_CTX_set_next_proto_select_cb. |
| 1508 | * | 1565 | * |
| @@ -1533,17 +1590,23 @@ SSL_get_servername_type(const SSL *s) | |||
| 1533 | * OPENSSL_NPN_NO_OVERLAP if the fallback case was reached. | 1590 | * OPENSSL_NPN_NO_OVERLAP if the fallback case was reached. |
| 1534 | */ | 1591 | */ |
| 1535 | int | 1592 | int |
| 1536 | SSL_select_next_proto(unsigned char **out, unsigned char *outlen, const unsigned char *server, unsigned int server_len, const unsigned char *client, unsigned int client_len) | 1593 | SSL_select_next_proto(unsigned char **out, unsigned char *outlen, |
| 1594 | const unsigned char *server, unsigned int server_len, | ||
| 1595 | const unsigned char *client, unsigned int client_len) | ||
| 1537 | { | 1596 | { |
| 1538 | unsigned int i, j; | 1597 | unsigned int i, j; |
| 1539 | const unsigned char *result; | 1598 | const unsigned char *result; |
| 1540 | int status = OPENSSL_NPN_UNSUPPORTED; | 1599 | int status = OPENSSL_NPN_UNSUPPORTED; |
| 1541 | 1600 | ||
| 1542 | /* For each protocol in server preference order, see if we support it. */ | 1601 | /* |
| 1602 | * For each protocol in server preference order, | ||
| 1603 | * see if we support it. | ||
| 1604 | */ | ||
| 1543 | for (i = 0; i < server_len; ) { | 1605 | for (i = 0; i < server_len; ) { |
| 1544 | for (j = 0; j < client_len; ) { | 1606 | for (j = 0; j < client_len; ) { |
| 1545 | if (server[i] == client[j] && | 1607 | if (server[i] == client[j] && |
| 1546 | memcmp(&server[i + 1], &client[j + 1], server[i]) == 0) { | 1608 | memcmp(&server[i + 1], |
| 1609 | &client[j + 1], server[i]) == 0) { | ||
| 1547 | /* We found a match */ | 1610 | /* We found a match */ |
| 1548 | result = &server[i]; | 1611 | result = &server[i]; |
| 1549 | status = OPENSSL_NPN_NEGOTIATED; | 1612 | status = OPENSSL_NPN_NEGOTIATED; |
| @@ -1560,13 +1623,14 @@ SSL_select_next_proto(unsigned char **out, unsigned char *outlen, const unsigned | |||
| 1560 | result = client; | 1623 | result = client; |
| 1561 | status = OPENSSL_NPN_NO_OVERLAP; | 1624 | status = OPENSSL_NPN_NO_OVERLAP; |
| 1562 | 1625 | ||
| 1563 | found: | 1626 | found: |
| 1564 | *out = (unsigned char *) result + 1; | 1627 | *out = (unsigned char *) result + 1; |
| 1565 | *outlen = result[0]; | 1628 | *outlen = result[0]; |
| 1566 | return status; | 1629 | return status; |
| 1567 | } | 1630 | } |
| 1568 | 1631 | ||
| 1569 | /* SSL_get0_next_proto_negotiated sets *data and *len to point to the client's | 1632 | /* |
| 1633 | * SSL_get0_next_proto_negotiated sets *data and *len to point to the client's | ||
| 1570 | * requested protocol for this connection and returns 0. If the client didn't | 1634 | * requested protocol for this connection and returns 0. If the client didn't |
| 1571 | * request any protocol, then *data is set to NULL. | 1635 | * request any protocol, then *data is set to NULL. |
| 1572 | * | 1636 | * |
| @@ -1575,7 +1639,8 @@ SSL_select_next_proto(unsigned char **out, unsigned char *outlen, const unsigned | |||
| 1575 | * provided by the callback. | 1639 | * provided by the callback. |
| 1576 | */ | 1640 | */ |
| 1577 | void | 1641 | void |
| 1578 | SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, unsigned *len) | 1642 | SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, |
| 1643 | unsigned *len) | ||
| 1579 | { | 1644 | { |
| 1580 | *data = s->next_proto_negotiated; | 1645 | *data = s->next_proto_negotiated; |
| 1581 | if (!*data) { | 1646 | if (!*data) { |
| @@ -1585,23 +1650,27 @@ SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, unsigne | |||
| 1585 | } | 1650 | } |
| 1586 | } | 1651 | } |
| 1587 | 1652 | ||
| 1588 | /* SSL_CTX_set_next_protos_advertised_cb sets a callback that is called when a | 1653 | /* |
| 1654 | * SSL_CTX_set_next_protos_advertised_cb sets a callback that is called when a | ||
| 1589 | * TLS server needs a list of supported protocols for Next Protocol | 1655 | * TLS server needs a list of supported protocols for Next Protocol |
| 1590 | * Negotiation. The returned list must be in wire format. The list is returned | 1656 | * Negotiation. The returned list must be in wire format. The list is returned |
| 1591 | * by setting |out| to point to it and |outlen| to its length. This memory will | 1657 | * by setting |out| to point to it and |outlen| to its length. This memory will |
| 1592 | * not be modified, but one should assume that the SSL* keeps a reference to | 1658 | * not be modified, but one should assume that the SSL* keeps a reference to |
| 1593 | * it. | 1659 | * it. |
| 1594 | * | 1660 | * |
| 1595 | * The callback should return SSL_TLSEXT_ERR_OK if it wishes to advertise. Otherwise, no | 1661 | * The callback should return SSL_TLSEXT_ERR_OK if it wishes to advertise. |
| 1596 | * such extension will be included in the ServerHello. */ | 1662 | * Otherwise, no such extension will be included in the ServerHello. |
| 1663 | */ | ||
| 1597 | void | 1664 | void |
| 1598 | SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, const unsigned char **out, unsigned int *outlen, void *arg), void *arg) | 1665 | SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, |
| 1666 | const unsigned char **out, unsigned int *outlen, void *arg), void *arg) | ||
| 1599 | { | 1667 | { |
| 1600 | ctx->next_protos_advertised_cb = cb; | 1668 | ctx->next_protos_advertised_cb = cb; |
| 1601 | ctx->next_protos_advertised_cb_arg = arg; | 1669 | ctx->next_protos_advertised_cb_arg = arg; |
| 1602 | } | 1670 | } |
| 1603 | 1671 | ||
| 1604 | /* SSL_CTX_set_next_proto_select_cb sets a callback that is called when a | 1672 | /* |
| 1673 | * SSL_CTX_set_next_proto_select_cb sets a callback that is called when a | ||
| 1605 | * client needs to select a protocol from the server's provided list. |out| | 1674 | * client needs to select a protocol from the server's provided list. |out| |
| 1606 | * must be set to point to the selected protocol (which may be within |in|). | 1675 | * must be set to point to the selected protocol (which may be within |in|). |
| 1607 | * The length of the protocol name must be written into |outlen|. The server's | 1676 | * The length of the protocol name must be written into |outlen|. The server's |
| @@ -1612,7 +1681,9 @@ SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, const u | |||
| 1612 | * callback returns a value other than SSL_TLSEXT_ERR_OK. | 1681 | * callback returns a value other than SSL_TLSEXT_ERR_OK. |
| 1613 | */ | 1682 | */ |
| 1614 | void | 1683 | void |
| 1615 | SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg), void *arg) | 1684 | SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, |
| 1685 | unsigned char **out, unsigned char *outlen, const unsigned char *in, | ||
| 1686 | unsigned int inlen, void *arg), void *arg) | ||
| 1616 | { | 1687 | { |
| 1617 | ctx->next_proto_select_cb = cb; | 1688 | ctx->next_proto_select_cb = cb; |
| 1618 | ctx->next_proto_select_cb_arg = arg; | 1689 | ctx->next_proto_select_cb_arg = arg; |
| @@ -1623,34 +1694,35 @@ SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, unsigned char | |||
| 1623 | int | 1694 | int |
| 1624 | SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, | 1695 | SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, |
| 1625 | const char *label, size_t llen, const unsigned char *p, size_t plen, | 1696 | const char *label, size_t llen, const unsigned char *p, size_t plen, |
| 1626 | int use_context) | 1697 | int use_context) |
| 1627 | { | 1698 | { |
| 1628 | if (s->version < TLS1_VERSION) | 1699 | if (s->version < TLS1_VERSION) |
| 1629 | return -1; | 1700 | return -1; |
| 1630 | 1701 | ||
| 1631 | return s->method->ssl3_enc->export_keying_material(s, out, olen, label, | 1702 | return s->method->ssl3_enc->export_keying_material(s, out, olen, |
| 1632 | llen, p, plen, | 1703 | label, llen, p, plen, use_context); |
| 1633 | use_context); | ||
| 1634 | } | 1704 | } |
| 1635 | 1705 | ||
| 1636 | static unsigned long | 1706 | static unsigned long |
| 1637 | ssl_session_hash(const SSL_SESSION *a) | 1707 | ssl_session_hash(const SSL_SESSION *a) |
| 1638 | { | 1708 | { |
| 1639 | unsigned long l; | 1709 | unsigned long l; |
| 1640 | 1710 | ||
| 1641 | l = (unsigned long) | 1711 | l = (unsigned long) |
| 1642 | ((unsigned int) a->session_id[0] )| | 1712 | ((unsigned int) a->session_id[0] )| |
| 1643 | ((unsigned int) a->session_id[1]<< 8L)| | 1713 | ((unsigned int) a->session_id[1]<< 8L)| |
| 1644 | ((unsigned long)a->session_id[2]<<16L)| | 1714 | ((unsigned long)a->session_id[2]<<16L)| |
| 1645 | ((unsigned long)a->session_id[3]<<24L); | 1715 | ((unsigned long)a->session_id[3]<<24L); |
| 1646 | return (l); | 1716 | return (l); |
| 1647 | } | 1717 | } |
| 1648 | 1718 | ||
| 1649 | /* NB: If this function (or indeed the hash function which uses a sort of | 1719 | /* |
| 1720 | * NB: If this function (or indeed the hash function which uses a sort of | ||
| 1650 | * coarser function than this one) is changed, ensure | 1721 | * coarser function than this one) is changed, ensure |
| 1651 | * SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being | 1722 | * SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being |
| 1652 | * able to construct an SSL_SESSION that will collide with any existing session | 1723 | * able to construct an SSL_SESSION that will collide with any existing session |
| 1653 | * with a matching session ID. */ | 1724 | * with a matching session ID. |
| 1725 | */ | ||
| 1654 | static int | 1726 | static int |
| 1655 | ssl_session_cmp(const SSL_SESSION *a, const SSL_SESSION *b) | 1727 | ssl_session_cmp(const SSL_SESSION *a, const SSL_SESSION *b) |
| 1656 | { | 1728 | { |
| @@ -1661,10 +1733,12 @@ ssl_session_cmp(const SSL_SESSION *a, const SSL_SESSION *b) | |||
| 1661 | return (memcmp(a->session_id, b->session_id, a->session_id_length)); | 1733 | return (memcmp(a->session_id, b->session_id, a->session_id_length)); |
| 1662 | } | 1734 | } |
| 1663 | 1735 | ||
| 1664 | /* These wrapper functions should remain rather than redeclaring | 1736 | /* |
| 1737 | * These wrapper functions should remain rather than redeclaring | ||
| 1665 | * SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each | 1738 | * SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each |
| 1666 | * variable. The reason is that the functions aren't static, they're exposed via | 1739 | * variable. The reason is that the functions aren't static, they're exposed via |
| 1667 | * ssl.h. */ | 1740 | * ssl.h. |
| 1741 | */ | ||
| 1668 | static | 1742 | static |
| 1669 | IMPLEMENT_LHASH_HASH_FN(ssl_session, SSL_SESSION) | 1743 | IMPLEMENT_LHASH_HASH_FN(ssl_session, SSL_SESSION) |
| 1670 | static | 1744 | static |
| @@ -1673,15 +1747,17 @@ IMPLEMENT_LHASH_COMP_FN(ssl_session, SSL_SESSION) | |||
| 1673 | SSL_CTX * | 1747 | SSL_CTX * |
| 1674 | SSL_CTX_new(const SSL_METHOD *meth) | 1748 | SSL_CTX_new(const SSL_METHOD *meth) |
| 1675 | { | 1749 | { |
| 1676 | SSL_CTX *ret = NULL; | 1750 | SSL_CTX *ret = NULL; |
| 1677 | 1751 | ||
| 1678 | if (meth == NULL) { | 1752 | if (meth == NULL) { |
| 1679 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_NULL_SSL_METHOD_PASSED); | 1753 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1754 | SSL_R_NULL_SSL_METHOD_PASSED); | ||
| 1680 | return (NULL); | 1755 | return (NULL); |
| 1681 | } | 1756 | } |
| 1682 | 1757 | ||
| 1683 | if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0) { | 1758 | if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0) { |
| 1684 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_X509_VERIFICATION_SETUP_PROBLEMS); | 1759 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1760 | SSL_R_X509_VERIFICATION_SETUP_PROBLEMS); | ||
| 1685 | goto err; | 1761 | goto err; |
| 1686 | } | 1762 | } |
| 1687 | ret = calloc(1, sizeof(SSL_CTX)); | 1763 | ret = calloc(1, sizeof(SSL_CTX)); |
| @@ -1748,7 +1824,8 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
| 1748 | &ret->cipher_list_by_id, SSL_DEFAULT_CIPHER_LIST); | 1824 | &ret->cipher_list_by_id, SSL_DEFAULT_CIPHER_LIST); |
| 1749 | if (ret->cipher_list == NULL || | 1825 | if (ret->cipher_list == NULL || |
| 1750 | sk_SSL_CIPHER_num(ret->cipher_list) <= 0) { | 1826 | sk_SSL_CIPHER_num(ret->cipher_list) <= 0) { |
| 1751 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_LIBRARY_HAS_NO_CIPHERS); | 1827 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1828 | SSL_R_LIBRARY_HAS_NO_CIPHERS); | ||
| 1752 | goto err2; | 1829 | goto err2; |
| 1753 | } | 1830 | } |
| 1754 | 1831 | ||
| @@ -1757,11 +1834,13 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
| 1757 | goto err; | 1834 | goto err; |
| 1758 | 1835 | ||
| 1759 | if ((ret->md5 = EVP_get_digestbyname("ssl3-md5")) == NULL) { | 1836 | if ((ret->md5 = EVP_get_digestbyname("ssl3-md5")) == NULL) { |
| 1760 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES); | 1837 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1838 | SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES); | ||
| 1761 | goto err2; | 1839 | goto err2; |
| 1762 | } | 1840 | } |
| 1763 | if ((ret->sha1 = EVP_get_digestbyname("ssl3-sha1")) == NULL) { | 1841 | if ((ret->sha1 = EVP_get_digestbyname("ssl3-sha1")) == NULL) { |
| 1764 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES); | 1842 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1843 | SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES); | ||
| 1765 | goto err2; | 1844 | goto err2; |
| 1766 | } | 1845 | } |
| 1767 | 1846 | ||
| @@ -1782,9 +1861,9 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
| 1782 | ret->tlsext_servername_arg = NULL; | 1861 | ret->tlsext_servername_arg = NULL; |
| 1783 | /* Setup RFC4507 ticket keys */ | 1862 | /* Setup RFC4507 ticket keys */ |
| 1784 | if ((RAND_pseudo_bytes(ret->tlsext_tick_key_name, 16) <= 0) | 1863 | if ((RAND_pseudo_bytes(ret->tlsext_tick_key_name, 16) <= 0) |
| 1785 | || (RAND_bytes(ret->tlsext_tick_hmac_key, 16) <= 0) | 1864 | || (RAND_bytes(ret->tlsext_tick_hmac_key, 16) <= 0) |
| 1786 | || (RAND_bytes(ret->tlsext_tick_aes_key, 16) <= 0)) | 1865 | || (RAND_bytes(ret->tlsext_tick_aes_key, 16) <= 0)) |
| 1787 | ret->options |= SSL_OP_NO_TICKET; | 1866 | ret->options |= SSL_OP_NO_TICKET; |
| 1788 | 1867 | ||
| 1789 | ret->tlsext_status_cb = 0; | 1868 | ret->tlsext_status_cb = 0; |
| 1790 | ret->tlsext_status_arg = NULL; | 1869 | ret->tlsext_status_arg = NULL; |
| @@ -1814,22 +1893,25 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
| 1814 | if (!eng) { | 1893 | if (!eng) { |
| 1815 | ERR_clear_error(); | 1894 | ERR_clear_error(); |
| 1816 | ENGINE_load_builtin_engines(); | 1895 | ENGINE_load_builtin_engines(); |
| 1817 | eng = ENGINE_by_id(eng_str(OPENSSL_SSL_CLIENT_ENGINE_AUTO)); | 1896 | eng = ENGINE_by_id(eng_str( |
| 1897 | OPENSSL_SSL_CLIENT_ENGINE_AUTO)); | ||
| 1818 | } | 1898 | } |
| 1819 | if (!eng || !SSL_CTX_set_client_cert_engine(ret, eng)) | 1899 | if (!eng || !SSL_CTX_set_client_cert_engine(ret, eng)) |
| 1820 | ERR_clear_error(); | 1900 | ERR_clear_error(); |
| 1821 | } | 1901 | } |
| 1822 | #endif | 1902 | #endif |
| 1823 | #endif | 1903 | #endif |
| 1824 | /* Default is to connect to non-RI servers. When RI is more widely | 1904 | /* |
| 1905 | * Default is to connect to non-RI servers. When RI is more widely | ||
| 1825 | * deployed might change this. | 1906 | * deployed might change this. |
| 1826 | */ | 1907 | */ |
| 1827 | ret->options |= SSL_OP_LEGACY_SERVER_CONNECT; | 1908 | ret->options |= SSL_OP_LEGACY_SERVER_CONNECT; |
| 1828 | 1909 | ||
| 1829 | return (ret); | 1910 | return (ret); |
| 1830 | err: | 1911 | err: |
| 1831 | SSLerr(SSL_F_SSL_CTX_NEW, ERR_R_MALLOC_FAILURE); | 1912 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1832 | err2: | 1913 | ERR_R_MALLOC_FAILURE); |
| 1914 | err2: | ||
| 1833 | if (ret != NULL) | 1915 | if (ret != NULL) |
| 1834 | SSL_CTX_free(ret); | 1916 | SSL_CTX_free(ret); |
| 1835 | return (NULL); | 1917 | return (NULL); |
| @@ -1845,7 +1927,7 @@ SSL_COMP_free(SSL_COMP *comp) | |||
| 1845 | void | 1927 | void |
| 1846 | SSL_CTX_free(SSL_CTX *a) | 1928 | SSL_CTX_free(SSL_CTX *a) |
| 1847 | { | 1929 | { |
| 1848 | int i; | 1930 | int i; |
| 1849 | 1931 | ||
| 1850 | if (a == NULL) | 1932 | if (a == NULL) |
| 1851 | return; | 1933 | return; |
| @@ -1926,7 +2008,8 @@ SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u) | |||
| 1926 | } | 2008 | } |
| 1927 | 2009 | ||
| 1928 | void | 2010 | void |
| 1929 | SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *, void *), void *arg) | 2011 | SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *, |
| 2012 | void *), void *arg) | ||
| 1930 | { | 2013 | { |
| 1931 | ctx->app_verify_callback = cb; | 2014 | ctx->app_verify_callback = cb; |
| 1932 | ctx->app_verify_arg = arg; | 2015 | ctx->app_verify_arg = arg; |
| @@ -1948,18 +2031,18 @@ SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth) | |||
| 1948 | void | 2031 | void |
| 1949 | ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | 2032 | ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) |
| 1950 | { | 2033 | { |
| 1951 | CERT_PKEY *cpk; | 2034 | CERT_PKEY *cpk; |
| 1952 | int rsa_enc, rsa_tmp, rsa_sign, dh_tmp, dh_rsa, dh_dsa, dsa_sign; | 2035 | int rsa_enc, rsa_tmp, rsa_sign, dh_tmp, dh_rsa, dh_dsa, dsa_sign; |
| 1953 | int rsa_enc_export, dh_rsa_export, dh_dsa_export; | 2036 | int rsa_enc_export, dh_rsa_export, dh_dsa_export; |
| 1954 | int rsa_tmp_export, dh_tmp_export, kl; | 2037 | int rsa_tmp_export, dh_tmp_export, kl; |
| 1955 | unsigned long mask_k, mask_a, emask_k, emask_a; | 2038 | unsigned long mask_k, mask_a, emask_k, emask_a; |
| 1956 | int have_ecc_cert, ecdh_ok, ecdsa_ok, ecc_pkey_size; | 2039 | int have_ecc_cert, ecdh_ok, ecdsa_ok, ecc_pkey_size; |
| 1957 | #ifndef OPENSSL_NO_ECDH | 2040 | #ifndef OPENSSL_NO_ECDH |
| 1958 | int have_ecdh_tmp; | 2041 | int have_ecdh_tmp; |
| 1959 | #endif | 2042 | #endif |
| 1960 | X509 *x = NULL; | 2043 | X509 *x = NULL; |
| 1961 | EVP_PKEY *ecc_pkey = NULL; | 2044 | EVP_PKEY *ecc_pkey = NULL; |
| 1962 | int signature_nid = 0, pk_nid = 0, md_nid = 0; | 2045 | int signature_nid = 0, pk_nid = 0, md_nid = 0; |
| 1963 | 2046 | ||
| 1964 | if (c == NULL) | 2047 | if (c == NULL) |
| 1965 | return; | 2048 | return; |
| @@ -2005,8 +2088,8 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
| 2005 | 2088 | ||
| 2006 | #ifdef CIPHER_DEBUG | 2089 | #ifdef CIPHER_DEBUG |
| 2007 | printf("rt=%d rte=%d dht=%d ecdht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n", | 2090 | printf("rt=%d rte=%d dht=%d ecdht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n", |
| 2008 | rsa_tmp, rsa_tmp_export, dh_tmp, have_ecdh_tmp, | 2091 | rsa_tmp, rsa_tmp_export, dh_tmp, have_ecdh_tmp, |
| 2009 | rsa_enc, rsa_enc_export, rsa_sign, dsa_sign, dh_rsa, dh_dsa); | 2092 | rsa_enc, rsa_enc_export, rsa_sign, dsa_sign, dh_rsa, dh_dsa); |
| 2010 | #endif | 2093 | #endif |
| 2011 | 2094 | ||
| 2012 | cpk = &(c->pkeys[SSL_PKEY_GOST01]); | 2095 | cpk = &(c->pkeys[SSL_PKEY_GOST01]); |
| @@ -2071,7 +2154,8 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
| 2071 | emask_a|=SSL_aKRB5; | 2154 | emask_a|=SSL_aKRB5; |
| 2072 | #endif | 2155 | #endif |
| 2073 | 2156 | ||
| 2074 | /* An ECC certificate may be usable for ECDH and/or | 2157 | /* |
| 2158 | * An ECC certificate may be usable for ECDH and/or | ||
| 2075 | * ECDSA cipher suites depending on the key usage extension. | 2159 | * ECDSA cipher suites depending on the key usage extension. |
| 2076 | */ | 2160 | */ |
| 2077 | if (have_ecc_cert) { | 2161 | if (have_ecc_cert) { |
| @@ -2150,11 +2234,11 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
| 2150 | int | 2234 | int |
| 2151 | ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) | 2235 | ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) |
| 2152 | { | 2236 | { |
| 2153 | unsigned long alg_k, alg_a; | 2237 | unsigned long alg_k, alg_a; |
| 2154 | EVP_PKEY *pkey = NULL; | 2238 | EVP_PKEY *pkey = NULL; |
| 2155 | int keysize = 0; | 2239 | int keysize = 0; |
| 2156 | int signature_nid = 0, md_nid = 0, pk_nid = 0; | 2240 | int signature_nid = 0, md_nid = 0, pk_nid = 0; |
| 2157 | const SSL_CIPHER *cs = s->s3->tmp.new_cipher; | 2241 | const SSL_CIPHER *cs = s->s3->tmp.new_cipher; |
| 2158 | 2242 | ||
| 2159 | alg_k = cs->algorithm_mkey; | 2243 | alg_k = cs->algorithm_mkey; |
| 2160 | alg_a = cs->algorithm_auth; | 2244 | alg_a = cs->algorithm_auth; |
| @@ -2179,21 +2263,25 @@ ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) | |||
| 2179 | if (alg_k & SSL_kECDHe || alg_k & SSL_kECDHr) { | 2263 | if (alg_k & SSL_kECDHe || alg_k & SSL_kECDHr) { |
| 2180 | /* key usage, if present, must allow key agreement */ | 2264 | /* key usage, if present, must allow key agreement */ |
| 2181 | if (ku_reject(x, X509v3_KU_KEY_AGREEMENT)) { | 2265 | if (ku_reject(x, X509v3_KU_KEY_AGREEMENT)) { |
| 2182 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT); | 2266 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, |
| 2267 | SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT); | ||
| 2183 | return 0; | 2268 | return 0; |
| 2184 | } | 2269 | } |
| 2185 | if ((alg_k & SSL_kECDHe) && TLS1_get_version(s) < TLS1_2_VERSION) { | 2270 | if ((alg_k & SSL_kECDHe) && TLS1_get_version(s) < |
| 2271 | TLS1_2_VERSION) { | ||
| 2186 | /* signature alg must be ECDSA */ | 2272 | /* signature alg must be ECDSA */ |
| 2187 | if (pk_nid != NID_X9_62_id_ecPublicKey) { | 2273 | if (pk_nid != NID_X9_62_id_ecPublicKey) { |
| 2188 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE); | 2274 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, |
| 2275 | SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE); | ||
| 2189 | return 0; | 2276 | return 0; |
| 2190 | } | 2277 | } |
| 2191 | } | 2278 | } |
| 2192 | if ((alg_k & SSL_kECDHr) && TLS1_get_version(s) < TLS1_2_VERSION) { | 2279 | if ((alg_k & SSL_kECDHr) && TLS1_get_version(s) < |
| 2280 | TLS1_2_VERSION) { | ||
| 2193 | /* signature alg must be RSA */ | 2281 | /* signature alg must be RSA */ |
| 2194 | |||
| 2195 | if (pk_nid != NID_rsaEncryption && pk_nid != NID_rsa) { | 2282 | if (pk_nid != NID_rsaEncryption && pk_nid != NID_rsa) { |
| 2196 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE); | 2283 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, |
| 2284 | SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE); | ||
| 2197 | return 0; | 2285 | return 0; |
| 2198 | } | 2286 | } |
| 2199 | } | 2287 | } |
| @@ -2201,7 +2289,8 @@ ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) | |||
| 2201 | if (alg_a & SSL_aECDSA) { | 2289 | if (alg_a & SSL_aECDSA) { |
| 2202 | /* key usage, if present, must allow signing */ | 2290 | /* key usage, if present, must allow signing */ |
| 2203 | if (ku_reject(x, X509v3_KU_DIGITAL_SIGNATURE)) { | 2291 | if (ku_reject(x, X509v3_KU_DIGITAL_SIGNATURE)) { |
| 2204 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_NOT_FOR_SIGNING); | 2292 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, |
| 2293 | SSL_R_ECC_CERT_NOT_FOR_SIGNING); | ||
| 2205 | return 0; | 2294 | return 0; |
| 2206 | } | 2295 | } |
| 2207 | } | 2296 | } |
| @@ -2216,9 +2305,9 @@ ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) | |||
| 2216 | CERT_PKEY * | 2305 | CERT_PKEY * |
| 2217 | ssl_get_server_send_pkey(const SSL *s) | 2306 | ssl_get_server_send_pkey(const SSL *s) |
| 2218 | { | 2307 | { |
| 2219 | unsigned long alg_k, alg_a; | 2308 | unsigned long alg_k, alg_a; |
| 2220 | CERT *c; | 2309 | CERT *c; |
| 2221 | int i; | 2310 | int i; |
| 2222 | 2311 | ||
| 2223 | c = s->cert; | 2312 | c = s->cert; |
| 2224 | ssl_set_cert_masks(c, s->s3->tmp.new_cipher); | 2313 | ssl_set_cert_masks(c, s->s3->tmp.new_cipher); |
| @@ -2227,7 +2316,8 @@ ssl_get_server_send_pkey(const SSL *s) | |||
| 2227 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; | 2316 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; |
| 2228 | 2317 | ||
| 2229 | if (alg_k & (SSL_kECDHr|SSL_kECDHe)) { | 2318 | if (alg_k & (SSL_kECDHr|SSL_kECDHe)) { |
| 2230 | /* we don't need to look at SSL_kEECDH | 2319 | /* |
| 2320 | * We don't need to look at SSL_kEECDH | ||
| 2231 | * since no certificate is needed for | 2321 | * since no certificate is needed for |
| 2232 | * anon ECDH and for authenticated | 2322 | * anon ECDH and for authenticated |
| 2233 | * EECDH, the check for the auth | 2323 | * EECDH, the check for the auth |
| @@ -2242,7 +2332,7 @@ ssl_get_server_send_pkey(const SSL *s) | |||
| 2242 | } else if (alg_a & SSL_aECDSA) { | 2332 | } else if (alg_a & SSL_aECDSA) { |
| 2243 | i = SSL_PKEY_ECC; | 2333 | i = SSL_PKEY_ECC; |
| 2244 | } else if (alg_k & SSL_kDHr) | 2334 | } else if (alg_k & SSL_kDHr) |
| 2245 | i = SSL_PKEY_DH_RSA; | 2335 | i = SSL_PKEY_DH_RSA; |
| 2246 | else if (alg_k & SSL_kDHd) | 2336 | else if (alg_k & SSL_kDHd) |
| 2247 | i = SSL_PKEY_DH_DSA; | 2337 | i = SSL_PKEY_DH_DSA; |
| 2248 | else if (alg_a & SSL_aDSS) | 2338 | else if (alg_a & SSL_aDSS) |
| @@ -2256,12 +2346,12 @@ ssl_get_server_send_pkey(const SSL *s) | |||
| 2256 | /* VRS something else here? */ | 2346 | /* VRS something else here? */ |
| 2257 | return (NULL); | 2347 | return (NULL); |
| 2258 | } else if (alg_a & SSL_aGOST94) | 2348 | } else if (alg_a & SSL_aGOST94) |
| 2259 | i = SSL_PKEY_GOST94; | 2349 | i = SSL_PKEY_GOST94; |
| 2260 | else if (alg_a & SSL_aGOST01) | 2350 | else if (alg_a & SSL_aGOST01) |
| 2261 | i = SSL_PKEY_GOST01; | 2351 | i = SSL_PKEY_GOST01; |
| 2262 | else /* if (alg_a & SSL_aNULL) */ | 2352 | else { /* if (alg_a & SSL_aNULL) */ |
| 2263 | { | 2353 | SSLerr(SSL_F_SSL_GET_SERVER_SEND_PKEY, |
| 2264 | SSLerr(SSL_F_SSL_GET_SERVER_SEND_PKEY, ERR_R_INTERNAL_ERROR); | 2354 | ERR_R_INTERNAL_ERROR); |
| 2265 | return (NULL); | 2355 | return (NULL); |
| 2266 | } | 2356 | } |
| 2267 | 2357 | ||
| @@ -2271,7 +2361,8 @@ ssl_get_server_send_pkey(const SSL *s) | |||
| 2271 | X509 * | 2361 | X509 * |
| 2272 | ssl_get_server_send_cert(const SSL *s) | 2362 | ssl_get_server_send_cert(const SSL *s) |
| 2273 | { | 2363 | { |
| 2274 | CERT_PKEY *cpk; | 2364 | CERT_PKEY *cpk; |
| 2365 | |||
| 2275 | cpk = ssl_get_server_send_pkey(s); | 2366 | cpk = ssl_get_server_send_pkey(s); |
| 2276 | if (!cpk) | 2367 | if (!cpk) |
| 2277 | return NULL; | 2368 | return NULL; |
| @@ -2281,26 +2372,27 @@ ssl_get_server_send_cert(const SSL *s) | |||
| 2281 | EVP_PKEY * | 2372 | EVP_PKEY * |
| 2282 | ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) | 2373 | ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) |
| 2283 | { | 2374 | { |
| 2284 | unsigned long alg_a; | 2375 | unsigned long alg_a; |
| 2285 | CERT *c; | 2376 | CERT *c; |
| 2286 | int idx = -1; | 2377 | int idx = -1; |
| 2287 | 2378 | ||
| 2288 | alg_a = cipher->algorithm_auth; | 2379 | alg_a = cipher->algorithm_auth; |
| 2289 | c = s->cert; | 2380 | c = s->cert; |
| 2290 | 2381 | ||
| 2291 | if ((alg_a & SSL_aDSS) && | 2382 | if ((alg_a & SSL_aDSS) && |
| 2292 | (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL)) | 2383 | (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL)) |
| 2293 | idx = SSL_PKEY_DSA_SIGN; | 2384 | idx = SSL_PKEY_DSA_SIGN; |
| 2294 | else if (alg_a & SSL_aRSA) { | 2385 | else if (alg_a & SSL_aRSA) { |
| 2295 | if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL) | 2386 | if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL) |
| 2296 | idx = SSL_PKEY_RSA_SIGN; | 2387 | idx = SSL_PKEY_RSA_SIGN; |
| 2297 | else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL) | 2388 | else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL) |
| 2298 | idx = SSL_PKEY_RSA_ENC; | 2389 | idx = SSL_PKEY_RSA_ENC; |
| 2299 | } else if ((alg_a & SSL_aECDSA) && | 2390 | } else if ((alg_a & SSL_aECDSA) && |
| 2300 | (c->pkeys[SSL_PKEY_ECC].privatekey != NULL)) | 2391 | (c->pkeys[SSL_PKEY_ECC].privatekey != NULL)) |
| 2301 | idx = SSL_PKEY_ECC; | 2392 | idx = SSL_PKEY_ECC; |
| 2302 | if (idx == -1) { | 2393 | if (idx == -1) { |
| 2303 | SSLerr(SSL_F_SSL_GET_SIGN_PKEY, ERR_R_INTERNAL_ERROR); | 2394 | SSLerr(SSL_F_SSL_GET_SIGN_PKEY, |
| 2395 | ERR_R_INTERNAL_ERROR); | ||
| 2304 | return (NULL); | 2396 | return (NULL); |
| 2305 | } | 2397 | } |
| 2306 | if (pmd) | 2398 | if (pmd) |
| @@ -2311,18 +2403,19 @@ ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) | |||
| 2311 | void | 2403 | void |
| 2312 | ssl_update_cache(SSL *s, int mode) | 2404 | ssl_update_cache(SSL *s, int mode) |
| 2313 | { | 2405 | { |
| 2314 | int i; | 2406 | int i; |
| 2315 | 2407 | ||
| 2316 | /* If the session_id_length is 0, we are not supposed to cache it, | 2408 | /* |
| 2317 | * and it would be rather hard to do anyway :-) */ | 2409 | * If the session_id_length is 0, we are not supposed to cache it, |
| 2410 | * and it would be rather hard to do anyway :-) | ||
| 2411 | */ | ||
| 2318 | if (s->session->session_id_length == 0) | 2412 | if (s->session->session_id_length == 0) |
| 2319 | return; | 2413 | return; |
| 2320 | 2414 | ||
| 2321 | i = s->session_ctx->session_cache_mode; | 2415 | i = s->session_ctx->session_cache_mode; |
| 2322 | if ((i & mode) && (!s->hit) | 2416 | if ((i & mode) && (!s->hit) && ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE) |
| 2323 | && ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE) | 2417 | || SSL_CTX_add_session(s->session_ctx, s->session)) |
| 2324 | || SSL_CTX_add_session(s->session_ctx, s->session)) | 2418 | && (s->session_ctx->new_session_cb != NULL)) { |
| 2325 | && (s->session_ctx->new_session_cb != NULL)) { | ||
| 2326 | CRYPTO_add(&s->session->references, 1, CRYPTO_LOCK_SSL_SESSION); | 2419 | CRYPTO_add(&s->session->references, 1, CRYPTO_LOCK_SSL_SESSION); |
| 2327 | if (!s->session_ctx->new_session_cb(s, s->session)) | 2420 | if (!s->session_ctx->new_session_cb(s, s->session)) |
| 2328 | SSL_SESSION_free(s->session); | 2421 | SSL_SESSION_free(s->session); |
| @@ -2330,10 +2423,10 @@ ssl_update_cache(SSL *s, int mode) | |||
| 2330 | 2423 | ||
| 2331 | /* auto flush every 255 connections */ | 2424 | /* auto flush every 255 connections */ |
| 2332 | if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) && | 2425 | if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) && |
| 2333 | ((i & mode) == mode)) { | 2426 | ((i & mode) == mode)) { |
| 2334 | if ((((mode & SSL_SESS_CACHE_CLIENT) | 2427 | if ((((mode & SSL_SESS_CACHE_CLIENT) ? |
| 2335 | ?s->session_ctx->stats.sess_connect_good | 2428 | s->session_ctx->stats.sess_connect_good : |
| 2336 | :s->session_ctx->stats.sess_accept_good) & 0xff) == 0xff) { | 2429 | s->session_ctx->stats.sess_accept_good) & 0xff) == 0xff) { |
| 2337 | SSL_CTX_flush_sessions(s->session_ctx, time(NULL)); | 2430 | SSL_CTX_flush_sessions(s->session_ctx, time(NULL)); |
| 2338 | } | 2431 | } |
| 2339 | } | 2432 | } |
| @@ -2348,8 +2441,8 @@ SSL_get_ssl_method(SSL *s) | |||
| 2348 | int | 2441 | int |
| 2349 | SSL_set_ssl_method(SSL *s, const SSL_METHOD *meth) | 2442 | SSL_set_ssl_method(SSL *s, const SSL_METHOD *meth) |
| 2350 | { | 2443 | { |
| 2351 | int conn = -1; | 2444 | int conn = -1; |
| 2352 | int ret = 1; | 2445 | int ret = 1; |
| 2353 | 2446 | ||
| 2354 | if (s->method != meth) { | 2447 | if (s->method != meth) { |
| 2355 | if (s->handshake_func != NULL) | 2448 | if (s->handshake_func != NULL) |
| @@ -2374,9 +2467,9 @@ SSL_set_ssl_method(SSL *s, const SSL_METHOD *meth) | |||
| 2374 | int | 2467 | int |
| 2375 | SSL_get_error(const SSL *s, int i) | 2468 | SSL_get_error(const SSL *s, int i) |
| 2376 | { | 2469 | { |
| 2377 | int reason; | 2470 | int reason; |
| 2378 | unsigned long l; | 2471 | unsigned long l; |
| 2379 | BIO *bio; | 2472 | BIO *bio; |
| 2380 | 2473 | ||
| 2381 | if (i > 0) | 2474 | if (i > 0) |
| 2382 | return (SSL_ERROR_NONE); | 2475 | return (SSL_ERROR_NONE); |
| @@ -2422,8 +2515,11 @@ SSL_get_error(const SSL *s, int i) | |||
| 2422 | if (BIO_should_write(bio)) | 2515 | if (BIO_should_write(bio)) |
| 2423 | return (SSL_ERROR_WANT_WRITE); | 2516 | return (SSL_ERROR_WANT_WRITE); |
| 2424 | else if (BIO_should_read(bio)) | 2517 | else if (BIO_should_read(bio)) |
| 2425 | /* See above (SSL_want_read(s) with BIO_should_write(bio)) */ | 2518 | return (SSL_ERROR_WANT_READ); |
| 2426 | return (SSL_ERROR_WANT_READ); | 2519 | /* |
| 2520 | * See above (SSL_want_read(s) with | ||
| 2521 | * BIO_should_write(bio)) | ||
| 2522 | */ | ||
| 2427 | else if (BIO_should_io_special(bio)) { | 2523 | else if (BIO_should_io_special(bio)) { |
| 2428 | reason = BIO_get_retry_reason(bio); | 2524 | reason = BIO_get_retry_reason(bio); |
| 2429 | if (reason == BIO_RR_CONNECT) | 2525 | if (reason == BIO_RR_CONNECT) |
| @@ -2449,10 +2545,11 @@ SSL_get_error(const SSL *s, int i) | |||
| 2449 | int | 2545 | int |
| 2450 | SSL_do_handshake(SSL *s) | 2546 | SSL_do_handshake(SSL *s) |
| 2451 | { | 2547 | { |
| 2452 | int ret = 1; | 2548 | int ret = 1; |
| 2453 | 2549 | ||
| 2454 | if (s->handshake_func == NULL) { | 2550 | if (s->handshake_func == NULL) { |
| 2455 | SSLerr(SSL_F_SSL_DO_HANDSHAKE, SSL_R_CONNECTION_TYPE_NOT_SET); | 2551 | SSLerr(SSL_F_SSL_DO_HANDSHAKE, |
| 2552 | SSL_R_CONNECTION_TYPE_NOT_SET); | ||
| 2456 | return (-1); | 2553 | return (-1); |
| 2457 | } | 2554 | } |
| 2458 | 2555 | ||
| @@ -2464,8 +2561,10 @@ SSL_do_handshake(SSL *s) | |||
| 2464 | return (ret); | 2561 | return (ret); |
| 2465 | } | 2562 | } |
| 2466 | 2563 | ||
| 2467 | /* For the next 2 functions, SSL_clear() sets shutdown and so | 2564 | /* |
| 2468 | * one of these calls will reset it */ | 2565 | * For the next 2 functions, SSL_clear() sets shutdown and so |
| 2566 | * one of these calls will reset it | ||
| 2567 | */ | ||
| 2469 | void | 2568 | void |
| 2470 | SSL_set_accept_state(SSL *s) | 2569 | SSL_set_accept_state(SSL *s) |
| 2471 | { | 2570 | { |
| @@ -2495,28 +2594,32 @@ SSL_set_connect_state(SSL *s) | |||
| 2495 | int | 2594 | int |
| 2496 | ssl_undefined_function(SSL *s) | 2595 | ssl_undefined_function(SSL *s) |
| 2497 | { | 2596 | { |
| 2498 | SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 2597 | SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION, |
| 2598 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 2499 | return (0); | 2599 | return (0); |
| 2500 | } | 2600 | } |
| 2501 | 2601 | ||
| 2502 | int | 2602 | int |
| 2503 | ssl_undefined_void_function(void) | 2603 | ssl_undefined_void_function(void) |
| 2504 | { | 2604 | { |
| 2505 | SSLerr(SSL_F_SSL_UNDEFINED_VOID_FUNCTION, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 2605 | SSLerr(SSL_F_SSL_UNDEFINED_VOID_FUNCTION, |
| 2606 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 2506 | return (0); | 2607 | return (0); |
| 2507 | } | 2608 | } |
| 2508 | 2609 | ||
| 2509 | int | 2610 | int |
| 2510 | ssl_undefined_const_function(const SSL *s) | 2611 | ssl_undefined_const_function(const SSL *s) |
| 2511 | { | 2612 | { |
| 2512 | SSLerr(SSL_F_SSL_UNDEFINED_CONST_FUNCTION, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 2613 | SSLerr(SSL_F_SSL_UNDEFINED_CONST_FUNCTION, |
| 2614 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 2513 | return (0); | 2615 | return (0); |
| 2514 | } | 2616 | } |
| 2515 | 2617 | ||
| 2516 | SSL_METHOD * | 2618 | SSL_METHOD * |
| 2517 | ssl_bad_method(int ver) | 2619 | ssl_bad_method(int ver) |
| 2518 | { | 2620 | { |
| 2519 | SSLerr(SSL_F_SSL_BAD_METHOD, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 2621 | SSLerr(SSL_F_SSL_BAD_METHOD, |
| 2622 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 2520 | return (NULL); | 2623 | return (NULL); |
| 2521 | } | 2624 | } |
| 2522 | 2625 | ||
| @@ -2554,10 +2657,12 @@ SSL_dup(SSL *s) | |||
| 2554 | /* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */ | 2657 | /* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */ |
| 2555 | SSL_copy_session_id(ret, s); | 2658 | SSL_copy_session_id(ret, s); |
| 2556 | } else { | 2659 | } else { |
| 2557 | /* No session has been established yet, so we have to expect | 2660 | /* |
| 2661 | * No session has been established yet, so we have to expect | ||
| 2558 | * that s->cert or ret->cert will be changed later -- | 2662 | * that s->cert or ret->cert will be changed later -- |
| 2559 | * they should not both point to the same object, | 2663 | * they should not both point to the same object, |
| 2560 | * and thus we can't use SSL_copy_session_id. */ | 2664 | * and thus we can't use SSL_copy_session_id. |
| 2665 | */ | ||
| 2561 | 2666 | ||
| 2562 | ret->method->ssl_free(ret); | 2667 | ret->method->ssl_free(ret); |
| 2563 | ret->method = s->method; | 2668 | ret->method = s->method; |
| @@ -2592,7 +2697,8 @@ SSL_dup(SSL *s) | |||
| 2592 | ret->debug = s->debug; | 2697 | ret->debug = s->debug; |
| 2593 | 2698 | ||
| 2594 | /* copy app data, a little dangerous perhaps */ | 2699 | /* copy app data, a little dangerous perhaps */ |
| 2595 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, &ret->ex_data, &s->ex_data)) | 2700 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, |
| 2701 | &ret->ex_data, &s->ex_data)) | ||
| 2596 | goto err; | 2702 | goto err; |
| 2597 | 2703 | ||
| 2598 | /* setup rbio, and wbio */ | 2704 | /* setup rbio, and wbio */ |
| @@ -2615,22 +2721,30 @@ SSL_dup(SSL *s) | |||
| 2615 | ret->new_session = s->new_session; | 2721 | ret->new_session = s->new_session; |
| 2616 | ret->quiet_shutdown = s->quiet_shutdown; | 2722 | ret->quiet_shutdown = s->quiet_shutdown; |
| 2617 | ret->shutdown = s->shutdown; | 2723 | ret->shutdown = s->shutdown; |
| 2618 | ret->state=s->state; /* SSL_dup does not really work at any state, though */ | 2724 | /* SSL_dup does not really work at any state, though */ |
| 2725 | ret->state=s->state; | ||
| 2619 | ret->rstate = s->rstate; | 2726 | ret->rstate = s->rstate; |
| 2620 | ret->init_num = 0; /* would have to copy ret->init_buf, ret->init_msg, ret->init_num, ret->init_off */ | 2727 | |
| 2728 | /* | ||
| 2729 | * Would have to copy ret->init_buf, ret->init_msg, ret->init_num, | ||
| 2730 | * ret->init_off | ||
| 2731 | */ | ||
| 2732 | ret->init_num = 0; | ||
| 2733 | |||
| 2621 | ret->hit = s->hit; | 2734 | ret->hit = s->hit; |
| 2622 | 2735 | ||
| 2623 | X509_VERIFY_PARAM_inherit(ret->param, s->param); | 2736 | X509_VERIFY_PARAM_inherit(ret->param, s->param); |
| 2624 | 2737 | ||
| 2625 | /* dup the cipher_list and cipher_list_by_id stacks */ | 2738 | /* dup the cipher_list and cipher_list_by_id stacks */ |
| 2626 | if (s->cipher_list != NULL) { | 2739 | if (s->cipher_list != NULL) { |
| 2627 | if ((ret->cipher_list = sk_SSL_CIPHER_dup(s->cipher_list)) == NULL) | 2740 | if ((ret->cipher_list = |
| 2741 | sk_SSL_CIPHER_dup(s->cipher_list)) == NULL) | ||
| 2628 | goto err; | 2742 | goto err; |
| 2629 | } | 2743 | } |
| 2630 | if (s->cipher_list_by_id != NULL) | 2744 | if (s->cipher_list_by_id != NULL) |
| 2631 | if ((ret->cipher_list_by_id = sk_SSL_CIPHER_dup(s->cipher_list_by_id)) | 2745 | if ((ret->cipher_list_by_id = |
| 2632 | == NULL) | 2746 | sk_SSL_CIPHER_dup(s->cipher_list_by_id)) == NULL) |
| 2633 | goto err; | 2747 | goto err; |
| 2634 | 2748 | ||
| 2635 | /* Dup the client_CA list */ | 2749 | /* Dup the client_CA list */ |
| 2636 | if (s->client_CA != NULL) { | 2750 | if (s->client_CA != NULL) { |
| @@ -2638,7 +2752,8 @@ SSL_dup(SSL *s) | |||
| 2638 | ret->client_CA = sk; | 2752 | ret->client_CA = sk; |
| 2639 | for (i = 0; i < sk_X509_NAME_num(sk); i++) { | 2753 | for (i = 0; i < sk_X509_NAME_num(sk); i++) { |
| 2640 | xn = sk_X509_NAME_value(sk, i); | 2754 | xn = sk_X509_NAME_value(sk, i); |
| 2641 | if (sk_X509_NAME_set(sk, i, X509_NAME_dup(xn)) == NULL) { | 2755 | if (sk_X509_NAME_set(sk, i, |
| 2756 | X509_NAME_dup(xn)) == NULL) { | ||
| 2642 | X509_NAME_free(xn); | 2757 | X509_NAME_free(xn); |
| 2643 | goto err; | 2758 | goto err; |
| 2644 | } | 2759 | } |
| @@ -2646,7 +2761,7 @@ SSL_dup(SSL *s) | |||
| 2646 | } | 2761 | } |
| 2647 | 2762 | ||
| 2648 | if (0) { | 2763 | if (0) { |
| 2649 | err: | 2764 | err: |
| 2650 | if (ret != NULL) | 2765 | if (ret != NULL) |
| 2651 | SSL_free(ret); | 2766 | SSL_free(ret); |
| 2652 | ret = NULL; | 2767 | ret = NULL; |
| @@ -2740,7 +2855,7 @@ SSL_get_current_expansion(SSL *s) | |||
| 2740 | int | 2855 | int |
| 2741 | ssl_init_wbio_buffer(SSL *s, int push) | 2856 | ssl_init_wbio_buffer(SSL *s, int push) |
| 2742 | { | 2857 | { |
| 2743 | BIO *bbio; | 2858 | BIO *bbio; |
| 2744 | 2859 | ||
| 2745 | if (s->bbio == NULL) { | 2860 | if (s->bbio == NULL) { |
| 2746 | bbio = BIO_new(BIO_f_buffer()); | 2861 | bbio = BIO_new(BIO_f_buffer()); |
| @@ -2755,7 +2870,8 @@ ssl_init_wbio_buffer(SSL *s, int push) | |||
| 2755 | (void)BIO_reset(bbio); | 2870 | (void)BIO_reset(bbio); |
| 2756 | /* if (!BIO_set_write_buffer_size(bbio,16*1024)) */ | 2871 | /* if (!BIO_set_write_buffer_size(bbio,16*1024)) */ |
| 2757 | if (!BIO_set_read_buffer_size(bbio, 1)) { | 2872 | if (!BIO_set_read_buffer_size(bbio, 1)) { |
| 2758 | SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER, ERR_R_BUF_LIB); | 2873 | SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER, |
| 2874 | ERR_R_BUF_LIB); | ||
| 2759 | return (0); | 2875 | return (0); |
| 2760 | } | 2876 | } |
| 2761 | if (push) { | 2877 | if (push) { |
| @@ -2871,8 +2987,10 @@ SSL_set_info_callback(SSL *ssl, | |||
| 2871 | ssl->info_callback = cb; | 2987 | ssl->info_callback = cb; |
| 2872 | } | 2988 | } |
| 2873 | 2989 | ||
| 2874 | /* One compiler (Diab DCC) doesn't like argument names in returned | 2990 | /* |
| 2875 | function pointer. */ | 2991 | * One compiler (Diab DCC) doesn't like argument names in returned |
| 2992 | * function pointer. | ||
| 2993 | */ | ||
| 2876 | void (*SSL_get_info_callback(const SSL *ssl))(const SSL * /*ssl*/,int /*type*/,int /*val*/) | 2994 | void (*SSL_get_info_callback(const SSL *ssl))(const SSL * /*ssl*/,int /*type*/,int /*val*/) |
| 2877 | { | 2995 | { |
| 2878 | return ssl->info_callback; | 2996 | return ssl->info_callback; |
| @@ -2907,7 +3025,7 @@ SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | |||
| 2907 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | 3025 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
| 2908 | { | 3026 | { |
| 2909 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp, | 3027 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp, |
| 2910 | new_func, dup_func, free_func); | 3028 | new_func, dup_func, free_func); |
| 2911 | } | 3029 | } |
| 2912 | 3030 | ||
| 2913 | int | 3031 | int |
| @@ -2927,7 +3045,7 @@ SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | |||
| 2927 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | 3045 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
| 2928 | { | 3046 | { |
| 2929 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp, | 3047 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp, |
| 2930 | new_func, dup_func, free_func); | 3048 | new_func, dup_func, free_func); |
| 2931 | } | 3049 | } |
| 2932 | 3050 | ||
| 2933 | int | 3051 | int |
| @@ -3030,10 +3148,11 @@ SSL_set_tmp_dh_callback(SSL *ssl, DH *(*dh)(SSL *ssl, int is_export, | |||
| 3030 | 3148 | ||
| 3031 | #ifndef OPENSSL_NO_ECDH | 3149 | #ifndef OPENSSL_NO_ECDH |
| 3032 | void | 3150 | void |
| 3033 | SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, EC_KEY *(*ecdh)(SSL *ssl, int is_export, | 3151 | SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, EC_KEY *(*ecdh)(SSL *ssl, |
| 3034 | int keylength)) | 3152 | int is_export, int keylength)) |
| 3035 | { | 3153 | { |
| 3036 | SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_TMP_ECDH_CB,(void (*)(void))ecdh); | 3154 | SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_TMP_ECDH_CB, |
| 3155 | (void (*)(void))ecdh); | ||
| 3037 | } | 3156 | } |
| 3038 | 3157 | ||
| 3039 | void | 3158 | void |
| @@ -3048,8 +3167,10 @@ SSL_set_tmp_ecdh_callback(SSL *ssl, EC_KEY *(*ecdh)(SSL *ssl, int is_export, | |||
| 3048 | int | 3167 | int |
| 3049 | SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint) | 3168 | SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint) |
| 3050 | { | 3169 | { |
| 3051 | if (identity_hint != NULL && strlen(identity_hint) > PSK_MAX_IDENTITY_LEN) { | 3170 | if (identity_hint != NULL && strlen(identity_hint) > |
| 3052 | SSLerr(SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT, SSL_R_DATA_LENGTH_TOO_LONG); | 3171 | PSK_MAX_IDENTITY_LEN) { |
| 3172 | SSLerr(SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT, | ||
| 3173 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 3053 | return 0; | 3174 | return 0; |
| 3054 | } | 3175 | } |
| 3055 | if (ctx->psk_identity_hint != NULL) | 3176 | if (ctx->psk_identity_hint != NULL) |
| @@ -3072,8 +3193,10 @@ SSL_use_psk_identity_hint(SSL *s, const char *identity_hint) | |||
| 3072 | if (s->session == NULL) | 3193 | if (s->session == NULL) |
| 3073 | return 1; /* session not created yet, ignored */ | 3194 | return 1; /* session not created yet, ignored */ |
| 3074 | 3195 | ||
| 3075 | if (identity_hint != NULL && strlen(identity_hint) > PSK_MAX_IDENTITY_LEN) { | 3196 | if (identity_hint != NULL && strlen(identity_hint) > |
| 3076 | SSLerr(SSL_F_SSL_USE_PSK_IDENTITY_HINT, SSL_R_DATA_LENGTH_TOO_LONG); | 3197 | PSK_MAX_IDENTITY_LEN) { |
| 3198 | SSLerr(SSL_F_SSL_USE_PSK_IDENTITY_HINT, | ||
| 3199 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 3077 | return 0; | 3200 | return 0; |
| 3078 | } | 3201 | } |
| 3079 | if (s->session->psk_identity_hint != NULL) | 3202 | if (s->session->psk_identity_hint != NULL) |
| @@ -3106,7 +3229,7 @@ SSL_get_psk_identity(const SSL *s) | |||
| 3106 | void | 3229 | void |
| 3107 | SSL_set_psk_client_callback(SSL *s, | 3230 | SSL_set_psk_client_callback(SSL *s, |
| 3108 | unsigned int (*cb)(SSL *ssl, const char *hint, | 3231 | unsigned int (*cb)(SSL *ssl, const char *hint, |
| 3109 | char *identity, unsigned int max_identity_len, unsigned char *psk, | 3232 | char *identity, unsigned int max_identity_len, unsigned char *psk, |
| 3110 | unsigned int max_psk_len)) | 3233 | unsigned int max_psk_len)) |
| 3111 | { | 3234 | { |
| 3112 | s->psk_client_callback = cb; | 3235 | s->psk_client_callback = cb; |
| @@ -3115,7 +3238,7 @@ char *identity, unsigned int max_identity_len, unsigned char *psk, | |||
| 3115 | void | 3238 | void |
| 3116 | SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, | 3239 | SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, |
| 3117 | unsigned int (*cb)(SSL *ssl, const char *hint, | 3240 | unsigned int (*cb)(SSL *ssl, const char *hint, |
| 3118 | char *identity, unsigned int max_identity_len, unsigned char *psk, | 3241 | char *identity, unsigned int max_identity_len, unsigned char *psk, |
| 3119 | unsigned int max_psk_len)) | 3242 | unsigned int max_psk_len)) |
| 3120 | { | 3243 | { |
| 3121 | ctx->psk_client_callback = cb; | 3244 | ctx->psk_client_callback = cb; |
| @@ -3124,7 +3247,7 @@ char *identity, unsigned int max_identity_len, unsigned char *psk, | |||
| 3124 | void | 3247 | void |
| 3125 | SSL_set_psk_server_callback(SSL *s, | 3248 | SSL_set_psk_server_callback(SSL *s, |
| 3126 | unsigned int (*cb)(SSL *ssl, const char *identity, | 3249 | unsigned int (*cb)(SSL *ssl, const char *identity, |
| 3127 | unsigned char *psk, unsigned int max_psk_len)) | 3250 | unsigned char *psk, unsigned int max_psk_len)) |
| 3128 | { | 3251 | { |
| 3129 | s->psk_server_callback = cb; | 3252 | s->psk_server_callback = cb; |
| 3130 | } | 3253 | } |
| @@ -3132,30 +3255,33 @@ unsigned char *psk, unsigned int max_psk_len)) | |||
| 3132 | void | 3255 | void |
| 3133 | SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, | 3256 | SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, |
| 3134 | unsigned int (*cb)(SSL *ssl, const char *identity, | 3257 | unsigned int (*cb)(SSL *ssl, const char *identity, |
| 3135 | unsigned char *psk, unsigned int max_psk_len)) | 3258 | unsigned char *psk, unsigned int max_psk_len)) |
| 3136 | { | 3259 | { |
| 3137 | ctx->psk_server_callback = cb; | 3260 | ctx->psk_server_callback = cb; |
| 3138 | } | 3261 | } |
| 3139 | #endif | 3262 | #endif |
| 3140 | 3263 | ||
| 3141 | void | 3264 | void |
| 3142 | SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) | 3265 | SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, |
| 3266 | int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) | ||
| 3143 | { | 3267 | { |
| 3144 | SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb); | 3268 | SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, |
| 3269 | (void (*)(void))cb); | ||
| 3145 | } | 3270 | } |
| 3146 | 3271 | ||
| 3147 | void | 3272 | void |
| 3148 | SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) | 3273 | SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, |
| 3274 | int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) | ||
| 3149 | { | 3275 | { |
| 3150 | SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb); | 3276 | SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb); |
| 3151 | } | 3277 | } |
| 3152 | 3278 | ||
| 3153 | /* Allocates new EVP_MD_CTX and sets pointer to it into given pointer | 3279 | /* |
| 3280 | * Allocates new EVP_MD_CTX and sets pointer to it into given pointer | ||
| 3154 | * vairable, freeing EVP_MD_CTX previously stored in that variable, if | 3281 | * vairable, freeing EVP_MD_CTX previously stored in that variable, if |
| 3155 | * any. If EVP_MD pointer is passed, initializes ctx with this md | 3282 | * any. If EVP_MD pointer is passed, initializes ctx with this md |
| 3156 | * Returns newly allocated ctx; | 3283 | * Returns newly allocated ctx; |
| 3157 | */ | 3284 | */ |
| 3158 | |||
| 3159 | EVP_MD_CTX * | 3285 | EVP_MD_CTX * |
| 3160 | ssl_replace_hash(EVP_MD_CTX **hash, const EVP_MD *md) | 3286 | ssl_replace_hash(EVP_MD_CTX **hash, const EVP_MD *md) |
| 3161 | { | 3287 | { |
| @@ -3169,7 +3295,6 @@ ssl_replace_hash(EVP_MD_CTX **hash, const EVP_MD *md) | |||
| 3169 | void | 3295 | void |
| 3170 | ssl_clear_hash_ctx(EVP_MD_CTX **hash) | 3296 | ssl_clear_hash_ctx(EVP_MD_CTX **hash) |
| 3171 | { | 3297 | { |
| 3172 | |||
| 3173 | if (*hash) | 3298 | if (*hash) |
| 3174 | EVP_MD_CTX_destroy(*hash); | 3299 | EVP_MD_CTX_destroy(*hash); |
| 3175 | *hash = NULL; | 3300 | *hash = NULL; |
| @@ -3190,4 +3315,4 @@ SSL_cache_hit(SSL *s) | |||
| 3190 | IMPLEMENT_STACK_OF(SSL_CIPHER) | 3315 | IMPLEMENT_STACK_OF(SSL_CIPHER) |
| 3191 | IMPLEMENT_STACK_OF(SSL_COMP) | 3316 | IMPLEMENT_STACK_OF(SSL_COMP) |
| 3192 | IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(SSL_CIPHER, SSL_CIPHER, | 3317 | IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(SSL_CIPHER, SSL_CIPHER, |
| 3193 | ssl_cipher_id); | 3318 | ssl_cipher_id); |
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index cde564cade..830f574183 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
| @@ -160,7 +160,10 @@ | |||
| 160 | const char *SSL_version_str = OPENSSL_VERSION_TEXT; | 160 | const char *SSL_version_str = OPENSSL_VERSION_TEXT; |
| 161 | 161 | ||
| 162 | SSL3_ENC_METHOD ssl3_undef_enc_method = { | 162 | SSL3_ENC_METHOD ssl3_undef_enc_method = { |
| 163 | /* evil casts, but these functions are only called if there's a library bug */ | 163 | /* |
| 164 | * Evil casts, but these functions are only called if there's a | ||
| 165 | * library bug. | ||
| 166 | */ | ||
| 164 | (int (*)(SSL *, int))ssl_undefined_function, | 167 | (int (*)(SSL *, int))ssl_undefined_function, |
| 165 | (int (*)(SSL *, unsigned char *, int))ssl_undefined_function, | 168 | (int (*)(SSL *, unsigned char *, int))ssl_undefined_function, |
| 166 | ssl_undefined_function, | 169 | ssl_undefined_function, |
| @@ -182,9 +185,9 @@ SSL3_ENC_METHOD ssl3_undef_enc_method = { | |||
| 182 | int | 185 | int |
| 183 | SSL_clear(SSL *s) | 186 | SSL_clear(SSL *s) |
| 184 | { | 187 | { |
| 185 | |||
| 186 | if (s->method == NULL) { | 188 | if (s->method == NULL) { |
| 187 | SSLerr(SSL_F_SSL_CLEAR, SSL_R_NO_METHOD_SPECIFIED); | 189 | SSLerr(SSL_F_SSL_CLEAR, |
| 190 | SSL_R_NO_METHOD_SPECIFIED); | ||
| 188 | return (0); | 191 | return (0); |
| 189 | } | 192 | } |
| 190 | 193 | ||
| @@ -198,7 +201,8 @@ SSL_clear(SSL *s) | |||
| 198 | s->shutdown = 0; | 201 | s->shutdown = 0; |
| 199 | 202 | ||
| 200 | if (s->renegotiate) { | 203 | if (s->renegotiate) { |
| 201 | SSLerr(SSL_F_SSL_CLEAR, ERR_R_INTERNAL_ERROR); | 204 | SSLerr(SSL_F_SSL_CLEAR, |
| 205 | ERR_R_INTERNAL_ERROR); | ||
| 202 | return 0; | 206 | return 0; |
| 203 | } | 207 | } |
| 204 | 208 | ||
| @@ -226,16 +230,19 @@ SSL_clear(SSL *s) | |||
| 226 | s->first_packet = 0; | 230 | s->first_packet = 0; |
| 227 | 231 | ||
| 228 | #if 1 | 232 | #if 1 |
| 229 | /* Check to see if we were changed into a different method, if | 233 | /* |
| 230 | * so, revert back if we are not doing session-id reuse. */ | 234 | * Check to see if we were changed into a different method, if |
| 231 | if (!s->in_handshake && (s->session == NULL) && (s->method != s->ctx->method)) { | 235 | * so, revert back if we are not doing session-id reuse. |
| 236 | */ | ||
| 237 | if (!s->in_handshake && (s->session == NULL) && | ||
| 238 | (s->method != s->ctx->method)) { | ||
| 232 | s->method->ssl_free(s); | 239 | s->method->ssl_free(s); |
| 233 | s->method = s->ctx->method; | 240 | s->method = s->ctx->method; |
| 234 | if (!s->method->ssl_new(s)) | 241 | if (!s->method->ssl_new(s)) |
| 235 | return (0); | 242 | return (0); |
| 236 | } else | 243 | } else |
| 237 | #endif | 244 | #endif |
| 238 | s->method->ssl_clear(s); | 245 | s->method->ssl_clear(s); |
| 239 | return (1); | 246 | return (1); |
| 240 | } | 247 | } |
| 241 | 248 | ||
| @@ -243,14 +250,15 @@ SSL_clear(SSL *s) | |||
| 243 | int | 250 | int |
| 244 | SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth) | 251 | SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth) |
| 245 | { | 252 | { |
| 246 | STACK_OF(SSL_CIPHER) *sk; | 253 | STACK_OF(SSL_CIPHER) *sk; |
| 247 | 254 | ||
| 248 | ctx->method = meth; | 255 | ctx->method = meth; |
| 249 | 256 | ||
| 250 | sk = ssl_create_cipher_list(ctx->method, &(ctx->cipher_list), | 257 | sk = ssl_create_cipher_list(ctx->method, &(ctx->cipher_list), |
| 251 | &(ctx->cipher_list_by_id), SSL_DEFAULT_CIPHER_LIST); | 258 | &(ctx->cipher_list_by_id), SSL_DEFAULT_CIPHER_LIST); |
| 252 | if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0)) { | 259 | if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0)) { |
| 253 | SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION, SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS); | 260 | SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION, |
| 261 | SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS); | ||
| 254 | return (0); | 262 | return (0); |
| 255 | } | 263 | } |
| 256 | return (1); | 264 | return (1); |
| @@ -259,14 +267,16 @@ SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth) | |||
| 259 | SSL * | 267 | SSL * |
| 260 | SSL_new(SSL_CTX *ctx) | 268 | SSL_new(SSL_CTX *ctx) |
| 261 | { | 269 | { |
| 262 | SSL *s; | 270 | SSL *s; |
| 263 | 271 | ||
| 264 | if (ctx == NULL) { | 272 | if (ctx == NULL) { |
| 265 | SSLerr(SSL_F_SSL_NEW, SSL_R_NULL_SSL_CTX); | 273 | SSLerr(SSL_F_SSL_NEW, |
| 274 | SSL_R_NULL_SSL_CTX); | ||
| 266 | return (NULL); | 275 | return (NULL); |
| 267 | } | 276 | } |
| 268 | if (ctx->method == NULL) { | 277 | if (ctx->method == NULL) { |
| 269 | SSLerr(SSL_F_SSL_NEW, SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION); | 278 | SSLerr(SSL_F_SSL_NEW, |
| 279 | SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION); | ||
| 270 | return (NULL); | 280 | return (NULL); |
| 271 | } | 281 | } |
| 272 | 282 | ||
| @@ -283,7 +293,8 @@ SSL_new(SSL_CTX *ctx) | |||
| 283 | s->max_cert_list = ctx->max_cert_list; | 293 | s->max_cert_list = ctx->max_cert_list; |
| 284 | 294 | ||
| 285 | if (ctx->cert != NULL) { | 295 | if (ctx->cert != NULL) { |
| 286 | /* Earlier library versions used to copy the pointer to | 296 | /* |
| 297 | * Earlier library versions used to copy the pointer to | ||
| 287 | * the CERT, not its contents; only when setting new | 298 | * the CERT, not its contents; only when setting new |
| 288 | * parameters for the per-SSL copy, ssl_cert_new would be | 299 | * parameters for the per-SSL copy, ssl_cert_new would be |
| 289 | * called (and the direct reference to the per-SSL_CTX | 300 | * called (and the direct reference to the per-SSL_CTX |
| @@ -291,8 +302,8 @@ SSL_new(SSL_CTX *ctx) | |||
| 291 | * accessed for various purposes, and for that reason they | 302 | * accessed for various purposes, and for that reason they |
| 292 | * used to be known as s->ctx->default_cert). | 303 | * used to be known as s->ctx->default_cert). |
| 293 | * Now we don't look at the SSL_CTX's CERT after having | 304 | * Now we don't look at the SSL_CTX's CERT after having |
| 294 | * duplicated it once. */ | 305 | * duplicated it once. |
| 295 | 306 | */ | |
| 296 | s->cert = ssl_cert_dup(ctx->cert); | 307 | s->cert = ssl_cert_dup(ctx->cert); |
| 297 | if (s->cert == NULL) | 308 | if (s->cert == NULL) |
| 298 | goto err; | 309 | goto err; |
| @@ -362,7 +373,7 @@ SSL_new(SSL_CTX *ctx) | |||
| 362 | #endif | 373 | #endif |
| 363 | 374 | ||
| 364 | return (s); | 375 | return (s); |
| 365 | err: | 376 | err: |
| 366 | if (s != NULL) { | 377 | if (s != NULL) { |
| 367 | if (s->cert != NULL) | 378 | if (s->cert != NULL) |
| 368 | ssl_cert_free(s->cert); | 379 | ssl_cert_free(s->cert); |
| @@ -370,7 +381,8 @@ err: | |||
| 370 | SSL_CTX_free(s->ctx); /* decrement reference count */ | 381 | SSL_CTX_free(s->ctx); /* decrement reference count */ |
| 371 | free(s); | 382 | free(s); |
| 372 | } | 383 | } |
| 373 | SSLerr(SSL_F_SSL_NEW, ERR_R_MALLOC_FAILURE); | 384 | SSLerr(SSL_F_SSL_NEW, |
| 385 | ERR_R_MALLOC_FAILURE); | ||
| 374 | return (NULL); | 386 | return (NULL); |
| 375 | } | 387 | } |
| 376 | 388 | ||
| @@ -379,7 +391,8 @@ SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, | |||
| 379 | unsigned int sid_ctx_len) | 391 | unsigned int sid_ctx_len) |
| 380 | { | 392 | { |
| 381 | if (sid_ctx_len > sizeof ctx->sid_ctx) { | 393 | if (sid_ctx_len > sizeof ctx->sid_ctx) { |
| 382 | SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT, SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); | 394 | SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT, |
| 395 | SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); | ||
| 383 | return 0; | 396 | return 0; |
| 384 | } | 397 | } |
| 385 | ctx->sid_ctx_length = sid_ctx_len; | 398 | ctx->sid_ctx_length = sid_ctx_len; |
| @@ -393,7 +406,8 @@ SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, | |||
| 393 | unsigned int sid_ctx_len) | 406 | unsigned int sid_ctx_len) |
| 394 | { | 407 | { |
| 395 | if (sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) { | 408 | if (sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) { |
| 396 | SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT, SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); | 409 | SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT, |
| 410 | SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); | ||
| 397 | return 0; | 411 | return 0; |
| 398 | } | 412 | } |
| 399 | ssl->sid_ctx_length = sid_ctx_len; | 413 | ssl->sid_ctx_length = sid_ctx_len; |
| @@ -485,7 +499,7 @@ SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm) | |||
| 485 | void | 499 | void |
| 486 | SSL_free(SSL *s) | 500 | SSL_free(SSL *s) |
| 487 | { | 501 | { |
| 488 | int i; | 502 | int i; |
| 489 | 503 | ||
| 490 | if (s == NULL) | 504 | if (s == NULL) |
| 491 | return; | 505 | return; |
| @@ -550,7 +564,7 @@ SSL_free(SSL *s) | |||
| 550 | free(s->tlsext_opaque_prf_input); | 564 | free(s->tlsext_opaque_prf_input); |
| 551 | if (s->tlsext_ocsp_exts) | 565 | if (s->tlsext_ocsp_exts) |
| 552 | sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts, | 566 | sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts, |
| 553 | X509_EXTENSION_free); | 567 | X509_EXTENSION_free); |
| 554 | if (s->tlsext_ocsp_ids) | 568 | if (s->tlsext_ocsp_ids) |
| 555 | sk_OCSP_RESPID_pop_free(s->tlsext_ocsp_ids, OCSP_RESPID_free); | 569 | sk_OCSP_RESPID_pop_free(s->tlsext_ocsp_ids, OCSP_RESPID_free); |
| 556 | if (s->tlsext_ocsp_resp) | 570 | if (s->tlsext_ocsp_resp) |
| @@ -587,8 +601,7 @@ SSL_free(SSL *s) | |||
| 587 | void | 601 | void |
| 588 | SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio) | 602 | SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio) |
| 589 | { | 603 | { |
| 590 | /* If the output buffering BIO is still in place, remove it | 604 | /* If the output buffering BIO is still in place, remove it */ |
| 591 | */ | ||
| 592 | if (s->bbio != NULL) { | 605 | if (s->bbio != NULL) { |
| 593 | if (s->wbio == s->bbio) { | 606 | if (s->wbio == s->bbio) { |
| 594 | s->wbio = s->wbio->next_bio; | 607 | s->wbio = s->wbio->next_bio; |
| @@ -624,8 +637,8 @@ SSL_get_fd(const SSL *s) | |||
| 624 | int | 637 | int |
| 625 | SSL_get_rfd(const SSL *s) | 638 | SSL_get_rfd(const SSL *s) |
| 626 | { | 639 | { |
| 627 | int ret = -1; | 640 | int ret = -1; |
| 628 | BIO *b, *r; | 641 | BIO *b, *r; |
| 629 | 642 | ||
| 630 | b = SSL_get_rbio(s); | 643 | b = SSL_get_rbio(s); |
| 631 | r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); | 644 | r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); |
| @@ -637,8 +650,8 @@ SSL_get_rfd(const SSL *s) | |||
| 637 | int | 650 | int |
| 638 | SSL_get_wfd(const SSL *s) | 651 | SSL_get_wfd(const SSL *s) |
| 639 | { | 652 | { |
| 640 | int ret = -1; | 653 | int ret = -1; |
| 641 | BIO *b, *r; | 654 | BIO *b, *r; |
| 642 | 655 | ||
| 643 | b = SSL_get_wbio(s); | 656 | b = SSL_get_wbio(s); |
| 644 | r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); | 657 | r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); |
| @@ -651,34 +664,36 @@ SSL_get_wfd(const SSL *s) | |||
| 651 | int | 664 | int |
| 652 | SSL_set_fd(SSL *s, int fd) | 665 | SSL_set_fd(SSL *s, int fd) |
| 653 | { | 666 | { |
| 654 | int ret = 0; | 667 | int ret = 0; |
| 655 | BIO *bio = NULL; | 668 | BIO *bio = NULL; |
| 656 | 669 | ||
| 657 | bio = BIO_new(BIO_s_socket()); | 670 | bio = BIO_new(BIO_s_socket()); |
| 658 | 671 | ||
| 659 | if (bio == NULL) { | 672 | if (bio == NULL) { |
| 660 | SSLerr(SSL_F_SSL_SET_FD, ERR_R_BUF_LIB); | 673 | SSLerr(SSL_F_SSL_SET_FD, |
| 674 | ERR_R_BUF_LIB); | ||
| 661 | goto err; | 675 | goto err; |
| 662 | } | 676 | } |
| 663 | BIO_set_fd(bio, fd, BIO_NOCLOSE); | 677 | BIO_set_fd(bio, fd, BIO_NOCLOSE); |
| 664 | SSL_set_bio(s, bio, bio); | 678 | SSL_set_bio(s, bio, bio); |
| 665 | ret = 1; | 679 | ret = 1; |
| 666 | err: | 680 | err: |
| 667 | return (ret); | 681 | return (ret); |
| 668 | } | 682 | } |
| 669 | 683 | ||
| 670 | int | 684 | int |
| 671 | SSL_set_wfd(SSL *s, int fd) | 685 | SSL_set_wfd(SSL *s, int fd) |
| 672 | { | 686 | { |
| 673 | int ret = 0; | 687 | int ret = 0; |
| 674 | BIO *bio = NULL; | 688 | BIO *bio = NULL; |
| 675 | 689 | ||
| 676 | if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET) | 690 | if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET) |
| 677 | || ((int)BIO_get_fd(s->rbio, NULL) != fd)) { | 691 | || ((int)BIO_get_fd(s->rbio, NULL) != fd)) { |
| 678 | bio = BIO_new(BIO_s_socket()); | 692 | bio = BIO_new(BIO_s_socket()); |
| 679 | 693 | ||
| 680 | if (bio == NULL) | 694 | if (bio == NULL) { |
| 681 | { SSLerr(SSL_F_SSL_SET_WFD, ERR_R_BUF_LIB); | 695 | SSLerr(SSL_F_SSL_SET_WFD, |
| 696 | ERR_R_BUF_LIB); | ||
| 682 | goto err; | 697 | goto err; |
| 683 | } | 698 | } |
| 684 | BIO_set_fd(bio, fd, BIO_NOCLOSE); | 699 | BIO_set_fd(bio, fd, BIO_NOCLOSE); |
| @@ -686,22 +701,23 @@ SSL_set_wfd(SSL *s, int fd) | |||
| 686 | } else | 701 | } else |
| 687 | SSL_set_bio(s, SSL_get_rbio(s), SSL_get_rbio(s)); | 702 | SSL_set_bio(s, SSL_get_rbio(s), SSL_get_rbio(s)); |
| 688 | ret = 1; | 703 | ret = 1; |
| 689 | err: | 704 | err: |
| 690 | return (ret); | 705 | return (ret); |
| 691 | } | 706 | } |
| 692 | 707 | ||
| 693 | int | 708 | int |
| 694 | SSL_set_rfd(SSL *s, int fd) | 709 | SSL_set_rfd(SSL *s, int fd) |
| 695 | { | 710 | { |
| 696 | int ret = 0; | 711 | int ret = 0; |
| 697 | BIO *bio = NULL; | 712 | BIO *bio = NULL; |
| 698 | 713 | ||
| 699 | if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET) | 714 | if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET) |
| 700 | || ((int)BIO_get_fd(s->wbio, NULL) != fd)) { | 715 | || ((int)BIO_get_fd(s->wbio, NULL) != fd)) { |
| 701 | bio = BIO_new(BIO_s_socket()); | 716 | bio = BIO_new(BIO_s_socket()); |
| 702 | 717 | ||
| 703 | if (bio == NULL) { | 718 | if (bio == NULL) { |
| 704 | SSLerr(SSL_F_SSL_SET_RFD, ERR_R_BUF_LIB); | 719 | SSLerr(SSL_F_SSL_SET_RFD, |
| 720 | ERR_R_BUF_LIB); | ||
| 705 | goto err; | 721 | goto err; |
| 706 | } | 722 | } |
| 707 | BIO_set_fd(bio, fd, BIO_NOCLOSE); | 723 | BIO_set_fd(bio, fd, BIO_NOCLOSE); |
| @@ -709,7 +725,7 @@ SSL_set_rfd(SSL *s, int fd) | |||
| 709 | } else | 725 | } else |
| 710 | SSL_set_bio(s, SSL_get_wbio(s), SSL_get_wbio(s)); | 726 | SSL_set_bio(s, SSL_get_wbio(s), SSL_get_wbio(s)); |
| 711 | ret = 1; | 727 | ret = 1; |
| 712 | err: | 728 | err: |
| 713 | return (ret); | 729 | return (ret); |
| 714 | } | 730 | } |
| 715 | #endif | 731 | #endif |
| @@ -719,7 +735,7 @@ err: | |||
| 719 | size_t | 735 | size_t |
| 720 | SSL_get_finished(const SSL *s, void *buf, size_t count) | 736 | SSL_get_finished(const SSL *s, void *buf, size_t count) |
| 721 | { | 737 | { |
| 722 | size_t ret = 0; | 738 | size_t ret = 0; |
| 723 | 739 | ||
| 724 | if (s->s3 != NULL) { | 740 | if (s->s3 != NULL) { |
| 725 | ret = s->s3->tmp.finish_md_len; | 741 | ret = s->s3->tmp.finish_md_len; |
| @@ -734,7 +750,7 @@ SSL_get_finished(const SSL *s, void *buf, size_t count) | |||
| 734 | size_t | 750 | size_t |
| 735 | SSL_get_peer_finished(const SSL *s, void *buf, size_t count) | 751 | SSL_get_peer_finished(const SSL *s, void *buf, size_t count) |
| 736 | { | 752 | { |
| 737 | size_t ret = 0; | 753 | size_t ret = 0; |
| 738 | 754 | ||
| 739 | if (s->s3 != NULL) { | 755 | if (s->s3 != NULL) { |
| 740 | ret = s->s3->tmp.peer_finish_md_len; | 756 | ret = s->s3->tmp.peer_finish_md_len; |
| @@ -810,7 +826,8 @@ SSL_get_read_ahead(const SSL *s) | |||
| 810 | int | 826 | int |
| 811 | SSL_pending(const SSL *s) | 827 | SSL_pending(const SSL *s) |
| 812 | { | 828 | { |
| 813 | /* SSL_pending cannot work properly if read-ahead is enabled | 829 | /* |
| 830 | * SSL_pending cannot work properly if read-ahead is enabled | ||
| 814 | * (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)), | 831 | * (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)), |
| 815 | * and it is impossible to fix since SSL_pending cannot report | 832 | * and it is impossible to fix since SSL_pending cannot report |
| 816 | * errors that may be observed while scanning the new data. | 833 | * errors that may be observed while scanning the new data. |
| @@ -823,7 +840,7 @@ SSL_pending(const SSL *s) | |||
| 823 | X509 * | 840 | X509 * |
| 824 | SSL_get_peer_certificate(const SSL *s) | 841 | SSL_get_peer_certificate(const SSL *s) |
| 825 | { | 842 | { |
| 826 | X509 *r; | 843 | X509 *r; |
| 827 | 844 | ||
| 828 | if ((s == NULL) || (s->session == NULL)) | 845 | if ((s == NULL) || (s->session == NULL)) |
| 829 | r = NULL; | 846 | r = NULL; |
| @@ -841,32 +858,38 @@ SSL_get_peer_certificate(const SSL *s) | |||
| 841 | STACK_OF(X509) * | 858 | STACK_OF(X509) * |
| 842 | SSL_get_peer_cert_chain(const SSL *s) | 859 | SSL_get_peer_cert_chain(const SSL *s) |
| 843 | { | 860 | { |
| 844 | STACK_OF(X509) *r; | 861 | STACK_OF(X509) *r; |
| 845 | 862 | ||
| 846 | if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL)) | 863 | if ((s == NULL) || (s->session == NULL) || |
| 864 | (s->session->sess_cert == NULL)) | ||
| 847 | r = NULL; | 865 | r = NULL; |
| 848 | else | 866 | else |
| 849 | r = s->session->sess_cert->cert_chain; | 867 | r = s->session->sess_cert->cert_chain; |
| 850 | 868 | ||
| 851 | /* If we are a client, cert_chain includes the peer's own | 869 | /* |
| 870 | * If we are a client, cert_chain includes the peer's own | ||
| 852 | * certificate; | 871 | * certificate; |
| 853 | if we are a server, it does not. */ | 872 | * if we are a server, it does not. |
| 854 | 873 | */ | |
| 855 | return (r); | 874 | return (r); |
| 856 | } | 875 | } |
| 857 | 876 | ||
| 858 | /* Now in theory, since the calling process own 't' it should be safe to | 877 | /* |
| 859 | * modify. We need to be able to read f without being hassled */ | 878 | * Now in theory, since the calling process own 't' it should be safe to |
| 879 | * modify. We need to be able to read f without being hassled | ||
| 880 | */ | ||
| 860 | void | 881 | void |
| 861 | SSL_copy_session_id(SSL *t, const SSL *f) | 882 | SSL_copy_session_id(SSL *t, const SSL *f) |
| 862 | { | 883 | { |
| 863 | CERT *tmp; | 884 | CERT *tmp; |
| 864 | 885 | ||
| 865 | /* Do we need to to SSL locking? */ | 886 | /* Do we need to to SSL locking? */ |
| 866 | SSL_set_session(t, SSL_get_session(f)); | 887 | SSL_set_session(t, SSL_get_session(f)); |
| 867 | 888 | ||
| 868 | /* what if we are setup as SSLv2 but want to talk SSLv3 or | 889 | /* |
| 869 | * vice-versa */ | 890 | * What if we are setup as SSLv2 but want to talk SSLv3 or |
| 891 | * vice-versa. | ||
| 892 | */ | ||
| 870 | if (t->method != f->method) { | 893 | if (t->method != f->method) { |
| 871 | t->method->ssl_free(t); /* cleanup current */ | 894 | t->method->ssl_free(t); /* cleanup current */ |
| 872 | t->method=f->method; /* change method */ | 895 | t->method=f->method; /* change method */ |
| @@ -888,17 +911,19 @@ SSL_copy_session_id(SSL *t, const SSL *f) | |||
| 888 | int | 911 | int |
| 889 | SSL_CTX_check_private_key(const SSL_CTX *ctx) | 912 | SSL_CTX_check_private_key(const SSL_CTX *ctx) |
| 890 | { | 913 | { |
| 891 | if ((ctx == NULL) || | 914 | if ((ctx == NULL) || (ctx->cert == NULL) || |
| 892 | (ctx->cert == NULL) || | 915 | (ctx->cert->key->x509 == NULL)) { |
| 893 | (ctx->cert->key->x509 == NULL)) { | 916 | SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY, |
| 894 | SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY, SSL_R_NO_CERTIFICATE_ASSIGNED); | 917 | SSL_R_NO_CERTIFICATE_ASSIGNED); |
| 895 | return (0); | 918 | return (0); |
| 896 | } | 919 | } |
| 897 | if (ctx->cert->key->privatekey == NULL) { | 920 | if (ctx->cert->key->privatekey == NULL) { |
| 898 | SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY, SSL_R_NO_PRIVATE_KEY_ASSIGNED); | 921 | SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY, |
| 922 | SSL_R_NO_PRIVATE_KEY_ASSIGNED); | ||
| 899 | return (0); | 923 | return (0); |
| 900 | } | 924 | } |
| 901 | return (X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey)); | 925 | return (X509_check_private_key(ctx->cert->key->x509, |
| 926 | ctx->cert->key->privatekey)); | ||
| 902 | } | 927 | } |
| 903 | 928 | ||
| 904 | /* Fix this function so that it takes an optional type parameter */ | 929 | /* Fix this function so that it takes an optional type parameter */ |
| @@ -906,31 +931,34 @@ int | |||
| 906 | SSL_check_private_key(const SSL *ssl) | 931 | SSL_check_private_key(const SSL *ssl) |
| 907 | { | 932 | { |
| 908 | if (ssl == NULL) { | 933 | if (ssl == NULL) { |
| 909 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, ERR_R_PASSED_NULL_PARAMETER); | 934 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, |
| 935 | ERR_R_PASSED_NULL_PARAMETER); | ||
| 910 | return (0); | 936 | return (0); |
| 911 | } | 937 | } |
| 912 | if (ssl->cert == NULL) { | 938 | if (ssl->cert == NULL) { |
| 913 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, SSL_R_NO_CERTIFICATE_ASSIGNED); | 939 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, |
| 940 | SSL_R_NO_CERTIFICATE_ASSIGNED); | ||
| 914 | return 0; | 941 | return 0; |
| 915 | } | 942 | } |
| 916 | if (ssl->cert->key->x509 == NULL) { | 943 | if (ssl->cert->key->x509 == NULL) { |
| 917 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, SSL_R_NO_CERTIFICATE_ASSIGNED); | 944 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, |
| 945 | SSL_R_NO_CERTIFICATE_ASSIGNED); | ||
| 918 | return (0); | 946 | return (0); |
| 919 | } | 947 | } |
| 920 | if (ssl->cert->key->privatekey == NULL) { | 948 | if (ssl->cert->key->privatekey == NULL) { |
| 921 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, SSL_R_NO_PRIVATE_KEY_ASSIGNED); | 949 | SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY, |
| 950 | SSL_R_NO_PRIVATE_KEY_ASSIGNED); | ||
| 922 | return (0); | 951 | return (0); |
| 923 | } | 952 | } |
| 924 | return(X509_check_private_key(ssl->cert->key->x509, | 953 | return (X509_check_private_key(ssl->cert->key->x509, |
| 925 | ssl->cert->key->privatekey)); | 954 | ssl->cert->key->privatekey)); |
| 926 | } | 955 | } |
| 927 | 956 | ||
| 928 | int | 957 | int |
| 929 | SSL_accept(SSL *s) | 958 | SSL_accept(SSL *s) |
| 930 | { | 959 | { |
| 931 | if (s->handshake_func == 0) | 960 | if (s->handshake_func == 0) |
| 932 | /* Not properly initialized yet */ | 961 | SSL_set_accept_state(s); /* Not properly initialized yet */ |
| 933 | SSL_set_accept_state(s); | ||
| 934 | 962 | ||
| 935 | return (s->method->ssl_accept(s)); | 963 | return (s->method->ssl_accept(s)); |
| 936 | } | 964 | } |
| @@ -939,8 +967,7 @@ int | |||
| 939 | SSL_connect(SSL *s) | 967 | SSL_connect(SSL *s) |
| 940 | { | 968 | { |
| 941 | if (s->handshake_func == 0) | 969 | if (s->handshake_func == 0) |
| 942 | /* Not properly initialized yet */ | 970 | SSL_set_connect_state(s); /* Not properly initialized yet */ |
| 943 | SSL_set_connect_state(s); | ||
| 944 | 971 | ||
| 945 | return (s->method->ssl_connect(s)); | 972 | return (s->method->ssl_connect(s)); |
| 946 | } | 973 | } |
| @@ -955,7 +982,8 @@ int | |||
| 955 | SSL_read(SSL *s, void *buf, int num) | 982 | SSL_read(SSL *s, void *buf, int num) |
| 956 | { | 983 | { |
| 957 | if (s->handshake_func == 0) { | 984 | if (s->handshake_func == 0) { |
| 958 | SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED); | 985 | SSLerr(SSL_F_SSL_READ, |
| 986 | SSL_R_UNINITIALIZED); | ||
| 959 | return -1; | 987 | return -1; |
| 960 | } | 988 | } |
| 961 | 989 | ||
| @@ -970,7 +998,8 @@ int | |||
| 970 | SSL_peek(SSL *s, void *buf, int num) | 998 | SSL_peek(SSL *s, void *buf, int num) |
| 971 | { | 999 | { |
| 972 | if (s->handshake_func == 0) { | 1000 | if (s->handshake_func == 0) { |
| 973 | SSLerr(SSL_F_SSL_PEEK, SSL_R_UNINITIALIZED); | 1001 | SSLerr(SSL_F_SSL_PEEK, |
| 1002 | SSL_R_UNINITIALIZED); | ||
| 974 | return -1; | 1003 | return -1; |
| 975 | } | 1004 | } |
| 976 | 1005 | ||
| @@ -984,13 +1013,15 @@ int | |||
| 984 | SSL_write(SSL *s, const void *buf, int num) | 1013 | SSL_write(SSL *s, const void *buf, int num) |
| 985 | { | 1014 | { |
| 986 | if (s->handshake_func == 0) { | 1015 | if (s->handshake_func == 0) { |
| 987 | SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED); | 1016 | SSLerr(SSL_F_SSL_WRITE, |
| 1017 | SSL_R_UNINITIALIZED); | ||
| 988 | return -1; | 1018 | return -1; |
| 989 | } | 1019 | } |
| 990 | 1020 | ||
| 991 | if (s->shutdown & SSL_SENT_SHUTDOWN) { | 1021 | if (s->shutdown & SSL_SENT_SHUTDOWN) { |
| 992 | s->rwstate = SSL_NOTHING; | 1022 | s->rwstate = SSL_NOTHING; |
| 993 | SSLerr(SSL_F_SSL_WRITE, SSL_R_PROTOCOL_IS_SHUTDOWN); | 1023 | SSLerr(SSL_F_SSL_WRITE, |
| 1024 | SSL_R_PROTOCOL_IS_SHUTDOWN); | ||
| 994 | return (-1); | 1025 | return (-1); |
| 995 | } | 1026 | } |
| 996 | return (s->method->ssl_write(s, buf, num)); | 1027 | return (s->method->ssl_write(s, buf, num)); |
| @@ -999,14 +1030,16 @@ SSL_write(SSL *s, const void *buf, int num) | |||
| 999 | int | 1030 | int |
| 1000 | SSL_shutdown(SSL *s) | 1031 | SSL_shutdown(SSL *s) |
| 1001 | { | 1032 | { |
| 1002 | /* Note that this function behaves differently from what one might | 1033 | /* |
| 1034 | * Note that this function behaves differently from what one might | ||
| 1003 | * expect. Return values are 0 for no success (yet), | 1035 | * expect. Return values are 0 for no success (yet), |
| 1004 | * 1 for success; but calling it once is usually not enough, | 1036 | * 1 for success; but calling it once is usually not enough, |
| 1005 | * even if blocking I/O is used (see ssl3_shutdown). | 1037 | * even if blocking I/O is used (see ssl3_shutdown). |
| 1006 | */ | 1038 | */ |
| 1007 | 1039 | ||
| 1008 | if (s->handshake_func == 0) { | 1040 | if (s->handshake_func == 0) { |
| 1009 | SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED); | 1041 | SSLerr(SSL_F_SSL_SHUTDOWN, |
| 1042 | SSL_R_UNINITIALIZED); | ||
| 1010 | return -1; | 1043 | return -1; |
| 1011 | } | 1044 | } |
| 1012 | 1045 | ||
| @@ -1041,15 +1074,17 @@ SSL_renegotiate_abbreviated(SSL *s) | |||
| 1041 | int | 1074 | int |
| 1042 | SSL_renegotiate_pending(SSL *s) | 1075 | SSL_renegotiate_pending(SSL *s) |
| 1043 | { | 1076 | { |
| 1044 | /* becomes true when negotiation is requested; | 1077 | /* |
| 1045 | * false again once a handshake has finished */ | 1078 | * Becomes true when negotiation is requested; |
| 1079 | * false again once a handshake has finished. | ||
| 1080 | */ | ||
| 1046 | return (s->renegotiate != 0); | 1081 | return (s->renegotiate != 0); |
| 1047 | } | 1082 | } |
| 1048 | 1083 | ||
| 1049 | long | 1084 | long |
| 1050 | SSL_ctrl(SSL *s, int cmd, long larg, void *parg) | 1085 | SSL_ctrl(SSL *s, int cmd, long larg, void *parg) |
| 1051 | { | 1086 | { |
| 1052 | long l; | 1087 | long l; |
| 1053 | 1088 | ||
| 1054 | switch (cmd) { | 1089 | switch (cmd) { |
| 1055 | case SSL_CTRL_GET_READ_AHEAD: | 1090 | case SSL_CTRL_GET_READ_AHEAD: |
| @@ -1084,7 +1119,7 @@ SSL_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
| 1084 | #endif | 1119 | #endif |
| 1085 | 1120 | ||
| 1086 | if (SSL_version(s) == DTLS1_VERSION || | 1121 | if (SSL_version(s) == DTLS1_VERSION || |
| 1087 | SSL_version(s) == DTLS1_BAD_VER) { | 1122 | SSL_version(s) == DTLS1_BAD_VER) { |
| 1088 | s->d1->mtu = larg; | 1123 | s->d1->mtu = larg; |
| 1089 | return larg; | 1124 | return larg; |
| 1090 | } | 1125 | } |
| @@ -1108,7 +1143,9 @@ SSL_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | |||
| 1108 | { | 1143 | { |
| 1109 | switch (cmd) { | 1144 | switch (cmd) { |
| 1110 | case SSL_CTRL_SET_MSG_CALLBACK: | 1145 | case SSL_CTRL_SET_MSG_CALLBACK: |
| 1111 | s->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp); | 1146 | s->msg_callback = (void (*)(int write_p, int version, |
| 1147 | int content_type, const void *buf, size_t len, | ||
| 1148 | SSL *ssl, void *arg))(fp); | ||
| 1112 | return 1; | 1149 | return 1; |
| 1113 | 1150 | ||
| 1114 | default: | 1151 | default: |
| @@ -1125,7 +1162,7 @@ SSL_CTX_sessions(SSL_CTX *ctx) | |||
| 1125 | long | 1162 | long |
| 1126 | SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | 1163 | SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) |
| 1127 | { | 1164 | { |
| 1128 | long l; | 1165 | long l; |
| 1129 | 1166 | ||
| 1130 | switch (cmd) { | 1167 | switch (cmd) { |
| 1131 | case SSL_CTRL_GET_READ_AHEAD: | 1168 | case SSL_CTRL_GET_READ_AHEAD: |
| @@ -1206,7 +1243,9 @@ SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | |||
| 1206 | { | 1243 | { |
| 1207 | switch (cmd) { | 1244 | switch (cmd) { |
| 1208 | case SSL_CTRL_SET_MSG_CALLBACK: | 1245 | case SSL_CTRL_SET_MSG_CALLBACK: |
| 1209 | ctx->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp); | 1246 | ctx->msg_callback = (void (*)(int write_p, int version, |
| 1247 | int content_type, const void *buf, size_t len, SSL *ssl, | ||
| 1248 | void *arg))(fp); | ||
| 1210 | return 1; | 1249 | return 1; |
| 1211 | 1250 | ||
| 1212 | default: | 1251 | default: |
| @@ -1217,7 +1256,7 @@ SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | |||
| 1217 | int | 1256 | int |
| 1218 | ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b) | 1257 | ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b) |
| 1219 | { | 1258 | { |
| 1220 | long l; | 1259 | long l; |
| 1221 | 1260 | ||
| 1222 | l = a->id - b->id; | 1261 | l = a->id - b->id; |
| 1223 | if (l == 0L) | 1262 | if (l == 0L) |
| @@ -1230,7 +1269,7 @@ int | |||
| 1230 | ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap, | 1269 | ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap, |
| 1231 | const SSL_CIPHER * const *bp) | 1270 | const SSL_CIPHER * const *bp) |
| 1232 | { | 1271 | { |
| 1233 | long l; | 1272 | long l; |
| 1234 | 1273 | ||
| 1235 | l = (*ap)->id - (*bp)->id; | 1274 | l = (*ap)->id - (*bp)->id; |
| 1236 | if (l == 0L) | 1275 | if (l == 0L) |
| @@ -1239,24 +1278,27 @@ ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap, | |||
| 1239 | return ((l > 0) ? 1:-1); | 1278 | return ((l > 0) ? 1:-1); |
| 1240 | } | 1279 | } |
| 1241 | 1280 | ||
| 1242 | /** return a STACK of the ciphers available for the SSL and in order of | 1281 | /* |
| 1243 | * preference */ | 1282 | * Return a STACK of the ciphers available for the SSL and in order of |
| 1283 | * preference. | ||
| 1284 | */ | ||
| 1244 | STACK_OF(SSL_CIPHER) * | 1285 | STACK_OF(SSL_CIPHER) * |
| 1245 | SSL_get_ciphers(const SSL *s) | 1286 | SSL_get_ciphers(const SSL *s) |
| 1246 | { | 1287 | { |
| 1247 | if (s != NULL) { | 1288 | if (s != NULL) { |
| 1248 | if (s->cipher_list != NULL) { | 1289 | if (s->cipher_list != NULL) { |
| 1249 | return (s->cipher_list); | 1290 | return (s->cipher_list); |
| 1250 | } else if ((s->ctx != NULL) && | 1291 | } else if ((s->ctx != NULL) && (s->ctx->cipher_list != NULL)) { |
| 1251 | (s->ctx->cipher_list != NULL)) { | ||
| 1252 | return (s->ctx->cipher_list); | 1292 | return (s->ctx->cipher_list); |
| 1253 | } | 1293 | } |
| 1254 | } | 1294 | } |
| 1255 | return (NULL); | 1295 | return (NULL); |
| 1256 | } | 1296 | } |
| 1257 | 1297 | ||
| 1258 | /** return a STACK of the ciphers available for the SSL and in order of | 1298 | /* |
| 1259 | * algorithm id */ | 1299 | * Return a STACK of the ciphers available for the SSL and in order of |
| 1300 | * algorithm id. | ||
| 1301 | */ | ||
| 1260 | STACK_OF(SSL_CIPHER) * | 1302 | STACK_OF(SSL_CIPHER) * |
| 1261 | ssl_get_ciphers_by_id(SSL *s) | 1303 | ssl_get_ciphers_by_id(SSL *s) |
| 1262 | { | 1304 | { |
| @@ -1264,19 +1306,19 @@ ssl_get_ciphers_by_id(SSL *s) | |||
| 1264 | if (s->cipher_list_by_id != NULL) { | 1306 | if (s->cipher_list_by_id != NULL) { |
| 1265 | return (s->cipher_list_by_id); | 1307 | return (s->cipher_list_by_id); |
| 1266 | } else if ((s->ctx != NULL) && | 1308 | } else if ((s->ctx != NULL) && |
| 1267 | (s->ctx->cipher_list_by_id != NULL)) { | 1309 | (s->ctx->cipher_list_by_id != NULL)) { |
| 1268 | return (s->ctx->cipher_list_by_id); | 1310 | return (s->ctx->cipher_list_by_id); |
| 1269 | } | 1311 | } |
| 1270 | } | 1312 | } |
| 1271 | return (NULL); | 1313 | return (NULL); |
| 1272 | } | 1314 | } |
| 1273 | 1315 | ||
| 1274 | /** The old interface to get the same thing as SSL_get_ciphers() */ | 1316 | /* The old interface to get the same thing as SSL_get_ciphers(). */ |
| 1275 | const char * | 1317 | const char * |
| 1276 | SSL_get_cipher_list(const SSL *s, int n) | 1318 | SSL_get_cipher_list(const SSL *s, int n) |
| 1277 | { | 1319 | { |
| 1278 | SSL_CIPHER *c; | 1320 | SSL_CIPHER *c; |
| 1279 | STACK_OF(SSL_CIPHER) *sk; | 1321 | STACK_OF(SSL_CIPHER) *sk; |
| 1280 | 1322 | ||
| 1281 | if (s == NULL) | 1323 | if (s == NULL) |
| 1282 | return (NULL); | 1324 | return (NULL); |
| @@ -1289,35 +1331,38 @@ SSL_get_cipher_list(const SSL *s, int n) | |||
| 1289 | return (c->name); | 1331 | return (c->name); |
| 1290 | } | 1332 | } |
| 1291 | 1333 | ||
| 1292 | /** specify the ciphers to be used by default by the SSL_CTX */ | 1334 | /* Specify the ciphers to be used by default by the SSL_CTX. */ |
| 1293 | int | 1335 | int |
| 1294 | SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str) | 1336 | SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str) |
| 1295 | { | 1337 | { |
| 1296 | STACK_OF(SSL_CIPHER) *sk; | 1338 | STACK_OF(SSL_CIPHER) *sk; |
| 1297 | 1339 | ||
| 1298 | sk = ssl_create_cipher_list(ctx->method, &ctx->cipher_list, | 1340 | sk = ssl_create_cipher_list(ctx->method, &ctx->cipher_list, |
| 1299 | &ctx->cipher_list_by_id, str); | 1341 | &ctx->cipher_list_by_id, str); |
| 1300 | /* ssl_create_cipher_list may return an empty stack if it | 1342 | /* |
| 1343 | * ssl_create_cipher_list may return an empty stack if it | ||
| 1301 | * was unable to find a cipher matching the given rule string | 1344 | * was unable to find a cipher matching the given rule string |
| 1302 | * (for example if the rule string specifies a cipher which | 1345 | * (for example if the rule string specifies a cipher which |
| 1303 | * has been disabled). This is not an error as far as | 1346 | * has been disabled). This is not an error as far as |
| 1304 | * ssl_create_cipher_list is concerned, and hence | 1347 | * ssl_create_cipher_list is concerned, and hence |
| 1305 | * ctx->cipher_list and ctx->cipher_list_by_id has been | 1348 | * ctx->cipher_list and ctx->cipher_list_by_id has been |
| 1306 | * updated. */ | 1349 | * updated. |
| 1350 | */ | ||
| 1307 | if (sk == NULL) | 1351 | if (sk == NULL) |
| 1308 | return 0; | 1352 | return 0; |
| 1309 | else if (sk_SSL_CIPHER_num(sk) == 0) { | 1353 | else if (sk_SSL_CIPHER_num(sk) == 0) { |
| 1310 | SSLerr(SSL_F_SSL_CTX_SET_CIPHER_LIST, SSL_R_NO_CIPHER_MATCH); | 1354 | SSLerr(SSL_F_SSL_CTX_SET_CIPHER_LIST, |
| 1355 | SSL_R_NO_CIPHER_MATCH); | ||
| 1311 | return 0; | 1356 | return 0; |
| 1312 | } | 1357 | } |
| 1313 | return 1; | 1358 | return 1; |
| 1314 | } | 1359 | } |
| 1315 | 1360 | ||
| 1316 | /** specify the ciphers to be used by the SSL */ | 1361 | /* Specify the ciphers to be used by the SSL. */ |
| 1317 | int | 1362 | int |
| 1318 | SSL_set_cipher_list(SSL *s, const char *str) | 1363 | SSL_set_cipher_list(SSL *s, const char *str) |
| 1319 | { | 1364 | { |
| 1320 | STACK_OF(SSL_CIPHER) *sk; | 1365 | STACK_OF(SSL_CIPHER) *sk; |
| 1321 | 1366 | ||
| 1322 | sk = ssl_create_cipher_list(s->ctx->method, &s->cipher_list, | 1367 | sk = ssl_create_cipher_list(s->ctx->method, &s->cipher_list, |
| 1323 | &s->cipher_list_by_id, str); | 1368 | &s->cipher_list_by_id, str); |
| @@ -1325,7 +1370,8 @@ SSL_set_cipher_list(SSL *s, const char *str) | |||
| 1325 | if (sk == NULL) | 1370 | if (sk == NULL) |
| 1326 | return 0; | 1371 | return 0; |
| 1327 | else if (sk_SSL_CIPHER_num(sk) == 0) { | 1372 | else if (sk_SSL_CIPHER_num(sk) == 0) { |
| 1328 | SSLerr(SSL_F_SSL_SET_CIPHER_LIST, SSL_R_NO_CIPHER_MATCH); | 1373 | SSLerr(SSL_F_SSL_SET_CIPHER_LIST, |
| 1374 | SSL_R_NO_CIPHER_MATCH); | ||
| 1329 | return 0; | 1375 | return 0; |
| 1330 | } | 1376 | } |
| 1331 | return 1; | 1377 | return 1; |
| @@ -1335,11 +1381,11 @@ SSL_set_cipher_list(SSL *s, const char *str) | |||
| 1335 | char * | 1381 | char * |
| 1336 | SSL_get_shared_ciphers(const SSL *s, char *buf, int len) | 1382 | SSL_get_shared_ciphers(const SSL *s, char *buf, int len) |
| 1337 | { | 1383 | { |
| 1338 | char *end; | 1384 | char *end; |
| 1339 | STACK_OF(SSL_CIPHER) *sk; | 1385 | STACK_OF(SSL_CIPHER) *sk; |
| 1340 | SSL_CIPHER *c; | 1386 | SSL_CIPHER *c; |
| 1341 | size_t curlen = 0; | 1387 | size_t curlen = 0; |
| 1342 | int i; | 1388 | int i; |
| 1343 | 1389 | ||
| 1344 | if ((s->session == NULL) || (s->session->ciphers == NULL) || | 1390 | if ((s->session == NULL) || (s->session->ciphers == NULL) || |
| 1345 | (len < 2)) | 1391 | (len < 2)) |
| @@ -1351,7 +1397,7 @@ SSL_get_shared_ciphers(const SSL *s, char *buf, int len) | |||
| 1351 | c = sk_SSL_CIPHER_value(sk, i); | 1397 | c = sk_SSL_CIPHER_value(sk, i); |
| 1352 | end = buf + curlen; | 1398 | end = buf + curlen; |
| 1353 | if (strlcat(buf, c->name, len) >= len || | 1399 | if (strlcat(buf, c->name, len) >= len || |
| 1354 | (curlen = strlcat(buf, ":", len)) >= len) { | 1400 | (curlen = strlcat(buf, ":", len)) >= len) { |
| 1355 | /* remove truncated cipher from list */ | 1401 | /* remove truncated cipher from list */ |
| 1356 | *end = '\0'; | 1402 | *end = '\0'; |
| 1357 | break; | 1403 | break; |
| @@ -1367,11 +1413,11 @@ int | |||
| 1367 | ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, | 1413 | ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, |
| 1368 | int (*put_cb)(const SSL_CIPHER *, unsigned char *)) | 1414 | int (*put_cb)(const SSL_CIPHER *, unsigned char *)) |
| 1369 | { | 1415 | { |
| 1370 | int i, j = 0; | 1416 | int i, j = 0; |
| 1371 | SSL_CIPHER *c; | 1417 | SSL_CIPHER *c; |
| 1372 | unsigned char *q; | 1418 | unsigned char *q; |
| 1373 | #ifndef OPENSSL_NO_KRB5 | 1419 | #ifndef OPENSSL_NO_KRB5 |
| 1374 | int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx); | 1420 | int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx); |
| 1375 | #endif /* OPENSSL_NO_KRB5 */ | 1421 | #endif /* OPENSSL_NO_KRB5 */ |
| 1376 | 1422 | ||
| 1377 | if (sk == NULL) | 1423 | if (sk == NULL) |
| @@ -1382,30 +1428,33 @@ ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, | |||
| 1382 | c = sk_SSL_CIPHER_value(sk, i); | 1428 | c = sk_SSL_CIPHER_value(sk, i); |
| 1383 | /* Skip TLS v1.2 only ciphersuites if lower than v1.2 */ | 1429 | /* Skip TLS v1.2 only ciphersuites if lower than v1.2 */ |
| 1384 | if ((c->algorithm_ssl & SSL_TLSV1_2) && | 1430 | if ((c->algorithm_ssl & SSL_TLSV1_2) && |
| 1385 | (TLS1_get_client_version(s) < TLS1_2_VERSION)) | 1431 | (TLS1_get_client_version(s) < TLS1_2_VERSION)) |
| 1386 | continue; | 1432 | continue; |
| 1387 | #ifndef OPENSSL_NO_KRB5 | 1433 | #ifndef OPENSSL_NO_KRB5 |
| 1388 | if (((c->algorithm_mkey & SSL_kKRB5) || (c->algorithm_auth & SSL_aKRB5)) && | 1434 | if (((c->algorithm_mkey & SSL_kKRB5) || |
| 1389 | nokrb5) | 1435 | (c->algorithm_auth & SSL_aKRB5)) && nokrb5) |
| 1390 | continue; | 1436 | continue; |
| 1391 | #endif /* OPENSSL_NO_KRB5 */ | 1437 | #endif /* OPENSSL_NO_KRB5 */ |
| 1392 | #ifndef OPENSSL_NO_PSK | 1438 | #ifndef OPENSSL_NO_PSK |
| 1393 | /* with PSK there must be client callback set */ | 1439 | /* with PSK there must be client callback set */ |
| 1394 | if (((c->algorithm_mkey & SSL_kPSK) || (c->algorithm_auth & SSL_aPSK)) && | 1440 | if (((c->algorithm_mkey & SSL_kPSK) || |
| 1395 | s->psk_client_callback == NULL) | 1441 | (c->algorithm_auth & SSL_aPSK)) && |
| 1396 | continue; | 1442 | s->psk_client_callback == NULL) |
| 1443 | continue; | ||
| 1397 | #endif /* OPENSSL_NO_PSK */ | 1444 | #endif /* OPENSSL_NO_PSK */ |
| 1398 | j = put_cb ? put_cb(c, p) : ssl_put_cipher_by_char(s, c, p); | 1445 | j = put_cb ? put_cb(c, p) : ssl_put_cipher_by_char(s, c, p); |
| 1399 | p += j; | 1446 | p += j; |
| 1400 | } | 1447 | } |
| 1401 | /* If p == q, no ciphers and caller indicates an error. Otherwise | 1448 | /* |
| 1449 | * If p == q, no ciphers and caller indicates an error. Otherwise | ||
| 1402 | * add SCSV if not renegotiating. | 1450 | * add SCSV if not renegotiating. |
| 1403 | */ | 1451 | */ |
| 1404 | if (p != q && !s->renegotiate) { | 1452 | if (p != q && !s->renegotiate) { |
| 1405 | static SSL_CIPHER scsv = { | 1453 | static SSL_CIPHER scsv = { |
| 1406 | 0, NULL, SSL3_CK_SCSV, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 1454 | 0, NULL, SSL3_CK_SCSV, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
| 1407 | }; | 1455 | }; |
| 1408 | j = put_cb ? put_cb(&scsv, p) : ssl_put_cipher_by_char(s, &scsv, p); | 1456 | j = put_cb ? put_cb(&scsv, p) : |
| 1457 | ssl_put_cipher_by_char(s, &scsv, p); | ||
| 1409 | p += j; | 1458 | p += j; |
| 1410 | #ifdef OPENSSL_RI_DEBUG | 1459 | #ifdef OPENSSL_RI_DEBUG |
| 1411 | fprintf(stderr, "SCSV sent by client\n"); | 1460 | fprintf(stderr, "SCSV sent by client\n"); |
| @@ -1419,15 +1468,17 @@ STACK_OF(SSL_CIPHER) * | |||
| 1419 | ssl_bytes_to_cipher_list(SSL *s, unsigned char *p, int num, | 1468 | ssl_bytes_to_cipher_list(SSL *s, unsigned char *p, int num, |
| 1420 | STACK_OF(SSL_CIPHER) **skp) | 1469 | STACK_OF(SSL_CIPHER) **skp) |
| 1421 | { | 1470 | { |
| 1422 | const SSL_CIPHER *c; | 1471 | const SSL_CIPHER *c; |
| 1423 | STACK_OF(SSL_CIPHER) *sk; | 1472 | STACK_OF(SSL_CIPHER) *sk; |
| 1424 | int i, n; | 1473 | int i, n; |
| 1474 | |||
| 1425 | if (s->s3) | 1475 | if (s->s3) |
| 1426 | s->s3->send_connection_binding = 0; | 1476 | s->s3->send_connection_binding = 0; |
| 1427 | 1477 | ||
| 1428 | n = ssl_put_cipher_by_char(s, NULL, NULL); | 1478 | n = ssl_put_cipher_by_char(s, NULL, NULL); |
| 1429 | if ((num % n) != 0) { | 1479 | if ((num % n) != 0) { |
| 1430 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST); | 1480 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, |
| 1481 | SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST); | ||
| 1431 | return (NULL); | 1482 | return (NULL); |
| 1432 | } | 1483 | } |
| 1433 | if ((skp == NULL) || (*skp == NULL)) | 1484 | if ((skp == NULL) || (*skp == NULL)) |
| @@ -1440,12 +1491,14 @@ ssl_bytes_to_cipher_list(SSL *s, unsigned char *p, int num, | |||
| 1440 | for (i = 0; i < num; i += n) { | 1491 | for (i = 0; i < num; i += n) { |
| 1441 | /* Check for SCSV */ | 1492 | /* Check for SCSV */ |
| 1442 | if (s->s3 && (n != 3 || !p[0]) && | 1493 | if (s->s3 && (n != 3 || !p[0]) && |
| 1443 | (p[n - 2] == ((SSL3_CK_SCSV >> 8) & 0xff)) && | 1494 | (p[n - 2] == ((SSL3_CK_SCSV >> 8) & 0xff)) && |
| 1444 | (p[n - 1] == (SSL3_CK_SCSV & 0xff))) { | 1495 | (p[n - 1] == (SSL3_CK_SCSV & 0xff))) { |
| 1445 | /* SCSV fatal if renegotiating */ | 1496 | /* SCSV fatal if renegotiating */ |
| 1446 | if (s->renegotiate) { | 1497 | if (s->renegotiate) { |
| 1447 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING); | 1498 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, |
| 1448 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 1499 | SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING); |
| 1500 | ssl3_send_alert(s, SSL3_AL_FATAL, | ||
| 1501 | SSL_AD_HANDSHAKE_FAILURE); | ||
| 1449 | 1502 | ||
| 1450 | goto err; | 1503 | goto err; |
| 1451 | } | 1504 | } |
| @@ -1461,7 +1514,8 @@ ssl_bytes_to_cipher_list(SSL *s, unsigned char *p, int num, | |||
| 1461 | p += n; | 1514 | p += n; |
| 1462 | if (c != NULL) { | 1515 | if (c != NULL) { |
| 1463 | if (!sk_SSL_CIPHER_push(sk, c)) { | 1516 | if (!sk_SSL_CIPHER_push(sk, c)) { |
| 1464 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, ERR_R_MALLOC_FAILURE); | 1517 | SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST, |
| 1518 | ERR_R_MALLOC_FAILURE); | ||
| 1465 | goto err; | 1519 | goto err; |
| 1466 | } | 1520 | } |
| 1467 | } | 1521 | } |
| @@ -1470,7 +1524,7 @@ ssl_bytes_to_cipher_list(SSL *s, unsigned char *p, int num, | |||
| 1470 | if (skp != NULL) | 1524 | if (skp != NULL) |
| 1471 | *skp = sk; | 1525 | *skp = sk; |
| 1472 | return (sk); | 1526 | return (sk); |
| 1473 | err: | 1527 | err: |
| 1474 | if ((skp == NULL) || (*skp == NULL)) | 1528 | if ((skp == NULL) || (*skp == NULL)) |
| 1475 | sk_SSL_CIPHER_free(sk); | 1529 | sk_SSL_CIPHER_free(sk); |
| 1476 | return (NULL); | 1530 | return (NULL); |
| @@ -1478,10 +1532,10 @@ err: | |||
| 1478 | 1532 | ||
| 1479 | 1533 | ||
| 1480 | #ifndef OPENSSL_NO_TLSEXT | 1534 | #ifndef OPENSSL_NO_TLSEXT |
| 1481 | /** return a servername extension value if provided in Client Hello, or NULL. | 1535 | /* |
| 1536 | * Return a servername extension value if provided in Client Hello, or NULL. | ||
| 1482 | * So far, only host_name types are defined (RFC 3546). | 1537 | * So far, only host_name types are defined (RFC 3546). |
| 1483 | */ | 1538 | */ |
| 1484 | |||
| 1485 | const char * | 1539 | const char * |
| 1486 | SSL_get_servername(const SSL *s, const int type) | 1540 | SSL_get_servername(const SSL *s, const int type) |
| 1487 | { | 1541 | { |
| @@ -1489,20 +1543,23 @@ SSL_get_servername(const SSL *s, const int type) | |||
| 1489 | return NULL; | 1543 | return NULL; |
| 1490 | 1544 | ||
| 1491 | return s->session && !s->tlsext_hostname ? | 1545 | return s->session && !s->tlsext_hostname ? |
| 1492 | s->session->tlsext_hostname : | 1546 | s->session->tlsext_hostname : |
| 1493 | s->tlsext_hostname; | 1547 | s->tlsext_hostname; |
| 1494 | } | 1548 | } |
| 1495 | 1549 | ||
| 1496 | int | 1550 | int |
| 1497 | SSL_get_servername_type(const SSL *s) | 1551 | SSL_get_servername_type(const SSL *s) |
| 1498 | { | 1552 | { |
| 1499 | if (s->session && (!s->tlsext_hostname ? s->session->tlsext_hostname : s->tlsext_hostname)) | 1553 | if (s->session && |
| 1554 | (!s->tlsext_hostname ? | ||
| 1555 | s->session->tlsext_hostname : s->tlsext_hostname)) | ||
| 1500 | return TLSEXT_NAMETYPE_host_name; | 1556 | return TLSEXT_NAMETYPE_host_name; |
| 1501 | return -1; | 1557 | return -1; |
| 1502 | } | 1558 | } |
| 1503 | 1559 | ||
| 1504 | # ifndef OPENSSL_NO_NEXTPROTONEG | 1560 | # ifndef OPENSSL_NO_NEXTPROTONEG |
| 1505 | /* SSL_select_next_proto implements the standard protocol selection. It is | 1561 | /* |
| 1562 | * SSL_select_next_proto implements the standard protocol selection. It is | ||
| 1506 | * expected that this function is called from the callback set by | 1563 | * expected that this function is called from the callback set by |
| 1507 | * SSL_CTX_set_next_proto_select_cb. | 1564 | * SSL_CTX_set_next_proto_select_cb. |
| 1508 | * | 1565 | * |
| @@ -1533,17 +1590,23 @@ SSL_get_servername_type(const SSL *s) | |||
| 1533 | * OPENSSL_NPN_NO_OVERLAP if the fallback case was reached. | 1590 | * OPENSSL_NPN_NO_OVERLAP if the fallback case was reached. |
| 1534 | */ | 1591 | */ |
| 1535 | int | 1592 | int |
| 1536 | SSL_select_next_proto(unsigned char **out, unsigned char *outlen, const unsigned char *server, unsigned int server_len, const unsigned char *client, unsigned int client_len) | 1593 | SSL_select_next_proto(unsigned char **out, unsigned char *outlen, |
| 1594 | const unsigned char *server, unsigned int server_len, | ||
| 1595 | const unsigned char *client, unsigned int client_len) | ||
| 1537 | { | 1596 | { |
| 1538 | unsigned int i, j; | 1597 | unsigned int i, j; |
| 1539 | const unsigned char *result; | 1598 | const unsigned char *result; |
| 1540 | int status = OPENSSL_NPN_UNSUPPORTED; | 1599 | int status = OPENSSL_NPN_UNSUPPORTED; |
| 1541 | 1600 | ||
| 1542 | /* For each protocol in server preference order, see if we support it. */ | 1601 | /* |
| 1602 | * For each protocol in server preference order, | ||
| 1603 | * see if we support it. | ||
| 1604 | */ | ||
| 1543 | for (i = 0; i < server_len; ) { | 1605 | for (i = 0; i < server_len; ) { |
| 1544 | for (j = 0; j < client_len; ) { | 1606 | for (j = 0; j < client_len; ) { |
| 1545 | if (server[i] == client[j] && | 1607 | if (server[i] == client[j] && |
| 1546 | memcmp(&server[i + 1], &client[j + 1], server[i]) == 0) { | 1608 | memcmp(&server[i + 1], |
| 1609 | &client[j + 1], server[i]) == 0) { | ||
| 1547 | /* We found a match */ | 1610 | /* We found a match */ |
| 1548 | result = &server[i]; | 1611 | result = &server[i]; |
| 1549 | status = OPENSSL_NPN_NEGOTIATED; | 1612 | status = OPENSSL_NPN_NEGOTIATED; |
| @@ -1560,13 +1623,14 @@ SSL_select_next_proto(unsigned char **out, unsigned char *outlen, const unsigned | |||
| 1560 | result = client; | 1623 | result = client; |
| 1561 | status = OPENSSL_NPN_NO_OVERLAP; | 1624 | status = OPENSSL_NPN_NO_OVERLAP; |
| 1562 | 1625 | ||
| 1563 | found: | 1626 | found: |
| 1564 | *out = (unsigned char *) result + 1; | 1627 | *out = (unsigned char *) result + 1; |
| 1565 | *outlen = result[0]; | 1628 | *outlen = result[0]; |
| 1566 | return status; | 1629 | return status; |
| 1567 | } | 1630 | } |
| 1568 | 1631 | ||
| 1569 | /* SSL_get0_next_proto_negotiated sets *data and *len to point to the client's | 1632 | /* |
| 1633 | * SSL_get0_next_proto_negotiated sets *data and *len to point to the client's | ||
| 1570 | * requested protocol for this connection and returns 0. If the client didn't | 1634 | * requested protocol for this connection and returns 0. If the client didn't |
| 1571 | * request any protocol, then *data is set to NULL. | 1635 | * request any protocol, then *data is set to NULL. |
| 1572 | * | 1636 | * |
| @@ -1575,7 +1639,8 @@ SSL_select_next_proto(unsigned char **out, unsigned char *outlen, const unsigned | |||
| 1575 | * provided by the callback. | 1639 | * provided by the callback. |
| 1576 | */ | 1640 | */ |
| 1577 | void | 1641 | void |
| 1578 | SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, unsigned *len) | 1642 | SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, |
| 1643 | unsigned *len) | ||
| 1579 | { | 1644 | { |
| 1580 | *data = s->next_proto_negotiated; | 1645 | *data = s->next_proto_negotiated; |
| 1581 | if (!*data) { | 1646 | if (!*data) { |
| @@ -1585,23 +1650,27 @@ SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, unsigne | |||
| 1585 | } | 1650 | } |
| 1586 | } | 1651 | } |
| 1587 | 1652 | ||
| 1588 | /* SSL_CTX_set_next_protos_advertised_cb sets a callback that is called when a | 1653 | /* |
| 1654 | * SSL_CTX_set_next_protos_advertised_cb sets a callback that is called when a | ||
| 1589 | * TLS server needs a list of supported protocols for Next Protocol | 1655 | * TLS server needs a list of supported protocols for Next Protocol |
| 1590 | * Negotiation. The returned list must be in wire format. The list is returned | 1656 | * Negotiation. The returned list must be in wire format. The list is returned |
| 1591 | * by setting |out| to point to it and |outlen| to its length. This memory will | 1657 | * by setting |out| to point to it and |outlen| to its length. This memory will |
| 1592 | * not be modified, but one should assume that the SSL* keeps a reference to | 1658 | * not be modified, but one should assume that the SSL* keeps a reference to |
| 1593 | * it. | 1659 | * it. |
| 1594 | * | 1660 | * |
| 1595 | * The callback should return SSL_TLSEXT_ERR_OK if it wishes to advertise. Otherwise, no | 1661 | * The callback should return SSL_TLSEXT_ERR_OK if it wishes to advertise. |
| 1596 | * such extension will be included in the ServerHello. */ | 1662 | * Otherwise, no such extension will be included in the ServerHello. |
| 1663 | */ | ||
| 1597 | void | 1664 | void |
| 1598 | SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, const unsigned char **out, unsigned int *outlen, void *arg), void *arg) | 1665 | SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, |
| 1666 | const unsigned char **out, unsigned int *outlen, void *arg), void *arg) | ||
| 1599 | { | 1667 | { |
| 1600 | ctx->next_protos_advertised_cb = cb; | 1668 | ctx->next_protos_advertised_cb = cb; |
| 1601 | ctx->next_protos_advertised_cb_arg = arg; | 1669 | ctx->next_protos_advertised_cb_arg = arg; |
| 1602 | } | 1670 | } |
| 1603 | 1671 | ||
| 1604 | /* SSL_CTX_set_next_proto_select_cb sets a callback that is called when a | 1672 | /* |
| 1673 | * SSL_CTX_set_next_proto_select_cb sets a callback that is called when a | ||
| 1605 | * client needs to select a protocol from the server's provided list. |out| | 1674 | * client needs to select a protocol from the server's provided list. |out| |
| 1606 | * must be set to point to the selected protocol (which may be within |in|). | 1675 | * must be set to point to the selected protocol (which may be within |in|). |
| 1607 | * The length of the protocol name must be written into |outlen|. The server's | 1676 | * The length of the protocol name must be written into |outlen|. The server's |
| @@ -1612,7 +1681,9 @@ SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, const u | |||
| 1612 | * callback returns a value other than SSL_TLSEXT_ERR_OK. | 1681 | * callback returns a value other than SSL_TLSEXT_ERR_OK. |
| 1613 | */ | 1682 | */ |
| 1614 | void | 1683 | void |
| 1615 | SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg), void *arg) | 1684 | SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, |
| 1685 | unsigned char **out, unsigned char *outlen, const unsigned char *in, | ||
| 1686 | unsigned int inlen, void *arg), void *arg) | ||
| 1616 | { | 1687 | { |
| 1617 | ctx->next_proto_select_cb = cb; | 1688 | ctx->next_proto_select_cb = cb; |
| 1618 | ctx->next_proto_select_cb_arg = arg; | 1689 | ctx->next_proto_select_cb_arg = arg; |
| @@ -1623,34 +1694,35 @@ SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, unsigned char | |||
| 1623 | int | 1694 | int |
| 1624 | SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, | 1695 | SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, |
| 1625 | const char *label, size_t llen, const unsigned char *p, size_t plen, | 1696 | const char *label, size_t llen, const unsigned char *p, size_t plen, |
| 1626 | int use_context) | 1697 | int use_context) |
| 1627 | { | 1698 | { |
| 1628 | if (s->version < TLS1_VERSION) | 1699 | if (s->version < TLS1_VERSION) |
| 1629 | return -1; | 1700 | return -1; |
| 1630 | 1701 | ||
| 1631 | return s->method->ssl3_enc->export_keying_material(s, out, olen, label, | 1702 | return s->method->ssl3_enc->export_keying_material(s, out, olen, |
| 1632 | llen, p, plen, | 1703 | label, llen, p, plen, use_context); |
| 1633 | use_context); | ||
| 1634 | } | 1704 | } |
| 1635 | 1705 | ||
| 1636 | static unsigned long | 1706 | static unsigned long |
| 1637 | ssl_session_hash(const SSL_SESSION *a) | 1707 | ssl_session_hash(const SSL_SESSION *a) |
| 1638 | { | 1708 | { |
| 1639 | unsigned long l; | 1709 | unsigned long l; |
| 1640 | 1710 | ||
| 1641 | l = (unsigned long) | 1711 | l = (unsigned long) |
| 1642 | ((unsigned int) a->session_id[0] )| | 1712 | ((unsigned int) a->session_id[0] )| |
| 1643 | ((unsigned int) a->session_id[1]<< 8L)| | 1713 | ((unsigned int) a->session_id[1]<< 8L)| |
| 1644 | ((unsigned long)a->session_id[2]<<16L)| | 1714 | ((unsigned long)a->session_id[2]<<16L)| |
| 1645 | ((unsigned long)a->session_id[3]<<24L); | 1715 | ((unsigned long)a->session_id[3]<<24L); |
| 1646 | return (l); | 1716 | return (l); |
| 1647 | } | 1717 | } |
| 1648 | 1718 | ||
| 1649 | /* NB: If this function (or indeed the hash function which uses a sort of | 1719 | /* |
| 1720 | * NB: If this function (or indeed the hash function which uses a sort of | ||
| 1650 | * coarser function than this one) is changed, ensure | 1721 | * coarser function than this one) is changed, ensure |
| 1651 | * SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being | 1722 | * SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being |
| 1652 | * able to construct an SSL_SESSION that will collide with any existing session | 1723 | * able to construct an SSL_SESSION that will collide with any existing session |
| 1653 | * with a matching session ID. */ | 1724 | * with a matching session ID. |
| 1725 | */ | ||
| 1654 | static int | 1726 | static int |
| 1655 | ssl_session_cmp(const SSL_SESSION *a, const SSL_SESSION *b) | 1727 | ssl_session_cmp(const SSL_SESSION *a, const SSL_SESSION *b) |
| 1656 | { | 1728 | { |
| @@ -1661,10 +1733,12 @@ ssl_session_cmp(const SSL_SESSION *a, const SSL_SESSION *b) | |||
| 1661 | return (memcmp(a->session_id, b->session_id, a->session_id_length)); | 1733 | return (memcmp(a->session_id, b->session_id, a->session_id_length)); |
| 1662 | } | 1734 | } |
| 1663 | 1735 | ||
| 1664 | /* These wrapper functions should remain rather than redeclaring | 1736 | /* |
| 1737 | * These wrapper functions should remain rather than redeclaring | ||
| 1665 | * SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each | 1738 | * SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each |
| 1666 | * variable. The reason is that the functions aren't static, they're exposed via | 1739 | * variable. The reason is that the functions aren't static, they're exposed via |
| 1667 | * ssl.h. */ | 1740 | * ssl.h. |
| 1741 | */ | ||
| 1668 | static | 1742 | static |
| 1669 | IMPLEMENT_LHASH_HASH_FN(ssl_session, SSL_SESSION) | 1743 | IMPLEMENT_LHASH_HASH_FN(ssl_session, SSL_SESSION) |
| 1670 | static | 1744 | static |
| @@ -1673,15 +1747,17 @@ IMPLEMENT_LHASH_COMP_FN(ssl_session, SSL_SESSION) | |||
| 1673 | SSL_CTX * | 1747 | SSL_CTX * |
| 1674 | SSL_CTX_new(const SSL_METHOD *meth) | 1748 | SSL_CTX_new(const SSL_METHOD *meth) |
| 1675 | { | 1749 | { |
| 1676 | SSL_CTX *ret = NULL; | 1750 | SSL_CTX *ret = NULL; |
| 1677 | 1751 | ||
| 1678 | if (meth == NULL) { | 1752 | if (meth == NULL) { |
| 1679 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_NULL_SSL_METHOD_PASSED); | 1753 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1754 | SSL_R_NULL_SSL_METHOD_PASSED); | ||
| 1680 | return (NULL); | 1755 | return (NULL); |
| 1681 | } | 1756 | } |
| 1682 | 1757 | ||
| 1683 | if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0) { | 1758 | if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0) { |
| 1684 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_X509_VERIFICATION_SETUP_PROBLEMS); | 1759 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1760 | SSL_R_X509_VERIFICATION_SETUP_PROBLEMS); | ||
| 1685 | goto err; | 1761 | goto err; |
| 1686 | } | 1762 | } |
| 1687 | ret = calloc(1, sizeof(SSL_CTX)); | 1763 | ret = calloc(1, sizeof(SSL_CTX)); |
| @@ -1748,7 +1824,8 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
| 1748 | &ret->cipher_list_by_id, SSL_DEFAULT_CIPHER_LIST); | 1824 | &ret->cipher_list_by_id, SSL_DEFAULT_CIPHER_LIST); |
| 1749 | if (ret->cipher_list == NULL || | 1825 | if (ret->cipher_list == NULL || |
| 1750 | sk_SSL_CIPHER_num(ret->cipher_list) <= 0) { | 1826 | sk_SSL_CIPHER_num(ret->cipher_list) <= 0) { |
| 1751 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_LIBRARY_HAS_NO_CIPHERS); | 1827 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1828 | SSL_R_LIBRARY_HAS_NO_CIPHERS); | ||
| 1752 | goto err2; | 1829 | goto err2; |
| 1753 | } | 1830 | } |
| 1754 | 1831 | ||
| @@ -1757,11 +1834,13 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
| 1757 | goto err; | 1834 | goto err; |
| 1758 | 1835 | ||
| 1759 | if ((ret->md5 = EVP_get_digestbyname("ssl3-md5")) == NULL) { | 1836 | if ((ret->md5 = EVP_get_digestbyname("ssl3-md5")) == NULL) { |
| 1760 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES); | 1837 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1838 | SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES); | ||
| 1761 | goto err2; | 1839 | goto err2; |
| 1762 | } | 1840 | } |
| 1763 | if ((ret->sha1 = EVP_get_digestbyname("ssl3-sha1")) == NULL) { | 1841 | if ((ret->sha1 = EVP_get_digestbyname("ssl3-sha1")) == NULL) { |
| 1764 | SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES); | 1842 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1843 | SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES); | ||
| 1765 | goto err2; | 1844 | goto err2; |
| 1766 | } | 1845 | } |
| 1767 | 1846 | ||
| @@ -1782,9 +1861,9 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
| 1782 | ret->tlsext_servername_arg = NULL; | 1861 | ret->tlsext_servername_arg = NULL; |
| 1783 | /* Setup RFC4507 ticket keys */ | 1862 | /* Setup RFC4507 ticket keys */ |
| 1784 | if ((RAND_pseudo_bytes(ret->tlsext_tick_key_name, 16) <= 0) | 1863 | if ((RAND_pseudo_bytes(ret->tlsext_tick_key_name, 16) <= 0) |
| 1785 | || (RAND_bytes(ret->tlsext_tick_hmac_key, 16) <= 0) | 1864 | || (RAND_bytes(ret->tlsext_tick_hmac_key, 16) <= 0) |
| 1786 | || (RAND_bytes(ret->tlsext_tick_aes_key, 16) <= 0)) | 1865 | || (RAND_bytes(ret->tlsext_tick_aes_key, 16) <= 0)) |
| 1787 | ret->options |= SSL_OP_NO_TICKET; | 1866 | ret->options |= SSL_OP_NO_TICKET; |
| 1788 | 1867 | ||
| 1789 | ret->tlsext_status_cb = 0; | 1868 | ret->tlsext_status_cb = 0; |
| 1790 | ret->tlsext_status_arg = NULL; | 1869 | ret->tlsext_status_arg = NULL; |
| @@ -1814,22 +1893,25 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
| 1814 | if (!eng) { | 1893 | if (!eng) { |
| 1815 | ERR_clear_error(); | 1894 | ERR_clear_error(); |
| 1816 | ENGINE_load_builtin_engines(); | 1895 | ENGINE_load_builtin_engines(); |
| 1817 | eng = ENGINE_by_id(eng_str(OPENSSL_SSL_CLIENT_ENGINE_AUTO)); | 1896 | eng = ENGINE_by_id(eng_str( |
| 1897 | OPENSSL_SSL_CLIENT_ENGINE_AUTO)); | ||
| 1818 | } | 1898 | } |
| 1819 | if (!eng || !SSL_CTX_set_client_cert_engine(ret, eng)) | 1899 | if (!eng || !SSL_CTX_set_client_cert_engine(ret, eng)) |
| 1820 | ERR_clear_error(); | 1900 | ERR_clear_error(); |
| 1821 | } | 1901 | } |
| 1822 | #endif | 1902 | #endif |
| 1823 | #endif | 1903 | #endif |
| 1824 | /* Default is to connect to non-RI servers. When RI is more widely | 1904 | /* |
| 1905 | * Default is to connect to non-RI servers. When RI is more widely | ||
| 1825 | * deployed might change this. | 1906 | * deployed might change this. |
| 1826 | */ | 1907 | */ |
| 1827 | ret->options |= SSL_OP_LEGACY_SERVER_CONNECT; | 1908 | ret->options |= SSL_OP_LEGACY_SERVER_CONNECT; |
| 1828 | 1909 | ||
| 1829 | return (ret); | 1910 | return (ret); |
| 1830 | err: | 1911 | err: |
| 1831 | SSLerr(SSL_F_SSL_CTX_NEW, ERR_R_MALLOC_FAILURE); | 1912 | SSLerr(SSL_F_SSL_CTX_NEW, |
| 1832 | err2: | 1913 | ERR_R_MALLOC_FAILURE); |
| 1914 | err2: | ||
| 1833 | if (ret != NULL) | 1915 | if (ret != NULL) |
| 1834 | SSL_CTX_free(ret); | 1916 | SSL_CTX_free(ret); |
| 1835 | return (NULL); | 1917 | return (NULL); |
| @@ -1845,7 +1927,7 @@ SSL_COMP_free(SSL_COMP *comp) | |||
| 1845 | void | 1927 | void |
| 1846 | SSL_CTX_free(SSL_CTX *a) | 1928 | SSL_CTX_free(SSL_CTX *a) |
| 1847 | { | 1929 | { |
| 1848 | int i; | 1930 | int i; |
| 1849 | 1931 | ||
| 1850 | if (a == NULL) | 1932 | if (a == NULL) |
| 1851 | return; | 1933 | return; |
| @@ -1926,7 +2008,8 @@ SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u) | |||
| 1926 | } | 2008 | } |
| 1927 | 2009 | ||
| 1928 | void | 2010 | void |
| 1929 | SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *, void *), void *arg) | 2011 | SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *, |
| 2012 | void *), void *arg) | ||
| 1930 | { | 2013 | { |
| 1931 | ctx->app_verify_callback = cb; | 2014 | ctx->app_verify_callback = cb; |
| 1932 | ctx->app_verify_arg = arg; | 2015 | ctx->app_verify_arg = arg; |
| @@ -1948,18 +2031,18 @@ SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth) | |||
| 1948 | void | 2031 | void |
| 1949 | ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | 2032 | ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) |
| 1950 | { | 2033 | { |
| 1951 | CERT_PKEY *cpk; | 2034 | CERT_PKEY *cpk; |
| 1952 | int rsa_enc, rsa_tmp, rsa_sign, dh_tmp, dh_rsa, dh_dsa, dsa_sign; | 2035 | int rsa_enc, rsa_tmp, rsa_sign, dh_tmp, dh_rsa, dh_dsa, dsa_sign; |
| 1953 | int rsa_enc_export, dh_rsa_export, dh_dsa_export; | 2036 | int rsa_enc_export, dh_rsa_export, dh_dsa_export; |
| 1954 | int rsa_tmp_export, dh_tmp_export, kl; | 2037 | int rsa_tmp_export, dh_tmp_export, kl; |
| 1955 | unsigned long mask_k, mask_a, emask_k, emask_a; | 2038 | unsigned long mask_k, mask_a, emask_k, emask_a; |
| 1956 | int have_ecc_cert, ecdh_ok, ecdsa_ok, ecc_pkey_size; | 2039 | int have_ecc_cert, ecdh_ok, ecdsa_ok, ecc_pkey_size; |
| 1957 | #ifndef OPENSSL_NO_ECDH | 2040 | #ifndef OPENSSL_NO_ECDH |
| 1958 | int have_ecdh_tmp; | 2041 | int have_ecdh_tmp; |
| 1959 | #endif | 2042 | #endif |
| 1960 | X509 *x = NULL; | 2043 | X509 *x = NULL; |
| 1961 | EVP_PKEY *ecc_pkey = NULL; | 2044 | EVP_PKEY *ecc_pkey = NULL; |
| 1962 | int signature_nid = 0, pk_nid = 0, md_nid = 0; | 2045 | int signature_nid = 0, pk_nid = 0, md_nid = 0; |
| 1963 | 2046 | ||
| 1964 | if (c == NULL) | 2047 | if (c == NULL) |
| 1965 | return; | 2048 | return; |
| @@ -2005,8 +2088,8 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
| 2005 | 2088 | ||
| 2006 | #ifdef CIPHER_DEBUG | 2089 | #ifdef CIPHER_DEBUG |
| 2007 | printf("rt=%d rte=%d dht=%d ecdht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n", | 2090 | printf("rt=%d rte=%d dht=%d ecdht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n", |
| 2008 | rsa_tmp, rsa_tmp_export, dh_tmp, have_ecdh_tmp, | 2091 | rsa_tmp, rsa_tmp_export, dh_tmp, have_ecdh_tmp, |
| 2009 | rsa_enc, rsa_enc_export, rsa_sign, dsa_sign, dh_rsa, dh_dsa); | 2092 | rsa_enc, rsa_enc_export, rsa_sign, dsa_sign, dh_rsa, dh_dsa); |
| 2010 | #endif | 2093 | #endif |
| 2011 | 2094 | ||
| 2012 | cpk = &(c->pkeys[SSL_PKEY_GOST01]); | 2095 | cpk = &(c->pkeys[SSL_PKEY_GOST01]); |
| @@ -2071,7 +2154,8 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
| 2071 | emask_a|=SSL_aKRB5; | 2154 | emask_a|=SSL_aKRB5; |
| 2072 | #endif | 2155 | #endif |
| 2073 | 2156 | ||
| 2074 | /* An ECC certificate may be usable for ECDH and/or | 2157 | /* |
| 2158 | * An ECC certificate may be usable for ECDH and/or | ||
| 2075 | * ECDSA cipher suites depending on the key usage extension. | 2159 | * ECDSA cipher suites depending on the key usage extension. |
| 2076 | */ | 2160 | */ |
| 2077 | if (have_ecc_cert) { | 2161 | if (have_ecc_cert) { |
| @@ -2150,11 +2234,11 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
| 2150 | int | 2234 | int |
| 2151 | ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) | 2235 | ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) |
| 2152 | { | 2236 | { |
| 2153 | unsigned long alg_k, alg_a; | 2237 | unsigned long alg_k, alg_a; |
| 2154 | EVP_PKEY *pkey = NULL; | 2238 | EVP_PKEY *pkey = NULL; |
| 2155 | int keysize = 0; | 2239 | int keysize = 0; |
| 2156 | int signature_nid = 0, md_nid = 0, pk_nid = 0; | 2240 | int signature_nid = 0, md_nid = 0, pk_nid = 0; |
| 2157 | const SSL_CIPHER *cs = s->s3->tmp.new_cipher; | 2241 | const SSL_CIPHER *cs = s->s3->tmp.new_cipher; |
| 2158 | 2242 | ||
| 2159 | alg_k = cs->algorithm_mkey; | 2243 | alg_k = cs->algorithm_mkey; |
| 2160 | alg_a = cs->algorithm_auth; | 2244 | alg_a = cs->algorithm_auth; |
| @@ -2179,21 +2263,25 @@ ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) | |||
| 2179 | if (alg_k & SSL_kECDHe || alg_k & SSL_kECDHr) { | 2263 | if (alg_k & SSL_kECDHe || alg_k & SSL_kECDHr) { |
| 2180 | /* key usage, if present, must allow key agreement */ | 2264 | /* key usage, if present, must allow key agreement */ |
| 2181 | if (ku_reject(x, X509v3_KU_KEY_AGREEMENT)) { | 2265 | if (ku_reject(x, X509v3_KU_KEY_AGREEMENT)) { |
| 2182 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT); | 2266 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, |
| 2267 | SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT); | ||
| 2183 | return 0; | 2268 | return 0; |
| 2184 | } | 2269 | } |
| 2185 | if ((alg_k & SSL_kECDHe) && TLS1_get_version(s) < TLS1_2_VERSION) { | 2270 | if ((alg_k & SSL_kECDHe) && TLS1_get_version(s) < |
| 2271 | TLS1_2_VERSION) { | ||
| 2186 | /* signature alg must be ECDSA */ | 2272 | /* signature alg must be ECDSA */ |
| 2187 | if (pk_nid != NID_X9_62_id_ecPublicKey) { | 2273 | if (pk_nid != NID_X9_62_id_ecPublicKey) { |
| 2188 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE); | 2274 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, |
| 2275 | SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE); | ||
| 2189 | return 0; | 2276 | return 0; |
| 2190 | } | 2277 | } |
| 2191 | } | 2278 | } |
| 2192 | if ((alg_k & SSL_kECDHr) && TLS1_get_version(s) < TLS1_2_VERSION) { | 2279 | if ((alg_k & SSL_kECDHr) && TLS1_get_version(s) < |
| 2280 | TLS1_2_VERSION) { | ||
| 2193 | /* signature alg must be RSA */ | 2281 | /* signature alg must be RSA */ |
| 2194 | |||
| 2195 | if (pk_nid != NID_rsaEncryption && pk_nid != NID_rsa) { | 2282 | if (pk_nid != NID_rsaEncryption && pk_nid != NID_rsa) { |
| 2196 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE); | 2283 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, |
| 2284 | SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE); | ||
| 2197 | return 0; | 2285 | return 0; |
| 2198 | } | 2286 | } |
| 2199 | } | 2287 | } |
| @@ -2201,7 +2289,8 @@ ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) | |||
| 2201 | if (alg_a & SSL_aECDSA) { | 2289 | if (alg_a & SSL_aECDSA) { |
| 2202 | /* key usage, if present, must allow signing */ | 2290 | /* key usage, if present, must allow signing */ |
| 2203 | if (ku_reject(x, X509v3_KU_DIGITAL_SIGNATURE)) { | 2291 | if (ku_reject(x, X509v3_KU_DIGITAL_SIGNATURE)) { |
| 2204 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_NOT_FOR_SIGNING); | 2292 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, |
| 2293 | SSL_R_ECC_CERT_NOT_FOR_SIGNING); | ||
| 2205 | return 0; | 2294 | return 0; |
| 2206 | } | 2295 | } |
| 2207 | } | 2296 | } |
| @@ -2216,9 +2305,9 @@ ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) | |||
| 2216 | CERT_PKEY * | 2305 | CERT_PKEY * |
| 2217 | ssl_get_server_send_pkey(const SSL *s) | 2306 | ssl_get_server_send_pkey(const SSL *s) |
| 2218 | { | 2307 | { |
| 2219 | unsigned long alg_k, alg_a; | 2308 | unsigned long alg_k, alg_a; |
| 2220 | CERT *c; | 2309 | CERT *c; |
| 2221 | int i; | 2310 | int i; |
| 2222 | 2311 | ||
| 2223 | c = s->cert; | 2312 | c = s->cert; |
| 2224 | ssl_set_cert_masks(c, s->s3->tmp.new_cipher); | 2313 | ssl_set_cert_masks(c, s->s3->tmp.new_cipher); |
| @@ -2227,7 +2316,8 @@ ssl_get_server_send_pkey(const SSL *s) | |||
| 2227 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; | 2316 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; |
| 2228 | 2317 | ||
| 2229 | if (alg_k & (SSL_kECDHr|SSL_kECDHe)) { | 2318 | if (alg_k & (SSL_kECDHr|SSL_kECDHe)) { |
| 2230 | /* we don't need to look at SSL_kEECDH | 2319 | /* |
| 2320 | * We don't need to look at SSL_kEECDH | ||
| 2231 | * since no certificate is needed for | 2321 | * since no certificate is needed for |
| 2232 | * anon ECDH and for authenticated | 2322 | * anon ECDH and for authenticated |
| 2233 | * EECDH, the check for the auth | 2323 | * EECDH, the check for the auth |
| @@ -2242,7 +2332,7 @@ ssl_get_server_send_pkey(const SSL *s) | |||
| 2242 | } else if (alg_a & SSL_aECDSA) { | 2332 | } else if (alg_a & SSL_aECDSA) { |
| 2243 | i = SSL_PKEY_ECC; | 2333 | i = SSL_PKEY_ECC; |
| 2244 | } else if (alg_k & SSL_kDHr) | 2334 | } else if (alg_k & SSL_kDHr) |
| 2245 | i = SSL_PKEY_DH_RSA; | 2335 | i = SSL_PKEY_DH_RSA; |
| 2246 | else if (alg_k & SSL_kDHd) | 2336 | else if (alg_k & SSL_kDHd) |
| 2247 | i = SSL_PKEY_DH_DSA; | 2337 | i = SSL_PKEY_DH_DSA; |
| 2248 | else if (alg_a & SSL_aDSS) | 2338 | else if (alg_a & SSL_aDSS) |
| @@ -2256,12 +2346,12 @@ ssl_get_server_send_pkey(const SSL *s) | |||
| 2256 | /* VRS something else here? */ | 2346 | /* VRS something else here? */ |
| 2257 | return (NULL); | 2347 | return (NULL); |
| 2258 | } else if (alg_a & SSL_aGOST94) | 2348 | } else if (alg_a & SSL_aGOST94) |
| 2259 | i = SSL_PKEY_GOST94; | 2349 | i = SSL_PKEY_GOST94; |
| 2260 | else if (alg_a & SSL_aGOST01) | 2350 | else if (alg_a & SSL_aGOST01) |
| 2261 | i = SSL_PKEY_GOST01; | 2351 | i = SSL_PKEY_GOST01; |
| 2262 | else /* if (alg_a & SSL_aNULL) */ | 2352 | else { /* if (alg_a & SSL_aNULL) */ |
| 2263 | { | 2353 | SSLerr(SSL_F_SSL_GET_SERVER_SEND_PKEY, |
| 2264 | SSLerr(SSL_F_SSL_GET_SERVER_SEND_PKEY, ERR_R_INTERNAL_ERROR); | 2354 | ERR_R_INTERNAL_ERROR); |
| 2265 | return (NULL); | 2355 | return (NULL); |
| 2266 | } | 2356 | } |
| 2267 | 2357 | ||
| @@ -2271,7 +2361,8 @@ ssl_get_server_send_pkey(const SSL *s) | |||
| 2271 | X509 * | 2361 | X509 * |
| 2272 | ssl_get_server_send_cert(const SSL *s) | 2362 | ssl_get_server_send_cert(const SSL *s) |
| 2273 | { | 2363 | { |
| 2274 | CERT_PKEY *cpk; | 2364 | CERT_PKEY *cpk; |
| 2365 | |||
| 2275 | cpk = ssl_get_server_send_pkey(s); | 2366 | cpk = ssl_get_server_send_pkey(s); |
| 2276 | if (!cpk) | 2367 | if (!cpk) |
| 2277 | return NULL; | 2368 | return NULL; |
| @@ -2281,26 +2372,27 @@ ssl_get_server_send_cert(const SSL *s) | |||
| 2281 | EVP_PKEY * | 2372 | EVP_PKEY * |
| 2282 | ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) | 2373 | ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) |
| 2283 | { | 2374 | { |
| 2284 | unsigned long alg_a; | 2375 | unsigned long alg_a; |
| 2285 | CERT *c; | 2376 | CERT *c; |
| 2286 | int idx = -1; | 2377 | int idx = -1; |
| 2287 | 2378 | ||
| 2288 | alg_a = cipher->algorithm_auth; | 2379 | alg_a = cipher->algorithm_auth; |
| 2289 | c = s->cert; | 2380 | c = s->cert; |
| 2290 | 2381 | ||
| 2291 | if ((alg_a & SSL_aDSS) && | 2382 | if ((alg_a & SSL_aDSS) && |
| 2292 | (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL)) | 2383 | (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL)) |
| 2293 | idx = SSL_PKEY_DSA_SIGN; | 2384 | idx = SSL_PKEY_DSA_SIGN; |
| 2294 | else if (alg_a & SSL_aRSA) { | 2385 | else if (alg_a & SSL_aRSA) { |
| 2295 | if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL) | 2386 | if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL) |
| 2296 | idx = SSL_PKEY_RSA_SIGN; | 2387 | idx = SSL_PKEY_RSA_SIGN; |
| 2297 | else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL) | 2388 | else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL) |
| 2298 | idx = SSL_PKEY_RSA_ENC; | 2389 | idx = SSL_PKEY_RSA_ENC; |
| 2299 | } else if ((alg_a & SSL_aECDSA) && | 2390 | } else if ((alg_a & SSL_aECDSA) && |
| 2300 | (c->pkeys[SSL_PKEY_ECC].privatekey != NULL)) | 2391 | (c->pkeys[SSL_PKEY_ECC].privatekey != NULL)) |
| 2301 | idx = SSL_PKEY_ECC; | 2392 | idx = SSL_PKEY_ECC; |
| 2302 | if (idx == -1) { | 2393 | if (idx == -1) { |
| 2303 | SSLerr(SSL_F_SSL_GET_SIGN_PKEY, ERR_R_INTERNAL_ERROR); | 2394 | SSLerr(SSL_F_SSL_GET_SIGN_PKEY, |
| 2395 | ERR_R_INTERNAL_ERROR); | ||
| 2304 | return (NULL); | 2396 | return (NULL); |
| 2305 | } | 2397 | } |
| 2306 | if (pmd) | 2398 | if (pmd) |
| @@ -2311,18 +2403,19 @@ ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) | |||
| 2311 | void | 2403 | void |
| 2312 | ssl_update_cache(SSL *s, int mode) | 2404 | ssl_update_cache(SSL *s, int mode) |
| 2313 | { | 2405 | { |
| 2314 | int i; | 2406 | int i; |
| 2315 | 2407 | ||
| 2316 | /* If the session_id_length is 0, we are not supposed to cache it, | 2408 | /* |
| 2317 | * and it would be rather hard to do anyway :-) */ | 2409 | * If the session_id_length is 0, we are not supposed to cache it, |
| 2410 | * and it would be rather hard to do anyway :-) | ||
| 2411 | */ | ||
| 2318 | if (s->session->session_id_length == 0) | 2412 | if (s->session->session_id_length == 0) |
| 2319 | return; | 2413 | return; |
| 2320 | 2414 | ||
| 2321 | i = s->session_ctx->session_cache_mode; | 2415 | i = s->session_ctx->session_cache_mode; |
| 2322 | if ((i & mode) && (!s->hit) | 2416 | if ((i & mode) && (!s->hit) && ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE) |
| 2323 | && ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE) | 2417 | || SSL_CTX_add_session(s->session_ctx, s->session)) |
| 2324 | || SSL_CTX_add_session(s->session_ctx, s->session)) | 2418 | && (s->session_ctx->new_session_cb != NULL)) { |
| 2325 | && (s->session_ctx->new_session_cb != NULL)) { | ||
| 2326 | CRYPTO_add(&s->session->references, 1, CRYPTO_LOCK_SSL_SESSION); | 2419 | CRYPTO_add(&s->session->references, 1, CRYPTO_LOCK_SSL_SESSION); |
| 2327 | if (!s->session_ctx->new_session_cb(s, s->session)) | 2420 | if (!s->session_ctx->new_session_cb(s, s->session)) |
| 2328 | SSL_SESSION_free(s->session); | 2421 | SSL_SESSION_free(s->session); |
| @@ -2330,10 +2423,10 @@ ssl_update_cache(SSL *s, int mode) | |||
| 2330 | 2423 | ||
| 2331 | /* auto flush every 255 connections */ | 2424 | /* auto flush every 255 connections */ |
| 2332 | if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) && | 2425 | if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) && |
| 2333 | ((i & mode) == mode)) { | 2426 | ((i & mode) == mode)) { |
| 2334 | if ((((mode & SSL_SESS_CACHE_CLIENT) | 2427 | if ((((mode & SSL_SESS_CACHE_CLIENT) ? |
| 2335 | ?s->session_ctx->stats.sess_connect_good | 2428 | s->session_ctx->stats.sess_connect_good : |
| 2336 | :s->session_ctx->stats.sess_accept_good) & 0xff) == 0xff) { | 2429 | s->session_ctx->stats.sess_accept_good) & 0xff) == 0xff) { |
| 2337 | SSL_CTX_flush_sessions(s->session_ctx, time(NULL)); | 2430 | SSL_CTX_flush_sessions(s->session_ctx, time(NULL)); |
| 2338 | } | 2431 | } |
| 2339 | } | 2432 | } |
| @@ -2348,8 +2441,8 @@ SSL_get_ssl_method(SSL *s) | |||
| 2348 | int | 2441 | int |
| 2349 | SSL_set_ssl_method(SSL *s, const SSL_METHOD *meth) | 2442 | SSL_set_ssl_method(SSL *s, const SSL_METHOD *meth) |
| 2350 | { | 2443 | { |
| 2351 | int conn = -1; | 2444 | int conn = -1; |
| 2352 | int ret = 1; | 2445 | int ret = 1; |
| 2353 | 2446 | ||
| 2354 | if (s->method != meth) { | 2447 | if (s->method != meth) { |
| 2355 | if (s->handshake_func != NULL) | 2448 | if (s->handshake_func != NULL) |
| @@ -2374,9 +2467,9 @@ SSL_set_ssl_method(SSL *s, const SSL_METHOD *meth) | |||
| 2374 | int | 2467 | int |
| 2375 | SSL_get_error(const SSL *s, int i) | 2468 | SSL_get_error(const SSL *s, int i) |
| 2376 | { | 2469 | { |
| 2377 | int reason; | 2470 | int reason; |
| 2378 | unsigned long l; | 2471 | unsigned long l; |
| 2379 | BIO *bio; | 2472 | BIO *bio; |
| 2380 | 2473 | ||
| 2381 | if (i > 0) | 2474 | if (i > 0) |
| 2382 | return (SSL_ERROR_NONE); | 2475 | return (SSL_ERROR_NONE); |
| @@ -2422,8 +2515,11 @@ SSL_get_error(const SSL *s, int i) | |||
| 2422 | if (BIO_should_write(bio)) | 2515 | if (BIO_should_write(bio)) |
| 2423 | return (SSL_ERROR_WANT_WRITE); | 2516 | return (SSL_ERROR_WANT_WRITE); |
| 2424 | else if (BIO_should_read(bio)) | 2517 | else if (BIO_should_read(bio)) |
| 2425 | /* See above (SSL_want_read(s) with BIO_should_write(bio)) */ | 2518 | return (SSL_ERROR_WANT_READ); |
| 2426 | return (SSL_ERROR_WANT_READ); | 2519 | /* |
| 2520 | * See above (SSL_want_read(s) with | ||
| 2521 | * BIO_should_write(bio)) | ||
| 2522 | */ | ||
| 2427 | else if (BIO_should_io_special(bio)) { | 2523 | else if (BIO_should_io_special(bio)) { |
| 2428 | reason = BIO_get_retry_reason(bio); | 2524 | reason = BIO_get_retry_reason(bio); |
| 2429 | if (reason == BIO_RR_CONNECT) | 2525 | if (reason == BIO_RR_CONNECT) |
| @@ -2449,10 +2545,11 @@ SSL_get_error(const SSL *s, int i) | |||
| 2449 | int | 2545 | int |
| 2450 | SSL_do_handshake(SSL *s) | 2546 | SSL_do_handshake(SSL *s) |
| 2451 | { | 2547 | { |
| 2452 | int ret = 1; | 2548 | int ret = 1; |
| 2453 | 2549 | ||
| 2454 | if (s->handshake_func == NULL) { | 2550 | if (s->handshake_func == NULL) { |
| 2455 | SSLerr(SSL_F_SSL_DO_HANDSHAKE, SSL_R_CONNECTION_TYPE_NOT_SET); | 2551 | SSLerr(SSL_F_SSL_DO_HANDSHAKE, |
| 2552 | SSL_R_CONNECTION_TYPE_NOT_SET); | ||
| 2456 | return (-1); | 2553 | return (-1); |
| 2457 | } | 2554 | } |
| 2458 | 2555 | ||
| @@ -2464,8 +2561,10 @@ SSL_do_handshake(SSL *s) | |||
| 2464 | return (ret); | 2561 | return (ret); |
| 2465 | } | 2562 | } |
| 2466 | 2563 | ||
| 2467 | /* For the next 2 functions, SSL_clear() sets shutdown and so | 2564 | /* |
| 2468 | * one of these calls will reset it */ | 2565 | * For the next 2 functions, SSL_clear() sets shutdown and so |
| 2566 | * one of these calls will reset it | ||
| 2567 | */ | ||
| 2469 | void | 2568 | void |
| 2470 | SSL_set_accept_state(SSL *s) | 2569 | SSL_set_accept_state(SSL *s) |
| 2471 | { | 2570 | { |
| @@ -2495,28 +2594,32 @@ SSL_set_connect_state(SSL *s) | |||
| 2495 | int | 2594 | int |
| 2496 | ssl_undefined_function(SSL *s) | 2595 | ssl_undefined_function(SSL *s) |
| 2497 | { | 2596 | { |
| 2498 | SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 2597 | SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION, |
| 2598 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 2499 | return (0); | 2599 | return (0); |
| 2500 | } | 2600 | } |
| 2501 | 2601 | ||
| 2502 | int | 2602 | int |
| 2503 | ssl_undefined_void_function(void) | 2603 | ssl_undefined_void_function(void) |
| 2504 | { | 2604 | { |
| 2505 | SSLerr(SSL_F_SSL_UNDEFINED_VOID_FUNCTION, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 2605 | SSLerr(SSL_F_SSL_UNDEFINED_VOID_FUNCTION, |
| 2606 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 2506 | return (0); | 2607 | return (0); |
| 2507 | } | 2608 | } |
| 2508 | 2609 | ||
| 2509 | int | 2610 | int |
| 2510 | ssl_undefined_const_function(const SSL *s) | 2611 | ssl_undefined_const_function(const SSL *s) |
| 2511 | { | 2612 | { |
| 2512 | SSLerr(SSL_F_SSL_UNDEFINED_CONST_FUNCTION, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 2613 | SSLerr(SSL_F_SSL_UNDEFINED_CONST_FUNCTION, |
| 2614 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 2513 | return (0); | 2615 | return (0); |
| 2514 | } | 2616 | } |
| 2515 | 2617 | ||
| 2516 | SSL_METHOD * | 2618 | SSL_METHOD * |
| 2517 | ssl_bad_method(int ver) | 2619 | ssl_bad_method(int ver) |
| 2518 | { | 2620 | { |
| 2519 | SSLerr(SSL_F_SSL_BAD_METHOD, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 2621 | SSLerr(SSL_F_SSL_BAD_METHOD, |
| 2622 | ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
| 2520 | return (NULL); | 2623 | return (NULL); |
| 2521 | } | 2624 | } |
| 2522 | 2625 | ||
| @@ -2554,10 +2657,12 @@ SSL_dup(SSL *s) | |||
| 2554 | /* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */ | 2657 | /* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */ |
| 2555 | SSL_copy_session_id(ret, s); | 2658 | SSL_copy_session_id(ret, s); |
| 2556 | } else { | 2659 | } else { |
| 2557 | /* No session has been established yet, so we have to expect | 2660 | /* |
| 2661 | * No session has been established yet, so we have to expect | ||
| 2558 | * that s->cert or ret->cert will be changed later -- | 2662 | * that s->cert or ret->cert will be changed later -- |
| 2559 | * they should not both point to the same object, | 2663 | * they should not both point to the same object, |
| 2560 | * and thus we can't use SSL_copy_session_id. */ | 2664 | * and thus we can't use SSL_copy_session_id. |
| 2665 | */ | ||
| 2561 | 2666 | ||
| 2562 | ret->method->ssl_free(ret); | 2667 | ret->method->ssl_free(ret); |
| 2563 | ret->method = s->method; | 2668 | ret->method = s->method; |
| @@ -2592,7 +2697,8 @@ SSL_dup(SSL *s) | |||
| 2592 | ret->debug = s->debug; | 2697 | ret->debug = s->debug; |
| 2593 | 2698 | ||
| 2594 | /* copy app data, a little dangerous perhaps */ | 2699 | /* copy app data, a little dangerous perhaps */ |
| 2595 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, &ret->ex_data, &s->ex_data)) | 2700 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, |
| 2701 | &ret->ex_data, &s->ex_data)) | ||
| 2596 | goto err; | 2702 | goto err; |
| 2597 | 2703 | ||
| 2598 | /* setup rbio, and wbio */ | 2704 | /* setup rbio, and wbio */ |
| @@ -2615,22 +2721,30 @@ SSL_dup(SSL *s) | |||
| 2615 | ret->new_session = s->new_session; | 2721 | ret->new_session = s->new_session; |
| 2616 | ret->quiet_shutdown = s->quiet_shutdown; | 2722 | ret->quiet_shutdown = s->quiet_shutdown; |
| 2617 | ret->shutdown = s->shutdown; | 2723 | ret->shutdown = s->shutdown; |
| 2618 | ret->state=s->state; /* SSL_dup does not really work at any state, though */ | 2724 | /* SSL_dup does not really work at any state, though */ |
| 2725 | ret->state=s->state; | ||
| 2619 | ret->rstate = s->rstate; | 2726 | ret->rstate = s->rstate; |
| 2620 | ret->init_num = 0; /* would have to copy ret->init_buf, ret->init_msg, ret->init_num, ret->init_off */ | 2727 | |
| 2728 | /* | ||
| 2729 | * Would have to copy ret->init_buf, ret->init_msg, ret->init_num, | ||
| 2730 | * ret->init_off | ||
| 2731 | */ | ||
| 2732 | ret->init_num = 0; | ||
| 2733 | |||
| 2621 | ret->hit = s->hit; | 2734 | ret->hit = s->hit; |
| 2622 | 2735 | ||
| 2623 | X509_VERIFY_PARAM_inherit(ret->param, s->param); | 2736 | X509_VERIFY_PARAM_inherit(ret->param, s->param); |
| 2624 | 2737 | ||
| 2625 | /* dup the cipher_list and cipher_list_by_id stacks */ | 2738 | /* dup the cipher_list and cipher_list_by_id stacks */ |
| 2626 | if (s->cipher_list != NULL) { | 2739 | if (s->cipher_list != NULL) { |
| 2627 | if ((ret->cipher_list = sk_SSL_CIPHER_dup(s->cipher_list)) == NULL) | 2740 | if ((ret->cipher_list = |
| 2741 | sk_SSL_CIPHER_dup(s->cipher_list)) == NULL) | ||
| 2628 | goto err; | 2742 | goto err; |
| 2629 | } | 2743 | } |
| 2630 | if (s->cipher_list_by_id != NULL) | 2744 | if (s->cipher_list_by_id != NULL) |
| 2631 | if ((ret->cipher_list_by_id = sk_SSL_CIPHER_dup(s->cipher_list_by_id)) | 2745 | if ((ret->cipher_list_by_id = |
| 2632 | == NULL) | 2746 | sk_SSL_CIPHER_dup(s->cipher_list_by_id)) == NULL) |
| 2633 | goto err; | 2747 | goto err; |
| 2634 | 2748 | ||
| 2635 | /* Dup the client_CA list */ | 2749 | /* Dup the client_CA list */ |
| 2636 | if (s->client_CA != NULL) { | 2750 | if (s->client_CA != NULL) { |
| @@ -2638,7 +2752,8 @@ SSL_dup(SSL *s) | |||
| 2638 | ret->client_CA = sk; | 2752 | ret->client_CA = sk; |
| 2639 | for (i = 0; i < sk_X509_NAME_num(sk); i++) { | 2753 | for (i = 0; i < sk_X509_NAME_num(sk); i++) { |
| 2640 | xn = sk_X509_NAME_value(sk, i); | 2754 | xn = sk_X509_NAME_value(sk, i); |
| 2641 | if (sk_X509_NAME_set(sk, i, X509_NAME_dup(xn)) == NULL) { | 2755 | if (sk_X509_NAME_set(sk, i, |
| 2756 | X509_NAME_dup(xn)) == NULL) { | ||
| 2642 | X509_NAME_free(xn); | 2757 | X509_NAME_free(xn); |
| 2643 | goto err; | 2758 | goto err; |
| 2644 | } | 2759 | } |
| @@ -2646,7 +2761,7 @@ SSL_dup(SSL *s) | |||
| 2646 | } | 2761 | } |
| 2647 | 2762 | ||
| 2648 | if (0) { | 2763 | if (0) { |
| 2649 | err: | 2764 | err: |
| 2650 | if (ret != NULL) | 2765 | if (ret != NULL) |
| 2651 | SSL_free(ret); | 2766 | SSL_free(ret); |
| 2652 | ret = NULL; | 2767 | ret = NULL; |
| @@ -2740,7 +2855,7 @@ SSL_get_current_expansion(SSL *s) | |||
| 2740 | int | 2855 | int |
| 2741 | ssl_init_wbio_buffer(SSL *s, int push) | 2856 | ssl_init_wbio_buffer(SSL *s, int push) |
| 2742 | { | 2857 | { |
| 2743 | BIO *bbio; | 2858 | BIO *bbio; |
| 2744 | 2859 | ||
| 2745 | if (s->bbio == NULL) { | 2860 | if (s->bbio == NULL) { |
| 2746 | bbio = BIO_new(BIO_f_buffer()); | 2861 | bbio = BIO_new(BIO_f_buffer()); |
| @@ -2755,7 +2870,8 @@ ssl_init_wbio_buffer(SSL *s, int push) | |||
| 2755 | (void)BIO_reset(bbio); | 2870 | (void)BIO_reset(bbio); |
| 2756 | /* if (!BIO_set_write_buffer_size(bbio,16*1024)) */ | 2871 | /* if (!BIO_set_write_buffer_size(bbio,16*1024)) */ |
| 2757 | if (!BIO_set_read_buffer_size(bbio, 1)) { | 2872 | if (!BIO_set_read_buffer_size(bbio, 1)) { |
| 2758 | SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER, ERR_R_BUF_LIB); | 2873 | SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER, |
| 2874 | ERR_R_BUF_LIB); | ||
| 2759 | return (0); | 2875 | return (0); |
| 2760 | } | 2876 | } |
| 2761 | if (push) { | 2877 | if (push) { |
| @@ -2871,8 +2987,10 @@ SSL_set_info_callback(SSL *ssl, | |||
| 2871 | ssl->info_callback = cb; | 2987 | ssl->info_callback = cb; |
| 2872 | } | 2988 | } |
| 2873 | 2989 | ||
| 2874 | /* One compiler (Diab DCC) doesn't like argument names in returned | 2990 | /* |
| 2875 | function pointer. */ | 2991 | * One compiler (Diab DCC) doesn't like argument names in returned |
| 2992 | * function pointer. | ||
| 2993 | */ | ||
| 2876 | void (*SSL_get_info_callback(const SSL *ssl))(const SSL * /*ssl*/,int /*type*/,int /*val*/) | 2994 | void (*SSL_get_info_callback(const SSL *ssl))(const SSL * /*ssl*/,int /*type*/,int /*val*/) |
| 2877 | { | 2995 | { |
| 2878 | return ssl->info_callback; | 2996 | return ssl->info_callback; |
| @@ -2907,7 +3025,7 @@ SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | |||
| 2907 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | 3025 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
| 2908 | { | 3026 | { |
| 2909 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp, | 3027 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp, |
| 2910 | new_func, dup_func, free_func); | 3028 | new_func, dup_func, free_func); |
| 2911 | } | 3029 | } |
| 2912 | 3030 | ||
| 2913 | int | 3031 | int |
| @@ -2927,7 +3045,7 @@ SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | |||
| 2927 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | 3045 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
| 2928 | { | 3046 | { |
| 2929 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp, | 3047 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp, |
| 2930 | new_func, dup_func, free_func); | 3048 | new_func, dup_func, free_func); |
| 2931 | } | 3049 | } |
| 2932 | 3050 | ||
| 2933 | int | 3051 | int |
| @@ -3030,10 +3148,11 @@ SSL_set_tmp_dh_callback(SSL *ssl, DH *(*dh)(SSL *ssl, int is_export, | |||
| 3030 | 3148 | ||
| 3031 | #ifndef OPENSSL_NO_ECDH | 3149 | #ifndef OPENSSL_NO_ECDH |
| 3032 | void | 3150 | void |
| 3033 | SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, EC_KEY *(*ecdh)(SSL *ssl, int is_export, | 3151 | SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, EC_KEY *(*ecdh)(SSL *ssl, |
| 3034 | int keylength)) | 3152 | int is_export, int keylength)) |
| 3035 | { | 3153 | { |
| 3036 | SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_TMP_ECDH_CB,(void (*)(void))ecdh); | 3154 | SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_TMP_ECDH_CB, |
| 3155 | (void (*)(void))ecdh); | ||
| 3037 | } | 3156 | } |
| 3038 | 3157 | ||
| 3039 | void | 3158 | void |
| @@ -3048,8 +3167,10 @@ SSL_set_tmp_ecdh_callback(SSL *ssl, EC_KEY *(*ecdh)(SSL *ssl, int is_export, | |||
| 3048 | int | 3167 | int |
| 3049 | SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint) | 3168 | SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint) |
| 3050 | { | 3169 | { |
| 3051 | if (identity_hint != NULL && strlen(identity_hint) > PSK_MAX_IDENTITY_LEN) { | 3170 | if (identity_hint != NULL && strlen(identity_hint) > |
| 3052 | SSLerr(SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT, SSL_R_DATA_LENGTH_TOO_LONG); | 3171 | PSK_MAX_IDENTITY_LEN) { |
| 3172 | SSLerr(SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT, | ||
| 3173 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 3053 | return 0; | 3174 | return 0; |
| 3054 | } | 3175 | } |
| 3055 | if (ctx->psk_identity_hint != NULL) | 3176 | if (ctx->psk_identity_hint != NULL) |
| @@ -3072,8 +3193,10 @@ SSL_use_psk_identity_hint(SSL *s, const char *identity_hint) | |||
| 3072 | if (s->session == NULL) | 3193 | if (s->session == NULL) |
| 3073 | return 1; /* session not created yet, ignored */ | 3194 | return 1; /* session not created yet, ignored */ |
| 3074 | 3195 | ||
| 3075 | if (identity_hint != NULL && strlen(identity_hint) > PSK_MAX_IDENTITY_LEN) { | 3196 | if (identity_hint != NULL && strlen(identity_hint) > |
| 3076 | SSLerr(SSL_F_SSL_USE_PSK_IDENTITY_HINT, SSL_R_DATA_LENGTH_TOO_LONG); | 3197 | PSK_MAX_IDENTITY_LEN) { |
| 3198 | SSLerr(SSL_F_SSL_USE_PSK_IDENTITY_HINT, | ||
| 3199 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 3077 | return 0; | 3200 | return 0; |
| 3078 | } | 3201 | } |
| 3079 | if (s->session->psk_identity_hint != NULL) | 3202 | if (s->session->psk_identity_hint != NULL) |
| @@ -3106,7 +3229,7 @@ SSL_get_psk_identity(const SSL *s) | |||
| 3106 | void | 3229 | void |
| 3107 | SSL_set_psk_client_callback(SSL *s, | 3230 | SSL_set_psk_client_callback(SSL *s, |
| 3108 | unsigned int (*cb)(SSL *ssl, const char *hint, | 3231 | unsigned int (*cb)(SSL *ssl, const char *hint, |
| 3109 | char *identity, unsigned int max_identity_len, unsigned char *psk, | 3232 | char *identity, unsigned int max_identity_len, unsigned char *psk, |
| 3110 | unsigned int max_psk_len)) | 3233 | unsigned int max_psk_len)) |
| 3111 | { | 3234 | { |
| 3112 | s->psk_client_callback = cb; | 3235 | s->psk_client_callback = cb; |
| @@ -3115,7 +3238,7 @@ char *identity, unsigned int max_identity_len, unsigned char *psk, | |||
| 3115 | void | 3238 | void |
| 3116 | SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, | 3239 | SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, |
| 3117 | unsigned int (*cb)(SSL *ssl, const char *hint, | 3240 | unsigned int (*cb)(SSL *ssl, const char *hint, |
| 3118 | char *identity, unsigned int max_identity_len, unsigned char *psk, | 3241 | char *identity, unsigned int max_identity_len, unsigned char *psk, |
| 3119 | unsigned int max_psk_len)) | 3242 | unsigned int max_psk_len)) |
| 3120 | { | 3243 | { |
| 3121 | ctx->psk_client_callback = cb; | 3244 | ctx->psk_client_callback = cb; |
| @@ -3124,7 +3247,7 @@ char *identity, unsigned int max_identity_len, unsigned char *psk, | |||
| 3124 | void | 3247 | void |
| 3125 | SSL_set_psk_server_callback(SSL *s, | 3248 | SSL_set_psk_server_callback(SSL *s, |
| 3126 | unsigned int (*cb)(SSL *ssl, const char *identity, | 3249 | unsigned int (*cb)(SSL *ssl, const char *identity, |
| 3127 | unsigned char *psk, unsigned int max_psk_len)) | 3250 | unsigned char *psk, unsigned int max_psk_len)) |
| 3128 | { | 3251 | { |
| 3129 | s->psk_server_callback = cb; | 3252 | s->psk_server_callback = cb; |
| 3130 | } | 3253 | } |
| @@ -3132,30 +3255,33 @@ unsigned char *psk, unsigned int max_psk_len)) | |||
| 3132 | void | 3255 | void |
| 3133 | SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, | 3256 | SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, |
| 3134 | unsigned int (*cb)(SSL *ssl, const char *identity, | 3257 | unsigned int (*cb)(SSL *ssl, const char *identity, |
| 3135 | unsigned char *psk, unsigned int max_psk_len)) | 3258 | unsigned char *psk, unsigned int max_psk_len)) |
| 3136 | { | 3259 | { |
| 3137 | ctx->psk_server_callback = cb; | 3260 | ctx->psk_server_callback = cb; |
| 3138 | } | 3261 | } |
| 3139 | #endif | 3262 | #endif |
| 3140 | 3263 | ||
| 3141 | void | 3264 | void |
| 3142 | SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) | 3265 | SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, |
| 3266 | int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) | ||
| 3143 | { | 3267 | { |
| 3144 | SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb); | 3268 | SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, |
| 3269 | (void (*)(void))cb); | ||
| 3145 | } | 3270 | } |
| 3146 | 3271 | ||
| 3147 | void | 3272 | void |
| 3148 | SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) | 3273 | SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, |
| 3274 | int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) | ||
| 3149 | { | 3275 | { |
| 3150 | SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb); | 3276 | SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb); |
| 3151 | } | 3277 | } |
| 3152 | 3278 | ||
| 3153 | /* Allocates new EVP_MD_CTX and sets pointer to it into given pointer | 3279 | /* |
| 3280 | * Allocates new EVP_MD_CTX and sets pointer to it into given pointer | ||
| 3154 | * vairable, freeing EVP_MD_CTX previously stored in that variable, if | 3281 | * vairable, freeing EVP_MD_CTX previously stored in that variable, if |
| 3155 | * any. If EVP_MD pointer is passed, initializes ctx with this md | 3282 | * any. If EVP_MD pointer is passed, initializes ctx with this md |
| 3156 | * Returns newly allocated ctx; | 3283 | * Returns newly allocated ctx; |
| 3157 | */ | 3284 | */ |
| 3158 | |||
| 3159 | EVP_MD_CTX * | 3285 | EVP_MD_CTX * |
| 3160 | ssl_replace_hash(EVP_MD_CTX **hash, const EVP_MD *md) | 3286 | ssl_replace_hash(EVP_MD_CTX **hash, const EVP_MD *md) |
| 3161 | { | 3287 | { |
| @@ -3169,7 +3295,6 @@ ssl_replace_hash(EVP_MD_CTX **hash, const EVP_MD *md) | |||
| 3169 | void | 3295 | void |
| 3170 | ssl_clear_hash_ctx(EVP_MD_CTX **hash) | 3296 | ssl_clear_hash_ctx(EVP_MD_CTX **hash) |
| 3171 | { | 3297 | { |
| 3172 | |||
| 3173 | if (*hash) | 3298 | if (*hash) |
| 3174 | EVP_MD_CTX_destroy(*hash); | 3299 | EVP_MD_CTX_destroy(*hash); |
| 3175 | *hash = NULL; | 3300 | *hash = NULL; |
| @@ -3190,4 +3315,4 @@ SSL_cache_hit(SSL *s) | |||
| 3190 | IMPLEMENT_STACK_OF(SSL_CIPHER) | 3315 | IMPLEMENT_STACK_OF(SSL_CIPHER) |
| 3191 | IMPLEMENT_STACK_OF(SSL_COMP) | 3316 | IMPLEMENT_STACK_OF(SSL_COMP) |
| 3192 | IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(SSL_CIPHER, SSL_CIPHER, | 3317 | IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(SSL_CIPHER, SSL_CIPHER, |
| 3193 | ssl_cipher_id); | 3318 | ssl_cipher_id); |
