summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_clnt.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libssl/ssl_clnt.c81
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)
1071int 1071int
1072ssl3_get_server_certificate(SSL *s) 1072ssl3_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
2449ssl3_check_cert_and_algorithm(SSL *s) 2438ssl3_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)) {