diff options
Diffstat (limited to 'src/lib/libssl/ssl_srvr.c')
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index d665a568d1..acdcb15398 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.148 2022/07/03 14:58:00 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.149 2022/08/17 07:39:19 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 | * |
@@ -2175,6 +2175,11 @@ ssl3_get_client_certificate(SSL *s) | |||
2175 | al = SSL_AD_HANDSHAKE_FAILURE; | 2175 | al = SSL_AD_HANDSHAKE_FAILURE; |
2176 | goto fatal_err; | 2176 | goto fatal_err; |
2177 | } | 2177 | } |
2178 | |||
2179 | /* | ||
2180 | * If we asked for a client certificate and the client has none, | ||
2181 | * it must respond with a certificate list of length zero. | ||
2182 | */ | ||
2178 | if (s->s3->hs.tls12.cert_request != 0) { | 2183 | if (s->s3->hs.tls12.cert_request != 0) { |
2179 | SSLerror(s, SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST); | 2184 | SSLerror(s, SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST); |
2180 | al = SSL_AD_UNEXPECTED_MESSAGE; | 2185 | al = SSL_AD_UNEXPECTED_MESSAGE; |
@@ -2244,19 +2249,11 @@ ssl3_get_client_certificate(SSL *s) | |||
2244 | SSLerror(s, SSL_R_NO_CERTIFICATE_RETURNED); | 2249 | SSLerror(s, SSL_R_NO_CERTIFICATE_RETURNED); |
2245 | goto fatal_err; | 2250 | goto fatal_err; |
2246 | } | 2251 | } |
2247 | |||
2248 | X509_free(s->session->peer_cert); | ||
2249 | s->session->peer_cert = sk_X509_shift(certs); | ||
2250 | |||
2251 | /* | ||
2252 | * Inconsistency alert: cert_chain does *not* include the | ||
2253 | * peer's own certificate, while we do include it in s3_clnt.c | ||
2254 | */ | ||
2255 | sk_X509_pop_free(s->session->cert_chain, X509_free); | ||
2256 | s->session->cert_chain = certs; | ||
2257 | certs = NULL; | ||
2258 | |||
2259 | s->session->verify_result = s->verify_result; | 2252 | s->session->verify_result = s->verify_result; |
2253 | ERR_clear_error(); | ||
2254 | |||
2255 | if (!tls_process_peer_certs(s, certs)) | ||
2256 | goto err; | ||
2260 | 2257 | ||
2261 | done: | 2258 | done: |
2262 | ret = 1; | 2259 | ret = 1; |