diff options
Diffstat (limited to 'src/lib/libssl/ssl_clnt.c')
| -rw-r--r-- | src/lib/libssl/ssl_clnt.c | 206 |
1 files changed, 2 insertions, 204 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index 52f5de35a4..56fb9ba1c7 100644 --- a/src/lib/libssl/ssl_clnt.c +++ b/src/lib/libssl/ssl_clnt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_clnt.c,v 1.163 2023/12/29 12:24:33 tb Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.164 2024/02/03 15:58:33 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 | * |
| @@ -161,10 +161,6 @@ | |||
| 161 | #include <openssl/objects.h> | 161 | #include <openssl/objects.h> |
| 162 | #include <openssl/opensslconf.h> | 162 | #include <openssl/opensslconf.h> |
| 163 | 163 | ||
| 164 | #ifndef OPENSSL_NO_GOST | ||
| 165 | #include <openssl/gost.h> | ||
| 166 | #endif | ||
| 167 | |||
| 168 | #include "bytestring.h" | 164 | #include "bytestring.h" |
| 169 | #include "dtls_local.h" | 165 | #include "dtls_local.h" |
| 170 | #include "ssl_local.h" | 166 | #include "ssl_local.h" |
| @@ -829,7 +825,6 @@ ssl3_get_server_hello(SSL *s) | |||
| 829 | uint8_t compression_method; | 825 | uint8_t compression_method; |
| 830 | const SSL_CIPHER *cipher; | 826 | const SSL_CIPHER *cipher; |
| 831 | const SSL_METHOD *method; | 827 | const SSL_METHOD *method; |
| 832 | unsigned long alg_k; | ||
| 833 | int al, ret; | 828 | int al, ret; |
| 834 | 829 | ||
| 835 | s->first_packet = 1; | 830 | s->first_packet = 1; |
| @@ -1038,8 +1033,7 @@ ssl3_get_server_hello(SSL *s) | |||
| 1038 | * Don't digest cached records if no sigalgs: we may need them for | 1033 | * Don't digest cached records if no sigalgs: we may need them for |
| 1039 | * client authentication. | 1034 | * client authentication. |
| 1040 | */ | 1035 | */ |
| 1041 | alg_k = s->s3->hs.cipher->algorithm_mkey; | 1036 | if (!SSL_USE_SIGALGS(s)) |
| 1042 | if (!(SSL_USE_SIGALGS(s) || (alg_k & SSL_kGOST))) | ||
| 1043 | tls1_transcript_free(s); | 1037 | tls1_transcript_free(s); |
| 1044 | 1038 | ||
| 1045 | if (!CBS_get_u8(&cbs, &compression_method)) | 1039 | if (!CBS_get_u8(&cbs, &compression_method)) |
| @@ -1931,119 +1925,6 @@ ssl3_send_client_kex_ecdhe(SSL *s, CBB *cbb) | |||
| 1931 | } | 1925 | } |
| 1932 | 1926 | ||
| 1933 | static int | 1927 | static int |
| 1934 | ssl3_send_client_kex_gost(SSL *s, CBB *cbb) | ||
| 1935 | { | ||
| 1936 | unsigned char premaster_secret[32], shared_ukm[32], tmp[256]; | ||
| 1937 | EVP_PKEY_CTX *pkey_ctx = NULL; | ||
| 1938 | EVP_MD_CTX *ukm_hash = NULL; | ||
| 1939 | EVP_PKEY *pkey; | ||
| 1940 | size_t msglen; | ||
| 1941 | unsigned int md_len; | ||
| 1942 | CBB gostblob; | ||
| 1943 | int nid; | ||
| 1944 | int ret = 0; | ||
| 1945 | |||
| 1946 | /* Get server certificate PKEY and create ctx from it */ | ||
| 1947 | pkey = X509_get0_pubkey(s->session->peer_cert); | ||
| 1948 | if (pkey == NULL || s->session->peer_cert_type != SSL_PKEY_GOST01) { | ||
| 1949 | SSLerror(s, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER); | ||
| 1950 | goto err; | ||
| 1951 | } | ||
| 1952 | if ((pkey_ctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL) { | ||
| 1953 | SSLerror(s, ERR_R_MALLOC_FAILURE); | ||
| 1954 | goto err; | ||
| 1955 | } | ||
| 1956 | |||
| 1957 | /* | ||
| 1958 | * If we have send a certificate, and certificate key parameters match | ||
| 1959 | * those of server certificate, use certificate key for key exchange. | ||
| 1960 | * Otherwise, generate ephemeral key pair. | ||
| 1961 | */ | ||
| 1962 | if (EVP_PKEY_encrypt_init(pkey_ctx) <= 0) | ||
| 1963 | goto err; | ||
| 1964 | |||
| 1965 | /* Generate session key. */ | ||
| 1966 | arc4random_buf(premaster_secret, sizeof(premaster_secret)); | ||
| 1967 | |||
| 1968 | /* | ||
| 1969 | * If we have client certificate, use its secret as peer key. | ||
| 1970 | * XXX - this presumably lacks PFS. | ||
| 1971 | */ | ||
| 1972 | if (s->s3->hs.tls12.cert_request != 0 && | ||
| 1973 | s->cert->key->privatekey != NULL) { | ||
| 1974 | if (EVP_PKEY_derive_set_peer(pkey_ctx, | ||
| 1975 | s->cert->key->privatekey) <=0) { | ||
| 1976 | /* | ||
| 1977 | * If there was an error - just ignore it. | ||
| 1978 | * Ephemeral key would be used. | ||
| 1979 | */ | ||
| 1980 | ERR_clear_error(); | ||
| 1981 | } | ||
| 1982 | } | ||
| 1983 | |||
| 1984 | /* | ||
| 1985 | * Compute shared IV and store it in algorithm-specific context data. | ||
| 1986 | */ | ||
| 1987 | if ((ukm_hash = EVP_MD_CTX_new()) == NULL) { | ||
| 1988 | SSLerror(s, ERR_R_MALLOC_FAILURE); | ||
| 1989 | goto err; | ||
| 1990 | } | ||
| 1991 | |||
| 1992 | /* XXX check handshake hash instead. */ | ||
| 1993 | if (s->s3->hs.cipher->algorithm2 & SSL_HANDSHAKE_MAC_GOST94) | ||
| 1994 | nid = NID_id_GostR3411_94; | ||
| 1995 | else | ||
| 1996 | nid = NID_id_tc26_gost3411_2012_256; | ||
| 1997 | if (!EVP_DigestInit(ukm_hash, EVP_get_digestbynid(nid))) | ||
| 1998 | goto err; | ||
| 1999 | if (!EVP_DigestUpdate(ukm_hash, s->s3->client_random, SSL3_RANDOM_SIZE)) | ||
| 2000 | goto err; | ||
| 2001 | if (!EVP_DigestUpdate(ukm_hash, s->s3->server_random, SSL3_RANDOM_SIZE)) | ||
| 2002 | goto err; | ||
| 2003 | if (!EVP_DigestFinal_ex(ukm_hash, shared_ukm, &md_len)) | ||
| 2004 | goto err; | ||
| 2005 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, EVP_PKEY_OP_ENCRYPT, | ||
| 2006 | EVP_PKEY_CTRL_SET_IV, 8, shared_ukm) < 0) { | ||
| 2007 | SSLerror(s, SSL_R_LIBRARY_BUG); | ||
| 2008 | goto err; | ||
| 2009 | } | ||
| 2010 | |||
| 2011 | /* | ||
| 2012 | * Make GOST keytransport blob message, encapsulate it into sequence. | ||
| 2013 | */ | ||
| 2014 | msglen = 255; | ||
| 2015 | if (EVP_PKEY_encrypt(pkey_ctx, tmp, &msglen, premaster_secret, | ||
| 2016 | sizeof(premaster_secret)) < 0) { | ||
| 2017 | SSLerror(s, SSL_R_LIBRARY_BUG); | ||
| 2018 | goto err; | ||
| 2019 | } | ||
| 2020 | |||
| 2021 | if (!CBB_add_asn1(cbb, &gostblob, CBS_ASN1_SEQUENCE)) | ||
| 2022 | goto err; | ||
| 2023 | if (!CBB_add_bytes(&gostblob, tmp, msglen)) | ||
| 2024 | goto err; | ||
| 2025 | if (!CBB_flush(cbb)) | ||
| 2026 | goto err; | ||
| 2027 | |||
| 2028 | /* Check if pubkey from client certificate was used. */ | ||
| 2029 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, EVP_PKEY_CTRL_PEER_KEY, 2, | ||
| 2030 | NULL) > 0) | ||
| 2031 | s->s3->flags |= TLS1_FLAGS_SKIP_CERT_VERIFY; | ||
| 2032 | |||
| 2033 | if (!tls12_derive_master_secret(s, premaster_secret, 32)) | ||
| 2034 | goto err; | ||
| 2035 | |||
| 2036 | ret = 1; | ||
| 2037 | |||
| 2038 | err: | ||
| 2039 | explicit_bzero(premaster_secret, sizeof(premaster_secret)); | ||
| 2040 | EVP_PKEY_CTX_free(pkey_ctx); | ||
| 2041 | EVP_MD_CTX_free(ukm_hash); | ||
| 2042 | |||
| 2043 | return ret; | ||
| 2044 | } | ||
| 2045 | |||
| 2046 | static int | ||
| 2047 | ssl3_send_client_key_exchange(SSL *s) | 1928 | ssl3_send_client_key_exchange(SSL *s) |
| 2048 | { | 1929 | { |
| 2049 | unsigned long alg_k; | 1930 | unsigned long alg_k; |
| @@ -2067,9 +1948,6 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2067 | } else if (alg_k & SSL_kECDHE) { | 1948 | } else if (alg_k & SSL_kECDHE) { |
| 2068 | if (!ssl3_send_client_kex_ecdhe(s, &kex)) | 1949 | if (!ssl3_send_client_kex_ecdhe(s, &kex)) |
| 2069 | goto err; | 1950 | goto err; |
| 2070 | } else if (alg_k & SSL_kGOST) { | ||
| 2071 | if (!ssl3_send_client_kex_gost(s, &kex)) | ||
| 2072 | goto err; | ||
| 2073 | } else { | 1951 | } else { |
| 2074 | ssl3_send_alert(s, SSL3_AL_FATAL, | 1952 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 2075 | SSL_AD_HANDSHAKE_FAILURE); | 1953 | SSL_AD_HANDSHAKE_FAILURE); |
| @@ -2115,14 +1993,6 @@ ssl3_send_client_verify_sigalgs(SSL *s, EVP_PKEY *pkey, | |||
| 2115 | SSLerror(s, ERR_R_EVP_LIB); | 1993 | SSLerror(s, ERR_R_EVP_LIB); |
| 2116 | goto err; | 1994 | goto err; |
| 2117 | } | 1995 | } |
| 2118 | #ifndef OPENSSL_NO_GOST | ||
| 2119 | if (sigalg->key_type == EVP_PKEY_GOSTR01 && | ||
| 2120 | EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN, | ||
| 2121 | EVP_PKEY_CTRL_GOST_SIG_FORMAT, GOST_SIG_FORMAT_RS_LE, NULL) <= 0) { | ||
| 2122 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 2123 | goto err; | ||
| 2124 | } | ||
| 2125 | #endif | ||
| 2126 | if ((sigalg->flags & SIGALG_FLAG_RSA_PSS) && | 1996 | if ((sigalg->flags & SIGALG_FLAG_RSA_PSS) && |
| 2127 | (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) || | 1997 | (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) || |
| 2128 | !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) { | 1998 | !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) { |
| @@ -2230,72 +2100,6 @@ ssl3_send_client_verify_ec(SSL *s, EVP_PKEY *pkey, CBB *cert_verify) | |||
| 2230 | return ret; | 2100 | return ret; |
| 2231 | } | 2101 | } |
| 2232 | 2102 | ||
| 2233 | #ifndef OPENSSL_NO_GOST | ||
| 2234 | static int | ||
| 2235 | ssl3_send_client_verify_gost(SSL *s, EVP_PKEY *pkey, CBB *cert_verify) | ||
| 2236 | { | ||
| 2237 | CBB cbb_signature; | ||
| 2238 | EVP_MD_CTX *mctx; | ||
| 2239 | EVP_PKEY_CTX *pctx; | ||
| 2240 | const EVP_MD *md; | ||
| 2241 | const unsigned char *hdata; | ||
| 2242 | unsigned char *signature = NULL; | ||
| 2243 | size_t signature_len; | ||
| 2244 | size_t hdata_len; | ||
| 2245 | int nid; | ||
| 2246 | int ret = 0; | ||
| 2247 | |||
| 2248 | if ((mctx = EVP_MD_CTX_new()) == NULL) | ||
| 2249 | goto err; | ||
| 2250 | |||
| 2251 | if (!tls1_transcript_data(s, &hdata, &hdata_len)) { | ||
| 2252 | SSLerror(s, ERR_R_INTERNAL_ERROR); | ||
| 2253 | goto err; | ||
| 2254 | } | ||
| 2255 | if (!EVP_PKEY_get_default_digest_nid(pkey, &nid) || | ||
| 2256 | (md = EVP_get_digestbynid(nid)) == NULL) { | ||
| 2257 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 2258 | goto err; | ||
| 2259 | } | ||
| 2260 | if (!EVP_DigestSignInit(mctx, &pctx, md, NULL, pkey)) { | ||
| 2261 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 2262 | goto err; | ||
| 2263 | } | ||
| 2264 | #ifndef OPENSSL_NO_GOST | ||
| 2265 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN, | ||
| 2266 | EVP_PKEY_CTRL_GOST_SIG_FORMAT, GOST_SIG_FORMAT_RS_LE, NULL) <= 0) { | ||
| 2267 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 2268 | goto err; | ||
| 2269 | } | ||
| 2270 | #endif | ||
| 2271 | if (!EVP_DigestSign(mctx, NULL, &signature_len, hdata, hdata_len)) { | ||
| 2272 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 2273 | goto err; | ||
| 2274 | } | ||
| 2275 | if ((signature = calloc(1, signature_len)) == NULL) { | ||
| 2276 | SSLerror(s, ERR_R_MALLOC_FAILURE); | ||
| 2277 | goto err; | ||
| 2278 | } | ||
| 2279 | if (!EVP_DigestSign(mctx, signature, &signature_len, hdata, hdata_len)) { | ||
| 2280 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 2281 | goto err; | ||
| 2282 | } | ||
| 2283 | |||
| 2284 | if (!CBB_add_u16_length_prefixed(cert_verify, &cbb_signature)) | ||
| 2285 | goto err; | ||
| 2286 | if (!CBB_add_bytes(&cbb_signature, signature, signature_len)) | ||
| 2287 | goto err; | ||
| 2288 | if (!CBB_flush(cert_verify)) | ||
| 2289 | goto err; | ||
| 2290 | |||
| 2291 | ret = 1; | ||
| 2292 | err: | ||
| 2293 | EVP_MD_CTX_free(mctx); | ||
| 2294 | free(signature); | ||
| 2295 | return ret; | ||
| 2296 | } | ||
| 2297 | #endif | ||
| 2298 | |||
| 2299 | static int | 2103 | static int |
| 2300 | ssl3_send_client_verify(SSL *s) | 2104 | ssl3_send_client_verify(SSL *s) |
| 2301 | { | 2105 | { |
| @@ -2331,12 +2135,6 @@ ssl3_send_client_verify(SSL *s) | |||
| 2331 | } else if (EVP_PKEY_id(pkey) == EVP_PKEY_EC) { | 2135 | } else if (EVP_PKEY_id(pkey) == EVP_PKEY_EC) { |
| 2332 | if (!ssl3_send_client_verify_ec(s, pkey, &cert_verify)) | 2136 | if (!ssl3_send_client_verify_ec(s, pkey, &cert_verify)) |
| 2333 | goto err; | 2137 | goto err; |
| 2334 | #ifndef OPENSSL_NO_GOST | ||
| 2335 | } else if (EVP_PKEY_id(pkey) == NID_id_GostR3410_94 || | ||
| 2336 | EVP_PKEY_id(pkey) == NID_id_GostR3410_2001) { | ||
| 2337 | if (!ssl3_send_client_verify_gost(s, pkey, &cert_verify)) | ||
| 2338 | goto err; | ||
| 2339 | #endif | ||
| 2340 | } else { | 2138 | } else { |
| 2341 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 2139 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
| 2342 | goto err; | 2140 | goto err; |
