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; |
