diff options
Diffstat (limited to 'src/lib/libssl/ssl_clnt.c')
| -rw-r--r-- | src/lib/libssl/ssl_clnt.c | 81 |
1 files changed, 32 insertions, 49 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index 8b5ccd480a..61c1d71c8e 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.136 2022/01/11 18:39:28 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.137 2022/01/11 19:03:15 jsing Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -1071,12 +1071,13 @@ ssl3_get_server_hello(SSL *s) | |||
| 1071 | int | 1071 | int |
| 1072 | ssl3_get_server_certificate(SSL *s) | 1072 | ssl3_get_server_certificate(SSL *s) |
| 1073 | { | 1073 | { |
| 1074 | int al, i, ret; | ||
| 1075 | CBS cbs, cert_list; | 1074 | CBS cbs, cert_list; |
| 1076 | X509 *x = NULL; | 1075 | X509 *x = NULL; |
| 1077 | const unsigned char *q; | 1076 | const unsigned char *q; |
| 1078 | STACK_OF(X509) *sk = NULL; | 1077 | STACK_OF(X509) *sk = NULL; |
| 1079 | EVP_PKEY *pkey = NULL; | 1078 | EVP_PKEY *pkey; |
| 1079 | int cert_type; | ||
| 1080 | int al, ret; | ||
| 1080 | 1081 | ||
| 1081 | if ((ret = ssl3_get_message(s, SSL3_ST_CR_CERT_A, | 1082 | if ((ret = ssl3_get_message(s, SSL3_ST_CR_CERT_A, |
| 1082 | SSL3_ST_CR_CERT_B, -1, s->internal->max_cert_list)) <= 0) | 1083 | SSL3_ST_CR_CERT_B, -1, s->internal->max_cert_list)) <= 0) |
| @@ -1144,12 +1145,11 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1144 | x = NULL; | 1145 | x = NULL; |
| 1145 | } | 1146 | } |
| 1146 | 1147 | ||
| 1147 | i = ssl_verify_cert_chain(s, sk); | 1148 | if (ssl_verify_cert_chain(s, sk) <= 0 && |
| 1148 | if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)) { | 1149 | s->verify_mode != SSL_VERIFY_NONE) { |
| 1149 | al = ssl_verify_alarm_type(s->verify_result); | 1150 | al = ssl_verify_alarm_type(s->verify_result); |
| 1150 | SSLerror(s, SSL_R_CERTIFICATE_VERIFY_FAILED); | 1151 | SSLerror(s, SSL_R_CERTIFICATE_VERIFY_FAILED); |
| 1151 | goto fatal_err; | 1152 | goto fatal_err; |
| 1152 | |||
| 1153 | } | 1153 | } |
| 1154 | ERR_clear_error(); /* but we keep s->verify_result */ | 1154 | ERR_clear_error(); /* but we keep s->verify_result */ |
| 1155 | 1155 | ||
| @@ -1159,39 +1159,31 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1159 | */ | 1159 | */ |
| 1160 | x = sk_X509_value(sk, 0); | 1160 | x = sk_X509_value(sk, 0); |
| 1161 | 1161 | ||
| 1162 | pkey = X509_get_pubkey(x); | 1162 | if ((pkey = X509_get0_pubkey(x)) == NULL || |
| 1163 | 1163 | EVP_PKEY_missing_parameters(pkey)) { | |
| 1164 | if (pkey == NULL || EVP_PKEY_missing_parameters(pkey)) { | ||
| 1165 | x = NULL; | 1164 | x = NULL; |
| 1166 | al = SSL3_AL_FATAL; | 1165 | al = SSL3_AL_FATAL; |
| 1167 | SSLerror(s, SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS); | 1166 | SSLerror(s, SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS); |
| 1168 | goto fatal_err; | 1167 | goto fatal_err; |
| 1169 | } | 1168 | } |
| 1170 | 1169 | if ((cert_type = ssl_cert_type(x, pkey)) < 0) { | |
| 1171 | i = ssl_cert_type(x, pkey); | ||
| 1172 | if (i < 0) { | ||
| 1173 | x = NULL; | 1170 | x = NULL; |
| 1174 | al = SSL3_AL_FATAL; | 1171 | al = SSL3_AL_FATAL; |
| 1175 | SSLerror(s, SSL_R_UNKNOWN_CERTIFICATE_TYPE); | 1172 | SSLerror(s, SSL_R_UNKNOWN_CERTIFICATE_TYPE); |
| 1176 | goto fatal_err; | 1173 | goto fatal_err; |
| 1177 | } | 1174 | } |
| 1178 | s->session->peer_cert_type = i; | ||
| 1179 | |||
| 1180 | sk_X509_pop_free(s->session->cert_chain, X509_free); | ||
| 1181 | s->session->cert_chain = sk; | ||
| 1182 | sk = NULL; | ||
| 1183 | |||
| 1184 | X509_up_ref(x); | ||
| 1185 | X509_free(s->session->peer_pkeys[i].x509); | ||
| 1186 | s->session->peer_pkeys[i].x509 = x; | ||
| 1187 | s->session->peer_key = &s->session->peer_pkeys[i]; | ||
| 1188 | 1175 | ||
| 1189 | X509_up_ref(x); | 1176 | X509_up_ref(x); |
| 1190 | X509_free(s->session->peer_cert); | 1177 | X509_free(s->session->peer_cert); |
| 1191 | s->session->peer_cert = x; | 1178 | s->session->peer_cert = x; |
| 1179 | s->session->peer_cert_type = cert_type; | ||
| 1192 | 1180 | ||
| 1193 | s->session->verify_result = s->verify_result; | 1181 | s->session->verify_result = s->verify_result; |
| 1194 | 1182 | ||
| 1183 | sk_X509_pop_free(s->session->cert_chain, X509_free); | ||
| 1184 | s->session->cert_chain = sk; | ||
| 1185 | sk = NULL; | ||
| 1186 | |||
| 1195 | x = NULL; | 1187 | x = NULL; |
| 1196 | ret = 1; | 1188 | ret = 1; |
| 1197 | 1189 | ||
| @@ -1204,7 +1196,6 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1204 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1196 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1205 | } | 1197 | } |
| 1206 | err: | 1198 | err: |
| 1207 | EVP_PKEY_free(pkey); | ||
| 1208 | X509_free(x); | 1199 | X509_free(x); |
| 1209 | sk_X509_pop_free(sk, X509_free); | 1200 | sk_X509_pop_free(sk, X509_free); |
| 1210 | 1201 | ||
| @@ -1377,12 +1368,12 @@ ssl3_get_server_key_exchange(SSL *s) | |||
| 1377 | EVP_PKEY_CTX *pctx; | 1368 | EVP_PKEY_CTX *pctx; |
| 1378 | EVP_PKEY *pkey = NULL; | 1369 | EVP_PKEY *pkey = NULL; |
| 1379 | 1370 | ||
| 1380 | if ((alg_a & SSL_aRSA) != 0) { | 1371 | if ((alg_a & SSL_aRSA) != 0 && |
| 1381 | pkey = X509_get0_pubkey( | 1372 | s->session->peer_cert_type == SSL_PKEY_RSA) { |
| 1382 | s->session->peer_pkeys[SSL_PKEY_RSA].x509); | 1373 | pkey = X509_get0_pubkey(s->session->peer_cert); |
| 1383 | } else if ((alg_a & SSL_aECDSA) != 0) { | 1374 | } else if ((alg_a & SSL_aECDSA) != 0 && |
| 1384 | pkey = X509_get0_pubkey( | 1375 | s->session->peer_cert_type == SSL_PKEY_ECC) { |
| 1385 | s->session->peer_pkeys[SSL_PKEY_ECC].x509); | 1376 | pkey = X509_get0_pubkey(s->session->peer_cert); |
| 1386 | } | 1377 | } |
| 1387 | if (pkey == NULL) { | 1378 | if (pkey == NULL) { |
| 1388 | al = SSL_AD_ILLEGAL_PARAMETER; | 1379 | al = SSL_AD_ILLEGAL_PARAMETER; |
| @@ -1800,7 +1791,7 @@ ssl3_send_client_kex_rsa(SSL *s, CBB *cbb) | |||
| 1800 | unsigned char pms[SSL_MAX_MASTER_KEY_LENGTH]; | 1791 | unsigned char pms[SSL_MAX_MASTER_KEY_LENGTH]; |
| 1801 | unsigned char *enc_pms = NULL; | 1792 | unsigned char *enc_pms = NULL; |
| 1802 | uint16_t max_legacy_version; | 1793 | uint16_t max_legacy_version; |
| 1803 | EVP_PKEY *pkey = NULL; | 1794 | EVP_PKEY *pkey; |
| 1804 | RSA *rsa; | 1795 | RSA *rsa; |
| 1805 | int ret = 0; | 1796 | int ret = 0; |
| 1806 | int enc_len; | 1797 | int enc_len; |
| @@ -1810,7 +1801,7 @@ ssl3_send_client_kex_rsa(SSL *s, CBB *cbb) | |||
| 1810 | * RSA-Encrypted Premaster Secret Message - RFC 5246 section 7.4.7.1. | 1801 | * RSA-Encrypted Premaster Secret Message - RFC 5246 section 7.4.7.1. |
| 1811 | */ | 1802 | */ |
| 1812 | 1803 | ||
| 1813 | pkey = X509_get_pubkey(s->session->peer_pkeys[SSL_PKEY_RSA].x509); | 1804 | pkey = X509_get0_pubkey(s->session->peer_cert); |
| 1814 | if (pkey == NULL || (rsa = EVP_PKEY_get0_RSA(pkey)) == NULL) { | 1805 | if (pkey == NULL || (rsa = EVP_PKEY_get0_RSA(pkey)) == NULL) { |
| 1815 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 1806 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
| 1816 | goto err; | 1807 | goto err; |
| @@ -1855,7 +1846,6 @@ ssl3_send_client_kex_rsa(SSL *s, CBB *cbb) | |||
| 1855 | 1846 | ||
| 1856 | err: | 1847 | err: |
| 1857 | explicit_bzero(pms, sizeof(pms)); | 1848 | explicit_bzero(pms, sizeof(pms)); |
| 1858 | EVP_PKEY_free(pkey); | ||
| 1859 | free(enc_pms); | 1849 | free(enc_pms); |
| 1860 | 1850 | ||
| 1861 | return ret; | 1851 | return ret; |
| @@ -1938,8 +1928,7 @@ ssl3_send_client_kex_gost(SSL *s, CBB *cbb) | |||
| 1938 | unsigned char premaster_secret[32], shared_ukm[32], tmp[256]; | 1928 | unsigned char premaster_secret[32], shared_ukm[32], tmp[256]; |
| 1939 | EVP_PKEY_CTX *pkey_ctx = NULL; | 1929 | EVP_PKEY_CTX *pkey_ctx = NULL; |
| 1940 | EVP_MD_CTX *ukm_hash = NULL; | 1930 | EVP_MD_CTX *ukm_hash = NULL; |
| 1941 | EVP_PKEY *pub_key; | 1931 | EVP_PKEY *pkey; |
| 1942 | X509 *peer_cert; | ||
| 1943 | size_t msglen; | 1932 | size_t msglen; |
| 1944 | unsigned int md_len; | 1933 | unsigned int md_len; |
| 1945 | CBB gostblob; | 1934 | CBB gostblob; |
| @@ -1947,12 +1936,12 @@ ssl3_send_client_kex_gost(SSL *s, CBB *cbb) | |||
| 1947 | int ret = 0; | 1936 | int ret = 0; |
| 1948 | 1937 | ||
| 1949 | /* Get server sertificate PKEY and create ctx from it */ | 1938 | /* Get server sertificate PKEY and create ctx from it */ |
| 1950 | peer_cert = s->session->peer_pkeys[SSL_PKEY_GOST01].x509; | 1939 | pkey = X509_get0_pubkey(s->session->peer_cert); |
| 1951 | if ((pub_key = X509_get0_pubkey(peer_cert)) == NULL) { | 1940 | if (pkey == NULL || s->session->peer_cert_type != SSL_PKEY_GOST01) { |
| 1952 | SSLerror(s, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER); | 1941 | SSLerror(s, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER); |
| 1953 | goto err; | 1942 | goto err; |
| 1954 | } | 1943 | } |
| 1955 | if ((pkey_ctx = EVP_PKEY_CTX_new(pub_key, NULL)) == NULL) { | 1944 | if ((pkey_ctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL) { |
| 1956 | SSLerror(s, ERR_R_MALLOC_FAILURE); | 1945 | SSLerror(s, ERR_R_MALLOC_FAILURE); |
| 1957 | goto err; | 1946 | goto err; |
| 1958 | } | 1947 | } |
| @@ -2449,9 +2438,8 @@ int | |||
| 2449 | ssl3_check_cert_and_algorithm(SSL *s) | 2438 | ssl3_check_cert_and_algorithm(SSL *s) |
| 2450 | { | 2439 | { |
| 2451 | long alg_k, alg_a; | 2440 | long alg_k, alg_a; |
| 2452 | EVP_PKEY *pkey = NULL; | ||
| 2453 | int nid = NID_undef; | 2441 | int nid = NID_undef; |
| 2454 | int i, idx; | 2442 | int i; |
| 2455 | 2443 | ||
| 2456 | alg_k = S3I(s)->hs.cipher->algorithm_mkey; | 2444 | alg_k = S3I(s)->hs.cipher->algorithm_mkey; |
| 2457 | alg_a = S3I(s)->hs.cipher->algorithm_auth; | 2445 | alg_a = S3I(s)->hs.cipher->algorithm_auth; |
| @@ -2465,20 +2453,15 @@ ssl3_check_cert_and_algorithm(SSL *s) | |||
| 2465 | 2453 | ||
| 2466 | /* This is the passed certificate. */ | 2454 | /* This is the passed certificate. */ |
| 2467 | 2455 | ||
| 2468 | idx = s->session->peer_cert_type; | 2456 | if (s->session->peer_cert_type == SSL_PKEY_ECC) { |
| 2469 | if (idx == SSL_PKEY_ECC) { | 2457 | if (!ssl_check_srvr_ecc_cert_and_alg(s, s->session->peer_cert)) { |
| 2470 | if (!ssl_check_srvr_ecc_cert_and_alg(s, | ||
| 2471 | s->session->peer_pkeys[idx].x509)) { | ||
| 2472 | /* check failed */ | ||
| 2473 | SSLerror(s, SSL_R_BAD_ECC_CERT); | 2458 | SSLerror(s, SSL_R_BAD_ECC_CERT); |
| 2474 | goto fatal_err; | 2459 | goto fatal_err; |
| 2475 | } else { | ||
| 2476 | return (1); | ||
| 2477 | } | 2460 | } |
| 2461 | return (1); | ||
| 2478 | } | 2462 | } |
| 2479 | pkey = X509_get_pubkey(s->session->peer_pkeys[idx].x509); | 2463 | |
| 2480 | i = X509_certificate_type(s->session->peer_pkeys[idx].x509, pkey); | 2464 | i = X509_certificate_type(s->session->peer_cert, NULL); |
| 2481 | EVP_PKEY_free(pkey); | ||
| 2482 | 2465 | ||
| 2483 | /* Check that we have a certificate if we require one. */ | 2466 | /* Check that we have a certificate if we require one. */ |
| 2484 | if ((alg_a & SSL_aRSA) && !has_bits(i, EVP_PK_RSA|EVP_PKT_SIGN)) { | 2467 | if ((alg_a & SSL_aRSA) && !has_bits(i, EVP_PK_RSA|EVP_PKT_SIGN)) { |
