Built motion from commit 6a09e18b.|2.6.11
[motion2.git] / legacy-libs / grpc / deps / grpc / third_party / boringssl / ssl / ssl_x509.cc
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to.  The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  *    notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  *    notice, this list of conditions and the following disclaimer in the
29  *    documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  *    must display the following acknowledgement:
32  *    "This product includes cryptographic software written by
33  *     Eric Young (eay@cryptsoft.com)"
34  *    The word 'cryptographic' can be left out if the rouines from the library
35  *    being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  *    the apps directory (application code) you must include an acknowledgement:
38  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.]
56  */
57 /* ====================================================================
58  * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
59  *
60  * Redistribution and use in source and binary forms, with or without
61  * modification, are permitted provided that the following conditions
62  * are met:
63  *
64  * 1. Redistributions of source code must retain the above copyright
65  *    notice, this list of conditions and the following disclaimer.
66  *
67  * 2. Redistributions in binary form must reproduce the above copyright
68  *    notice, this list of conditions and the following disclaimer in
69  *    the documentation and/or other materials provided with the
70  *    distribution.
71  *
72  * 3. All advertising materials mentioning features or use of this
73  *    software must display the following acknowledgment:
74  *    "This product includes software developed by the OpenSSL Project
75  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
76  *
77  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
78  *    endorse or promote products derived from this software without
79  *    prior written permission. For written permission, please contact
80  *    openssl-core@openssl.org.
81  *
82  * 5. Products derived from this software may not be called "OpenSSL"
83  *    nor may "OpenSSL" appear in their names without prior written
84  *    permission of the OpenSSL Project.
85  *
86  * 6. Redistributions of any form whatsoever must retain the following
87  *    acknowledgment:
88  *    "This product includes software developed by the OpenSSL Project
89  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
90  *
91  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
92  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
93  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
94  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
95  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
96  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
97  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
98  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
99  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
100  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
101  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
102  * OF THE POSSIBILITY OF SUCH DAMAGE.
103  * ====================================================================
104  *
105  * This product includes cryptographic software written by Eric Young
106  * (eay@cryptsoft.com).  This product includes software written by Tim
107  * Hudson (tjh@cryptsoft.com).
108  *
109  */
110 /* ====================================================================
111  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
112  * ECC cipher suite support in OpenSSL originally developed by
113  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
114  */
115 /* ====================================================================
116  * Copyright 2005 Nokia. All rights reserved.
117  *
118  * The portions of the attached software ("Contribution") is developed by
119  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
120  * license.
121  *
122  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
123  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
124  * support (see RFC 4279) to OpenSSL.
125  *
126  * No patent licenses or other rights except those expressly stated in
127  * the OpenSSL open source license shall be deemed granted or received
128  * expressly, by implication, estoppel, or otherwise.
129  *
130  * No assurances are provided by Nokia that the Contribution does not
131  * infringe the patent or other intellectual property rights of any third
132  * party or that the license provides you with all the necessary rights
133  * to make use of the Contribution.
134  *
135  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
136  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
137  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
138  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
139  * OTHERWISE. */
140
141 #include <openssl/ssl.h>
142
143 #include <assert.h>
144
145 #include <openssl/asn1.h>
146 #include <openssl/bytestring.h>
147 #include <openssl/err.h>
148 #include <openssl/pem.h>
149 #include <openssl/stack.h>
150 #include <openssl/x509.h>
151 #include <openssl/x509v3.h>
152 #include <openssl/x509_vfy.h>
153
154 #include "internal.h"
155 #include "../crypto/internal.h"
156
157
158 namespace bssl {
159
160 // check_ssl_x509_method asserts that |ssl| has the X509-based method
161 // installed. Calling an X509-based method on an |ssl| with a different method
162 // will likely misbehave and possibly crash or leak memory.
163 static void check_ssl_x509_method(const SSL *ssl) {
164   assert(ssl == NULL || ssl->ctx->x509_method == &ssl_crypto_x509_method);
165 }
166
167 // check_ssl_ctx_x509_method acts like |check_ssl_x509_method|, but for an
168 // |SSL_CTX|.
169 static void check_ssl_ctx_x509_method(const SSL_CTX *ctx) {
170   assert(ctx == NULL || ctx->x509_method == &ssl_crypto_x509_method);
171 }
172
173 // x509_to_buffer returns a |CRYPTO_BUFFER| that contains the serialised
174 // contents of |x509|.
175 static UniquePtr<CRYPTO_BUFFER> x509_to_buffer(X509 *x509) {
176   uint8_t *buf = NULL;
177   int cert_len = i2d_X509(x509, &buf);
178   if (cert_len <= 0) {
179     return 0;
180   }
181
182   UniquePtr<CRYPTO_BUFFER> buffer(CRYPTO_BUFFER_new(buf, cert_len, NULL));
183   OPENSSL_free(buf);
184
185   return buffer;
186 }
187
188 // new_leafless_chain returns a fresh stack of buffers set to {NULL}.
189 static STACK_OF(CRYPTO_BUFFER) *new_leafless_chain(void) {
190   STACK_OF(CRYPTO_BUFFER) *chain = sk_CRYPTO_BUFFER_new_null();
191   if (chain == NULL) {
192     return NULL;
193   }
194
195   if (!sk_CRYPTO_BUFFER_push(chain, NULL)) {
196     sk_CRYPTO_BUFFER_free(chain);
197     return NULL;
198   }
199
200   return chain;
201 }
202
203 // ssl_cert_set_chain sets elements 1.. of |cert->chain| to the serialised
204 // forms of elements of |chain|. It returns one on success or zero on error, in
205 // which case no change to |cert->chain| is made. It preverses the existing
206 // leaf from |cert->chain|, if any.
207 static int ssl_cert_set_chain(CERT *cert, STACK_OF(X509) *chain) {
208   UniquePtr<STACK_OF(CRYPTO_BUFFER)> new_chain;
209
210   if (cert->chain != NULL) {
211     new_chain.reset(sk_CRYPTO_BUFFER_new_null());
212     if (!new_chain) {
213       return 0;
214     }
215
216     CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain, 0);
217     if (!sk_CRYPTO_BUFFER_push(new_chain.get(), leaf)) {
218       return 0;
219     }
220     // |leaf| might be NULL if it's a “leafless” chain.
221     if (leaf != NULL) {
222       CRYPTO_BUFFER_up_ref(leaf);
223     }
224   }
225
226   for (X509 *x509 : chain) {
227     if (!new_chain) {
228       new_chain.reset(new_leafless_chain());
229       if (!new_chain) {
230         return 0;
231       }
232     }
233
234     UniquePtr<CRYPTO_BUFFER> buffer = x509_to_buffer(x509);
235     if (!buffer ||
236         !PushToStack(new_chain.get(), std::move(buffer))) {
237       return 0;
238     }
239   }
240
241   sk_CRYPTO_BUFFER_pop_free(cert->chain, CRYPTO_BUFFER_free);
242   cert->chain = new_chain.release();
243
244   return 1;
245 }
246
247 static void ssl_crypto_x509_cert_flush_cached_leaf(CERT *cert) {
248   X509_free(cert->x509_leaf);
249   cert->x509_leaf = NULL;
250 }
251
252 static void ssl_crypto_x509_cert_flush_cached_chain(CERT *cert) {
253   sk_X509_pop_free(cert->x509_chain, X509_free);
254   cert->x509_chain = NULL;
255 }
256
257 static int ssl_crypto_x509_check_client_CA_list(
258     STACK_OF(CRYPTO_BUFFER) *names) {
259   for (const CRYPTO_BUFFER *buffer : names) {
260     const uint8_t *inp = CRYPTO_BUFFER_data(buffer);
261     X509_NAME *name = d2i_X509_NAME(NULL, &inp, CRYPTO_BUFFER_len(buffer));
262     const int ok = name != NULL && inp == CRYPTO_BUFFER_data(buffer) +
263                                               CRYPTO_BUFFER_len(buffer);
264     X509_NAME_free(name);
265     if (!ok) {
266       return 0;
267     }
268   }
269
270   return 1;
271 }
272
273 static void ssl_crypto_x509_cert_clear(CERT *cert) {
274   ssl_crypto_x509_cert_flush_cached_leaf(cert);
275   ssl_crypto_x509_cert_flush_cached_chain(cert);
276
277   X509_free(cert->x509_stash);
278   cert->x509_stash = NULL;
279 }
280
281 static void ssl_crypto_x509_cert_free(CERT *cert) {
282   ssl_crypto_x509_cert_clear(cert);
283   X509_STORE_free(cert->verify_store);
284 }
285
286 static void ssl_crypto_x509_cert_dup(CERT *new_cert, const CERT *cert) {
287   if (cert->verify_store != NULL) {
288     X509_STORE_up_ref(cert->verify_store);
289     new_cert->verify_store = cert->verify_store;
290   }
291 }
292
293 static int ssl_crypto_x509_session_cache_objects(SSL_SESSION *sess) {
294   bssl::UniquePtr<STACK_OF(X509)> chain;
295   if (sk_CRYPTO_BUFFER_num(sess->certs) > 0) {
296     chain.reset(sk_X509_new_null());
297     if (!chain) {
298       OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
299       return 0;
300     }
301   }
302
303   X509 *leaf = nullptr;
304   for (CRYPTO_BUFFER *cert : sess->certs) {
305     UniquePtr<X509> x509(X509_parse_from_buffer(cert));
306     if (!x509) {
307       OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
308       return 0;
309     }
310     if (leaf == nullptr) {
311       leaf = x509.get();
312     }
313     if (!PushToStack(chain.get(), std::move(x509))) {
314       OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
315       return 0;
316     }
317   }
318
319   sk_X509_pop_free(sess->x509_chain, X509_free);
320   sess->x509_chain = chain.release();
321   sk_X509_pop_free(sess->x509_chain_without_leaf, X509_free);
322   sess->x509_chain_without_leaf = NULL;
323
324   X509_free(sess->x509_peer);
325   if (leaf != NULL) {
326     X509_up_ref(leaf);
327   }
328   sess->x509_peer = leaf;
329   return 1;
330 }
331
332 static int ssl_crypto_x509_session_dup(SSL_SESSION *new_session,
333                                        const SSL_SESSION *session) {
334   if (session->x509_peer != NULL) {
335     X509_up_ref(session->x509_peer);
336     new_session->x509_peer = session->x509_peer;
337   }
338   if (session->x509_chain != NULL) {
339     new_session->x509_chain = X509_chain_up_ref(session->x509_chain);
340     if (new_session->x509_chain == NULL) {
341       return 0;
342     }
343   }
344
345   return 1;
346 }
347
348 static void ssl_crypto_x509_session_clear(SSL_SESSION *session) {
349   X509_free(session->x509_peer);
350   session->x509_peer = NULL;
351   sk_X509_pop_free(session->x509_chain, X509_free);
352   session->x509_chain = NULL;
353   sk_X509_pop_free(session->x509_chain_without_leaf, X509_free);
354   session->x509_chain_without_leaf = NULL;
355 }
356
357 static int ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,
358                                                      SSL *ssl,
359                                                      uint8_t *out_alert) {
360   *out_alert = SSL_AD_INTERNAL_ERROR;
361   STACK_OF(X509) *const cert_chain = session->x509_chain;
362   if (cert_chain == NULL || sk_X509_num(cert_chain) == 0) {
363     return 0;
364   }
365
366   X509_STORE *verify_store = ssl->ctx->cert_store;
367   if (ssl->cert->verify_store != NULL) {
368     verify_store = ssl->cert->verify_store;
369   }
370
371   X509 *leaf = sk_X509_value(cert_chain, 0);
372   ScopedX509_STORE_CTX ctx;
373   if (!X509_STORE_CTX_init(ctx.get(), verify_store, leaf, cert_chain)) {
374     OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
375     return 0;
376   }
377   if (!X509_STORE_CTX_set_ex_data(ctx.get(),
378                                   SSL_get_ex_data_X509_STORE_CTX_idx(), ssl)) {
379     return 0;
380   }
381
382   // We need to inherit the verify parameters. These can be determined by the
383   // context: if its a server it will verify SSL client certificates or vice
384   // versa.
385   X509_STORE_CTX_set_default(ctx.get(),
386                              ssl->server ? "ssl_client" : "ssl_server");
387
388   // Anything non-default in "param" should overwrite anything in the ctx.
389   X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(ctx.get()), ssl->param);
390
391   if (ssl->verify_callback) {
392     X509_STORE_CTX_set_verify_cb(ctx.get(), ssl->verify_callback);
393   }
394
395   int verify_ret;
396   if (ssl->ctx->app_verify_callback != NULL) {
397     verify_ret =
398         ssl->ctx->app_verify_callback(ctx.get(), ssl->ctx->app_verify_arg);
399   } else {
400     verify_ret = X509_verify_cert(ctx.get());
401   }
402
403   session->verify_result = ctx->error;
404
405   // If |SSL_VERIFY_NONE|, the error is non-fatal, but we keep the result.
406   if (verify_ret <= 0 && ssl->verify_mode != SSL_VERIFY_NONE) {
407     *out_alert = SSL_alert_from_verify_result(ctx->error);
408     return 0;
409   }
410
411   ERR_clear_error();
412   return 1;
413 }
414
415 static void ssl_crypto_x509_hs_flush_cached_ca_names(SSL_HANDSHAKE *hs) {
416   sk_X509_NAME_pop_free(hs->cached_x509_ca_names, X509_NAME_free);
417   hs->cached_x509_ca_names = NULL;
418 }
419
420 static int ssl_crypto_x509_ssl_new(SSL *ssl) {
421   ssl->param = X509_VERIFY_PARAM_new();
422   if (ssl->param == NULL) {
423     return 0;
424   }
425   X509_VERIFY_PARAM_inherit(ssl->param, ssl->ctx->param);
426   return 1;
427 }
428
429 static void ssl_crypto_x509_ssl_flush_cached_client_CA(SSL *ssl) {
430   sk_X509_NAME_pop_free(ssl->cached_x509_client_CA, X509_NAME_free);
431   ssl->cached_x509_client_CA = NULL;
432 }
433
434 static void ssl_crypto_x509_ssl_free(SSL *ssl) {
435   ssl_crypto_x509_ssl_flush_cached_client_CA(ssl);
436   X509_VERIFY_PARAM_free(ssl->param);
437 }
438
439 static int ssl_crypto_x509_ssl_auto_chain_if_needed(SSL *ssl) {
440   // Only build a chain if there are no intermediates configured and the feature
441   // isn't disabled.
442   if ((ssl->mode & SSL_MODE_NO_AUTO_CHAIN) ||
443       !ssl_has_certificate(ssl) ||
444       ssl->cert->chain == NULL ||
445       sk_CRYPTO_BUFFER_num(ssl->cert->chain) > 1) {
446     return 1;
447   }
448
449   UniquePtr<X509> leaf(
450       X509_parse_from_buffer(sk_CRYPTO_BUFFER_value(ssl->cert->chain, 0)));
451   if (!leaf) {
452     OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
453     return 0;
454   }
455
456   ScopedX509_STORE_CTX ctx;
457   if (!X509_STORE_CTX_init(ctx.get(), ssl->ctx->cert_store, leaf.get(), NULL)) {
458     OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
459     return 0;
460   }
461
462   // Attempt to build a chain, ignoring the result.
463   X509_verify_cert(ctx.get());
464   ERR_clear_error();
465
466   // Remove the leaf from the generated chain.
467   X509_free(sk_X509_shift(ctx->chain));
468
469   if (!ssl_cert_set_chain(ssl->cert, ctx->chain)) {
470     return 0;
471   }
472
473   ssl_crypto_x509_cert_flush_cached_chain(ssl->cert);
474
475   return 1;
476 }
477
478 static void ssl_crypto_x509_ssl_ctx_flush_cached_client_CA(SSL_CTX *ctx) {
479   sk_X509_NAME_pop_free(ctx->cached_x509_client_CA, X509_NAME_free);
480   ctx->cached_x509_client_CA = NULL;
481 }
482
483 static int ssl_crypto_x509_ssl_ctx_new(SSL_CTX *ctx) {
484   ctx->cert_store = X509_STORE_new();
485   ctx->param = X509_VERIFY_PARAM_new();
486   return (ctx->cert_store != NULL && ctx->param != NULL);
487 }
488
489 static void ssl_crypto_x509_ssl_ctx_free(SSL_CTX *ctx) {
490   ssl_crypto_x509_ssl_ctx_flush_cached_client_CA(ctx);
491   X509_VERIFY_PARAM_free(ctx->param);
492   X509_STORE_free(ctx->cert_store);
493 }
494
495 const SSL_X509_METHOD ssl_crypto_x509_method = {
496   ssl_crypto_x509_check_client_CA_list,
497   ssl_crypto_x509_cert_clear,
498   ssl_crypto_x509_cert_free,
499   ssl_crypto_x509_cert_dup,
500   ssl_crypto_x509_cert_flush_cached_chain,
501   ssl_crypto_x509_cert_flush_cached_leaf,
502   ssl_crypto_x509_session_cache_objects,
503   ssl_crypto_x509_session_dup,
504   ssl_crypto_x509_session_clear,
505   ssl_crypto_x509_session_verify_cert_chain,
506   ssl_crypto_x509_hs_flush_cached_ca_names,
507   ssl_crypto_x509_ssl_new,
508   ssl_crypto_x509_ssl_free,
509   ssl_crypto_x509_ssl_flush_cached_client_CA,
510   ssl_crypto_x509_ssl_auto_chain_if_needed,
511   ssl_crypto_x509_ssl_ctx_new,
512   ssl_crypto_x509_ssl_ctx_free,
513   ssl_crypto_x509_ssl_ctx_flush_cached_client_CA,
514 };
515
516 }  // namespace bssl
517
518 using namespace bssl;
519
520 X509 *SSL_get_peer_certificate(const SSL *ssl) {
521   check_ssl_x509_method(ssl);
522   if (ssl == NULL) {
523     return NULL;
524   }
525   SSL_SESSION *session = SSL_get_session(ssl);
526   if (session == NULL || session->x509_peer == NULL) {
527     return NULL;
528   }
529   X509_up_ref(session->x509_peer);
530   return session->x509_peer;
531 }
532
533 STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *ssl) {
534   check_ssl_x509_method(ssl);
535   if (ssl == NULL) {
536     return NULL;
537   }
538   SSL_SESSION *session = SSL_get_session(ssl);
539   if (session == NULL ||
540       session->x509_chain == NULL) {
541     return NULL;
542   }
543
544   if (!ssl->server) {
545     return session->x509_chain;
546   }
547
548   // OpenSSL historically didn't include the leaf certificate in the returned
549   // certificate chain, but only for servers.
550   if (session->x509_chain_without_leaf == NULL) {
551     session->x509_chain_without_leaf = sk_X509_new_null();
552     if (session->x509_chain_without_leaf == NULL) {
553       return NULL;
554     }
555
556     for (size_t i = 1; i < sk_X509_num(session->x509_chain); i++) {
557       X509 *cert = sk_X509_value(session->x509_chain, i);
558       if (!sk_X509_push(session->x509_chain_without_leaf, cert)) {
559         sk_X509_pop_free(session->x509_chain_without_leaf, X509_free);
560         session->x509_chain_without_leaf = NULL;
561         return NULL;
562       }
563       X509_up_ref(cert);
564     }
565   }
566
567   return session->x509_chain_without_leaf;
568 }
569
570 STACK_OF(X509) *SSL_get_peer_full_cert_chain(const SSL *ssl) {
571   check_ssl_x509_method(ssl);
572   SSL_SESSION *session = SSL_get_session(ssl);
573   if (session == NULL) {
574     return NULL;
575   }
576
577   return session->x509_chain;
578 }
579
580 int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose) {
581   check_ssl_ctx_x509_method(ctx);
582   return X509_VERIFY_PARAM_set_purpose(ctx->param, purpose);
583 }
584
585 int SSL_set_purpose(SSL *ssl, int purpose) {
586   check_ssl_x509_method(ssl);
587   return X509_VERIFY_PARAM_set_purpose(ssl->param, purpose);
588 }
589
590 int SSL_CTX_set_trust(SSL_CTX *ctx, int trust) {
591   check_ssl_ctx_x509_method(ctx);
592   return X509_VERIFY_PARAM_set_trust(ctx->param, trust);
593 }
594
595 int SSL_set_trust(SSL *ssl, int trust) {
596   check_ssl_x509_method(ssl);
597   return X509_VERIFY_PARAM_set_trust(ssl->param, trust);
598 }
599
600 int SSL_CTX_set1_param(SSL_CTX *ctx, const X509_VERIFY_PARAM *param) {
601   check_ssl_ctx_x509_method(ctx);
602   return X509_VERIFY_PARAM_set1(ctx->param, param);
603 }
604
605 int SSL_set1_param(SSL *ssl, const X509_VERIFY_PARAM *param) {
606   check_ssl_x509_method(ssl);
607   return X509_VERIFY_PARAM_set1(ssl->param, param);
608 }
609
610 X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx) {
611   check_ssl_ctx_x509_method(ctx);
612   return ctx->param;
613 }
614
615 X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl) {
616   check_ssl_x509_method(ssl);
617   return ssl->param;
618 }
619
620 int SSL_get_verify_depth(const SSL *ssl) {
621   check_ssl_x509_method(ssl);
622   return X509_VERIFY_PARAM_get_depth(ssl->param);
623 }
624
625 int (*SSL_get_verify_callback(const SSL *ssl))(int, X509_STORE_CTX *) {
626   check_ssl_x509_method(ssl);
627   return ssl->verify_callback;
628 }
629
630 int SSL_CTX_get_verify_mode(const SSL_CTX *ctx) {
631   check_ssl_ctx_x509_method(ctx);
632   return ctx->verify_mode;
633 }
634
635 int SSL_CTX_get_verify_depth(const SSL_CTX *ctx) {
636   check_ssl_ctx_x509_method(ctx);
637   return X509_VERIFY_PARAM_get_depth(ctx->param);
638 }
639
640 int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(
641     int ok, X509_STORE_CTX *store_ctx) {
642   check_ssl_ctx_x509_method(ctx);
643   return ctx->default_verify_callback;
644 }
645
646 void SSL_set_verify(SSL *ssl, int mode,
647                     int (*callback)(int ok, X509_STORE_CTX *store_ctx)) {
648   check_ssl_x509_method(ssl);
649   ssl->verify_mode = mode;
650   if (callback != NULL) {
651     ssl->verify_callback = callback;
652   }
653 }
654
655 void SSL_set_verify_depth(SSL *ssl, int depth) {
656   check_ssl_x509_method(ssl);
657   X509_VERIFY_PARAM_set_depth(ssl->param, depth);
658 }
659
660 void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,
661                                       int (*cb)(X509_STORE_CTX *store_ctx,
662                                                 void *arg),
663                                       void *arg) {
664   check_ssl_ctx_x509_method(ctx);
665   ctx->app_verify_callback = cb;
666   ctx->app_verify_arg = arg;
667 }
668
669 void SSL_CTX_set_verify(SSL_CTX *ctx, int mode,
670                         int (*cb)(int, X509_STORE_CTX *)) {
671   check_ssl_ctx_x509_method(ctx);
672   ctx->verify_mode = mode;
673   ctx->default_verify_callback = cb;
674 }
675
676 void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth) {
677   check_ssl_ctx_x509_method(ctx);
678   X509_VERIFY_PARAM_set_depth(ctx->param, depth);
679 }
680
681 int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx) {
682   check_ssl_ctx_x509_method(ctx);
683   return X509_STORE_set_default_paths(ctx->cert_store);
684 }
685
686 int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *ca_file,
687                                   const char *ca_dir) {
688   check_ssl_ctx_x509_method(ctx);
689   return X509_STORE_load_locations(ctx->cert_store, ca_file, ca_dir);
690 }
691
692 void SSL_set_verify_result(SSL *ssl, long result) {
693   check_ssl_x509_method(ssl);
694   if (result != X509_V_OK) {
695     abort();
696   }
697 }
698
699 long SSL_get_verify_result(const SSL *ssl) {
700   check_ssl_x509_method(ssl);
701   SSL_SESSION *session = SSL_get_session(ssl);
702   if (session == NULL) {
703     return X509_V_ERR_INVALID_CALL;
704   }
705   return session->verify_result;
706 }
707
708 X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *ctx) {
709   check_ssl_ctx_x509_method(ctx);
710   return ctx->cert_store;
711 }
712
713 void SSL_CTX_set_cert_store(SSL_CTX *ctx, X509_STORE *store) {
714   check_ssl_ctx_x509_method(ctx);
715   X509_STORE_free(ctx->cert_store);
716   ctx->cert_store = store;
717 }
718
719 static int ssl_use_certificate(CERT *cert, X509 *x) {
720   if (x == NULL) {
721     OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER);
722     return 0;
723   }
724
725   UniquePtr<CRYPTO_BUFFER> buffer = x509_to_buffer(x);
726   if (!buffer) {
727     return 0;
728   }
729
730   return ssl_set_cert(cert, std::move(buffer));
731 }
732
733 int SSL_use_certificate(SSL *ssl, X509 *x) {
734   check_ssl_x509_method(ssl);
735   return ssl_use_certificate(ssl->cert, x);
736 }
737
738 int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x) {
739   check_ssl_ctx_x509_method(ctx);
740   return ssl_use_certificate(ctx->cert, x);
741 }
742
743 // ssl_cert_cache_leaf_cert sets |cert->x509_leaf|, if currently NULL, from the
744 // first element of |cert->chain|.
745 static int ssl_cert_cache_leaf_cert(CERT *cert) {
746   assert(cert->x509_method);
747
748   if (cert->x509_leaf != NULL ||
749       cert->chain == NULL) {
750     return 1;
751   }
752
753   CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain, 0);
754   if (!leaf) {
755     return 1;
756   }
757
758   cert->x509_leaf = X509_parse_from_buffer(leaf);
759   return cert->x509_leaf != NULL;
760 }
761
762 static X509 *ssl_cert_get0_leaf(CERT *cert) {
763   if (cert->x509_leaf == NULL &&
764       !ssl_cert_cache_leaf_cert(cert)) {
765     return NULL;
766   }
767
768   return cert->x509_leaf;
769 }
770
771 X509 *SSL_get_certificate(const SSL *ssl) {
772   check_ssl_x509_method(ssl);
773   return ssl_cert_get0_leaf(ssl->cert);
774 }
775
776 X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx) {
777   check_ssl_ctx_x509_method(ctx);
778   MutexWriteLock lock(const_cast<CRYPTO_MUTEX*>(&ctx->lock));
779   return ssl_cert_get0_leaf(ctx->cert);
780 }
781
782 static int ssl_cert_set0_chain(CERT *cert, STACK_OF(X509) *chain) {
783   if (!ssl_cert_set_chain(cert, chain)) {
784     return 0;
785   }
786
787   sk_X509_pop_free(chain, X509_free);
788   ssl_crypto_x509_cert_flush_cached_chain(cert);
789   return 1;
790 }
791
792 static int ssl_cert_set1_chain(CERT *cert, STACK_OF(X509) *chain) {
793   if (!ssl_cert_set_chain(cert, chain)) {
794     return 0;
795   }
796
797   ssl_crypto_x509_cert_flush_cached_chain(cert);
798   return 1;
799 }
800
801 static int ssl_cert_append_cert(CERT *cert, X509 *x509) {
802   assert(cert->x509_method);
803
804   UniquePtr<CRYPTO_BUFFER> buffer = x509_to_buffer(x509);
805   if (!buffer) {
806     return 0;
807   }
808
809   if (cert->chain != NULL) {
810     return PushToStack(cert->chain, std::move(buffer));
811   }
812
813   cert->chain = new_leafless_chain();
814   if (cert->chain == NULL ||
815       !PushToStack(cert->chain, std::move(buffer))) {
816     sk_CRYPTO_BUFFER_free(cert->chain);
817     cert->chain = NULL;
818     return 0;
819   }
820
821   return 1;
822 }
823
824 static int ssl_cert_add0_chain_cert(CERT *cert, X509 *x509) {
825   if (!ssl_cert_append_cert(cert, x509)) {
826     return 0;
827   }
828
829   X509_free(cert->x509_stash);
830   cert->x509_stash = x509;
831   ssl_crypto_x509_cert_flush_cached_chain(cert);
832   return 1;
833 }
834
835 static int ssl_cert_add1_chain_cert(CERT *cert, X509 *x509) {
836   if (!ssl_cert_append_cert(cert, x509)) {
837     return 0;
838   }
839
840   ssl_crypto_x509_cert_flush_cached_chain(cert);
841   return 1;
842 }
843
844 int SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
845   check_ssl_ctx_x509_method(ctx);
846   return ssl_cert_set0_chain(ctx->cert, chain);
847 }
848
849 int SSL_CTX_set1_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
850   check_ssl_ctx_x509_method(ctx);
851   return ssl_cert_set1_chain(ctx->cert, chain);
852 }
853
854 int SSL_set0_chain(SSL *ssl, STACK_OF(X509) *chain) {
855   check_ssl_x509_method(ssl);
856   return ssl_cert_set0_chain(ssl->cert, chain);
857 }
858
859 int SSL_set1_chain(SSL *ssl, STACK_OF(X509) *chain) {
860   check_ssl_x509_method(ssl);
861   return ssl_cert_set1_chain(ssl->cert, chain);
862 }
863
864 int SSL_CTX_add0_chain_cert(SSL_CTX *ctx, X509 *x509) {
865   check_ssl_ctx_x509_method(ctx);
866   return ssl_cert_add0_chain_cert(ctx->cert, x509);
867 }
868
869 int SSL_CTX_add1_chain_cert(SSL_CTX *ctx, X509 *x509) {
870   check_ssl_ctx_x509_method(ctx);
871   return ssl_cert_add1_chain_cert(ctx->cert, x509);
872 }
873
874 int SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *x509) {
875   check_ssl_ctx_x509_method(ctx);
876   return SSL_CTX_add0_chain_cert(ctx, x509);
877 }
878
879 int SSL_add0_chain_cert(SSL *ssl, X509 *x509) {
880   check_ssl_x509_method(ssl);
881   return ssl_cert_add0_chain_cert(ssl->cert, x509);
882 }
883
884 int SSL_add1_chain_cert(SSL *ssl, X509 *x509) {
885   check_ssl_x509_method(ssl);
886   return ssl_cert_add1_chain_cert(ssl->cert, x509);
887 }
888
889 int SSL_CTX_clear_chain_certs(SSL_CTX *ctx) {
890   check_ssl_ctx_x509_method(ctx);
891   return SSL_CTX_set0_chain(ctx, NULL);
892 }
893
894 int SSL_CTX_clear_extra_chain_certs(SSL_CTX *ctx) {
895   check_ssl_ctx_x509_method(ctx);
896   return SSL_CTX_clear_chain_certs(ctx);
897 }
898
899 int SSL_clear_chain_certs(SSL *ssl) {
900   check_ssl_x509_method(ssl);
901   return SSL_set0_chain(ssl, NULL);
902 }
903
904 // ssl_cert_cache_chain_certs fills in |cert->x509_chain| from elements 1.. of
905 // |cert->chain|.
906 static int ssl_cert_cache_chain_certs(CERT *cert) {
907   assert(cert->x509_method);
908
909   if (cert->x509_chain != NULL ||
910       cert->chain == NULL ||
911       sk_CRYPTO_BUFFER_num(cert->chain) < 2) {
912     return 1;
913   }
914
915   UniquePtr<STACK_OF(X509)> chain(sk_X509_new_null());
916   if (!chain) {
917     return 0;
918   }
919
920   for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(cert->chain); i++) {
921     CRYPTO_BUFFER *buffer = sk_CRYPTO_BUFFER_value(cert->chain, i);
922     UniquePtr<X509> x509(X509_parse_from_buffer(buffer));
923     if (!x509 ||
924         !PushToStack(chain.get(), std::move(x509))) {
925       return 0;
926     }
927   }
928
929   cert->x509_chain = chain.release();
930   return 1;
931 }
932
933 int SSL_CTX_get0_chain_certs(const SSL_CTX *ctx, STACK_OF(X509) **out_chain) {
934   check_ssl_ctx_x509_method(ctx);
935   MutexWriteLock lock(const_cast<CRYPTO_MUTEX*>(&ctx->lock));
936   if (!ssl_cert_cache_chain_certs(ctx->cert)) {
937     *out_chain = NULL;
938     return 0;
939   }
940
941   *out_chain = ctx->cert->x509_chain;
942   return 1;
943 }
944
945 int SSL_CTX_get_extra_chain_certs(const SSL_CTX *ctx,
946                                   STACK_OF(X509) **out_chain) {
947   return SSL_CTX_get0_chain_certs(ctx, out_chain);
948 }
949
950 int SSL_get0_chain_certs(const SSL *ssl, STACK_OF(X509) **out_chain) {
951   check_ssl_x509_method(ssl);
952   if (!ssl_cert_cache_chain_certs(ssl->cert)) {
953     *out_chain = NULL;
954     return 0;
955   }
956
957   *out_chain = ssl->cert->x509_chain;
958   return 1;
959 }
960
961 static SSL_SESSION *ssl_session_new_with_crypto_x509(void) {
962   return ssl_session_new(&ssl_crypto_x509_method).release();
963 }
964
965 SSL_SESSION *d2i_SSL_SESSION_bio(BIO *bio, SSL_SESSION **out) {
966   return ASN1_d2i_bio_of(SSL_SESSION, ssl_session_new_with_crypto_x509,
967                          d2i_SSL_SESSION, bio, out);
968 }
969
970 int i2d_SSL_SESSION_bio(BIO *bio, const SSL_SESSION *session) {
971   return ASN1_i2d_bio_of(SSL_SESSION, i2d_SSL_SESSION, bio, session);
972 }
973
974 IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION)
975
976 SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const uint8_t **pp, long length) {
977   if (length < 0) {
978     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
979     return NULL;
980   }
981
982   CBS cbs;
983   CBS_init(&cbs, *pp, length);
984
985   UniquePtr<SSL_SESSION> ret = SSL_SESSION_parse(&cbs, &ssl_crypto_x509_method,
986                                                  NULL /* no buffer pool */);
987   if (!ret) {
988     return NULL;
989   }
990
991   if (a) {
992     SSL_SESSION_free(*a);
993     *a = ret.get();
994   }
995   *pp = CBS_data(&cbs);
996   return ret.release();
997 }
998
999 STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *list) {
1000   return sk_X509_NAME_deep_copy(list, X509_NAME_dup, X509_NAME_free);
1001 }
1002
1003 static void set_client_CA_list(STACK_OF(CRYPTO_BUFFER) **ca_list,
1004                                const STACK_OF(X509_NAME) *name_list,
1005                                CRYPTO_BUFFER_POOL *pool) {
1006   UniquePtr<STACK_OF(CRYPTO_BUFFER)> buffers(sk_CRYPTO_BUFFER_new_null());
1007   if (!buffers) {
1008     return;
1009   }
1010
1011   for (X509_NAME *name : name_list) {
1012     uint8_t *outp = NULL;
1013     int len = i2d_X509_NAME(name, &outp);
1014     if (len < 0) {
1015       return;
1016     }
1017
1018     UniquePtr<CRYPTO_BUFFER> buffer(CRYPTO_BUFFER_new(outp, len, pool));
1019     OPENSSL_free(outp);
1020     if (!buffer ||
1021         !PushToStack(buffers.get(), std::move(buffer))) {
1022       return;
1023     }
1024   }
1025
1026   sk_CRYPTO_BUFFER_pop_free(*ca_list, CRYPTO_BUFFER_free);
1027   *ca_list = buffers.release();
1028 }
1029
1030 void SSL_set_client_CA_list(SSL *ssl, STACK_OF(X509_NAME) *name_list) {
1031   check_ssl_x509_method(ssl);
1032   ssl->ctx->x509_method->ssl_flush_cached_client_CA(ssl);
1033   set_client_CA_list(&ssl->client_CA, name_list, ssl->ctx->pool);
1034   sk_X509_NAME_pop_free(name_list, X509_NAME_free);
1035 }
1036
1037 void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list) {
1038   check_ssl_ctx_x509_method(ctx);
1039   ctx->x509_method->ssl_ctx_flush_cached_client_CA(ctx);
1040   set_client_CA_list(&ctx->client_CA, name_list, ctx->pool);
1041   sk_X509_NAME_pop_free(name_list, X509_NAME_free);
1042 }
1043
1044 static STACK_OF(X509_NAME) *
1045     buffer_names_to_x509(const STACK_OF(CRYPTO_BUFFER) *names,
1046                          STACK_OF(X509_NAME) **cached) {
1047   if (names == NULL) {
1048     return NULL;
1049   }
1050
1051   if (*cached != NULL) {
1052     return *cached;
1053   }
1054
1055   UniquePtr<STACK_OF(X509_NAME)> new_cache(sk_X509_NAME_new_null());
1056   if (!new_cache) {
1057     OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
1058     return NULL;
1059   }
1060
1061   for (const CRYPTO_BUFFER *buffer : names) {
1062     const uint8_t *inp = CRYPTO_BUFFER_data(buffer);
1063     UniquePtr<X509_NAME> name(
1064         d2i_X509_NAME(nullptr, &inp, CRYPTO_BUFFER_len(buffer)));
1065     if (!name ||
1066         inp != CRYPTO_BUFFER_data(buffer) + CRYPTO_BUFFER_len(buffer) ||
1067         !PushToStack(new_cache.get(), std::move(name))) {
1068       return NULL;
1069     }
1070   }
1071
1072   *cached = new_cache.release();
1073   return *cached;
1074 }
1075
1076 STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *ssl) {
1077   check_ssl_x509_method(ssl);
1078   // For historical reasons, this function is used both to query configuration
1079   // state on a server as well as handshake state on a client. However, whether
1080   // |ssl| is a client or server is not known until explicitly configured with
1081   // |SSL_set_connect_state|. If |do_handshake| is NULL, |ssl| is in an
1082   // indeterminate mode and |ssl->server| is unset.
1083   if (ssl->do_handshake != NULL && !ssl->server) {
1084     if (ssl->s3->hs != NULL) {
1085       return buffer_names_to_x509(ssl->s3->hs->ca_names.get(),
1086                                   &ssl->s3->hs->cached_x509_ca_names);
1087     }
1088
1089     return NULL;
1090   }
1091
1092   if (ssl->client_CA != NULL) {
1093     return buffer_names_to_x509(
1094         ssl->client_CA, (STACK_OF(X509_NAME) **)&ssl->cached_x509_client_CA);
1095   }
1096   return SSL_CTX_get_client_CA_list(ssl->ctx);
1097 }
1098
1099 STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx) {
1100   check_ssl_ctx_x509_method(ctx);
1101   // This is a logically const operation that may be called on multiple threads,
1102   // so it needs to lock around updating |cached_x509_client_CA|.
1103   MutexWriteLock lock(const_cast<CRYPTO_MUTEX *>(&ctx->lock));
1104   return buffer_names_to_x509(
1105       ctx->client_CA,
1106       const_cast<STACK_OF(X509_NAME) **>(&ctx->cached_x509_client_CA));
1107 }
1108
1109 static int add_client_CA(STACK_OF(CRYPTO_BUFFER) **names, X509 *x509,
1110                          CRYPTO_BUFFER_POOL *pool) {
1111   if (x509 == NULL) {
1112     return 0;
1113   }
1114
1115   uint8_t *outp = NULL;
1116   int len = i2d_X509_NAME(X509_get_subject_name(x509), &outp);
1117   if (len < 0) {
1118     return 0;
1119   }
1120
1121   UniquePtr<CRYPTO_BUFFER> buffer(CRYPTO_BUFFER_new(outp, len, pool));
1122   OPENSSL_free(outp);
1123   if (!buffer) {
1124     return 0;
1125   }
1126
1127   int alloced = 0;
1128   if (*names == NULL) {
1129     *names = sk_CRYPTO_BUFFER_new_null();
1130     alloced = 1;
1131
1132     if (*names == NULL) {
1133       return 0;
1134     }
1135   }
1136
1137   if (!PushToStack(*names, std::move(buffer))) {
1138     if (alloced) {
1139       sk_CRYPTO_BUFFER_pop_free(*names, CRYPTO_BUFFER_free);
1140       *names = NULL;
1141     }
1142     return 0;
1143   }
1144
1145   return 1;
1146 }
1147
1148 int SSL_add_client_CA(SSL *ssl, X509 *x509) {
1149   check_ssl_x509_method(ssl);
1150   if (!add_client_CA(&ssl->client_CA, x509, ssl->ctx->pool)) {
1151     return 0;
1152   }
1153
1154   ssl_crypto_x509_ssl_flush_cached_client_CA(ssl);
1155   return 1;
1156 }
1157
1158 int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x509) {
1159   check_ssl_ctx_x509_method(ctx);
1160   if (!add_client_CA(&ctx->client_CA, x509, ctx->pool)) {
1161     return 0;
1162   }
1163
1164   ssl_crypto_x509_ssl_ctx_flush_cached_client_CA(ctx);
1165   return 1;
1166 }
1167
1168 static int do_client_cert_cb(SSL *ssl, void *arg) {
1169   if (ssl_has_certificate(ssl) || ssl->ctx->client_cert_cb == NULL) {
1170     return 1;
1171   }
1172
1173   X509 *x509 = NULL;
1174   EVP_PKEY *pkey = NULL;
1175   int ret = ssl->ctx->client_cert_cb(ssl, &x509, &pkey);
1176   if (ret < 0) {
1177     return -1;
1178   }
1179   UniquePtr<X509> free_x509(x509);
1180   UniquePtr<EVP_PKEY> free_pkey(pkey);
1181
1182   if (ret != 0) {
1183     if (!SSL_use_certificate(ssl, x509) ||
1184         !SSL_use_PrivateKey(ssl, pkey)) {
1185       return 0;
1186     }
1187   }
1188
1189   return 1;
1190 }
1191
1192 void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, int (*cb)(SSL *ssl,
1193                                                         X509 **out_x509,
1194                                                         EVP_PKEY **out_pkey)) {
1195   check_ssl_ctx_x509_method(ctx);
1196   // Emulate the old client certificate callback with the new one.
1197   SSL_CTX_set_cert_cb(ctx, do_client_cert_cb, NULL);
1198   ctx->client_cert_cb = cb;
1199 }
1200
1201 static int set_cert_store(X509_STORE **store_ptr, X509_STORE *new_store,
1202                           int take_ref) {
1203   X509_STORE_free(*store_ptr);
1204   *store_ptr = new_store;
1205
1206   if (new_store != NULL && take_ref) {
1207     X509_STORE_up_ref(new_store);
1208   }
1209
1210   return 1;
1211 }
1212
1213 int SSL_get_ex_data_X509_STORE_CTX_idx(void) {
1214   // The ex_data index to go from |X509_STORE_CTX| to |SSL| always uses the
1215   // reserved app_data slot. Before ex_data was introduced, app_data was used.
1216   // Avoid breaking any software which assumes |X509_STORE_CTX_get_app_data|
1217   // works.
1218   return 0;
1219 }
1220
1221 int SSL_CTX_set0_verify_cert_store(SSL_CTX *ctx, X509_STORE *store) {
1222   check_ssl_ctx_x509_method(ctx);
1223   return set_cert_store(&ctx->cert->verify_store, store, 0);
1224 }
1225
1226 int SSL_CTX_set1_verify_cert_store(SSL_CTX *ctx, X509_STORE *store) {
1227   check_ssl_ctx_x509_method(ctx);
1228   return set_cert_store(&ctx->cert->verify_store, store, 1);
1229 }
1230
1231 int SSL_set0_verify_cert_store(SSL *ssl, X509_STORE *store) {
1232   check_ssl_x509_method(ssl);
1233   return set_cert_store(&ssl->cert->verify_store, store, 0);
1234 }
1235
1236 int SSL_set1_verify_cert_store(SSL *ssl, X509_STORE *store) {
1237   check_ssl_x509_method(ssl);
1238   return set_cert_store(&ssl->cert->verify_store, store, 1);
1239 }
1240
1241 int SSL_alert_from_verify_result(long result) {
1242   switch (result) {
1243     case X509_V_ERR_CERT_CHAIN_TOO_LONG:
1244     case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
1245     case X509_V_ERR_INVALID_CA:
1246     case X509_V_ERR_PATH_LENGTH_EXCEEDED:
1247     case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
1248     case X509_V_ERR_UNABLE_TO_GET_CRL:
1249     case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
1250     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
1251     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
1252     case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
1253       return SSL_AD_UNKNOWN_CA;
1254
1255     case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
1256     case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
1257     case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
1258     case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
1259     case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
1260     case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
1261     case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
1262     case X509_V_ERR_CERT_UNTRUSTED:
1263     case X509_V_ERR_CERT_REJECTED:
1264     case X509_V_ERR_HOSTNAME_MISMATCH:
1265     case X509_V_ERR_EMAIL_MISMATCH:
1266     case X509_V_ERR_IP_ADDRESS_MISMATCH:
1267       return SSL_AD_BAD_CERTIFICATE;
1268
1269     case X509_V_ERR_CERT_SIGNATURE_FAILURE:
1270     case X509_V_ERR_CRL_SIGNATURE_FAILURE:
1271       return SSL_AD_DECRYPT_ERROR;
1272
1273     case X509_V_ERR_CERT_HAS_EXPIRED:
1274     case X509_V_ERR_CERT_NOT_YET_VALID:
1275     case X509_V_ERR_CRL_HAS_EXPIRED:
1276     case X509_V_ERR_CRL_NOT_YET_VALID:
1277       return SSL_AD_CERTIFICATE_EXPIRED;
1278
1279     case X509_V_ERR_CERT_REVOKED:
1280       return SSL_AD_CERTIFICATE_REVOKED;
1281
1282     case X509_V_ERR_UNSPECIFIED:
1283     case X509_V_ERR_OUT_OF_MEM:
1284     case X509_V_ERR_INVALID_CALL:
1285     case X509_V_ERR_STORE_LOOKUP:
1286       return SSL_AD_INTERNAL_ERROR;
1287
1288     case X509_V_ERR_APPLICATION_VERIFICATION:
1289       return SSL_AD_HANDSHAKE_FAILURE;
1290
1291     case X509_V_ERR_INVALID_PURPOSE:
1292       return SSL_AD_UNSUPPORTED_CERTIFICATE;
1293
1294     default:
1295       return SSL_AD_CERTIFICATE_UNKNOWN;
1296   }
1297 }