ssl_cert.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799
  1. /*
  2. * ! \file ssl/ssl_cert.c
  3. */
  4. /* Copyright (C) 1995-1998 Eric Young ([email protected])
  5. * All rights reserved.
  6. *
  7. * This package is an SSL implementation written
  8. * by Eric Young ([email protected]).
  9. * The implementation was written so as to conform with Netscapes SSL.
  10. *
  11. * This library is free for commercial and non-commercial use as long as
  12. * the following conditions are aheared to. The following conditions
  13. * apply to all code found in this distribution, be it the RC4, RSA,
  14. * lhash, DES, etc., code; not just the SSL code. The SSL documentation
  15. * included with this distribution is covered by the same copyright terms
  16. * except that the holder is Tim Hudson ([email protected]).
  17. *
  18. * Copyright remains Eric Young's, and as such any Copyright notices in
  19. * the code are not to be removed.
  20. * If this package is used in a product, Eric Young should be given attribution
  21. * as the author of the parts of the library used.
  22. * This can be in the form of a textual message at program startup or
  23. * in documentation (online or textual) provided with the package.
  24. *
  25. * Redistribution and use in source and binary forms, with or without
  26. * modification, are permitted provided that the following conditions
  27. * are met:
  28. * 1. Redistributions of source code must retain the copyright
  29. * notice, this list of conditions and the following disclaimer.
  30. * 2. Redistributions in binary form must reproduce the above copyright
  31. * notice, this list of conditions and the following disclaimer in the
  32. * documentation and/or other materials provided with the distribution.
  33. * 3. All advertising materials mentioning features or use of this software
  34. * must display the following acknowledgement:
  35. * "This product includes cryptographic software written by
  36. * Eric Young ([email protected])"
  37. * The word 'cryptographic' can be left out if the rouines from the library
  38. * being used are not cryptographic related :-).
  39. * 4. If you include any Windows specific code (or a derivative thereof) from
  40. * the apps directory (application code) you must include an acknowledgement:
  41. * "This product includes software written by Tim Hudson ([email protected])"
  42. *
  43. * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  44. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  45. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  46. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  47. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  48. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  49. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  50. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  51. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  52. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  53. * SUCH DAMAGE.
  54. *
  55. * The licence and distribution terms for any publically available version or
  56. * derivative of this code cannot be changed. i.e. this code cannot simply be
  57. * copied and put under another distribution licence
  58. * [including the GNU Public Licence.]
  59. */
  60. /* ====================================================================
  61. * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
  62. *
  63. * Redistribution and use in source and binary forms, with or without
  64. * modification, are permitted provided that the following conditions
  65. * are met:
  66. *
  67. * 1. Redistributions of source code must retain the above copyright
  68. * notice, this list of conditions and the following disclaimer.
  69. *
  70. * 2. Redistributions in binary form must reproduce the above copyright
  71. * notice, this list of conditions and the following disclaimer in
  72. * the documentation and/or other materials provided with the
  73. * distribution.
  74. *
  75. * 3. All advertising materials mentioning features or use of this
  76. * software must display the following acknowledgment:
  77. * "This product includes software developed by the OpenSSL Project
  78. * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  79. *
  80. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  81. * endorse or promote products derived from this software without
  82. * prior written permission. For written permission, please contact
  83. * [email protected].
  84. *
  85. * 5. Products derived from this software may not be called "OpenSSL"
  86. * nor may "OpenSSL" appear in their names without prior written
  87. * permission of the OpenSSL Project.
  88. *
  89. * 6. Redistributions of any form whatsoever must retain the following
  90. * acknowledgment:
  91. * "This product includes software developed by the OpenSSL Project
  92. * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  93. *
  94. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  95. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  96. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  97. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  98. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  99. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  100. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  101. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  102. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  103. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  104. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  105. * OF THE POSSIBILITY OF SUCH DAMAGE.
  106. * ====================================================================
  107. *
  108. * This product includes cryptographic software written by Eric Young
  109. * ([email protected]). This product includes software written by Tim
  110. * Hudson ([email protected]).
  111. *
  112. */
  113. /* ====================================================================
  114. * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
  115. * ECC cipher suite support in OpenSSL originally developed by
  116. * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
  117. */
  118. #include <stdio.h>
  119. #include "e_os.h"
  120. #ifndef NO_SYS_TYPES_H
  121. # include <sys/types.h>
  122. #endif
  123. #include "o_dir.h"
  124. #include <openssl/objects.h>
  125. #include <openssl/bio.h>
  126. #include <openssl/pem.h>
  127. #include <openssl/x509v3.h>
  128. #ifndef OPENSSL_NO_DH
  129. # include <openssl/dh.h>
  130. #endif
  131. #include <openssl/bn.h>
  132. #include "ssl_locl.h"
  133. int SSL_get_ex_data_X509_STORE_CTX_idx(void)
  134. {
  135. static volatile int ssl_x509_store_ctx_idx = -1;
  136. int got_write_lock = 0;
  137. CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
  138. if (ssl_x509_store_ctx_idx < 0) {
  139. CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
  140. CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
  141. got_write_lock = 1;
  142. if (ssl_x509_store_ctx_idx < 0) {
  143. ssl_x509_store_ctx_idx =
  144. X509_STORE_CTX_get_ex_new_index(0, "SSL for verify callback",
  145. NULL, NULL, NULL);
  146. }
  147. }
  148. if (got_write_lock)
  149. CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
  150. else
  151. CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
  152. return ssl_x509_store_ctx_idx;
  153. }
  154. static void ssl_cert_set_default_md(CERT *cert)
  155. {
  156. /* Set digest values to defaults */
  157. #ifndef OPENSSL_NO_DSA
  158. cert->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
  159. #endif
  160. #ifndef OPENSSL_NO_RSA
  161. cert->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
  162. cert->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
  163. #endif
  164. #ifndef OPENSSL_NO_ECDSA
  165. cert->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
  166. #endif
  167. }
  168. CERT *ssl_cert_new(void)
  169. {
  170. CERT *ret;
  171. ret = (CERT *)OPENSSL_malloc(sizeof(CERT));
  172. if (ret == NULL) {
  173. SSLerr(SSL_F_SSL_CERT_NEW, ERR_R_MALLOC_FAILURE);
  174. return (NULL);
  175. }
  176. memset(ret, 0, sizeof(CERT));
  177. ret->key = &(ret->pkeys[SSL_PKEY_RSA_ENC]);
  178. ret->references = 1;
  179. ssl_cert_set_default_md(ret);
  180. return (ret);
  181. }
  182. CERT *ssl_cert_dup(CERT *cert)
  183. {
  184. CERT *ret;
  185. int i;
  186. ret = (CERT *)OPENSSL_malloc(sizeof(CERT));
  187. if (ret == NULL) {
  188. SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE);
  189. return (NULL);
  190. }
  191. memset(ret, 0, sizeof(CERT));
  192. ret->references = 1;
  193. ret->key = &ret->pkeys[cert->key - &cert->pkeys[0]];
  194. /*
  195. * or ret->key = ret->pkeys + (cert->key - cert->pkeys), if you find that
  196. * more readable
  197. */
  198. ret->valid = cert->valid;
  199. ret->mask_k = cert->mask_k;
  200. ret->mask_a = cert->mask_a;
  201. ret->export_mask_k = cert->export_mask_k;
  202. ret->export_mask_a = cert->export_mask_a;
  203. #ifndef OPENSSL_NO_RSA
  204. if (cert->rsa_tmp != NULL) {
  205. RSA_up_ref(cert->rsa_tmp);
  206. ret->rsa_tmp = cert->rsa_tmp;
  207. }
  208. ret->rsa_tmp_cb = cert->rsa_tmp_cb;
  209. #endif
  210. #ifndef OPENSSL_NO_DH
  211. if (cert->dh_tmp != NULL) {
  212. ret->dh_tmp = DHparams_dup(cert->dh_tmp);
  213. if (ret->dh_tmp == NULL) {
  214. SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_DH_LIB);
  215. goto err;
  216. }
  217. if (cert->dh_tmp->priv_key) {
  218. BIGNUM *b = BN_dup(cert->dh_tmp->priv_key);
  219. if (!b) {
  220. SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_BN_LIB);
  221. goto err;
  222. }
  223. ret->dh_tmp->priv_key = b;
  224. }
  225. if (cert->dh_tmp->pub_key) {
  226. BIGNUM *b = BN_dup(cert->dh_tmp->pub_key);
  227. if (!b) {
  228. SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_BN_LIB);
  229. goto err;
  230. }
  231. ret->dh_tmp->pub_key = b;
  232. }
  233. }
  234. ret->dh_tmp_cb = cert->dh_tmp_cb;
  235. #endif
  236. #ifndef OPENSSL_NO_ECDH
  237. if (cert->ecdh_tmp) {
  238. ret->ecdh_tmp = EC_KEY_dup(cert->ecdh_tmp);
  239. if (ret->ecdh_tmp == NULL) {
  240. SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_EC_LIB);
  241. goto err;
  242. }
  243. }
  244. ret->ecdh_tmp_cb = cert->ecdh_tmp_cb;
  245. #endif
  246. for (i = 0; i < SSL_PKEY_NUM; i++) {
  247. if (cert->pkeys[i].x509 != NULL) {
  248. ret->pkeys[i].x509 = cert->pkeys[i].x509;
  249. CRYPTO_add(&ret->pkeys[i].x509->references, 1, CRYPTO_LOCK_X509);
  250. }
  251. if (cert->pkeys[i].privatekey != NULL) {
  252. ret->pkeys[i].privatekey = cert->pkeys[i].privatekey;
  253. CRYPTO_add(&ret->pkeys[i].privatekey->references, 1,
  254. CRYPTO_LOCK_EVP_PKEY);
  255. }
  256. }
  257. /*
  258. * ret->extra_certs *should* exist, but currently the own certificate
  259. * chain is held inside SSL_CTX
  260. */
  261. /*
  262. * Set digests to defaults. NB: we don't copy existing values as they
  263. * will be set during handshake.
  264. */
  265. ssl_cert_set_default_md(ret);
  266. return (ret);
  267. #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_ECDH)
  268. err:
  269. #endif
  270. #ifndef OPENSSL_NO_RSA
  271. if (ret->rsa_tmp != NULL)
  272. RSA_free(ret->rsa_tmp);
  273. #endif
  274. #ifndef OPENSSL_NO_DH
  275. if (ret->dh_tmp != NULL)
  276. DH_free(ret->dh_tmp);
  277. #endif
  278. #ifndef OPENSSL_NO_ECDH
  279. if (ret->ecdh_tmp != NULL)
  280. EC_KEY_free(ret->ecdh_tmp);
  281. #endif
  282. for (i = 0; i < SSL_PKEY_NUM; i++) {
  283. if (ret->pkeys[i].x509 != NULL)
  284. X509_free(ret->pkeys[i].x509);
  285. if (ret->pkeys[i].privatekey != NULL)
  286. EVP_PKEY_free(ret->pkeys[i].privatekey);
  287. }
  288. return NULL;
  289. }
  290. void ssl_cert_free(CERT *c)
  291. {
  292. int i;
  293. if (c == NULL)
  294. return;
  295. i = CRYPTO_add(&c->references, -1, CRYPTO_LOCK_SSL_CERT);
  296. #ifdef REF_PRINT
  297. REF_PRINT("CERT", c);
  298. #endif
  299. if (i > 0)
  300. return;
  301. #ifdef REF_CHECK
  302. if (i < 0) {
  303. fprintf(stderr, "ssl_cert_free, bad reference count\n");
  304. abort(); /* ok */
  305. }
  306. #endif
  307. #ifndef OPENSSL_NO_RSA
  308. if (c->rsa_tmp)
  309. RSA_free(c->rsa_tmp);
  310. #endif
  311. #ifndef OPENSSL_NO_DH
  312. if (c->dh_tmp)
  313. DH_free(c->dh_tmp);
  314. #endif
  315. #ifndef OPENSSL_NO_ECDH
  316. if (c->ecdh_tmp)
  317. EC_KEY_free(c->ecdh_tmp);
  318. #endif
  319. for (i = 0; i < SSL_PKEY_NUM; i++) {
  320. if (c->pkeys[i].x509 != NULL)
  321. X509_free(c->pkeys[i].x509);
  322. if (c->pkeys[i].privatekey != NULL)
  323. EVP_PKEY_free(c->pkeys[i].privatekey);
  324. #if 0
  325. if (c->pkeys[i].publickey != NULL)
  326. EVP_PKEY_free(c->pkeys[i].publickey);
  327. #endif
  328. }
  329. OPENSSL_free(c);
  330. }
  331. int ssl_cert_inst(CERT **o)
  332. {
  333. /*
  334. * Create a CERT if there isn't already one (which cannot really happen,
  335. * as it is initially created in SSL_CTX_new; but the earlier code
  336. * usually allows for that one being non-existant, so we follow that
  337. * behaviour, as it might turn out that there actually is a reason for it
  338. * -- but I'm not sure that *all* of the existing code could cope with
  339. * s->cert being NULL, otherwise we could do without the initialization
  340. * in SSL_CTX_new).
  341. */
  342. if (o == NULL) {
  343. SSLerr(SSL_F_SSL_CERT_INST, ERR_R_PASSED_NULL_PARAMETER);
  344. return (0);
  345. }
  346. if (*o == NULL) {
  347. if ((*o = ssl_cert_new()) == NULL) {
  348. SSLerr(SSL_F_SSL_CERT_INST, ERR_R_MALLOC_FAILURE);
  349. return (0);
  350. }
  351. }
  352. return (1);
  353. }
  354. SESS_CERT *ssl_sess_cert_new(void)
  355. {
  356. SESS_CERT *ret;
  357. ret = OPENSSL_malloc(sizeof *ret);
  358. if (ret == NULL) {
  359. SSLerr(SSL_F_SSL_SESS_CERT_NEW, ERR_R_MALLOC_FAILURE);
  360. return NULL;
  361. }
  362. memset(ret, 0, sizeof *ret);
  363. ret->peer_key = &(ret->peer_pkeys[SSL_PKEY_RSA_ENC]);
  364. ret->references = 1;
  365. return ret;
  366. }
  367. void ssl_sess_cert_free(SESS_CERT *sc)
  368. {
  369. int i;
  370. if (sc == NULL)
  371. return;
  372. i = CRYPTO_add(&sc->references, -1, CRYPTO_LOCK_SSL_SESS_CERT);
  373. #ifdef REF_PRINT
  374. REF_PRINT("SESS_CERT", sc);
  375. #endif
  376. if (i > 0)
  377. return;
  378. #ifdef REF_CHECK
  379. if (i < 0) {
  380. fprintf(stderr, "ssl_sess_cert_free, bad reference count\n");
  381. abort(); /* ok */
  382. }
  383. #endif
  384. /* i == 0 */
  385. if (sc->cert_chain != NULL)
  386. sk_X509_pop_free(sc->cert_chain, X509_free);
  387. for (i = 0; i < SSL_PKEY_NUM; i++) {
  388. if (sc->peer_pkeys[i].x509 != NULL)
  389. X509_free(sc->peer_pkeys[i].x509);
  390. #if 0 /* We don't have the peer's private key.
  391. * These lines are just * here as a reminder
  392. * that we're still using a
  393. * not-quite-appropriate * data structure. */
  394. if (sc->peer_pkeys[i].privatekey != NULL)
  395. EVP_PKEY_free(sc->peer_pkeys[i].privatekey);
  396. #endif
  397. }
  398. #ifndef OPENSSL_NO_RSA
  399. if (sc->peer_rsa_tmp != NULL)
  400. RSA_free(sc->peer_rsa_tmp);
  401. #endif
  402. #ifndef OPENSSL_NO_DH
  403. if (sc->peer_dh_tmp != NULL)
  404. DH_free(sc->peer_dh_tmp);
  405. #endif
  406. #ifndef OPENSSL_NO_ECDH
  407. if (sc->peer_ecdh_tmp != NULL)
  408. EC_KEY_free(sc->peer_ecdh_tmp);
  409. #endif
  410. OPENSSL_free(sc);
  411. }
  412. int ssl_set_peer_cert_type(SESS_CERT *sc, int type)
  413. {
  414. sc->peer_cert_type = type;
  415. return (1);
  416. }
  417. int ssl_verify_cert_chain(SSL *s, STACK_OF(X509) *sk)
  418. {
  419. X509 *x;
  420. int i;
  421. X509_STORE_CTX ctx;
  422. if ((sk == NULL) || (sk_X509_num(sk) == 0))
  423. return (0);
  424. x = sk_X509_value(sk, 0);
  425. if (!X509_STORE_CTX_init(&ctx, s->ctx->cert_store, x, sk)) {
  426. SSLerr(SSL_F_SSL_VERIFY_CERT_CHAIN, ERR_R_X509_LIB);
  427. return (0);
  428. }
  429. #if 0
  430. if (SSL_get_verify_depth(s) >= 0)
  431. X509_STORE_CTX_set_depth(&ctx, SSL_get_verify_depth(s));
  432. #endif
  433. X509_STORE_CTX_set_ex_data(&ctx, SSL_get_ex_data_X509_STORE_CTX_idx(), s);
  434. /*
  435. * We need to inherit the verify parameters. These can be determined by
  436. * the context: if its a server it will verify SSL client certificates or
  437. * vice versa.
  438. */
  439. X509_STORE_CTX_set_default(&ctx, s->server ? "ssl_client" : "ssl_server");
  440. /*
  441. * Anything non-default in "param" should overwrite anything in the ctx.
  442. */
  443. X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(&ctx), s->param);
  444. if (s->verify_callback)
  445. X509_STORE_CTX_set_verify_cb(&ctx, s->verify_callback);
  446. if (s->ctx->app_verify_callback != NULL)
  447. #if 1 /* new with OpenSSL 0.9.7 */
  448. i = s->ctx->app_verify_callback(&ctx, s->ctx->app_verify_arg);
  449. #else
  450. i = s->ctx->app_verify_callback(&ctx); /* should pass app_verify_arg */
  451. #endif
  452. else {
  453. #ifndef OPENSSL_NO_X509_VERIFY
  454. i = X509_verify_cert(&ctx);
  455. #else
  456. i = 0;
  457. ctx.error = X509_V_ERR_APPLICATION_VERIFICATION;
  458. SSLerr(SSL_F_SSL_VERIFY_CERT_CHAIN, SSL_R_NO_VERIFY_CALLBACK);
  459. #endif
  460. }
  461. s->verify_result = ctx.error;
  462. X509_STORE_CTX_cleanup(&ctx);
  463. return (i);
  464. }
  465. static void set_client_CA_list(STACK_OF(X509_NAME) **ca_list,
  466. STACK_OF(X509_NAME) *name_list)
  467. {
  468. if (*ca_list != NULL)
  469. sk_X509_NAME_pop_free(*ca_list, X509_NAME_free);
  470. *ca_list = name_list;
  471. }
  472. STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk)
  473. {
  474. int i;
  475. STACK_OF(X509_NAME) *ret;
  476. X509_NAME *name;
  477. ret = sk_X509_NAME_new_null();
  478. for (i = 0; i < sk_X509_NAME_num(sk); i++) {
  479. name = X509_NAME_dup(sk_X509_NAME_value(sk, i));
  480. if ((name == NULL) || !sk_X509_NAME_push(ret, name)) {
  481. sk_X509_NAME_pop_free(ret, X509_NAME_free);
  482. return (NULL);
  483. }
  484. }
  485. return (ret);
  486. }
  487. void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list)
  488. {
  489. set_client_CA_list(&(s->client_CA), name_list);
  490. }
  491. void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list)
  492. {
  493. set_client_CA_list(&(ctx->client_CA), name_list);
  494. }
  495. STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx)
  496. {
  497. return (ctx->client_CA);
  498. }
  499. STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s)
  500. {
  501. if (s->type == SSL_ST_CONNECT) { /* we are in the client */
  502. if (((s->version >> 8) == SSL3_VERSION_MAJOR) && (s->s3 != NULL))
  503. return (s->s3->tmp.ca_names);
  504. else
  505. return (NULL);
  506. } else {
  507. if (s->client_CA != NULL)
  508. return (s->client_CA);
  509. else
  510. return (s->ctx->client_CA);
  511. }
  512. }
  513. static int add_client_CA(STACK_OF(X509_NAME) **sk, X509 *x)
  514. {
  515. X509_NAME *name;
  516. if (x == NULL)
  517. return (0);
  518. if ((*sk == NULL) && ((*sk = sk_X509_NAME_new_null()) == NULL))
  519. return (0);
  520. if ((name = X509_NAME_dup(X509_get_subject_name(x))) == NULL)
  521. return (0);
  522. if (!sk_X509_NAME_push(*sk, name)) {
  523. X509_NAME_free(name);
  524. return (0);
  525. }
  526. return (1);
  527. }
  528. int SSL_add_client_CA(SSL *ssl, X509 *x)
  529. {
  530. return (add_client_CA(&(ssl->client_CA), x));
  531. }
  532. int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x)
  533. {
  534. return (add_client_CA(&(ctx->client_CA), x));
  535. }
  536. static int xname_cmp(const X509_NAME *const *a, const X509_NAME *const *b)
  537. {
  538. return (X509_NAME_cmp(*a, *b));
  539. }
  540. #ifndef OPENSSL_NO_STDIO
  541. /**
  542. * Load CA certs from a file into a ::STACK. Note that it is somewhat misnamed;
  543. * it doesn't really have anything to do with clients (except that a common use
  544. * for a stack of CAs is to send it to the client). Actually, it doesn't have
  545. * much to do with CAs, either, since it will load any old cert.
  546. * \param file the file containing one or more certs.
  547. * \return a ::STACK containing the certs.
  548. */
  549. STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file)
  550. {
  551. BIO *in;
  552. X509 *x = NULL;
  553. X509_NAME *xn = NULL;
  554. STACK_OF(X509_NAME) *ret = NULL, *sk;
  555. sk = sk_X509_NAME_new(xname_cmp);
  556. in = BIO_new(BIO_s_file_internal());
  557. if ((sk == NULL) || (in == NULL)) {
  558. SSLerr(SSL_F_SSL_LOAD_CLIENT_CA_FILE, ERR_R_MALLOC_FAILURE);
  559. goto err;
  560. }
  561. if (!BIO_read_filename(in, file))
  562. goto err;
  563. for (;;) {
  564. if (PEM_read_bio_X509(in, &x, NULL, NULL) == NULL)
  565. break;
  566. if (ret == NULL) {
  567. ret = sk_X509_NAME_new_null();
  568. if (ret == NULL) {
  569. SSLerr(SSL_F_SSL_LOAD_CLIENT_CA_FILE, ERR_R_MALLOC_FAILURE);
  570. goto err;
  571. }
  572. }
  573. if ((xn = X509_get_subject_name(x)) == NULL)
  574. goto err;
  575. /* check for duplicates */
  576. xn = X509_NAME_dup(xn);
  577. if (xn == NULL)
  578. goto err;
  579. if (sk_X509_NAME_find(sk, xn) >= 0)
  580. X509_NAME_free(xn);
  581. else {
  582. sk_X509_NAME_push(sk, xn);
  583. sk_X509_NAME_push(ret, xn);
  584. }
  585. }
  586. if (0) {
  587. err:
  588. if (ret != NULL)
  589. sk_X509_NAME_pop_free(ret, X509_NAME_free);
  590. ret = NULL;
  591. }
  592. if (sk != NULL)
  593. sk_X509_NAME_free(sk);
  594. if (in != NULL)
  595. BIO_free(in);
  596. if (x != NULL)
  597. X509_free(x);
  598. if (ret != NULL)
  599. ERR_clear_error();
  600. return (ret);
  601. }
  602. #endif
  603. /**
  604. * Add a file of certs to a stack.
  605. * \param stack the stack to add to.
  606. * \param file the file to add from. All certs in this file that are not
  607. * already in the stack will be added.
  608. * \return 1 for success, 0 for failure. Note that in the case of failure some
  609. * certs may have been added to \c stack.
  610. */
  611. int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
  612. const char *file)
  613. {
  614. BIO *in;
  615. X509 *x = NULL;
  616. X509_NAME *xn = NULL;
  617. int ret = 1;
  618. int (*oldcmp) (const X509_NAME *const *a, const X509_NAME *const *b);
  619. oldcmp = sk_X509_NAME_set_cmp_func(stack, xname_cmp);
  620. in = BIO_new(BIO_s_file_internal());
  621. if (in == NULL) {
  622. SSLerr(SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK,
  623. ERR_R_MALLOC_FAILURE);
  624. goto err;
  625. }
  626. if (!BIO_read_filename(in, file))
  627. goto err;
  628. for (;;) {
  629. if (PEM_read_bio_X509(in, &x, NULL, NULL) == NULL)
  630. break;
  631. if ((xn = X509_get_subject_name(x)) == NULL)
  632. goto err;
  633. xn = X509_NAME_dup(xn);
  634. if (xn == NULL)
  635. goto err;
  636. if (sk_X509_NAME_find(stack, xn) >= 0)
  637. X509_NAME_free(xn);
  638. else
  639. sk_X509_NAME_push(stack, xn);
  640. }
  641. ERR_clear_error();
  642. if (0) {
  643. err:
  644. ret = 0;
  645. }
  646. if (in != NULL)
  647. BIO_free(in);
  648. if (x != NULL)
  649. X509_free(x);
  650. (void)sk_X509_NAME_set_cmp_func(stack, oldcmp);
  651. return ret;
  652. }
  653. /**
  654. * Add a directory of certs to a stack.
  655. * \param stack the stack to append to.
  656. * \param dir the directory to append from. All files in this directory will be
  657. * examined as potential certs. Any that are acceptable to
  658. * SSL_add_dir_cert_subjects_to_stack() that are not already in the stack will be
  659. * included.
  660. * \return 1 for success, 0 for failure. Note that in the case of failure some
  661. * certs may have been added to \c stack.
  662. */
  663. int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
  664. const char *dir)
  665. {
  666. OPENSSL_DIR_CTX *d = NULL;
  667. const char *filename;
  668. int ret = 0;
  669. CRYPTO_w_lock(CRYPTO_LOCK_READDIR);
  670. /* Note that a side effect is that the CAs will be sorted by name */
  671. while ((filename = OPENSSL_DIR_read(&d, dir))) {
  672. char buf[1024];
  673. int r;
  674. if (strlen(dir) + strlen(filename) + 2 > sizeof buf) {
  675. SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,
  676. SSL_R_PATH_TOO_LONG);
  677. goto err;
  678. }
  679. #ifdef OPENSSL_SYS_VMS
  680. r = BIO_snprintf(buf, sizeof buf, "%s%s", dir, filename);
  681. #else
  682. r = BIO_snprintf(buf, sizeof buf, "%s/%s", dir, filename);
  683. #endif
  684. if (r <= 0 || r >= (int)sizeof(buf))
  685. goto err;
  686. if (!SSL_add_file_cert_subjects_to_stack(stack, buf))
  687. goto err;
  688. }
  689. if (errno) {
  690. SYSerr(SYS_F_OPENDIR, get_last_sys_error());
  691. ERR_add_error_data(3, "OPENSSL_DIR_read(&ctx, '", dir, "')");
  692. SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB);
  693. goto err;
  694. }
  695. ret = 1;
  696. err:
  697. if (d)
  698. OPENSSL_DIR_end(&d);
  699. CRYPTO_w_unlock(CRYPTO_LOCK_READDIR);
  700. return ret;
  701. }