diff options
Diffstat (limited to 'src/lib/libssl/ssl_srvr.c')
| -rw-r--r-- | src/lib/libssl/ssl_srvr.c | 152 |
1 files changed, 4 insertions, 148 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index f26fde5061..117afac85e 100644 --- a/src/lib/libssl/ssl_srvr.c +++ b/src/lib/libssl/ssl_srvr.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_srvr.c,v 1.158 2023/12/29 12:24:33 tb Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.159 2024/02/03 15:58:34 beck 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 | * |
| @@ -162,10 +162,6 @@ | |||
| 162 | #include <openssl/opensslconf.h> | 162 | #include <openssl/opensslconf.h> |
| 163 | #include <openssl/x509.h> | 163 | #include <openssl/x509.h> |
| 164 | 164 | ||
| 165 | #ifndef OPENSSL_NO_GOST | ||
| 166 | #include <openssl/gost.h> | ||
| 167 | #endif | ||
| 168 | |||
| 169 | #include "bytestring.h" | 165 | #include "bytestring.h" |
| 170 | #include "dtls_local.h" | 166 | #include "dtls_local.h" |
| 171 | #include "ssl_local.h" | 167 | #include "ssl_local.h" |
| @@ -564,15 +560,7 @@ ssl3_accept(SSL *s) | |||
| 564 | } | 560 | } |
| 565 | 561 | ||
| 566 | alg_k = s->s3->hs.cipher->algorithm_mkey; | 562 | alg_k = s->s3->hs.cipher->algorithm_mkey; |
| 567 | if (s->s3->flags & TLS1_FLAGS_SKIP_CERT_VERIFY) { | 563 | if (SSL_USE_SIGALGS(s)) { |
| 568 | /* | ||
| 569 | * A GOST client may use the key from its | ||
| 570 | * certificate for key exchange, in which case | ||
| 571 | * the CertificateVerify message is not sent. | ||
| 572 | */ | ||
| 573 | s->s3->hs.state = SSL3_ST_SR_FINISHED_A; | ||
| 574 | s->init_num = 0; | ||
| 575 | } else if (SSL_USE_SIGALGS(s) || (alg_k & SSL_kGOST)) { | ||
| 576 | s->s3->hs.state = SSL3_ST_SR_CERT_VRFY_A; | 564 | s->s3->hs.state = SSL3_ST_SR_CERT_VRFY_A; |
| 577 | s->init_num = 0; | 565 | s->init_num = 0; |
| 578 | if (!s->session->peer_cert) | 566 | if (!s->session->peer_cert) |
| @@ -795,7 +783,6 @@ ssl3_get_client_hello(SSL *s) | |||
| 795 | unsigned long id; | 783 | unsigned long id; |
| 796 | SSL_CIPHER *c; | 784 | SSL_CIPHER *c; |
| 797 | STACK_OF(SSL_CIPHER) *ciphers = NULL; | 785 | STACK_OF(SSL_CIPHER) *ciphers = NULL; |
| 798 | unsigned long alg_k; | ||
| 799 | const SSL_METHOD *method; | 786 | const SSL_METHOD *method; |
| 800 | uint16_t shared_version; | 787 | uint16_t shared_version; |
| 801 | 788 | ||
| @@ -1138,10 +1125,8 @@ ssl3_get_client_hello(SSL *s) | |||
| 1138 | if (!tls1_transcript_hash_init(s)) | 1125 | if (!tls1_transcript_hash_init(s)) |
| 1139 | goto err; | 1126 | goto err; |
| 1140 | 1127 | ||
| 1141 | alg_k = s->s3->hs.cipher->algorithm_mkey; | 1128 | if (!SSL_USE_SIGALGS(s) || !(s->verify_mode & SSL_VERIFY_PEER)) |
| 1142 | if (!(SSL_USE_SIGALGS(s) || (alg_k & SSL_kGOST)) || | 1129 | tls1_transcript_free(s); |
| 1143 | !(s->verify_mode & SSL_VERIFY_PEER)) | ||
| 1144 | tls1_transcript_free(s); | ||
| 1145 | 1130 | ||
| 1146 | /* | 1131 | /* |
| 1147 | * We now have the following setup. | 1132 | * We now have the following setup. |
| @@ -1816,75 +1801,6 @@ ssl3_get_client_kex_ecdhe(SSL *s, CBS *cbs) | |||
| 1816 | } | 1801 | } |
| 1817 | 1802 | ||
| 1818 | static int | 1803 | static int |
| 1819 | ssl3_get_client_kex_gost(SSL *s, CBS *cbs) | ||
| 1820 | { | ||
| 1821 | unsigned char premaster_secret[32]; | ||
| 1822 | EVP_PKEY_CTX *pkey_ctx = NULL; | ||
| 1823 | EVP_PKEY *client_pubkey; | ||
| 1824 | EVP_PKEY *pkey = NULL; | ||
| 1825 | size_t outlen; | ||
| 1826 | CBS gostblob; | ||
| 1827 | |||
| 1828 | /* Get our certificate private key*/ | ||
| 1829 | #ifndef OPENSSL_NO_GOST | ||
| 1830 | if ((s->s3->hs.cipher->algorithm_auth & SSL_aGOST01) != 0) | ||
| 1831 | pkey = s->cert->pkeys[SSL_PKEY_GOST01].privatekey; | ||
| 1832 | #endif | ||
| 1833 | |||
| 1834 | if ((pkey_ctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL) | ||
| 1835 | goto err; | ||
| 1836 | if (EVP_PKEY_decrypt_init(pkey_ctx) <= 0) | ||
| 1837 | goto err; | ||
| 1838 | |||
| 1839 | /* | ||
| 1840 | * If client certificate is present and is of the same type, | ||
| 1841 | * maybe use it for key exchange. | ||
| 1842 | * Don't mind errors from EVP_PKEY_derive_set_peer, because | ||
| 1843 | * it is completely valid to use a client certificate for | ||
| 1844 | * authorization only. | ||
| 1845 | */ | ||
| 1846 | if ((client_pubkey = X509_get0_pubkey(s->session->peer_cert)) != NULL) { | ||
| 1847 | if (EVP_PKEY_derive_set_peer(pkey_ctx, client_pubkey) <= 0) | ||
| 1848 | ERR_clear_error(); | ||
| 1849 | } | ||
| 1850 | |||
| 1851 | /* Decrypt session key */ | ||
| 1852 | if (!CBS_get_asn1(cbs, &gostblob, CBS_ASN1_SEQUENCE)) | ||
| 1853 | goto decode_err; | ||
| 1854 | if (CBS_len(cbs) != 0) | ||
| 1855 | goto decode_err; | ||
| 1856 | outlen = sizeof(premaster_secret); | ||
| 1857 | if (EVP_PKEY_decrypt(pkey_ctx, premaster_secret, &outlen, | ||
| 1858 | CBS_data(&gostblob), CBS_len(&gostblob)) <= 0) { | ||
| 1859 | SSLerror(s, SSL_R_DECRYPTION_FAILED); | ||
| 1860 | goto err; | ||
| 1861 | } | ||
| 1862 | |||
| 1863 | if (!tls12_derive_master_secret(s, premaster_secret, | ||
| 1864 | sizeof(premaster_secret))) | ||
| 1865 | goto err; | ||
| 1866 | |||
| 1867 | /* Check if pubkey from client certificate was used */ | ||
| 1868 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, EVP_PKEY_CTRL_PEER_KEY, | ||
| 1869 | 2, NULL) > 0) | ||
| 1870 | s->s3->flags |= TLS1_FLAGS_SKIP_CERT_VERIFY; | ||
| 1871 | |||
| 1872 | explicit_bzero(premaster_secret, sizeof(premaster_secret)); | ||
| 1873 | EVP_PKEY_CTX_free(pkey_ctx); | ||
| 1874 | |||
| 1875 | return 1; | ||
| 1876 | |||
| 1877 | decode_err: | ||
| 1878 | SSLerror(s, SSL_R_BAD_PACKET_LENGTH); | ||
| 1879 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | ||
| 1880 | err: | ||
| 1881 | explicit_bzero(premaster_secret, sizeof(premaster_secret)); | ||
| 1882 | EVP_PKEY_CTX_free(pkey_ctx); | ||
| 1883 | |||
| 1884 | return 0; | ||
| 1885 | } | ||
| 1886 | |||
| 1887 | static int | ||
| 1888 | ssl3_get_client_key_exchange(SSL *s) | 1804 | ssl3_get_client_key_exchange(SSL *s) |
| 1889 | { | 1805 | { |
| 1890 | unsigned long alg_k; | 1806 | unsigned long alg_k; |
| @@ -1912,9 +1828,6 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1912 | } else if (alg_k & SSL_kECDHE) { | 1828 | } else if (alg_k & SSL_kECDHE) { |
| 1913 | if (!ssl3_get_client_kex_ecdhe(s, &cbs)) | 1829 | if (!ssl3_get_client_kex_ecdhe(s, &cbs)) |
| 1914 | goto err; | 1830 | goto err; |
| 1915 | } else if (alg_k & SSL_kGOST) { | ||
| 1916 | if (!ssl3_get_client_kex_gost(s, &cbs)) | ||
| 1917 | goto err; | ||
| 1918 | } else { | 1831 | } else { |
| 1919 | al = SSL_AD_HANDSHAKE_FAILURE; | 1832 | al = SSL_AD_HANDSHAKE_FAILURE; |
| 1920 | SSLerror(s, SSL_R_UNKNOWN_CIPHER_TYPE); | 1833 | SSLerror(s, SSL_R_UNKNOWN_CIPHER_TYPE); |
| @@ -2043,15 +1956,6 @@ ssl3_get_cert_verify(SSL *s) | |||
| 2043 | al = SSL_AD_INTERNAL_ERROR; | 1956 | al = SSL_AD_INTERNAL_ERROR; |
| 2044 | goto fatal_err; | 1957 | goto fatal_err; |
| 2045 | } | 1958 | } |
| 2046 | #ifndef OPENSSL_NO_GOST | ||
| 2047 | if (sigalg->key_type == EVP_PKEY_GOSTR01 && | ||
| 2048 | EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_VERIFY, | ||
| 2049 | EVP_PKEY_CTRL_GOST_SIG_FORMAT, GOST_SIG_FORMAT_RS_LE, | ||
| 2050 | NULL) <= 0) { | ||
| 2051 | al = SSL_AD_INTERNAL_ERROR; | ||
| 2052 | goto fatal_err; | ||
| 2053 | } | ||
| 2054 | #endif | ||
| 2055 | if (EVP_DigestVerify(mctx, CBS_data(&signature), | 1959 | if (EVP_DigestVerify(mctx, CBS_data(&signature), |
| 2056 | CBS_len(&signature), hdata, hdatalen) <= 0) { | 1960 | CBS_len(&signature), hdata, hdatalen) <= 0) { |
| 2057 | SSLerror(s, ERR_R_EVP_LIB); | 1961 | SSLerror(s, ERR_R_EVP_LIB); |
| @@ -2096,54 +2000,6 @@ ssl3_get_cert_verify(SSL *s) | |||
| 2096 | SSLerror(s, SSL_R_BAD_ECDSA_SIGNATURE); | 2000 | SSLerror(s, SSL_R_BAD_ECDSA_SIGNATURE); |
| 2097 | goto fatal_err; | 2001 | goto fatal_err; |
| 2098 | } | 2002 | } |
| 2099 | #ifndef OPENSSL_NO_GOST | ||
| 2100 | } else if (EVP_PKEY_id(pkey) == NID_id_GostR3410_94 || | ||
| 2101 | EVP_PKEY_id(pkey) == NID_id_GostR3410_2001) { | ||
| 2102 | unsigned char sigbuf[128]; | ||
| 2103 | unsigned int siglen = sizeof(sigbuf); | ||
| 2104 | EVP_PKEY_CTX *pctx; | ||
| 2105 | const EVP_MD *md; | ||
| 2106 | int nid; | ||
| 2107 | |||
| 2108 | if (!tls1_transcript_data(s, &hdata, &hdatalen)) { | ||
| 2109 | SSLerror(s, ERR_R_INTERNAL_ERROR); | ||
| 2110 | al = SSL_AD_INTERNAL_ERROR; | ||
| 2111 | goto fatal_err; | ||
| 2112 | } | ||
| 2113 | if (!EVP_PKEY_get_default_digest_nid(pkey, &nid) || | ||
| 2114 | !(md = EVP_get_digestbynid(nid))) { | ||
| 2115 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 2116 | al = SSL_AD_INTERNAL_ERROR; | ||
| 2117 | goto fatal_err; | ||
| 2118 | } | ||
| 2119 | if ((pctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL) { | ||
| 2120 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 2121 | al = SSL_AD_INTERNAL_ERROR; | ||
| 2122 | goto fatal_err; | ||
| 2123 | } | ||
| 2124 | if (!EVP_DigestInit_ex(mctx, md, NULL) || | ||
| 2125 | !EVP_DigestUpdate(mctx, hdata, hdatalen) || | ||
| 2126 | !EVP_DigestFinal(mctx, sigbuf, &siglen) || | ||
| 2127 | (EVP_PKEY_verify_init(pctx) <= 0) || | ||
| 2128 | (EVP_PKEY_CTX_set_signature_md(pctx, md) <= 0) || | ||
| 2129 | (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_VERIFY, | ||
| 2130 | EVP_PKEY_CTRL_GOST_SIG_FORMAT, | ||
| 2131 | GOST_SIG_FORMAT_RS_LE, NULL) <= 0)) { | ||
| 2132 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 2133 | al = SSL_AD_INTERNAL_ERROR; | ||
| 2134 | EVP_PKEY_CTX_free(pctx); | ||
| 2135 | goto fatal_err; | ||
| 2136 | } | ||
| 2137 | if (EVP_PKEY_verify(pctx, CBS_data(&signature), | ||
| 2138 | CBS_len(&signature), sigbuf, siglen) <= 0) { | ||
| 2139 | al = SSL_AD_DECRYPT_ERROR; | ||
| 2140 | SSLerror(s, SSL_R_BAD_SIGNATURE); | ||
| 2141 | EVP_PKEY_CTX_free(pctx); | ||
| 2142 | goto fatal_err; | ||
| 2143 | } | ||
| 2144 | |||
| 2145 | EVP_PKEY_CTX_free(pctx); | ||
| 2146 | #endif | ||
| 2147 | } else { | 2003 | } else { |
| 2148 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 2004 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
| 2149 | al = SSL_AD_UNSUPPORTED_CERTIFICATE; | 2005 | al = SSL_AD_UNSUPPORTED_CERTIFICATE; |
