summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2022-01-08 12:59:59 +0000
committerjsing <>2022-01-08 12:59:59 +0000
commitb30ca58d70d934bae7bf7e8653a6c20abbb32a31 (patch)
treea0f52599388e1e633ef501a33e33307964a97198
parentc9912e9c904debefddadcc409940eab31cf8b02b (diff)
downloadopenbsd-b30ca58d70d934bae7bf7e8653a6c20abbb32a31.tar.gz
openbsd-b30ca58d70d934bae7bf7e8653a6c20abbb32a31.tar.bz2
openbsd-b30ca58d70d934bae7bf7e8653a6c20abbb32a31.zip
Merge SESS_CERT into SSL_SESSION.
There is no reason for SESS_CERT to exist - remove it and merge its members into SSL_SESSION for the time being. More clean up to follow. ok inoguchi@ tb@
-rw-r--r--src/lib/libssl/ssl_cert.c37
-rw-r--r--src/lib/libssl/ssl_clnt.c99
-rw-r--r--src/lib/libssl/ssl_lib.c16
-rw-r--r--src/lib/libssl/ssl_locl.h29
-rw-r--r--src/lib/libssl/ssl_sess.c8
-rw-r--r--src/lib/libssl/ssl_srvr.c22
-rw-r--r--src/lib/libssl/tls13_client.c18
-rw-r--r--src/lib/libssl/tls13_server.c18
8 files changed, 76 insertions, 171 deletions
diff --git a/src/lib/libssl/ssl_cert.c b/src/lib/libssl/ssl_cert.c
index c735547393..e91de659ce 100644
--- a/src/lib/libssl/ssl_cert.c
+++ b/src/lib/libssl/ssl_cert.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_cert.c,v 1.92 2022/01/08 12:43:44 jsing Exp $ */ 1/* $OpenBSD: ssl_cert.c,v 1.93 2022/01/08 12:59:58 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 *
@@ -347,41 +347,6 @@ ssl_cert_add1_chain_cert(SSL_CERT *c, X509 *cert)
347 return 1; 347 return 1;
348} 348}
349 349
350SESS_CERT *
351ssl_sess_cert_new(void)
352{
353 SESS_CERT *ret;
354
355 ret = calloc(1, sizeof *ret);
356 if (ret == NULL) {
357 SSLerrorx(ERR_R_MALLOC_FAILURE);
358 return NULL;
359 }
360 ret->peer_key = &(ret->peer_pkeys[SSL_PKEY_RSA]);
361 ret->references = 1;
362
363 return ret;
364}
365
366void
367ssl_sess_cert_free(SESS_CERT *sc)
368{
369 int i;
370
371 if (sc == NULL)
372 return;
373
374 i = CRYPTO_add(&sc->references, -1, CRYPTO_LOCK_SSL_SESS_CERT);
375 if (i > 0)
376 return;
377
378 sk_X509_pop_free(sc->cert_chain, X509_free);
379 for (i = 0; i < SSL_PKEY_NUM; i++)
380 X509_free(sc->peer_pkeys[i].x509);
381
382 free(sc);
383}
384
385int 350int
386ssl_verify_cert_chain(SSL *s, STACK_OF(X509) *sk) 351ssl_verify_cert_chain(SSL *s, STACK_OF(X509) *sk)
387{ 352{
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c
index c3912c3ebd..70b6fff6bf 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.127 2022/01/06 18:23:56 jsing Exp $ */ 1/* $OpenBSD: ssl_clnt.c,v 1.128 2022/01/08 12:59:58 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 *
@@ -1076,7 +1076,6 @@ ssl3_get_server_certificate(SSL *s)
1076 X509 *x = NULL; 1076 X509 *x = NULL;
1077 const unsigned char *q; 1077 const unsigned char *q;
1078 STACK_OF(X509) *sk = NULL; 1078 STACK_OF(X509) *sk = NULL;
1079 SESS_CERT *sc;
1080 EVP_PKEY *pkey = NULL; 1079 EVP_PKEY *pkey = NULL;
1081 1080
1082 if ((ret = ssl3_get_message(s, SSL3_ST_CR_CERT_A, 1081 if ((ret = ssl3_get_message(s, SSL3_ST_CR_CERT_A,
@@ -1154,20 +1153,11 @@ ssl3_get_server_certificate(SSL *s)
1154 } 1153 }
1155 ERR_clear_error(); /* but we keep s->verify_result */ 1154 ERR_clear_error(); /* but we keep s->verify_result */
1156 1155
1157 sc = ssl_sess_cert_new();
1158 if (sc == NULL)
1159 goto err;
1160 ssl_sess_cert_free(s->session->sess_cert);
1161 s->session->sess_cert = sc;
1162
1163 sc->cert_chain = sk;
1164 /* 1156 /*
1165 * Inconsistency alert: cert_chain does include the peer's 1157 * Inconsistency alert: cert_chain does include the peer's
1166 * certificate, which we don't include in s3_srvr.c 1158 * certificate, which we don't include in s3_srvr.c
1167 */ 1159 */
1168 x = sk_X509_value(sk, 0); 1160 x = sk_X509_value(sk, 0);
1169 sk = NULL;
1170 /* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/
1171 1161
1172 pkey = X509_get_pubkey(x); 1162 pkey = X509_get_pubkey(x);
1173 1163
@@ -1185,20 +1175,21 @@ ssl3_get_server_certificate(SSL *s)
1185 SSLerror(s, SSL_R_UNKNOWN_CERTIFICATE_TYPE); 1175 SSLerror(s, SSL_R_UNKNOWN_CERTIFICATE_TYPE);
1186 goto fatal_err; 1176 goto fatal_err;
1187 } 1177 }
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;
1188 1183
1189 sc->peer_cert_type = i;
1190 X509_up_ref(x); 1184 X509_up_ref(x);
1191 /* 1185 X509_free(s->session->peer_pkeys[i].x509);
1192 * Why would the following ever happen? 1186 s->session->peer_pkeys[i].x509 = x;
1193 * We just created sc a couple of lines ago. 1187 s->session->peer_key = &s->session->peer_pkeys[i];
1194 */
1195 X509_free(sc->peer_pkeys[i].x509);
1196 sc->peer_pkeys[i].x509 = x;
1197 sc->peer_key = &(sc->peer_pkeys[i]);
1198 1188
1199 X509_free(s->session->peer);
1200 X509_up_ref(x); 1189 X509_up_ref(x);
1190 X509_free(s->session->peer);
1201 s->session->peer = x; 1191 s->session->peer = x;
1192
1202 s->session->verify_result = s->verify_result; 1193 s->session->verify_result = s->verify_result;
1203 1194
1204 x = NULL; 1195 x = NULL;
@@ -1225,11 +1216,9 @@ ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, CBS *cbs)
1225{ 1216{
1226 int nid = NID_dhKeyAgreement; 1217 int nid = NID_dhKeyAgreement;
1227 int invalid_params, invalid_key; 1218 int invalid_params, invalid_key;
1228 SESS_CERT *sc;
1229 long alg_a; 1219 long alg_a;
1230 1220
1231 alg_a = S3I(s)->hs.cipher->algorithm_auth; 1221 alg_a = S3I(s)->hs.cipher->algorithm_auth;
1232 sc = s->session->sess_cert;
1233 1222
1234 tls_key_share_free(S3I(s)->hs.key_share); 1223 tls_key_share_free(S3I(s)->hs.key_share);
1235 if ((S3I(s)->hs.key_share = tls_key_share_new_nid(nid)) == NULL) 1224 if ((S3I(s)->hs.key_share = tls_key_share_new_nid(nid)) == NULL)
@@ -1254,7 +1243,7 @@ ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, CBS *cbs)
1254 } 1243 }
1255 1244
1256 if (alg_a & SSL_aRSA) 1245 if (alg_a & SSL_aRSA)
1257 *pkey = X509_get_pubkey(sc->peer_pkeys[SSL_PKEY_RSA].x509); 1246 *pkey = X509_get_pubkey(s->session->peer_pkeys[SSL_PKEY_RSA].x509);
1258 else 1247 else
1259 /* XXX - Anonymous DH, so no certificate or pkey. */ 1248 /* XXX - Anonymous DH, so no certificate or pkey. */
1260 *pkey = NULL; 1249 *pkey = NULL;
@@ -1275,11 +1264,9 @@ ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, CBS *cbs)
1275 CBS public; 1264 CBS public;
1276 uint8_t curve_type; 1265 uint8_t curve_type;
1277 uint16_t curve_id; 1266 uint16_t curve_id;
1278 SESS_CERT *sc;
1279 long alg_a; 1267 long alg_a;
1280 1268
1281 alg_a = S3I(s)->hs.cipher->algorithm_auth; 1269 alg_a = S3I(s)->hs.cipher->algorithm_auth;
1282 sc = s->session->sess_cert;
1283 1270
1284 if (!CBS_get_u8(cbs, &curve_type)) 1271 if (!CBS_get_u8(cbs, &curve_type))
1285 goto decode_err; 1272 goto decode_err;
@@ -1319,9 +1306,9 @@ ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, CBS *cbs)
1319 * and ECDSA. 1306 * and ECDSA.
1320 */ 1307 */
1321 if (alg_a & SSL_aRSA) 1308 if (alg_a & SSL_aRSA)
1322 *pkey = X509_get_pubkey(sc->peer_pkeys[SSL_PKEY_RSA].x509); 1309 *pkey = X509_get_pubkey(s->session->peer_pkeys[SSL_PKEY_RSA].x509);
1323 else if (alg_a & SSL_aECDSA) 1310 else if (alg_a & SSL_aECDSA)
1324 *pkey = X509_get_pubkey(sc->peer_pkeys[SSL_PKEY_ECC].x509); 1311 *pkey = X509_get_pubkey(s->session->peer_pkeys[SSL_PKEY_ECC].x509);
1325 else 1312 else
1326 /* XXX - Anonymous ECDH, so no certificate or pkey. */ 1313 /* XXX - Anonymous ECDH, so no certificate or pkey. */
1327 *pkey = NULL; 1314 *pkey = NULL;
@@ -1381,12 +1368,6 @@ ssl3_get_server_key_exchange(SSL *s)
1381 return (1); 1368 return (1);
1382 } 1369 }
1383 1370
1384 if (s->session->sess_cert == NULL) {
1385 s->session->sess_cert = ssl_sess_cert_new();
1386 if (s->session->sess_cert == NULL)
1387 goto err;
1388 }
1389
1390 param = CBS_data(&cbs); 1371 param = CBS_data(&cbs);
1391 param_len = CBS_len(&cbs); 1372 param_len = CBS_len(&cbs);
1392 1373
@@ -1823,7 +1804,7 @@ ssl3_get_server_done(SSL *s)
1823} 1804}
1824 1805
1825static int 1806static int
1826ssl3_send_client_kex_rsa(SSL *s, SESS_CERT *sess_cert, CBB *cbb) 1807ssl3_send_client_kex_rsa(SSL *s, CBB *cbb)
1827{ 1808{
1828 unsigned char pms[SSL_MAX_MASTER_KEY_LENGTH]; 1809 unsigned char pms[SSL_MAX_MASTER_KEY_LENGTH];
1829 unsigned char *enc_pms = NULL; 1810 unsigned char *enc_pms = NULL;
@@ -1838,7 +1819,7 @@ ssl3_send_client_kex_rsa(SSL *s, SESS_CERT *sess_cert, CBB *cbb)
1838 * RSA-Encrypted Premaster Secret Message - RFC 5246 section 7.4.7.1. 1819 * RSA-Encrypted Premaster Secret Message - RFC 5246 section 7.4.7.1.
1839 */ 1820 */
1840 1821
1841 pkey = X509_get_pubkey(sess_cert->peer_pkeys[SSL_PKEY_RSA].x509); 1822 pkey = X509_get_pubkey(s->session->peer_pkeys[SSL_PKEY_RSA].x509);
1842 if (pkey == NULL || (rsa = EVP_PKEY_get0_RSA(pkey)) == NULL) { 1823 if (pkey == NULL || (rsa = EVP_PKEY_get0_RSA(pkey)) == NULL) {
1843 SSLerror(s, ERR_R_INTERNAL_ERROR); 1824 SSLerror(s, ERR_R_INTERNAL_ERROR);
1844 goto err; 1825 goto err;
@@ -1890,7 +1871,7 @@ ssl3_send_client_kex_rsa(SSL *s, SESS_CERT *sess_cert, CBB *cbb)
1890} 1871}
1891 1872
1892static int 1873static int
1893ssl3_send_client_kex_dhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) 1874ssl3_send_client_kex_dhe(SSL *s, CBB *cbb)
1894{ 1875{
1895 uint8_t *key = NULL; 1876 uint8_t *key = NULL;
1896 size_t key_len = 0; 1877 size_t key_len = 0;
@@ -1922,7 +1903,7 @@ ssl3_send_client_kex_dhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb)
1922} 1903}
1923 1904
1924static int 1905static int
1925ssl3_send_client_kex_ecdhe(SSL *s, SESS_CERT *sc, CBB *cbb) 1906ssl3_send_client_kex_ecdhe(SSL *s, CBB *cbb)
1926{ 1907{
1927 uint8_t *key = NULL; 1908 uint8_t *key = NULL;
1928 size_t key_len = 0; 1909 size_t key_len = 0;
@@ -1961,7 +1942,7 @@ ssl3_send_client_kex_ecdhe(SSL *s, SESS_CERT *sc, CBB *cbb)
1961} 1942}
1962 1943
1963static int 1944static int
1964ssl3_send_client_kex_gost(SSL *s, SESS_CERT *sess_cert, CBB *cbb) 1945ssl3_send_client_kex_gost(SSL *s, CBB *cbb)
1965{ 1946{
1966 unsigned char premaster_secret[32], shared_ukm[32], tmp[256]; 1947 unsigned char premaster_secret[32], shared_ukm[32], tmp[256];
1967 EVP_PKEY *pub_key = NULL; 1948 EVP_PKEY *pub_key = NULL;
@@ -1975,7 +1956,7 @@ ssl3_send_client_kex_gost(SSL *s, SESS_CERT *sess_cert, CBB *cbb)
1975 CBB gostblob; 1956 CBB gostblob;
1976 1957
1977 /* Get server sertificate PKEY and create ctx from it */ 1958 /* Get server sertificate PKEY and create ctx from it */
1978 peer_cert = sess_cert->peer_pkeys[SSL_PKEY_GOST01].x509; 1959 peer_cert = s->session->peer_pkeys[SSL_PKEY_GOST01].x509;
1979 if (peer_cert == NULL) { 1960 if (peer_cert == NULL) {
1980 SSLerror(s, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER); 1961 SSLerror(s, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER);
1981 goto err; 1962 goto err;
@@ -2074,7 +2055,6 @@ ssl3_send_client_kex_gost(SSL *s, SESS_CERT *sess_cert, CBB *cbb)
2074int 2055int
2075ssl3_send_client_key_exchange(SSL *s) 2056ssl3_send_client_key_exchange(SSL *s)
2076{ 2057{
2077 SESS_CERT *sess_cert;
2078 unsigned long alg_k; 2058 unsigned long alg_k;
2079 CBB cbb, kex; 2059 CBB cbb, kex;
2080 2060
@@ -2083,28 +2063,21 @@ ssl3_send_client_key_exchange(SSL *s)
2083 if (S3I(s)->hs.state == SSL3_ST_CW_KEY_EXCH_A) { 2063 if (S3I(s)->hs.state == SSL3_ST_CW_KEY_EXCH_A) {
2084 alg_k = S3I(s)->hs.cipher->algorithm_mkey; 2064 alg_k = S3I(s)->hs.cipher->algorithm_mkey;
2085 2065
2086 if ((sess_cert = s->session->sess_cert) == NULL) {
2087 ssl3_send_alert(s, SSL3_AL_FATAL,
2088 SSL_AD_UNEXPECTED_MESSAGE);
2089 SSLerror(s, ERR_R_INTERNAL_ERROR);
2090 goto err;
2091 }
2092
2093 if (!ssl3_handshake_msg_start(s, &cbb, &kex, 2066 if (!ssl3_handshake_msg_start(s, &cbb, &kex,
2094 SSL3_MT_CLIENT_KEY_EXCHANGE)) 2067 SSL3_MT_CLIENT_KEY_EXCHANGE))
2095 goto err; 2068 goto err;
2096 2069
2097 if (alg_k & SSL_kRSA) { 2070 if (alg_k & SSL_kRSA) {
2098 if (!ssl3_send_client_kex_rsa(s, sess_cert, &kex)) 2071 if (!ssl3_send_client_kex_rsa(s, &kex))
2099 goto err; 2072 goto err;
2100 } else if (alg_k & SSL_kDHE) { 2073 } else if (alg_k & SSL_kDHE) {
2101 if (!ssl3_send_client_kex_dhe(s, sess_cert, &kex)) 2074 if (!ssl3_send_client_kex_dhe(s, &kex))
2102 goto err; 2075 goto err;
2103 } else if (alg_k & SSL_kECDHE) { 2076 } else if (alg_k & SSL_kECDHE) {
2104 if (!ssl3_send_client_kex_ecdhe(s, sess_cert, &kex)) 2077 if (!ssl3_send_client_kex_ecdhe(s, &kex))
2105 goto err; 2078 goto err;
2106 } else if (alg_k & SSL_kGOST) { 2079 } else if (alg_k & SSL_kGOST) {
2107 if (ssl3_send_client_kex_gost(s, sess_cert, &kex) != 1) 2080 if (ssl3_send_client_kex_gost(s, &kex) != 1)
2108 goto err; 2081 goto err;
2109 } else { 2082 } else {
2110 ssl3_send_alert(s, SSL3_AL_FATAL, 2083 ssl3_send_alert(s, SSL3_AL_FATAL,
@@ -2481,11 +2454,10 @@ ssl3_send_client_certificate(SSL *s)
2481int 2454int
2482ssl3_check_cert_and_algorithm(SSL *s) 2455ssl3_check_cert_and_algorithm(SSL *s)
2483{ 2456{
2484 int i, idx; 2457 long alg_k, alg_a;
2485 long alg_k, alg_a; 2458 EVP_PKEY *pkey = NULL;
2486 EVP_PKEY *pkey = NULL;
2487 SESS_CERT *sc;
2488 int nid = NID_undef; 2459 int nid = NID_undef;
2460 int i, idx;
2489 2461
2490 alg_k = S3I(s)->hs.cipher->algorithm_mkey; 2462 alg_k = S3I(s)->hs.cipher->algorithm_mkey;
2491 alg_a = S3I(s)->hs.cipher->algorithm_auth; 2463 alg_a = S3I(s)->hs.cipher->algorithm_auth;
@@ -2494,21 +2466,15 @@ ssl3_check_cert_and_algorithm(SSL *s)
2494 if (alg_a & SSL_aNULL) 2466 if (alg_a & SSL_aNULL)
2495 return (1); 2467 return (1);
2496 2468
2497 sc = s->session->sess_cert;
2498 if (sc == NULL) {
2499 SSLerror(s, ERR_R_INTERNAL_ERROR);
2500 goto err;
2501 }
2502
2503 if (S3I(s)->hs.key_share != NULL) 2469 if (S3I(s)->hs.key_share != NULL)
2504 nid = tls_key_share_nid(S3I(s)->hs.key_share); 2470 nid = tls_key_share_nid(S3I(s)->hs.key_share);
2505 2471
2506 /* This is the passed certificate. */ 2472 /* This is the passed certificate. */
2507 2473
2508 idx = sc->peer_cert_type; 2474 idx = s->session->peer_cert_type;
2509 if (idx == SSL_PKEY_ECC) { 2475 if (idx == SSL_PKEY_ECC) {
2510 if (ssl_check_srvr_ecc_cert_and_alg( 2476 if (ssl_check_srvr_ecc_cert_and_alg(
2511 sc->peer_pkeys[idx].x509, s) == 0) { 2477 s->session->peer_pkeys[idx].x509, s) == 0) {
2512 /* check failed */ 2478 /* check failed */
2513 SSLerror(s, SSL_R_BAD_ECC_CERT); 2479 SSLerror(s, SSL_R_BAD_ECC_CERT);
2514 goto fatal_err; 2480 goto fatal_err;
@@ -2516,8 +2482,8 @@ ssl3_check_cert_and_algorithm(SSL *s)
2516 return (1); 2482 return (1);
2517 } 2483 }
2518 } 2484 }
2519 pkey = X509_get_pubkey(sc->peer_pkeys[idx].x509); 2485 pkey = X509_get_pubkey(s->session->peer_pkeys[idx].x509);
2520 i = X509_certificate_type(sc->peer_pkeys[idx].x509, pkey); 2486 i = X509_certificate_type(s->session->peer_pkeys[idx].x509, pkey);
2521 EVP_PKEY_free(pkey); 2487 EVP_PKEY_free(pkey);
2522 2488
2523 /* Check that we have a certificate if we require one. */ 2489 /* Check that we have a certificate if we require one. */
@@ -2536,9 +2502,10 @@ ssl3_check_cert_and_algorithm(SSL *s)
2536 } 2502 }
2537 2503
2538 return (1); 2504 return (1);
2505
2539 fatal_err: 2506 fatal_err:
2540 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); 2507 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
2541 err: 2508
2542 return (0); 2509 return (0);
2543} 2510}
2544 2511
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c
index 64b1806238..fb0920cdf2 100644
--- a/src/lib/libssl/ssl_lib.c
+++ b/src/lib/libssl/ssl_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_lib.c,v 1.282 2022/01/08 12:43:44 jsing Exp $ */ 1/* $OpenBSD: ssl_lib.c,v 1.283 2022/01/08 12:59:58 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 *
@@ -883,20 +883,14 @@ SSL_get_peer_certificate(const SSL *s)
883STACK_OF(X509) * 883STACK_OF(X509) *
884SSL_get_peer_cert_chain(const SSL *s) 884SSL_get_peer_cert_chain(const SSL *s)
885{ 885{
886 STACK_OF(X509) *r; 886 if (s == NULL || s->session == NULL)
887 887 return NULL;
888 if ((s == NULL) || (s->session == NULL) ||
889 (s->session->sess_cert == NULL))
890 r = NULL;
891 else
892 r = s->session->sess_cert->cert_chain;
893 888
894 /* 889 /*
895 * If we are a client, cert_chain includes the peer's own 890 * If we are a client, cert_chain includes the peer's own
896 * certificate; 891 * certificate; if we are a server, it does not.
897 * if we are a server, it does not.
898 */ 892 */
899 return (r); 893 return s->session->cert_chain;
900} 894}
901 895
902STACK_OF(X509) * 896STACK_OF(X509) *
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index 637a789dd1..d559e7148a 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.378 2022/01/08 12:54:32 jsing Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.379 2022/01/08 12:59:59 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 *
@@ -511,8 +511,15 @@ struct ssl_session_st {
511 * not_resumable_session_cb to disable session caching and tickets. */ 511 * not_resumable_session_cb to disable session caching and tickets. */
512 int not_resumable; 512 int not_resumable;
513 513
514 /* The cert is the certificate used to establish this connection */ 514 STACK_OF(X509) *cert_chain; /* as received from peer */
515 struct sess_cert_st /* SESS_CERT */ *sess_cert; 515
516 /* The 'peer_...' members are used only by clients. */
517 int peer_cert_type;
518
519 /* Obviously we don't have the private keys of these,
520 * so maybe we shouldn't even use the SSL_CERT_PKEY type here. */
521 SSL_CERT_PKEY *peer_key; /* points to an element of peer_pkeys (never NULL!) */
522 SSL_CERT_PKEY peer_pkeys[SSL_PKEY_NUM];
516 523
517 size_t tlsext_ecpointformatlist_length; 524 size_t tlsext_ecpointformatlist_length;
518 uint8_t *tlsext_ecpointformatlist; /* peer's list */ 525 uint8_t *tlsext_ecpointformatlist; /* peer's list */
@@ -1216,20 +1223,6 @@ typedef struct ssl3_state_st {
1216 struct ssl3_state_internal_st *internal; 1223 struct ssl3_state_internal_st *internal;
1217} SSL3_STATE; 1224} SSL3_STATE;
1218 1225
1219typedef struct sess_cert_st {
1220 STACK_OF(X509) *cert_chain; /* as received from peer */
1221
1222 /* The 'peer_...' members are used only by clients. */
1223 int peer_cert_type;
1224
1225 SSL_CERT_PKEY *peer_key; /* points to an element of peer_pkeys (never NULL!) */
1226 SSL_CERT_PKEY peer_pkeys[SSL_PKEY_NUM];
1227 /* Obviously we don't have the private keys of these,
1228 * so maybe we shouldn't even use the SSL_CERT_PKEY type here. */
1229
1230 int references; /* actually always 1 at the moment */
1231} SESS_CERT;
1232
1233/*#define SSL_DEBUG */ 1226/*#define SSL_DEBUG */
1234/*#define RSA_DEBUG */ 1227/*#define RSA_DEBUG */
1235 1228
@@ -1295,8 +1288,6 @@ int ssl_cert_set1_chain(SSL_CERT *c, STACK_OF(X509) *chain);
1295int ssl_cert_add0_chain_cert(SSL_CERT *c, X509 *cert); 1288int ssl_cert_add0_chain_cert(SSL_CERT *c, X509 *cert);
1296int ssl_cert_add1_chain_cert(SSL_CERT *c, X509 *cert); 1289int ssl_cert_add1_chain_cert(SSL_CERT *c, X509 *cert);
1297 1290
1298SESS_CERT *ssl_sess_cert_new(void);
1299void ssl_sess_cert_free(SESS_CERT *sc);
1300int ssl_get_new_session(SSL *s, int session); 1291int ssl_get_new_session(SSL *s, int session);
1301int ssl_get_prev_session(SSL *s, CBS *session_id, CBS *ext_block, 1292int ssl_get_prev_session(SSL *s, CBS *session_id, CBS *ext_block,
1302 int *alert); 1293 int *alert);
diff --git a/src/lib/libssl/ssl_sess.c b/src/lib/libssl/ssl_sess.c
index 2fa6af4564..8d0f0b928c 100644
--- a/src/lib/libssl/ssl_sess.c
+++ b/src/lib/libssl/ssl_sess.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_sess.c,v 1.106 2021/10/25 10:01:46 jsing Exp $ */ 1/* $OpenBSD: ssl_sess.c,v 1.107 2022/01/08 12:59:59 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 *
@@ -230,6 +230,8 @@ SSL_SESSION_new(void)
230 ss->next = NULL; 230 ss->next = NULL;
231 ss->tlsext_hostname = NULL; 231 ss->tlsext_hostname = NULL;
232 232
233 ss->peer_key = &ss->peer_pkeys[SSL_PKEY_RSA];
234
233 ss->tlsext_ecpointformatlist_length = 0; 235 ss->tlsext_ecpointformatlist_length = 0;
234 ss->tlsext_ecpointformatlist = NULL; 236 ss->tlsext_ecpointformatlist = NULL;
235 ss->tlsext_supportedgroups_length = 0; 237 ss->tlsext_supportedgroups_length = 0;
@@ -760,7 +762,9 @@ SSL_SESSION_free(SSL_SESSION *ss)
760 explicit_bzero(ss->master_key, sizeof ss->master_key); 762 explicit_bzero(ss->master_key, sizeof ss->master_key);
761 explicit_bzero(ss->session_id, sizeof ss->session_id); 763 explicit_bzero(ss->session_id, sizeof ss->session_id);
762 764
763 ssl_sess_cert_free(ss->sess_cert); 765 sk_X509_pop_free(ss->cert_chain, X509_free);
766 for (i = 0; i < SSL_PKEY_NUM; i++)
767 X509_free(ss->peer_pkeys[i].x509);
764 768
765 X509_free(ss->peer); 769 X509_free(ss->peer);
766 770
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index 6e74943803..7f7a176950 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.133 2022/01/08 12:43:44 jsing Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.134 2022/01/08 12:59:59 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 *
@@ -2235,29 +2235,17 @@ ssl3_get_client_certificate(SSL *s)
2235 2235
2236 X509_free(s->session->peer); 2236 X509_free(s->session->peer);
2237 s->session->peer = sk_X509_shift(sk); 2237 s->session->peer = sk_X509_shift(sk);
2238 s->session->verify_result = s->verify_result;
2239
2240 /*
2241 * With the current implementation, sess_cert will always be NULL
2242 * when we arrive here
2243 */
2244 if (s->session->sess_cert == NULL) {
2245 s->session->sess_cert = ssl_sess_cert_new();
2246 if (s->session->sess_cert == NULL) {
2247 SSLerror(s, ERR_R_MALLOC_FAILURE);
2248 goto err;
2249 }
2250 }
2251 sk_X509_pop_free(s->session->sess_cert->cert_chain, X509_free);
2252 s->session->sess_cert->cert_chain = sk;
2253 2238
2254 /* 2239 /*
2255 * Inconsistency alert: cert_chain does *not* include the 2240 * Inconsistency alert: cert_chain does *not* include the
2256 * peer's own certificate, while we do include it in s3_clnt.c 2241 * peer's own certificate, while we do include it in s3_clnt.c
2257 */ 2242 */
2258 2243 sk_X509_pop_free(s->session->cert_chain, X509_free);
2244 s->session->cert_chain = sk;
2259 sk = NULL; 2245 sk = NULL;
2260 2246
2247 s->session->verify_result = s->verify_result;
2248
2261 ret = 1; 2249 ret = 1;
2262 if (0) { 2250 if (0) {
2263 decode_err: 2251 decode_err:
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c
index 882bce8c1f..d961f98bef 100644
--- a/src/lib/libssl/tls13_client.c
+++ b/src/lib/libssl/tls13_client.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_client.c,v 1.90 2022/01/08 12:43:44 jsing Exp $ */ 1/* $OpenBSD: tls13_client.c,v 1.91 2022/01/08 12:59:59 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -628,21 +628,19 @@ tls13_server_certificate_recv(struct tls13_ctx *ctx, CBS *cbs)
628 if ((cert_idx = ssl_cert_type(cert, pkey)) < 0) 628 if ((cert_idx = ssl_cert_type(cert, pkey)) < 0)
629 goto err; 629 goto err;
630 630
631 ssl_sess_cert_free(s->session->sess_cert); 631 sk_X509_pop_free(s->session->cert_chain, X509_free);
632 if ((s->session->sess_cert = ssl_sess_cert_new()) == NULL) 632 s->session->cert_chain = certs;
633 goto err;
634
635 s->session->sess_cert->cert_chain = certs;
636 certs = NULL; 633 certs = NULL;
637 634
638 X509_up_ref(cert); 635 X509_up_ref(cert);
639 s->session->sess_cert->peer_pkeys[cert_idx].x509 = cert; 636 X509_free(s->session->peer_pkeys[cert_idx].x509);
640 s->session->sess_cert->peer_key = &(s->session->sess_cert->peer_pkeys[cert_idx]); 637 s->session->peer_pkeys[cert_idx].x509 = cert;
641 638 s->session->peer_key = &s->session->peer_pkeys[cert_idx];
642 X509_free(s->session->peer);
643 639
644 X509_up_ref(cert); 640 X509_up_ref(cert);
641 X509_free(s->session->peer);
645 s->session->peer = cert; 642 s->session->peer = cert;
643
646 s->session->verify_result = s->verify_result; 644 s->session->verify_result = s->verify_result;
647 645
648 if (ctx->ocsp_status_recv_cb != NULL && 646 if (ctx->ocsp_status_recv_cb != NULL &&
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c
index 4edf3881c2..e31ae38076 100644
--- a/src/lib/libssl/tls13_server.c
+++ b/src/lib/libssl/tls13_server.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_server.c,v 1.92 2022/01/08 12:43:45 jsing Exp $ */ 1/* $OpenBSD: tls13_server.c,v 1.93 2022/01/08 12:59:59 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
@@ -921,21 +921,19 @@ tls13_client_certificate_recv(struct tls13_ctx *ctx, CBS *cbs)
921 if ((cert_idx = ssl_cert_type(cert, pkey)) < 0) 921 if ((cert_idx = ssl_cert_type(cert, pkey)) < 0)
922 goto err; 922 goto err;
923 923
924 ssl_sess_cert_free(s->session->sess_cert); 924 sk_X509_pop_free(s->session->cert_chain, X509_free);
925 if ((s->session->sess_cert = ssl_sess_cert_new()) == NULL) 925 s->session->cert_chain = certs;
926 goto err;
927
928 s->session->sess_cert->cert_chain = certs;
929 certs = NULL; 926 certs = NULL;
930 927
931 X509_up_ref(cert); 928 X509_up_ref(cert);
932 s->session->sess_cert->peer_pkeys[cert_idx].x509 = cert; 929 X509_free(s->session->peer_pkeys[cert_idx].x509);
933 s->session->sess_cert->peer_key = &(s->session->sess_cert->peer_pkeys[cert_idx]); 930 s->session->peer_pkeys[cert_idx].x509 = cert;
934 931 s->session->peer_key = &s->session->peer_pkeys[cert_idx];
935 X509_free(s->session->peer);
936 932
937 X509_up_ref(cert); 933 X509_up_ref(cert);
934 X509_free(s->session->peer);
938 s->session->peer = cert; 935 s->session->peer = cert;
936
939 s->session->verify_result = s->verify_result; 937 s->session->verify_result = s->verify_result;
940 938
941 ctx->handshake_stage.hs_type |= WITH_CCV; 939 ctx->handshake_stage.hs_type |= WITH_CCV;