You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1291 regels
39 KiB

  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. #include <openssl/ssl.h>
  141. #include <assert.h>
  142. #include <openssl/asn1.h>
  143. #include <openssl/bytestring.h>
  144. #include <openssl/err.h>
  145. #include <openssl/pem.h>
  146. #include <openssl/stack.h>
  147. #include <openssl/x509.h>
  148. #include <openssl/x509v3.h>
  149. #include <openssl/x509_vfy.h>
  150. #include "internal.h"
  151. #include "../crypto/internal.h"
  152. namespace bssl {
  153. // check_ssl_x509_method asserts that |ssl| has the X509-based method
  154. // installed. Calling an X509-based method on an |ssl| with a different method
  155. // will likely misbehave and possibly crash or leak memory.
  156. static void check_ssl_x509_method(const SSL *ssl) {
  157. assert(ssl == NULL || ssl->ctx->x509_method == &ssl_crypto_x509_method);
  158. }
  159. // check_ssl_ctx_x509_method acts like |check_ssl_x509_method|, but for an
  160. // |SSL_CTX|.
  161. static void check_ssl_ctx_x509_method(const SSL_CTX *ctx) {
  162. assert(ctx == NULL || ctx->x509_method == &ssl_crypto_x509_method);
  163. }
  164. // x509_to_buffer returns a |CRYPTO_BUFFER| that contains the serialised
  165. // contents of |x509|.
  166. static UniquePtr<CRYPTO_BUFFER> x509_to_buffer(X509 *x509) {
  167. uint8_t *buf = NULL;
  168. int cert_len = i2d_X509(x509, &buf);
  169. if (cert_len <= 0) {
  170. return 0;
  171. }
  172. UniquePtr<CRYPTO_BUFFER> buffer(CRYPTO_BUFFER_new(buf, cert_len, NULL));
  173. OPENSSL_free(buf);
  174. return buffer;
  175. }
  176. // new_leafless_chain returns a fresh stack of buffers set to {NULL}.
  177. static UniquePtr<STACK_OF(CRYPTO_BUFFER)> new_leafless_chain(void) {
  178. UniquePtr<STACK_OF(CRYPTO_BUFFER)> chain(sk_CRYPTO_BUFFER_new_null());
  179. if (!chain ||
  180. !sk_CRYPTO_BUFFER_push(chain.get(), nullptr)) {
  181. return nullptr;
  182. }
  183. return chain;
  184. }
  185. // ssl_cert_set_chain sets elements 1.. of |cert->chain| to the serialised
  186. // forms of elements of |chain|. It returns one on success or zero on error, in
  187. // which case no change to |cert->chain| is made. It preverses the existing
  188. // leaf from |cert->chain|, if any.
  189. static int ssl_cert_set_chain(CERT *cert, STACK_OF(X509) *chain) {
  190. UniquePtr<STACK_OF(CRYPTO_BUFFER)> new_chain;
  191. if (cert->chain != nullptr) {
  192. new_chain.reset(sk_CRYPTO_BUFFER_new_null());
  193. if (!new_chain) {
  194. return 0;
  195. }
  196. CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain.get(), 0);
  197. if (!sk_CRYPTO_BUFFER_push(new_chain.get(), leaf)) {
  198. return 0;
  199. }
  200. // |leaf| might be NULL if it's a “leafless” chain.
  201. if (leaf != nullptr) {
  202. CRYPTO_BUFFER_up_ref(leaf);
  203. }
  204. }
  205. for (X509 *x509 : chain) {
  206. if (!new_chain) {
  207. new_chain = new_leafless_chain();
  208. if (!new_chain) {
  209. return 0;
  210. }
  211. }
  212. UniquePtr<CRYPTO_BUFFER> buffer = x509_to_buffer(x509);
  213. if (!buffer ||
  214. !PushToStack(new_chain.get(), std::move(buffer))) {
  215. return 0;
  216. }
  217. }
  218. cert->chain = std::move(new_chain);
  219. return 1;
  220. }
  221. static void ssl_crypto_x509_cert_flush_cached_leaf(CERT *cert) {
  222. X509_free(cert->x509_leaf);
  223. cert->x509_leaf = NULL;
  224. }
  225. static void ssl_crypto_x509_cert_flush_cached_chain(CERT *cert) {
  226. sk_X509_pop_free(cert->x509_chain, X509_free);
  227. cert->x509_chain = NULL;
  228. }
  229. static int ssl_crypto_x509_check_client_CA_list(
  230. STACK_OF(CRYPTO_BUFFER) *names) {
  231. for (const CRYPTO_BUFFER *buffer : names) {
  232. const uint8_t *inp = CRYPTO_BUFFER_data(buffer);
  233. X509_NAME *name = d2i_X509_NAME(NULL, &inp, CRYPTO_BUFFER_len(buffer));
  234. const int ok = name != NULL && inp == CRYPTO_BUFFER_data(buffer) +
  235. CRYPTO_BUFFER_len(buffer);
  236. X509_NAME_free(name);
  237. if (!ok) {
  238. return 0;
  239. }
  240. }
  241. return 1;
  242. }
  243. static void ssl_crypto_x509_cert_clear(CERT *cert) {
  244. ssl_crypto_x509_cert_flush_cached_leaf(cert);
  245. ssl_crypto_x509_cert_flush_cached_chain(cert);
  246. X509_free(cert->x509_stash);
  247. cert->x509_stash = NULL;
  248. }
  249. static void ssl_crypto_x509_cert_free(CERT *cert) {
  250. ssl_crypto_x509_cert_clear(cert);
  251. X509_STORE_free(cert->verify_store);
  252. }
  253. static void ssl_crypto_x509_cert_dup(CERT *new_cert, const CERT *cert) {
  254. if (cert->verify_store != NULL) {
  255. X509_STORE_up_ref(cert->verify_store);
  256. new_cert->verify_store = cert->verify_store;
  257. }
  258. }
  259. static int ssl_crypto_x509_session_cache_objects(SSL_SESSION *sess) {
  260. bssl::UniquePtr<STACK_OF(X509)> chain;
  261. if (sk_CRYPTO_BUFFER_num(sess->certs) > 0) {
  262. chain.reset(sk_X509_new_null());
  263. if (!chain) {
  264. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  265. return 0;
  266. }
  267. }
  268. X509 *leaf = nullptr;
  269. for (CRYPTO_BUFFER *cert : sess->certs) {
  270. UniquePtr<X509> x509(X509_parse_from_buffer(cert));
  271. if (!x509) {
  272. OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
  273. return 0;
  274. }
  275. if (leaf == nullptr) {
  276. leaf = x509.get();
  277. }
  278. if (!PushToStack(chain.get(), std::move(x509))) {
  279. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  280. return 0;
  281. }
  282. }
  283. sk_X509_pop_free(sess->x509_chain, X509_free);
  284. sess->x509_chain = chain.release();
  285. sk_X509_pop_free(sess->x509_chain_without_leaf, X509_free);
  286. sess->x509_chain_without_leaf = NULL;
  287. X509_free(sess->x509_peer);
  288. if (leaf != NULL) {
  289. X509_up_ref(leaf);
  290. }
  291. sess->x509_peer = leaf;
  292. return 1;
  293. }
  294. static int ssl_crypto_x509_session_dup(SSL_SESSION *new_session,
  295. const SSL_SESSION *session) {
  296. if (session->x509_peer != NULL) {
  297. X509_up_ref(session->x509_peer);
  298. new_session->x509_peer = session->x509_peer;
  299. }
  300. if (session->x509_chain != NULL) {
  301. new_session->x509_chain = X509_chain_up_ref(session->x509_chain);
  302. if (new_session->x509_chain == NULL) {
  303. return 0;
  304. }
  305. }
  306. return 1;
  307. }
  308. static void ssl_crypto_x509_session_clear(SSL_SESSION *session) {
  309. X509_free(session->x509_peer);
  310. session->x509_peer = NULL;
  311. sk_X509_pop_free(session->x509_chain, X509_free);
  312. session->x509_chain = NULL;
  313. sk_X509_pop_free(session->x509_chain_without_leaf, X509_free);
  314. session->x509_chain_without_leaf = NULL;
  315. }
  316. static int ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,
  317. SSL *ssl,
  318. uint8_t *out_alert) {
  319. *out_alert = SSL_AD_INTERNAL_ERROR;
  320. STACK_OF(X509) *const cert_chain = session->x509_chain;
  321. if (cert_chain == NULL || sk_X509_num(cert_chain) == 0) {
  322. return 0;
  323. }
  324. X509_STORE *verify_store = ssl->ctx->cert_store;
  325. if (ssl->cert->verify_store != NULL) {
  326. verify_store = ssl->cert->verify_store;
  327. }
  328. X509 *leaf = sk_X509_value(cert_chain, 0);
  329. ScopedX509_STORE_CTX ctx;
  330. if (!X509_STORE_CTX_init(ctx.get(), verify_store, leaf, cert_chain)) {
  331. OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
  332. return 0;
  333. }
  334. if (!X509_STORE_CTX_set_ex_data(ctx.get(),
  335. SSL_get_ex_data_X509_STORE_CTX_idx(), ssl)) {
  336. return 0;
  337. }
  338. // We need to inherit the verify parameters. These can be determined by the
  339. // context: if its a server it will verify SSL client certificates or vice
  340. // versa.
  341. X509_STORE_CTX_set_default(ctx.get(),
  342. ssl->server ? "ssl_client" : "ssl_server");
  343. // Anything non-default in "param" should overwrite anything in the ctx.
  344. X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(ctx.get()), ssl->param);
  345. if (ssl->verify_callback) {
  346. X509_STORE_CTX_set_verify_cb(ctx.get(), ssl->verify_callback);
  347. }
  348. int verify_ret;
  349. if (ssl->ctx->app_verify_callback != NULL) {
  350. verify_ret =
  351. ssl->ctx->app_verify_callback(ctx.get(), ssl->ctx->app_verify_arg);
  352. } else {
  353. verify_ret = X509_verify_cert(ctx.get());
  354. }
  355. session->verify_result = ctx->error;
  356. // If |SSL_VERIFY_NONE|, the error is non-fatal, but we keep the result.
  357. if (verify_ret <= 0 && ssl->verify_mode != SSL_VERIFY_NONE) {
  358. *out_alert = SSL_alert_from_verify_result(ctx->error);
  359. return 0;
  360. }
  361. ERR_clear_error();
  362. return 1;
  363. }
  364. static void ssl_crypto_x509_hs_flush_cached_ca_names(SSL_HANDSHAKE *hs) {
  365. sk_X509_NAME_pop_free(hs->cached_x509_ca_names, X509_NAME_free);
  366. hs->cached_x509_ca_names = NULL;
  367. }
  368. static int ssl_crypto_x509_ssl_new(SSL *ssl) {
  369. ssl->param = X509_VERIFY_PARAM_new();
  370. if (ssl->param == NULL) {
  371. return 0;
  372. }
  373. X509_VERIFY_PARAM_inherit(ssl->param, ssl->ctx->param);
  374. return 1;
  375. }
  376. static void ssl_crypto_x509_ssl_flush_cached_client_CA(SSL *ssl) {
  377. sk_X509_NAME_pop_free(ssl->cached_x509_client_CA, X509_NAME_free);
  378. ssl->cached_x509_client_CA = NULL;
  379. }
  380. static void ssl_crypto_x509_ssl_free(SSL *ssl) {
  381. ssl_crypto_x509_ssl_flush_cached_client_CA(ssl);
  382. X509_VERIFY_PARAM_free(ssl->param);
  383. }
  384. static int ssl_crypto_x509_ssl_auto_chain_if_needed(SSL *ssl) {
  385. // Only build a chain if there are no intermediates configured and the feature
  386. // isn't disabled.
  387. if ((ssl->mode & SSL_MODE_NO_AUTO_CHAIN) ||
  388. !ssl_has_certificate(ssl) ||
  389. ssl->cert->chain == nullptr ||
  390. sk_CRYPTO_BUFFER_num(ssl->cert->chain.get()) > 1) {
  391. return 1;
  392. }
  393. UniquePtr<X509> leaf(X509_parse_from_buffer(
  394. sk_CRYPTO_BUFFER_value(ssl->cert->chain.get(), 0)));
  395. if (!leaf) {
  396. OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
  397. return 0;
  398. }
  399. ScopedX509_STORE_CTX ctx;
  400. if (!X509_STORE_CTX_init(ctx.get(), ssl->ctx->cert_store, leaf.get(), NULL)) {
  401. OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
  402. return 0;
  403. }
  404. // Attempt to build a chain, ignoring the result.
  405. X509_verify_cert(ctx.get());
  406. ERR_clear_error();
  407. // Remove the leaf from the generated chain.
  408. X509_free(sk_X509_shift(ctx->chain));
  409. if (!ssl_cert_set_chain(ssl->cert, ctx->chain)) {
  410. return 0;
  411. }
  412. ssl_crypto_x509_cert_flush_cached_chain(ssl->cert);
  413. return 1;
  414. }
  415. static void ssl_crypto_x509_ssl_ctx_flush_cached_client_CA(SSL_CTX *ctx) {
  416. sk_X509_NAME_pop_free(ctx->cached_x509_client_CA, X509_NAME_free);
  417. ctx->cached_x509_client_CA = NULL;
  418. }
  419. static int ssl_crypto_x509_ssl_ctx_new(SSL_CTX *ctx) {
  420. ctx->cert_store = X509_STORE_new();
  421. ctx->param = X509_VERIFY_PARAM_new();
  422. return (ctx->cert_store != NULL && ctx->param != NULL);
  423. }
  424. static void ssl_crypto_x509_ssl_ctx_free(SSL_CTX *ctx) {
  425. ssl_crypto_x509_ssl_ctx_flush_cached_client_CA(ctx);
  426. X509_VERIFY_PARAM_free(ctx->param);
  427. X509_STORE_free(ctx->cert_store);
  428. }
  429. const SSL_X509_METHOD ssl_crypto_x509_method = {
  430. ssl_crypto_x509_check_client_CA_list,
  431. ssl_crypto_x509_cert_clear,
  432. ssl_crypto_x509_cert_free,
  433. ssl_crypto_x509_cert_dup,
  434. ssl_crypto_x509_cert_flush_cached_chain,
  435. ssl_crypto_x509_cert_flush_cached_leaf,
  436. ssl_crypto_x509_session_cache_objects,
  437. ssl_crypto_x509_session_dup,
  438. ssl_crypto_x509_session_clear,
  439. ssl_crypto_x509_session_verify_cert_chain,
  440. ssl_crypto_x509_hs_flush_cached_ca_names,
  441. ssl_crypto_x509_ssl_new,
  442. ssl_crypto_x509_ssl_free,
  443. ssl_crypto_x509_ssl_flush_cached_client_CA,
  444. ssl_crypto_x509_ssl_auto_chain_if_needed,
  445. ssl_crypto_x509_ssl_ctx_new,
  446. ssl_crypto_x509_ssl_ctx_free,
  447. ssl_crypto_x509_ssl_ctx_flush_cached_client_CA,
  448. };
  449. } // namespace bssl
  450. using namespace bssl;
  451. X509 *SSL_get_peer_certificate(const SSL *ssl) {
  452. check_ssl_x509_method(ssl);
  453. if (ssl == NULL) {
  454. return NULL;
  455. }
  456. SSL_SESSION *session = SSL_get_session(ssl);
  457. if (session == NULL || session->x509_peer == NULL) {
  458. return NULL;
  459. }
  460. X509_up_ref(session->x509_peer);
  461. return session->x509_peer;
  462. }
  463. STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *ssl) {
  464. check_ssl_x509_method(ssl);
  465. if (ssl == NULL) {
  466. return NULL;
  467. }
  468. SSL_SESSION *session = SSL_get_session(ssl);
  469. if (session == NULL ||
  470. session->x509_chain == NULL) {
  471. return NULL;
  472. }
  473. if (!ssl->server) {
  474. return session->x509_chain;
  475. }
  476. // OpenSSL historically didn't include the leaf certificate in the returned
  477. // certificate chain, but only for servers.
  478. if (session->x509_chain_without_leaf == NULL) {
  479. session->x509_chain_without_leaf = sk_X509_new_null();
  480. if (session->x509_chain_without_leaf == NULL) {
  481. return NULL;
  482. }
  483. for (size_t i = 1; i < sk_X509_num(session->x509_chain); i++) {
  484. X509 *cert = sk_X509_value(session->x509_chain, i);
  485. if (!sk_X509_push(session->x509_chain_without_leaf, cert)) {
  486. sk_X509_pop_free(session->x509_chain_without_leaf, X509_free);
  487. session->x509_chain_without_leaf = NULL;
  488. return NULL;
  489. }
  490. X509_up_ref(cert);
  491. }
  492. }
  493. return session->x509_chain_without_leaf;
  494. }
  495. STACK_OF(X509) *SSL_get_peer_full_cert_chain(const SSL *ssl) {
  496. check_ssl_x509_method(ssl);
  497. SSL_SESSION *session = SSL_get_session(ssl);
  498. if (session == NULL) {
  499. return NULL;
  500. }
  501. return session->x509_chain;
  502. }
  503. int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose) {
  504. check_ssl_ctx_x509_method(ctx);
  505. return X509_VERIFY_PARAM_set_purpose(ctx->param, purpose);
  506. }
  507. int SSL_set_purpose(SSL *ssl, int purpose) {
  508. check_ssl_x509_method(ssl);
  509. return X509_VERIFY_PARAM_set_purpose(ssl->param, purpose);
  510. }
  511. int SSL_CTX_set_trust(SSL_CTX *ctx, int trust) {
  512. check_ssl_ctx_x509_method(ctx);
  513. return X509_VERIFY_PARAM_set_trust(ctx->param, trust);
  514. }
  515. int SSL_set_trust(SSL *ssl, int trust) {
  516. check_ssl_x509_method(ssl);
  517. return X509_VERIFY_PARAM_set_trust(ssl->param, trust);
  518. }
  519. int SSL_CTX_set1_param(SSL_CTX *ctx, const X509_VERIFY_PARAM *param) {
  520. check_ssl_ctx_x509_method(ctx);
  521. return X509_VERIFY_PARAM_set1(ctx->param, param);
  522. }
  523. int SSL_set1_param(SSL *ssl, const X509_VERIFY_PARAM *param) {
  524. check_ssl_x509_method(ssl);
  525. return X509_VERIFY_PARAM_set1(ssl->param, param);
  526. }
  527. X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx) {
  528. check_ssl_ctx_x509_method(ctx);
  529. return ctx->param;
  530. }
  531. X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl) {
  532. check_ssl_x509_method(ssl);
  533. return ssl->param;
  534. }
  535. int SSL_get_verify_depth(const SSL *ssl) {
  536. check_ssl_x509_method(ssl);
  537. return X509_VERIFY_PARAM_get_depth(ssl->param);
  538. }
  539. int (*SSL_get_verify_callback(const SSL *ssl))(int, X509_STORE_CTX *) {
  540. check_ssl_x509_method(ssl);
  541. return ssl->verify_callback;
  542. }
  543. int SSL_CTX_get_verify_mode(const SSL_CTX *ctx) {
  544. check_ssl_ctx_x509_method(ctx);
  545. return ctx->verify_mode;
  546. }
  547. int SSL_CTX_get_verify_depth(const SSL_CTX *ctx) {
  548. check_ssl_ctx_x509_method(ctx);
  549. return X509_VERIFY_PARAM_get_depth(ctx->param);
  550. }
  551. int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(
  552. int ok, X509_STORE_CTX *store_ctx) {
  553. check_ssl_ctx_x509_method(ctx);
  554. return ctx->default_verify_callback;
  555. }
  556. void SSL_set_verify(SSL *ssl, int mode,
  557. int (*callback)(int ok, X509_STORE_CTX *store_ctx)) {
  558. check_ssl_x509_method(ssl);
  559. ssl->verify_mode = mode;
  560. if (callback != NULL) {
  561. ssl->verify_callback = callback;
  562. }
  563. }
  564. void SSL_set_verify_depth(SSL *ssl, int depth) {
  565. check_ssl_x509_method(ssl);
  566. X509_VERIFY_PARAM_set_depth(ssl->param, depth);
  567. }
  568. void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,
  569. int (*cb)(X509_STORE_CTX *store_ctx,
  570. void *arg),
  571. void *arg) {
  572. check_ssl_ctx_x509_method(ctx);
  573. ctx->app_verify_callback = cb;
  574. ctx->app_verify_arg = arg;
  575. }
  576. void SSL_CTX_set_verify(SSL_CTX *ctx, int mode,
  577. int (*cb)(int, X509_STORE_CTX *)) {
  578. check_ssl_ctx_x509_method(ctx);
  579. ctx->verify_mode = mode;
  580. ctx->default_verify_callback = cb;
  581. }
  582. void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth) {
  583. check_ssl_ctx_x509_method(ctx);
  584. X509_VERIFY_PARAM_set_depth(ctx->param, depth);
  585. }
  586. int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx) {
  587. check_ssl_ctx_x509_method(ctx);
  588. return X509_STORE_set_default_paths(ctx->cert_store);
  589. }
  590. int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *ca_file,
  591. const char *ca_dir) {
  592. check_ssl_ctx_x509_method(ctx);
  593. return X509_STORE_load_locations(ctx->cert_store, ca_file, ca_dir);
  594. }
  595. void SSL_set_verify_result(SSL *ssl, long result) {
  596. check_ssl_x509_method(ssl);
  597. if (result != X509_V_OK) {
  598. abort();
  599. }
  600. }
  601. long SSL_get_verify_result(const SSL *ssl) {
  602. check_ssl_x509_method(ssl);
  603. SSL_SESSION *session = SSL_get_session(ssl);
  604. if (session == NULL) {
  605. return X509_V_ERR_INVALID_CALL;
  606. }
  607. return session->verify_result;
  608. }
  609. X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *ctx) {
  610. check_ssl_ctx_x509_method(ctx);
  611. return ctx->cert_store;
  612. }
  613. void SSL_CTX_set_cert_store(SSL_CTX *ctx, X509_STORE *store) {
  614. check_ssl_ctx_x509_method(ctx);
  615. X509_STORE_free(ctx->cert_store);
  616. ctx->cert_store = store;
  617. }
  618. static int ssl_use_certificate(CERT *cert, X509 *x) {
  619. if (x == NULL) {
  620. OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER);
  621. return 0;
  622. }
  623. UniquePtr<CRYPTO_BUFFER> buffer = x509_to_buffer(x);
  624. if (!buffer) {
  625. return 0;
  626. }
  627. return ssl_set_cert(cert, std::move(buffer));
  628. }
  629. int SSL_use_certificate(SSL *ssl, X509 *x) {
  630. check_ssl_x509_method(ssl);
  631. return ssl_use_certificate(ssl->cert, x);
  632. }
  633. int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x) {
  634. check_ssl_ctx_x509_method(ctx);
  635. return ssl_use_certificate(ctx->cert, x);
  636. }
  637. // ssl_cert_cache_leaf_cert sets |cert->x509_leaf|, if currently NULL, from the
  638. // first element of |cert->chain|.
  639. static int ssl_cert_cache_leaf_cert(CERT *cert) {
  640. assert(cert->x509_method);
  641. if (cert->x509_leaf != NULL ||
  642. cert->chain == NULL) {
  643. return 1;
  644. }
  645. CRYPTO_BUFFER *leaf = sk_CRYPTO_BUFFER_value(cert->chain.get(), 0);
  646. if (!leaf) {
  647. return 1;
  648. }
  649. cert->x509_leaf = X509_parse_from_buffer(leaf);
  650. return cert->x509_leaf != NULL;
  651. }
  652. static X509 *ssl_cert_get0_leaf(CERT *cert) {
  653. if (cert->x509_leaf == NULL &&
  654. !ssl_cert_cache_leaf_cert(cert)) {
  655. return NULL;
  656. }
  657. return cert->x509_leaf;
  658. }
  659. X509 *SSL_get_certificate(const SSL *ssl) {
  660. check_ssl_x509_method(ssl);
  661. return ssl_cert_get0_leaf(ssl->cert);
  662. }
  663. X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx) {
  664. check_ssl_ctx_x509_method(ctx);
  665. MutexWriteLock lock(const_cast<CRYPTO_MUTEX*>(&ctx->lock));
  666. return ssl_cert_get0_leaf(ctx->cert);
  667. }
  668. static int ssl_cert_set0_chain(CERT *cert, STACK_OF(X509) *chain) {
  669. if (!ssl_cert_set_chain(cert, chain)) {
  670. return 0;
  671. }
  672. sk_X509_pop_free(chain, X509_free);
  673. ssl_crypto_x509_cert_flush_cached_chain(cert);
  674. return 1;
  675. }
  676. static int ssl_cert_set1_chain(CERT *cert, STACK_OF(X509) *chain) {
  677. if (!ssl_cert_set_chain(cert, chain)) {
  678. return 0;
  679. }
  680. ssl_crypto_x509_cert_flush_cached_chain(cert);
  681. return 1;
  682. }
  683. static int ssl_cert_append_cert(CERT *cert, X509 *x509) {
  684. assert(cert->x509_method);
  685. UniquePtr<CRYPTO_BUFFER> buffer = x509_to_buffer(x509);
  686. if (!buffer) {
  687. return 0;
  688. }
  689. if (cert->chain != NULL) {
  690. return PushToStack(cert->chain.get(), std::move(buffer));
  691. }
  692. cert->chain = new_leafless_chain();
  693. if (!cert->chain ||
  694. !PushToStack(cert->chain.get(), std::move(buffer))) {
  695. cert->chain.reset();
  696. return 0;
  697. }
  698. return 1;
  699. }
  700. static int ssl_cert_add0_chain_cert(CERT *cert, X509 *x509) {
  701. if (!ssl_cert_append_cert(cert, x509)) {
  702. return 0;
  703. }
  704. X509_free(cert->x509_stash);
  705. cert->x509_stash = x509;
  706. ssl_crypto_x509_cert_flush_cached_chain(cert);
  707. return 1;
  708. }
  709. static int ssl_cert_add1_chain_cert(CERT *cert, X509 *x509) {
  710. if (!ssl_cert_append_cert(cert, x509)) {
  711. return 0;
  712. }
  713. ssl_crypto_x509_cert_flush_cached_chain(cert);
  714. return 1;
  715. }
  716. int SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
  717. check_ssl_ctx_x509_method(ctx);
  718. return ssl_cert_set0_chain(ctx->cert, chain);
  719. }
  720. int SSL_CTX_set1_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
  721. check_ssl_ctx_x509_method(ctx);
  722. return ssl_cert_set1_chain(ctx->cert, chain);
  723. }
  724. int SSL_set0_chain(SSL *ssl, STACK_OF(X509) *chain) {
  725. check_ssl_x509_method(ssl);
  726. return ssl_cert_set0_chain(ssl->cert, chain);
  727. }
  728. int SSL_set1_chain(SSL *ssl, STACK_OF(X509) *chain) {
  729. check_ssl_x509_method(ssl);
  730. return ssl_cert_set1_chain(ssl->cert, chain);
  731. }
  732. int SSL_CTX_add0_chain_cert(SSL_CTX *ctx, X509 *x509) {
  733. check_ssl_ctx_x509_method(ctx);
  734. return ssl_cert_add0_chain_cert(ctx->cert, x509);
  735. }
  736. int SSL_CTX_add1_chain_cert(SSL_CTX *ctx, X509 *x509) {
  737. check_ssl_ctx_x509_method(ctx);
  738. return ssl_cert_add1_chain_cert(ctx->cert, x509);
  739. }
  740. int SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *x509) {
  741. check_ssl_ctx_x509_method(ctx);
  742. return SSL_CTX_add0_chain_cert(ctx, x509);
  743. }
  744. int SSL_add0_chain_cert(SSL *ssl, X509 *x509) {
  745. check_ssl_x509_method(ssl);
  746. return ssl_cert_add0_chain_cert(ssl->cert, x509);
  747. }
  748. int SSL_add1_chain_cert(SSL *ssl, X509 *x509) {
  749. check_ssl_x509_method(ssl);
  750. return ssl_cert_add1_chain_cert(ssl->cert, x509);
  751. }
  752. int SSL_CTX_clear_chain_certs(SSL_CTX *ctx) {
  753. check_ssl_ctx_x509_method(ctx);
  754. return SSL_CTX_set0_chain(ctx, NULL);
  755. }
  756. int SSL_CTX_clear_extra_chain_certs(SSL_CTX *ctx) {
  757. check_ssl_ctx_x509_method(ctx);
  758. return SSL_CTX_clear_chain_certs(ctx);
  759. }
  760. int SSL_clear_chain_certs(SSL *ssl) {
  761. check_ssl_x509_method(ssl);
  762. return SSL_set0_chain(ssl, NULL);
  763. }
  764. // ssl_cert_cache_chain_certs fills in |cert->x509_chain| from elements 1.. of
  765. // |cert->chain|.
  766. static int ssl_cert_cache_chain_certs(CERT *cert) {
  767. assert(cert->x509_method);
  768. if (cert->x509_chain != nullptr ||
  769. cert->chain == nullptr ||
  770. sk_CRYPTO_BUFFER_num(cert->chain.get()) < 2) {
  771. return 1;
  772. }
  773. UniquePtr<STACK_OF(X509)> chain(sk_X509_new_null());
  774. if (!chain) {
  775. return 0;
  776. }
  777. for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(cert->chain.get()); i++) {
  778. CRYPTO_BUFFER *buffer = sk_CRYPTO_BUFFER_value(cert->chain.get(), i);
  779. UniquePtr<X509> x509(X509_parse_from_buffer(buffer));
  780. if (!x509 ||
  781. !PushToStack(chain.get(), std::move(x509))) {
  782. return 0;
  783. }
  784. }
  785. cert->x509_chain = chain.release();
  786. return 1;
  787. }
  788. int SSL_CTX_get0_chain_certs(const SSL_CTX *ctx, STACK_OF(X509) **out_chain) {
  789. check_ssl_ctx_x509_method(ctx);
  790. MutexWriteLock lock(const_cast<CRYPTO_MUTEX*>(&ctx->lock));
  791. if (!ssl_cert_cache_chain_certs(ctx->cert)) {
  792. *out_chain = NULL;
  793. return 0;
  794. }
  795. *out_chain = ctx->cert->x509_chain;
  796. return 1;
  797. }
  798. int SSL_CTX_get_extra_chain_certs(const SSL_CTX *ctx,
  799. STACK_OF(X509) **out_chain) {
  800. return SSL_CTX_get0_chain_certs(ctx, out_chain);
  801. }
  802. int SSL_get0_chain_certs(const SSL *ssl, STACK_OF(X509) **out_chain) {
  803. check_ssl_x509_method(ssl);
  804. if (!ssl_cert_cache_chain_certs(ssl->cert)) {
  805. *out_chain = NULL;
  806. return 0;
  807. }
  808. *out_chain = ssl->cert->x509_chain;
  809. return 1;
  810. }
  811. static SSL_SESSION *ssl_session_new_with_crypto_x509(void) {
  812. return ssl_session_new(&ssl_crypto_x509_method).release();
  813. }
  814. SSL_SESSION *d2i_SSL_SESSION_bio(BIO *bio, SSL_SESSION **out) {
  815. return ASN1_d2i_bio_of(SSL_SESSION, ssl_session_new_with_crypto_x509,
  816. d2i_SSL_SESSION, bio, out);
  817. }
  818. int i2d_SSL_SESSION_bio(BIO *bio, const SSL_SESSION *session) {
  819. return ASN1_i2d_bio_of(SSL_SESSION, i2d_SSL_SESSION, bio, session);
  820. }
  821. IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION)
  822. SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const uint8_t **pp, long length) {
  823. if (length < 0) {
  824. OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
  825. return NULL;
  826. }
  827. CBS cbs;
  828. CBS_init(&cbs, *pp, length);
  829. UniquePtr<SSL_SESSION> ret = SSL_SESSION_parse(&cbs, &ssl_crypto_x509_method,
  830. NULL /* no buffer pool */);
  831. if (!ret) {
  832. return NULL;
  833. }
  834. if (a) {
  835. SSL_SESSION_free(*a);
  836. *a = ret.get();
  837. }
  838. *pp = CBS_data(&cbs);
  839. return ret.release();
  840. }
  841. STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *list) {
  842. return sk_X509_NAME_deep_copy(list, X509_NAME_dup, X509_NAME_free);
  843. }
  844. static void set_client_CA_list(STACK_OF(CRYPTO_BUFFER) **ca_list,
  845. const STACK_OF(X509_NAME) *name_list,
  846. CRYPTO_BUFFER_POOL *pool) {
  847. UniquePtr<STACK_OF(CRYPTO_BUFFER)> buffers(sk_CRYPTO_BUFFER_new_null());
  848. if (!buffers) {
  849. return;
  850. }
  851. for (X509_NAME *name : name_list) {
  852. uint8_t *outp = NULL;
  853. int len = i2d_X509_NAME(name, &outp);
  854. if (len < 0) {
  855. return;
  856. }
  857. UniquePtr<CRYPTO_BUFFER> buffer(CRYPTO_BUFFER_new(outp, len, pool));
  858. OPENSSL_free(outp);
  859. if (!buffer ||
  860. !PushToStack(buffers.get(), std::move(buffer))) {
  861. return;
  862. }
  863. }
  864. sk_CRYPTO_BUFFER_pop_free(*ca_list, CRYPTO_BUFFER_free);
  865. *ca_list = buffers.release();
  866. }
  867. void SSL_set_client_CA_list(SSL *ssl, STACK_OF(X509_NAME) *name_list) {
  868. check_ssl_x509_method(ssl);
  869. ssl->ctx->x509_method->ssl_flush_cached_client_CA(ssl);
  870. set_client_CA_list(&ssl->client_CA, name_list, ssl->ctx->pool);
  871. sk_X509_NAME_pop_free(name_list, X509_NAME_free);
  872. }
  873. void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list) {
  874. check_ssl_ctx_x509_method(ctx);
  875. ctx->x509_method->ssl_ctx_flush_cached_client_CA(ctx);
  876. set_client_CA_list(&ctx->client_CA, name_list, ctx->pool);
  877. sk_X509_NAME_pop_free(name_list, X509_NAME_free);
  878. }
  879. static STACK_OF(X509_NAME) *
  880. buffer_names_to_x509(const STACK_OF(CRYPTO_BUFFER) *names,
  881. STACK_OF(X509_NAME) **cached) {
  882. if (names == NULL) {
  883. return NULL;
  884. }
  885. if (*cached != NULL) {
  886. return *cached;
  887. }
  888. UniquePtr<STACK_OF(X509_NAME)> new_cache(sk_X509_NAME_new_null());
  889. if (!new_cache) {
  890. OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
  891. return NULL;
  892. }
  893. for (const CRYPTO_BUFFER *buffer : names) {
  894. const uint8_t *inp = CRYPTO_BUFFER_data(buffer);
  895. UniquePtr<X509_NAME> name(
  896. d2i_X509_NAME(nullptr, &inp, CRYPTO_BUFFER_len(buffer)));
  897. if (!name ||
  898. inp != CRYPTO_BUFFER_data(buffer) + CRYPTO_BUFFER_len(buffer) ||
  899. !PushToStack(new_cache.get(), std::move(name))) {
  900. return NULL;
  901. }
  902. }
  903. *cached = new_cache.release();
  904. return *cached;
  905. }
  906. STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *ssl) {
  907. check_ssl_x509_method(ssl);
  908. // For historical reasons, this function is used both to query configuration
  909. // state on a server as well as handshake state on a client. However, whether
  910. // |ssl| is a client or server is not known until explicitly configured with
  911. // |SSL_set_connect_state|. If |do_handshake| is NULL, |ssl| is in an
  912. // indeterminate mode and |ssl->server| is unset.
  913. if (ssl->do_handshake != NULL && !ssl->server) {
  914. if (ssl->s3->hs != NULL) {
  915. return buffer_names_to_x509(ssl->s3->hs->ca_names.get(),
  916. &ssl->s3->hs->cached_x509_ca_names);
  917. }
  918. return NULL;
  919. }
  920. if (ssl->client_CA != NULL) {
  921. return buffer_names_to_x509(
  922. ssl->client_CA, (STACK_OF(X509_NAME) **)&ssl->cached_x509_client_CA);
  923. }
  924. return SSL_CTX_get_client_CA_list(ssl->ctx);
  925. }
  926. STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx) {
  927. check_ssl_ctx_x509_method(ctx);
  928. // This is a logically const operation that may be called on multiple threads,
  929. // so it needs to lock around updating |cached_x509_client_CA|.
  930. MutexWriteLock lock(const_cast<CRYPTO_MUTEX *>(&ctx->lock));
  931. return buffer_names_to_x509(
  932. ctx->client_CA,
  933. const_cast<STACK_OF(X509_NAME) **>(&ctx->cached_x509_client_CA));
  934. }
  935. static int add_client_CA(STACK_OF(CRYPTO_BUFFER) **names, X509 *x509,
  936. CRYPTO_BUFFER_POOL *pool) {
  937. if (x509 == NULL) {
  938. return 0;
  939. }
  940. uint8_t *outp = NULL;
  941. int len = i2d_X509_NAME(X509_get_subject_name(x509), &outp);
  942. if (len < 0) {
  943. return 0;
  944. }
  945. UniquePtr<CRYPTO_BUFFER> buffer(CRYPTO_BUFFER_new(outp, len, pool));
  946. OPENSSL_free(outp);
  947. if (!buffer) {
  948. return 0;
  949. }
  950. int alloced = 0;
  951. if (*names == NULL) {
  952. *names = sk_CRYPTO_BUFFER_new_null();
  953. alloced = 1;
  954. if (*names == NULL) {
  955. return 0;
  956. }
  957. }
  958. if (!PushToStack(*names, std::move(buffer))) {
  959. if (alloced) {
  960. sk_CRYPTO_BUFFER_pop_free(*names, CRYPTO_BUFFER_free);
  961. *names = NULL;
  962. }
  963. return 0;
  964. }
  965. return 1;
  966. }
  967. int SSL_add_client_CA(SSL *ssl, X509 *x509) {
  968. check_ssl_x509_method(ssl);
  969. if (!add_client_CA(&ssl->client_CA, x509, ssl->ctx->pool)) {
  970. return 0;
  971. }
  972. ssl_crypto_x509_ssl_flush_cached_client_CA(ssl);
  973. return 1;
  974. }
  975. int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x509) {
  976. check_ssl_ctx_x509_method(ctx);
  977. if (!add_client_CA(&ctx->client_CA, x509, ctx->pool)) {
  978. return 0;
  979. }
  980. ssl_crypto_x509_ssl_ctx_flush_cached_client_CA(ctx);
  981. return 1;
  982. }
  983. static int do_client_cert_cb(SSL *ssl, void *arg) {
  984. if (ssl_has_certificate(ssl) || ssl->ctx->client_cert_cb == NULL) {
  985. return 1;
  986. }
  987. X509 *x509 = NULL;
  988. EVP_PKEY *pkey = NULL;
  989. int ret = ssl->ctx->client_cert_cb(ssl, &x509, &pkey);
  990. if (ret < 0) {
  991. return -1;
  992. }
  993. UniquePtr<X509> free_x509(x509);
  994. UniquePtr<EVP_PKEY> free_pkey(pkey);
  995. if (ret != 0) {
  996. if (!SSL_use_certificate(ssl, x509) ||
  997. !SSL_use_PrivateKey(ssl, pkey)) {
  998. return 0;
  999. }
  1000. }
  1001. return 1;
  1002. }
  1003. void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, int (*cb)(SSL *ssl,
  1004. X509 **out_x509,
  1005. EVP_PKEY **out_pkey)) {
  1006. check_ssl_ctx_x509_method(ctx);
  1007. // Emulate the old client certificate callback with the new one.
  1008. SSL_CTX_set_cert_cb(ctx, do_client_cert_cb, NULL);
  1009. ctx->client_cert_cb = cb;
  1010. }
  1011. static int set_cert_store(X509_STORE **store_ptr, X509_STORE *new_store,
  1012. int take_ref) {
  1013. X509_STORE_free(*store_ptr);
  1014. *store_ptr = new_store;
  1015. if (new_store != NULL && take_ref) {
  1016. X509_STORE_up_ref(new_store);
  1017. }
  1018. return 1;
  1019. }
  1020. int SSL_get_ex_data_X509_STORE_CTX_idx(void) {
  1021. // The ex_data index to go from |X509_STORE_CTX| to |SSL| always uses the
  1022. // reserved app_data slot. Before ex_data was introduced, app_data was used.
  1023. // Avoid breaking any software which assumes |X509_STORE_CTX_get_app_data|
  1024. // works.
  1025. return 0;
  1026. }
  1027. int SSL_CTX_set0_verify_cert_store(SSL_CTX *ctx, X509_STORE *store) {
  1028. check_ssl_ctx_x509_method(ctx);
  1029. return set_cert_store(&ctx->cert->verify_store, store, 0);
  1030. }
  1031. int SSL_CTX_set1_verify_cert_store(SSL_CTX *ctx, X509_STORE *store) {
  1032. check_ssl_ctx_x509_method(ctx);
  1033. return set_cert_store(&ctx->cert->verify_store, store, 1);
  1034. }
  1035. int SSL_set0_verify_cert_store(SSL *ssl, X509_STORE *store) {
  1036. check_ssl_x509_method(ssl);
  1037. return set_cert_store(&ssl->cert->verify_store, store, 0);
  1038. }
  1039. int SSL_set1_verify_cert_store(SSL *ssl, X509_STORE *store) {
  1040. check_ssl_x509_method(ssl);
  1041. return set_cert_store(&ssl->cert->verify_store, store, 1);
  1042. }
  1043. int SSL_alert_from_verify_result(long result) {
  1044. switch (result) {
  1045. case X509_V_ERR_CERT_CHAIN_TOO_LONG:
  1046. case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
  1047. case X509_V_ERR_INVALID_CA:
  1048. case X509_V_ERR_PATH_LENGTH_EXCEEDED:
  1049. case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
  1050. case X509_V_ERR_UNABLE_TO_GET_CRL:
  1051. case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
  1052. case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
  1053. case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
  1054. case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
  1055. return SSL_AD_UNKNOWN_CA;
  1056. case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
  1057. case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
  1058. case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
  1059. case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
  1060. case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
  1061. case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
  1062. case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
  1063. case X509_V_ERR_CERT_UNTRUSTED:
  1064. case X509_V_ERR_CERT_REJECTED:
  1065. case X509_V_ERR_HOSTNAME_MISMATCH:
  1066. case X509_V_ERR_EMAIL_MISMATCH:
  1067. case X509_V_ERR_IP_ADDRESS_MISMATCH:
  1068. return SSL_AD_BAD_CERTIFICATE;
  1069. case X509_V_ERR_CERT_SIGNATURE_FAILURE:
  1070. case X509_V_ERR_CRL_SIGNATURE_FAILURE:
  1071. return SSL_AD_DECRYPT_ERROR;
  1072. case X509_V_ERR_CERT_HAS_EXPIRED:
  1073. case X509_V_ERR_CERT_NOT_YET_VALID:
  1074. case X509_V_ERR_CRL_HAS_EXPIRED:
  1075. case X509_V_ERR_CRL_NOT_YET_VALID:
  1076. return SSL_AD_CERTIFICATE_EXPIRED;
  1077. case X509_V_ERR_CERT_REVOKED:
  1078. return SSL_AD_CERTIFICATE_REVOKED;
  1079. case X509_V_ERR_UNSPECIFIED:
  1080. case X509_V_ERR_OUT_OF_MEM:
  1081. case X509_V_ERR_INVALID_CALL:
  1082. case X509_V_ERR_STORE_LOOKUP:
  1083. return SSL_AD_INTERNAL_ERROR;
  1084. case X509_V_ERR_APPLICATION_VERIFICATION:
  1085. return SSL_AD_HANDSHAKE_FAILURE;
  1086. case X509_V_ERR_INVALID_PURPOSE:
  1087. return SSL_AD_UNSUPPORTED_CERTIFICATE;
  1088. default:
  1089. return SSL_AD_CERTIFICATE_UNKNOWN;
  1090. }
  1091. }