diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib/libssl/s3_lib.c | 110 |
1 files changed, 58 insertions, 52 deletions
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index ef7a368d8f..990ce2153d 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: s3_lib.c,v 1.119 2017/01/22 06:36:49 jsing Exp $ */ | 1 | /* $OpenBSD: s3_lib.c,v 1.120 2017/01/22 09:02:07 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -1681,8 +1681,8 @@ ssl3_pending(const SSL *s) | |||
1681 | if (s->rstate == SSL_ST_READ_BODY) | 1681 | if (s->rstate == SSL_ST_READ_BODY) |
1682 | return 0; | 1682 | return 0; |
1683 | 1683 | ||
1684 | return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? | 1684 | return (S3I(s)->rrec.type == SSL3_RT_APPLICATION_DATA) ? |
1685 | s->s3->rrec.length : 0; | 1685 | S3I(s)->rrec.length : 0; |
1686 | } | 1686 | } |
1687 | 1687 | ||
1688 | int | 1688 | int |
@@ -1811,7 +1811,7 @@ ssl3_new(SSL *s) | |||
1811 | { | 1811 | { |
1812 | if ((s->s3 = calloc(1, sizeof(*s->s3))) == NULL) | 1812 | if ((s->s3 = calloc(1, sizeof(*s->s3))) == NULL) |
1813 | return (0); | 1813 | return (0); |
1814 | if ((s->s3->internal = calloc(1, sizeof(*s->s3->internal))) == NULL) { | 1814 | if ((S3I(s) = calloc(1, sizeof(*S3I(s)))) == NULL) { |
1815 | free(s->s3); | 1815 | free(s->s3); |
1816 | return (0); | 1816 | return (0); |
1817 | } | 1817 | } |
@@ -1831,21 +1831,21 @@ ssl3_free(SSL *s) | |||
1831 | ssl3_release_read_buffer(s); | 1831 | ssl3_release_read_buffer(s); |
1832 | ssl3_release_write_buffer(s); | 1832 | ssl3_release_write_buffer(s); |
1833 | 1833 | ||
1834 | DH_free(s->s3->tmp.dh); | 1834 | DH_free(S3I(s)->tmp.dh); |
1835 | EC_KEY_free(s->s3->tmp.ecdh); | 1835 | EC_KEY_free(S3I(s)->tmp.ecdh); |
1836 | 1836 | ||
1837 | if (s->s3->tmp.x25519 != NULL) | 1837 | if (S3I(s)->tmp.x25519 != NULL) |
1838 | explicit_bzero(s->s3->tmp.x25519, X25519_KEY_LENGTH); | 1838 | explicit_bzero(S3I(s)->tmp.x25519, X25519_KEY_LENGTH); |
1839 | free(s->s3->tmp.x25519); | 1839 | free(S3I(s)->tmp.x25519); |
1840 | 1840 | ||
1841 | if (s->s3->tmp.ca_names != NULL) | 1841 | if (S3I(s)->tmp.ca_names != NULL) |
1842 | sk_X509_NAME_pop_free(s->s3->tmp.ca_names, X509_NAME_free); | 1842 | sk_X509_NAME_pop_free(S3I(s)->tmp.ca_names, X509_NAME_free); |
1843 | BIO_free(s->s3->handshake_buffer); | 1843 | BIO_free(S3I(s)->handshake_buffer); |
1844 | tls1_free_digest_list(s); | 1844 | tls1_free_digest_list(s); |
1845 | free(s->s3->alpn_selected); | 1845 | free(S3I(s)->alpn_selected); |
1846 | 1846 | ||
1847 | explicit_bzero(s->s3->internal, sizeof(*s->s3->internal)); | 1847 | explicit_bzero(S3I(s), sizeof(*S3I(s))); |
1848 | free(s->s3->internal); | 1848 | free(S3I(s)); |
1849 | 1849 | ||
1850 | explicit_bzero(s->s3, sizeof(*s->s3)); | 1850 | explicit_bzero(s->s3, sizeof(*s->s3)); |
1851 | free(s->s3); | 1851 | free(s->s3); |
@@ -1861,36 +1861,36 @@ ssl3_clear(SSL *s) | |||
1861 | size_t rlen, wlen; | 1861 | size_t rlen, wlen; |
1862 | 1862 | ||
1863 | tls1_cleanup_key_block(s); | 1863 | tls1_cleanup_key_block(s); |
1864 | if (s->s3->tmp.ca_names != NULL) | 1864 | if (S3I(s)->tmp.ca_names != NULL) |
1865 | sk_X509_NAME_pop_free(s->s3->tmp.ca_names, X509_NAME_free); | 1865 | sk_X509_NAME_pop_free(S3I(s)->tmp.ca_names, X509_NAME_free); |
1866 | 1866 | ||
1867 | DH_free(s->s3->tmp.dh); | 1867 | DH_free(S3I(s)->tmp.dh); |
1868 | s->s3->tmp.dh = NULL; | 1868 | S3I(s)->tmp.dh = NULL; |
1869 | EC_KEY_free(s->s3->tmp.ecdh); | 1869 | EC_KEY_free(S3I(s)->tmp.ecdh); |
1870 | s->s3->tmp.ecdh = NULL; | 1870 | S3I(s)->tmp.ecdh = NULL; |
1871 | 1871 | ||
1872 | if (s->s3->tmp.x25519 != NULL) | 1872 | if (S3I(s)->tmp.x25519 != NULL) |
1873 | explicit_bzero(s->s3->tmp.x25519, X25519_KEY_LENGTH); | 1873 | explicit_bzero(S3I(s)->tmp.x25519, X25519_KEY_LENGTH); |
1874 | free(s->s3->tmp.x25519); | 1874 | free(S3I(s)->tmp.x25519); |
1875 | s->s3->tmp.x25519 = NULL; | 1875 | S3I(s)->tmp.x25519 = NULL; |
1876 | 1876 | ||
1877 | rp = s->s3->rbuf.buf; | 1877 | rp = s->s3->rbuf.buf; |
1878 | wp = s->s3->wbuf.buf; | 1878 | wp = s->s3->wbuf.buf; |
1879 | rlen = s->s3->rbuf.len; | 1879 | rlen = s->s3->rbuf.len; |
1880 | wlen = s->s3->wbuf.len; | 1880 | wlen = s->s3->wbuf.len; |
1881 | 1881 | ||
1882 | BIO_free(s->s3->handshake_buffer); | 1882 | BIO_free(S3I(s)->handshake_buffer); |
1883 | s->s3->handshake_buffer = NULL; | 1883 | S3I(s)->handshake_buffer = NULL; |
1884 | 1884 | ||
1885 | tls1_free_digest_list(s); | 1885 | tls1_free_digest_list(s); |
1886 | 1886 | ||
1887 | free(s->s3->alpn_selected); | 1887 | free(S3I(s)->alpn_selected); |
1888 | s->s3->alpn_selected = NULL; | 1888 | S3I(s)->alpn_selected = NULL; |
1889 | 1889 | ||
1890 | memset(s->s3->internal, 0, sizeof(*s->s3->internal)); | 1890 | memset(S3I(s), 0, sizeof(*S3I(s))); |
1891 | internal = s->s3->internal; | 1891 | internal = S3I(s); |
1892 | memset(s->s3, 0, sizeof(*s->s3)); | 1892 | memset(s->s3, 0, sizeof(*s->s3)); |
1893 | s->s3->internal = internal; | 1893 | S3I(s) = internal; |
1894 | 1894 | ||
1895 | s->s3->rbuf.buf = rp; | 1895 | s->s3->rbuf.buf = rp; |
1896 | s->s3->wbuf.buf = wp; | 1896 | s->s3->wbuf.buf = wp; |
@@ -1899,6 +1899,12 @@ ssl3_clear(SSL *s) | |||
1899 | 1899 | ||
1900 | ssl_free_wbio_buffer(s); | 1900 | ssl_free_wbio_buffer(s); |
1901 | 1901 | ||
1902 | /* Not needed... */ | ||
1903 | S3I(s)->renegotiate = 0; | ||
1904 | S3I(s)->total_renegotiations = 0; | ||
1905 | S3I(s)->num_renegotiations = 0; | ||
1906 | S3I(s)->in_read_app_data = 0; | ||
1907 | |||
1902 | s->packet_length = 0; | 1908 | s->packet_length = 0; |
1903 | s->version = TLS1_VERSION; | 1909 | s->version = TLS1_VERSION; |
1904 | 1910 | ||
@@ -1989,14 +1995,14 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
1989 | case SSL_CTRL_GET_CLIENT_CERT_REQUEST: | 1995 | case SSL_CTRL_GET_CLIENT_CERT_REQUEST: |
1990 | break; | 1996 | break; |
1991 | case SSL_CTRL_GET_NUM_RENEGOTIATIONS: | 1997 | case SSL_CTRL_GET_NUM_RENEGOTIATIONS: |
1992 | ret = s->s3->num_renegotiations; | 1998 | ret = S3I(s)->num_renegotiations; |
1993 | break; | 1999 | break; |
1994 | case SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS: | 2000 | case SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS: |
1995 | ret = s->s3->num_renegotiations; | 2001 | ret = S3I(s)->num_renegotiations; |
1996 | s->s3->num_renegotiations = 0; | 2002 | S3I(s)->num_renegotiations = 0; |
1997 | break; | 2003 | break; |
1998 | case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS: | 2004 | case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS: |
1999 | ret = s->s3->total_renegotiations; | 2005 | ret = S3I(s)->total_renegotiations; |
2000 | break; | 2006 | break; |
2001 | case SSL_CTRL_GET_FLAGS: | 2007 | case SSL_CTRL_GET_FLAGS: |
2002 | ret = (int)(s->s3->flags); | 2008 | ret = (int)(s->s3->flags); |
@@ -2463,7 +2469,7 @@ ssl3_get_req_cert_type(SSL *s, unsigned char *p) | |||
2463 | int ret = 0; | 2469 | int ret = 0; |
2464 | unsigned long alg_k; | 2470 | unsigned long alg_k; |
2465 | 2471 | ||
2466 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; | 2472 | alg_k = S3I(s)->tmp.new_cipher->algorithm_mkey; |
2467 | 2473 | ||
2468 | #ifndef OPENSSL_NO_GOST | 2474 | #ifndef OPENSSL_NO_GOST |
2469 | if ((alg_k & SSL_kGOST)) { | 2475 | if ((alg_k & SSL_kGOST)) { |
@@ -2552,7 +2558,7 @@ ssl3_write(SSL *s, const void *buf, int len) | |||
2552 | } | 2558 | } |
2553 | #endif | 2559 | #endif |
2554 | errno = 0; | 2560 | errno = 0; |
2555 | if (s->s3->renegotiate) | 2561 | if (S3I(s)->renegotiate) |
2556 | ssl3_renegotiate_check(s); | 2562 | ssl3_renegotiate_check(s); |
2557 | 2563 | ||
2558 | /* | 2564 | /* |
@@ -2564,13 +2570,13 @@ ssl3_write(SSL *s, const void *buf, int len) | |||
2564 | /* The second test is because the buffer may have been removed */ | 2570 | /* The second test is because the buffer may have been removed */ |
2565 | if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio)) { | 2571 | if ((s->s3->flags & SSL3_FLAGS_POP_BUFFER) && (s->wbio == s->bbio)) { |
2566 | /* First time through, we write into the buffer */ | 2572 | /* First time through, we write into the buffer */ |
2567 | if (s->s3->delay_buf_pop_ret == 0) { | 2573 | if (S3I(s)->delay_buf_pop_ret == 0) { |
2568 | ret = ssl3_write_bytes(s, SSL3_RT_APPLICATION_DATA, | 2574 | ret = ssl3_write_bytes(s, SSL3_RT_APPLICATION_DATA, |
2569 | buf, len); | 2575 | buf, len); |
2570 | if (ret <= 0) | 2576 | if (ret <= 0) |
2571 | return (ret); | 2577 | return (ret); |
2572 | 2578 | ||
2573 | s->s3->delay_buf_pop_ret = ret; | 2579 | S3I(s)->delay_buf_pop_ret = ret; |
2574 | } | 2580 | } |
2575 | 2581 | ||
2576 | s->rwstate = SSL_WRITING; | 2582 | s->rwstate = SSL_WRITING; |
@@ -2583,8 +2589,8 @@ ssl3_write(SSL *s, const void *buf, int len) | |||
2583 | ssl_free_wbio_buffer(s); | 2589 | ssl_free_wbio_buffer(s); |
2584 | s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER; | 2590 | s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER; |
2585 | 2591 | ||
2586 | ret = s->s3->delay_buf_pop_ret; | 2592 | ret = S3I(s)->delay_buf_pop_ret; |
2587 | s->s3->delay_buf_pop_ret = 0; | 2593 | S3I(s)->delay_buf_pop_ret = 0; |
2588 | } else { | 2594 | } else { |
2589 | ret = s->method->ssl_write_bytes(s, SSL3_RT_APPLICATION_DATA, | 2595 | ret = s->method->ssl_write_bytes(s, SSL3_RT_APPLICATION_DATA, |
2590 | buf, len); | 2596 | buf, len); |
@@ -2601,12 +2607,12 @@ ssl3_read_internal(SSL *s, void *buf, int len, int peek) | |||
2601 | int ret; | 2607 | int ret; |
2602 | 2608 | ||
2603 | errno = 0; | 2609 | errno = 0; |
2604 | if (s->s3->renegotiate) | 2610 | if (S3I(s)->renegotiate) |
2605 | ssl3_renegotiate_check(s); | 2611 | ssl3_renegotiate_check(s); |
2606 | s->s3->in_read_app_data = 1; | 2612 | S3I(s)->in_read_app_data = 1; |
2607 | ret = s->method->ssl_read_bytes(s, | 2613 | ret = s->method->ssl_read_bytes(s, |
2608 | SSL3_RT_APPLICATION_DATA, buf, len, peek); | 2614 | SSL3_RT_APPLICATION_DATA, buf, len, peek); |
2609 | if ((ret == -1) && (s->s3->in_read_app_data == 2)) { | 2615 | if ((ret == -1) && (S3I(s)->in_read_app_data == 2)) { |
2610 | /* | 2616 | /* |
2611 | * ssl3_read_bytes decided to call s->handshake_func, which | 2617 | * ssl3_read_bytes decided to call s->handshake_func, which |
2612 | * called ssl3_read_bytes to read handshake data. | 2618 | * called ssl3_read_bytes to read handshake data. |
@@ -2619,7 +2625,7 @@ ssl3_read_internal(SSL *s, void *buf, int len, int peek) | |||
2619 | SSL3_RT_APPLICATION_DATA, buf, len, peek); | 2625 | SSL3_RT_APPLICATION_DATA, buf, len, peek); |
2620 | s->in_handshake--; | 2626 | s->in_handshake--; |
2621 | } else | 2627 | } else |
2622 | s->s3->in_read_app_data = 0; | 2628 | S3I(s)->in_read_app_data = 0; |
2623 | 2629 | ||
2624 | return (ret); | 2630 | return (ret); |
2625 | } | 2631 | } |
@@ -2645,7 +2651,7 @@ ssl3_renegotiate(SSL *s) | |||
2645 | if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) | 2651 | if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) |
2646 | return (0); | 2652 | return (0); |
2647 | 2653 | ||
2648 | s->s3->renegotiate = 1; | 2654 | S3I(s)->renegotiate = 1; |
2649 | return (1); | 2655 | return (1); |
2650 | } | 2656 | } |
2651 | 2657 | ||
@@ -2654,7 +2660,7 @@ ssl3_renegotiate_check(SSL *s) | |||
2654 | { | 2660 | { |
2655 | int ret = 0; | 2661 | int ret = 0; |
2656 | 2662 | ||
2657 | if (s->s3->renegotiate) { | 2663 | if (S3I(s)->renegotiate) { |
2658 | if ((s->s3->rbuf.left == 0) && (s->s3->wbuf.left == 0) && | 2664 | if ((s->s3->rbuf.left == 0) && (s->s3->wbuf.left == 0) && |
2659 | !SSL_in_init(s)) { | 2665 | !SSL_in_init(s)) { |
2660 | /* | 2666 | /* |
@@ -2664,9 +2670,9 @@ ssl3_renegotiate_check(SSL *s) | |||
2664 | */ | 2670 | */ |
2665 | /* SSL_ST_ACCEPT */ | 2671 | /* SSL_ST_ACCEPT */ |
2666 | s->state = SSL_ST_RENEGOTIATE; | 2672 | s->state = SSL_ST_RENEGOTIATE; |
2667 | s->s3->renegotiate = 0; | 2673 | S3I(s)->renegotiate = 0; |
2668 | s->s3->num_renegotiations++; | 2674 | S3I(s)->num_renegotiations++; |
2669 | s->s3->total_renegotiations++; | 2675 | S3I(s)->total_renegotiations++; |
2670 | ret = 1; | 2676 | ret = 1; |
2671 | } | 2677 | } |
2672 | } | 2678 | } |
@@ -2679,7 +2685,7 @@ ssl3_renegotiate_check(SSL *s) | |||
2679 | long | 2685 | long |
2680 | ssl_get_algorithm2(SSL *s) | 2686 | ssl_get_algorithm2(SSL *s) |
2681 | { | 2687 | { |
2682 | long alg2 = s->s3->tmp.new_cipher->algorithm2; | 2688 | long alg2 = S3I(s)->tmp.new_cipher->algorithm2; |
2683 | 2689 | ||
2684 | if (s->method->ssl3_enc->enc_flags & SSL_ENC_FLAG_SHA256_PRF && | 2690 | if (s->method->ssl3_enc->enc_flags & SSL_ENC_FLAG_SHA256_PRF && |
2685 | alg2 == (SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF)) | 2691 | alg2 == (SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF)) |