ssl_conf.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769
  1. /*
  2. * ! \file ssl/ssl_conf.c \brief SSL configuration functions
  3. */
  4. /* ====================================================================
  5. * Copyright (c) 2012 The OpenSSL Project. All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. *
  11. * 1. Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. *
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in
  16. * the documentation and/or other materials provided with the
  17. * distribution.
  18. *
  19. * 3. All advertising materials mentioning features or use of this
  20. * software must display the following acknowledgment:
  21. * "This product includes software developed by the OpenSSL Project
  22. * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  23. *
  24. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  25. * endorse or promote products derived from this software without
  26. * prior written permission. For written permission, please contact
  27. * openssl-core@openssl.org.
  28. *
  29. * 5. Products derived from this software may not be called "OpenSSL"
  30. * nor may "OpenSSL" appear in their names without prior written
  31. * permission of the OpenSSL Project.
  32. *
  33. * 6. Redistributions of any form whatsoever must retain the following
  34. * acknowledgment:
  35. * "This product includes software developed by the OpenSSL Project
  36. * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  37. *
  38. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  39. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  40. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  41. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  42. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  43. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  44. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  45. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  46. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  47. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  48. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  49. * OF THE POSSIBILITY OF SUCH DAMAGE.
  50. * ====================================================================
  51. *
  52. * This product includes cryptographic software written by Eric Young
  53. * (eay@cryptsoft.com). This product includes software written by Tim
  54. * Hudson (tjh@cryptsoft.com).
  55. *
  56. */
  57. #ifdef REF_CHECK
  58. # include <assert.h>
  59. #endif
  60. #include <stdio.h>
  61. #include "ssl_locl.h"
  62. #include <openssl/conf.h>
  63. #include <openssl/objects.h>
  64. #ifndef OPENSSL_NO_DH
  65. # include <openssl/dh.h>
  66. #endif
  67. /*
  68. * structure holding name tables. This is used for pemitted elements in lists
  69. * such as TLSv1.
  70. */
  71. typedef struct {
  72. const char *name;
  73. int namelen;
  74. unsigned int name_flags;
  75. unsigned long option_value;
  76. } ssl_flag_tbl;
  77. /* Switch table: use for single command line switches like no_tls2 */
  78. typedef struct {
  79. unsigned long option_value;
  80. unsigned int name_flags;
  81. } ssl_switch_tbl;
  82. /* Sense of name is inverted e.g. "TLSv1" will clear SSL_OP_NO_TLSv1 */
  83. #define SSL_TFLAG_INV 0x1
  84. /* Flags refers to cert_flags not options */
  85. #define SSL_TFLAG_CERT 0x2
  86. /* Option can only be used for clients */
  87. #define SSL_TFLAG_CLIENT SSL_CONF_FLAG_CLIENT
  88. /* Option can only be used for servers */
  89. #define SSL_TFLAG_SERVER SSL_CONF_FLAG_SERVER
  90. #define SSL_TFLAG_BOTH (SSL_TFLAG_CLIENT|SSL_TFLAG_SERVER)
  91. #define SSL_FLAG_TBL(str, flag) \
  92. {str, (int)(sizeof(str) - 1), SSL_TFLAG_BOTH, flag}
  93. #define SSL_FLAG_TBL_SRV(str, flag) \
  94. {str, (int)(sizeof(str) - 1), SSL_TFLAG_SERVER, flag}
  95. #define SSL_FLAG_TBL_CLI(str, flag) \
  96. {str, (int)(sizeof(str) - 1), SSL_TFLAG_CLIENT, flag}
  97. #define SSL_FLAG_TBL_INV(str, flag) \
  98. {str, (int)(sizeof(str) - 1), SSL_TFLAG_INV|SSL_TFLAG_BOTH, flag}
  99. #define SSL_FLAG_TBL_SRV_INV(str, flag) \
  100. {str, (int)(sizeof(str) - 1), SSL_TFLAG_INV|SSL_TFLAG_SERVER, flag}
  101. #define SSL_FLAG_TBL_CERT(str, flag) \
  102. {str, (int)(sizeof(str) - 1), SSL_TFLAG_CERT|SSL_TFLAG_BOTH, flag}
  103. /*
  104. * Opaque structure containing SSL configuration context.
  105. */
  106. struct ssl_conf_ctx_st {
  107. /*
  108. * Various flags indicating (among other things) which options we will
  109. * recognise.
  110. */
  111. unsigned int flags;
  112. /* Prefix and length of commands */
  113. char *prefix;
  114. size_t prefixlen;
  115. /* SSL_CTX or SSL structure to perform operations on */
  116. SSL_CTX *ctx;
  117. SSL *ssl;
  118. /* Pointer to SSL or SSL_CTX options field or NULL if none */
  119. unsigned long *poptions;
  120. /* Certificate filenames for each type */
  121. char *cert_filename[SSL_PKEY_NUM];
  122. /* Pointer to SSL or SSL_CTX cert_flags or NULL if none */
  123. unsigned int *pcert_flags;
  124. /* Current flag table being worked on */
  125. const ssl_flag_tbl *tbl;
  126. /* Size of table */
  127. size_t ntbl;
  128. };
  129. static void ssl_set_option(SSL_CONF_CTX *cctx, unsigned int name_flags,
  130. unsigned long option_value, int onoff)
  131. {
  132. if (cctx->poptions == NULL)
  133. return;
  134. if (name_flags & SSL_TFLAG_INV)
  135. onoff ^= 1;
  136. if (name_flags & SSL_TFLAG_CERT) {
  137. if (onoff)
  138. *cctx->pcert_flags |= option_value;
  139. else
  140. *cctx->pcert_flags &= ~option_value;
  141. } else {
  142. if (onoff)
  143. *cctx->poptions |= option_value;
  144. else
  145. *cctx->poptions &= ~option_value;
  146. }
  147. }
  148. static int ssl_match_option(SSL_CONF_CTX *cctx, const ssl_flag_tbl *tbl,
  149. const char *name, int namelen, int onoff)
  150. {
  151. /* If name not relevant for context skip */
  152. if (!(cctx->flags & tbl->name_flags & SSL_TFLAG_BOTH))
  153. return 0;
  154. if (namelen == -1) {
  155. if (strcmp(tbl->name, name))
  156. return 0;
  157. } else if (tbl->namelen != namelen
  158. || strncasecmp(tbl->name, name, namelen))
  159. return 0;
  160. ssl_set_option(cctx, tbl->name_flags, tbl->option_value, onoff);
  161. return 1;
  162. }
  163. static int ssl_set_option_list(const char *elem, int len, void *usr)
  164. {
  165. SSL_CONF_CTX *cctx = usr;
  166. size_t i;
  167. const ssl_flag_tbl *tbl;
  168. int onoff = 1;
  169. /*
  170. * len == -1 indicates not being called in list context, just for single
  171. * command line switches, so don't allow +, -.
  172. */
  173. if (elem == NULL)
  174. return 0;
  175. if (len != -1) {
  176. if (*elem == '+') {
  177. elem++;
  178. len--;
  179. onoff = 1;
  180. } else if (*elem == '-') {
  181. elem++;
  182. len--;
  183. onoff = 0;
  184. }
  185. }
  186. for (i = 0, tbl = cctx->tbl; i < cctx->ntbl; i++, tbl++) {
  187. if (ssl_match_option(cctx, tbl, elem, len, onoff))
  188. return 1;
  189. }
  190. return 0;
  191. }
  192. /* Set supported signature algorithms */
  193. static int cmd_SignatureAlgorithms(SSL_CONF_CTX *cctx, const char *value)
  194. {
  195. int rv;
  196. if (cctx->ssl)
  197. rv = SSL_set1_sigalgs_list(cctx->ssl, value);
  198. /* NB: ctx == NULL performs syntax checking only */
  199. else
  200. rv = SSL_CTX_set1_sigalgs_list(cctx->ctx, value);
  201. return rv > 0;
  202. }
  203. /* Set supported client signature algorithms */
  204. static int cmd_ClientSignatureAlgorithms(SSL_CONF_CTX *cctx,
  205. const char *value)
  206. {
  207. int rv;
  208. if (cctx->ssl)
  209. rv = SSL_set1_client_sigalgs_list(cctx->ssl, value);
  210. /* NB: ctx == NULL performs syntax checking only */
  211. else
  212. rv = SSL_CTX_set1_client_sigalgs_list(cctx->ctx, value);
  213. return rv > 0;
  214. }
  215. static int cmd_Curves(SSL_CONF_CTX *cctx, const char *value)
  216. {
  217. int rv;
  218. if (cctx->ssl)
  219. rv = SSL_set1_curves_list(cctx->ssl, value);
  220. /* NB: ctx == NULL performs syntax checking only */
  221. else
  222. rv = SSL_CTX_set1_curves_list(cctx->ctx, value);
  223. return rv > 0;
  224. }
  225. #ifndef OPENSSL_NO_EC
  226. /* ECDH temporary parameters */
  227. static int cmd_ECDHParameters(SSL_CONF_CTX *cctx, const char *value)
  228. {
  229. int onoff = -1, rv = 1;
  230. if (cctx->flags & SSL_CONF_FLAG_FILE) {
  231. if (*value == '+') {
  232. onoff = 1;
  233. value++;
  234. }
  235. if (*value == '-') {
  236. onoff = 0;
  237. value++;
  238. }
  239. if (strcasecmp(value, "automatic") == 0) {
  240. if (onoff == -1)
  241. onoff = 1;
  242. } else if (onoff != -1)
  243. return 0;
  244. } else if (cctx->flags & SSL_CONF_FLAG_CMDLINE) {
  245. if (strcmp(value, "auto") == 0)
  246. onoff = 1;
  247. }
  248. if (onoff != -1) {
  249. if (cctx->ctx)
  250. rv = SSL_CTX_set_ecdh_auto(cctx->ctx, onoff);
  251. else if (cctx->ssl)
  252. rv = SSL_set_ecdh_auto(cctx->ssl, onoff);
  253. } else {
  254. EC_KEY *ecdh;
  255. int nid;
  256. nid = EC_curve_nist2nid(value);
  257. if (nid == NID_undef)
  258. nid = OBJ_sn2nid(value);
  259. if (nid == 0)
  260. return 0;
  261. ecdh = EC_KEY_new_by_curve_name(nid);
  262. if (!ecdh)
  263. return 0;
  264. if (cctx->ctx)
  265. rv = SSL_CTX_set_tmp_ecdh(cctx->ctx, ecdh);
  266. else if (cctx->ssl)
  267. rv = SSL_set_tmp_ecdh(cctx->ssl, ecdh);
  268. EC_KEY_free(ecdh);
  269. }
  270. return rv > 0;
  271. }
  272. #endif
  273. static int cmd_CipherString(SSL_CONF_CTX *cctx, const char *value)
  274. {
  275. int rv = 1;
  276. if (cctx->ctx)
  277. rv = SSL_CTX_set_cipher_list(cctx->ctx, value);
  278. if (cctx->ssl)
  279. rv = SSL_set_cipher_list(cctx->ssl, value);
  280. return rv > 0;
  281. }
  282. static int cmd_Protocol(SSL_CONF_CTX *cctx, const char *value)
  283. {
  284. static const ssl_flag_tbl ssl_protocol_list[] = {
  285. SSL_FLAG_TBL_INV("ALL", SSL_OP_NO_SSL_MASK),
  286. SSL_FLAG_TBL_INV("SSLv2", SSL_OP_NO_SSLv2),
  287. SSL_FLAG_TBL_INV("SSLv3", SSL_OP_NO_SSLv3),
  288. SSL_FLAG_TBL_INV("TLSv1", SSL_OP_NO_TLSv1),
  289. SSL_FLAG_TBL_INV("TLSv1.1", SSL_OP_NO_TLSv1_1),
  290. SSL_FLAG_TBL_INV("TLSv1.2", SSL_OP_NO_TLSv1_2)
  291. };
  292. cctx->tbl = ssl_protocol_list;
  293. cctx->ntbl = OSSL_NELEM(ssl_protocol_list);
  294. return CONF_parse_list(value, ',', 1, ssl_set_option_list, cctx);
  295. }
  296. static int cmd_Options(SSL_CONF_CTX *cctx, const char *value)
  297. {
  298. static const ssl_flag_tbl ssl_option_list[] = {
  299. SSL_FLAG_TBL_INV("SessionTicket", SSL_OP_NO_TICKET),
  300. SSL_FLAG_TBL_INV("EmptyFragments",
  301. SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS),
  302. SSL_FLAG_TBL("Bugs", SSL_OP_ALL),
  303. SSL_FLAG_TBL_INV("Compression", SSL_OP_NO_COMPRESSION),
  304. SSL_FLAG_TBL_SRV("ServerPreference", SSL_OP_CIPHER_SERVER_PREFERENCE),
  305. SSL_FLAG_TBL_SRV("NoResumptionOnRenegotiation",
  306. SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION),
  307. SSL_FLAG_TBL_SRV("DHSingle", SSL_OP_SINGLE_DH_USE),
  308. SSL_FLAG_TBL_SRV("ECDHSingle", SSL_OP_SINGLE_ECDH_USE),
  309. SSL_FLAG_TBL("UnsafeLegacyRenegotiation",
  310. SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION),
  311. };
  312. if (value == NULL)
  313. return -3;
  314. cctx->tbl = ssl_option_list;
  315. cctx->ntbl = OSSL_NELEM(ssl_option_list);
  316. return CONF_parse_list(value, ',', 1, ssl_set_option_list, cctx);
  317. }
  318. static int cmd_Certificate(SSL_CONF_CTX *cctx, const char *value)
  319. {
  320. int rv = 1;
  321. CERT *c = NULL;
  322. if (cctx->ctx) {
  323. rv = SSL_CTX_use_certificate_chain_file(cctx->ctx, value);
  324. c = cctx->ctx->cert;
  325. }
  326. if (cctx->ssl) {
  327. rv = SSL_use_certificate_file(cctx->ssl, value, SSL_FILETYPE_PEM);
  328. c = cctx->ssl->cert;
  329. }
  330. if (rv > 0 && c && cctx->flags & SSL_CONF_FLAG_REQUIRE_PRIVATE) {
  331. char **pfilename = &cctx->cert_filename[c->key - c->pkeys];
  332. OPENSSL_free(*pfilename);
  333. *pfilename = BUF_strdup(value);
  334. if (!*pfilename)
  335. rv = 0;
  336. }
  337. return rv > 0;
  338. }
  339. static int cmd_PrivateKey(SSL_CONF_CTX *cctx, const char *value)
  340. {
  341. int rv = 1;
  342. if (!(cctx->flags & SSL_CONF_FLAG_CERTIFICATE))
  343. return -2;
  344. if (cctx->ctx)
  345. rv = SSL_CTX_use_PrivateKey_file(cctx->ctx, value, SSL_FILETYPE_PEM);
  346. if (cctx->ssl)
  347. rv = SSL_use_PrivateKey_file(cctx->ssl, value, SSL_FILETYPE_PEM);
  348. return rv > 0;
  349. }
  350. static int cmd_ServerInfoFile(SSL_CONF_CTX *cctx, const char *value)
  351. {
  352. int rv = 1;
  353. if (cctx->ctx)
  354. rv = SSL_CTX_use_serverinfo_file(cctx->ctx, value);
  355. return rv > 0;
  356. }
  357. #ifndef OPENSSL_NO_DH
  358. static int cmd_DHParameters(SSL_CONF_CTX *cctx, const char *value)
  359. {
  360. int rv = 0;
  361. DH *dh = NULL;
  362. BIO *in = NULL;
  363. if (cctx->ctx || cctx->ssl) {
  364. in = BIO_new(BIO_s_file_internal());
  365. if (!in)
  366. goto end;
  367. if (BIO_read_filename(in, value) <= 0)
  368. goto end;
  369. dh = PEM_read_bio_DHparams(in, NULL, NULL, NULL);
  370. if (!dh)
  371. goto end;
  372. } else
  373. return 1;
  374. if (cctx->ctx)
  375. rv = SSL_CTX_set_tmp_dh(cctx->ctx, dh);
  376. if (cctx->ssl)
  377. rv = SSL_set_tmp_dh(cctx->ssl, dh);
  378. end:
  379. DH_free(dh);
  380. BIO_free(in);
  381. return rv > 0;
  382. }
  383. #endif
  384. typedef struct {
  385. int (*cmd) (SSL_CONF_CTX *cctx, const char *value);
  386. const char *str_file;
  387. const char *str_cmdline;
  388. unsigned short flags;
  389. unsigned short value_type;
  390. } ssl_conf_cmd_tbl;
  391. /* Table of supported parameters */
  392. #define SSL_CONF_CMD(name, cmdopt, flags, type) \
  393. {cmd_##name, #name, cmdopt, flags, type}
  394. #define SSL_CONF_CMD_STRING(name, cmdopt, flags) \
  395. SSL_CONF_CMD(name, cmdopt, flags, SSL_CONF_TYPE_STRING)
  396. #define SSL_CONF_CMD_SWITCH(name, flags) \
  397. {0, NULL, name, flags, SSL_CONF_TYPE_NONE}
  398. /* See apps/apps.h if you change this table. */
  399. static const ssl_conf_cmd_tbl ssl_conf_cmds[] = {
  400. SSL_CONF_CMD_SWITCH("no_ssl3", 0),
  401. SSL_CONF_CMD_SWITCH("no_tls1", 0),
  402. SSL_CONF_CMD_SWITCH("no_tls1_1", 0),
  403. SSL_CONF_CMD_SWITCH("no_tls1_2", 0),
  404. SSL_CONF_CMD_SWITCH("bugs", 0),
  405. SSL_CONF_CMD_SWITCH("no_comp", 0),
  406. SSL_CONF_CMD_SWITCH("ecdh_single", SSL_CONF_FLAG_SERVER),
  407. #ifndef OPENSSL_NO_TLSEXT
  408. SSL_CONF_CMD_SWITCH("no_ticket", 0),
  409. #endif
  410. SSL_CONF_CMD_SWITCH("serverpref", SSL_CONF_FLAG_SERVER),
  411. SSL_CONF_CMD_SWITCH("legacy_renegotiation", 0),
  412. SSL_CONF_CMD_SWITCH("legacy_server_connect", SSL_CONF_FLAG_SERVER),
  413. SSL_CONF_CMD_SWITCH("no_resumption_on_reneg", SSL_CONF_FLAG_SERVER),
  414. SSL_CONF_CMD_SWITCH("no_legacy_server_connect", SSL_CONF_FLAG_SERVER),
  415. SSL_CONF_CMD_SWITCH("strict", 0),
  416. #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
  417. SSL_CONF_CMD_SWITCH("debug_broken_protocol", 0),
  418. #endif
  419. SSL_CONF_CMD_STRING(SignatureAlgorithms, "sigalgs", 0),
  420. SSL_CONF_CMD_STRING(ClientSignatureAlgorithms, "client_sigalgs", 0),
  421. SSL_CONF_CMD_STRING(Curves, "curves", 0),
  422. #ifndef OPENSSL_NO_EC
  423. SSL_CONF_CMD_STRING(ECDHParameters, "named_curve", SSL_CONF_FLAG_SERVER),
  424. #endif
  425. SSL_CONF_CMD_STRING(CipherString, "cipher", 0),
  426. SSL_CONF_CMD_STRING(Protocol, NULL, 0),
  427. SSL_CONF_CMD_STRING(Options, NULL, 0),
  428. SSL_CONF_CMD(Certificate, "cert", SSL_CONF_FLAG_CERTIFICATE,
  429. SSL_CONF_TYPE_FILE),
  430. SSL_CONF_CMD(PrivateKey, "key", SSL_CONF_FLAG_CERTIFICATE,
  431. SSL_CONF_TYPE_FILE),
  432. SSL_CONF_CMD(ServerInfoFile, NULL,
  433. SSL_CONF_FLAG_SERVER | SSL_CONF_FLAG_CERTIFICATE,
  434. SSL_CONF_TYPE_FILE),
  435. #ifndef OPENSSL_NO_DH
  436. SSL_CONF_CMD(DHParameters, "dhparam",
  437. SSL_CONF_FLAG_SERVER | SSL_CONF_FLAG_CERTIFICATE,
  438. SSL_CONF_TYPE_FILE)
  439. #endif
  440. };
  441. /* Supported switches: must match order of switches in ssl_conf_cmds */
  442. static const ssl_switch_tbl ssl_cmd_switches[] = {
  443. {SSL_OP_NO_SSLv3, 0}, /* no_ssl3 */
  444. {SSL_OP_NO_TLSv1, 0}, /* no_tls1 */
  445. {SSL_OP_NO_TLSv1_1, 0}, /* no_tls1_1 */
  446. {SSL_OP_NO_TLSv1_2, 0}, /* no_tls1_2 */
  447. {SSL_OP_ALL, 0}, /* bugs */
  448. {SSL_OP_NO_COMPRESSION, 0}, /* no_comp */
  449. {SSL_OP_SINGLE_ECDH_USE, 0}, /* ecdh_single */
  450. #ifndef OPENSSL_NO_TLSEXT
  451. {SSL_OP_NO_TICKET, 0}, /* no_ticket */
  452. #endif
  453. {SSL_OP_CIPHER_SERVER_PREFERENCE, 0}, /* serverpref */
  454. /* legacy_renegotiation */
  455. {SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION, 0},
  456. /* legacy_server_connect */
  457. {SSL_OP_LEGACY_SERVER_CONNECT, 0},
  458. /* no_resumption_on_reneg */
  459. {SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION, 0},
  460. /* no_legacy_server_connect */
  461. {SSL_OP_LEGACY_SERVER_CONNECT, SSL_TFLAG_INV},
  462. {SSL_CERT_FLAG_TLS_STRICT, SSL_TFLAG_CERT}, /* strict */
  463. #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
  464. {SSL_CERT_FLAG_BROKEN_PROTOCOL, SSL_TFLAG_CERT} /* debug_broken_protocol */
  465. #endif
  466. };
  467. static int ssl_conf_cmd_skip_prefix(SSL_CONF_CTX *cctx, const char **pcmd)
  468. {
  469. if (!pcmd || !*pcmd)
  470. return 0;
  471. /* If a prefix is set, check and skip */
  472. if (cctx->prefix) {
  473. if (strlen(*pcmd) <= cctx->prefixlen)
  474. return 0;
  475. if (cctx->flags & SSL_CONF_FLAG_CMDLINE &&
  476. strncmp(*pcmd, cctx->prefix, cctx->prefixlen))
  477. return 0;
  478. if (cctx->flags & SSL_CONF_FLAG_FILE &&
  479. strncasecmp(*pcmd, cctx->prefix, cctx->prefixlen))
  480. return 0;
  481. *pcmd += cctx->prefixlen;
  482. } else if (cctx->flags & SSL_CONF_FLAG_CMDLINE) {
  483. if (**pcmd != '-' || !(*pcmd)[1])
  484. return 0;
  485. *pcmd += 1;
  486. }
  487. return 1;
  488. }
  489. /* Determine if a command is allowed according to cctx flags */
  490. static int ssl_conf_cmd_allowed(SSL_CONF_CTX *cctx,
  491. const ssl_conf_cmd_tbl * t)
  492. {
  493. unsigned int tfl = t->flags;
  494. unsigned int cfl = cctx->flags;
  495. if ((tfl & SSL_CONF_FLAG_SERVER) && !(cfl & SSL_CONF_FLAG_SERVER))
  496. return 0;
  497. if ((tfl & SSL_CONF_FLAG_CLIENT) && !(cfl & SSL_CONF_FLAG_CLIENT))
  498. return 0;
  499. if ((tfl & SSL_CONF_FLAG_CERTIFICATE)
  500. && !(cfl & SSL_CONF_FLAG_CERTIFICATE))
  501. return 0;
  502. return 1;
  503. }
  504. static const ssl_conf_cmd_tbl *ssl_conf_cmd_lookup(SSL_CONF_CTX *cctx,
  505. const char *cmd)
  506. {
  507. const ssl_conf_cmd_tbl *t;
  508. size_t i;
  509. if (cmd == NULL)
  510. return NULL;
  511. /* Look for matching parameter name in table */
  512. for (i = 0, t = ssl_conf_cmds; i < OSSL_NELEM(ssl_conf_cmds); i++, t++) {
  513. if (ssl_conf_cmd_allowed(cctx, t)) {
  514. if (cctx->flags & SSL_CONF_FLAG_CMDLINE) {
  515. if (t->str_cmdline && strcmp(t->str_cmdline, cmd) == 0)
  516. return t;
  517. }
  518. if (cctx->flags & SSL_CONF_FLAG_FILE) {
  519. if (t->str_file && strcasecmp(t->str_file, cmd) == 0)
  520. return t;
  521. }
  522. }
  523. }
  524. return NULL;
  525. }
  526. static int ctrl_switch_option(SSL_CONF_CTX *cctx,
  527. const ssl_conf_cmd_tbl * cmd)
  528. {
  529. /* Find index of command in table */
  530. size_t idx = cmd - ssl_conf_cmds;
  531. const ssl_switch_tbl *scmd;
  532. /* Sanity check index */
  533. if (idx >= OSSL_NELEM(ssl_cmd_switches))
  534. return 0;
  535. /* Obtain switches entry with same index */
  536. scmd = ssl_cmd_switches + idx;
  537. ssl_set_option(cctx, scmd->name_flags, scmd->option_value, 1);
  538. return 1;
  539. }
  540. int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value)
  541. {
  542. const ssl_conf_cmd_tbl *runcmd;
  543. if (cmd == NULL) {
  544. SSLerr(SSL_F_SSL_CONF_CMD, SSL_R_INVALID_NULL_CMD_NAME);
  545. return 0;
  546. }
  547. if (!ssl_conf_cmd_skip_prefix(cctx, &cmd))
  548. return -2;
  549. runcmd = ssl_conf_cmd_lookup(cctx, cmd);
  550. if (runcmd) {
  551. int rv;
  552. if (runcmd->value_type == SSL_CONF_TYPE_NONE) {
  553. return ctrl_switch_option(cctx, runcmd);
  554. }
  555. if (value == NULL)
  556. return -3;
  557. rv = runcmd->cmd(cctx, value);
  558. if (rv > 0)
  559. return 2;
  560. if (rv == -2)
  561. return -2;
  562. if (cctx->flags & SSL_CONF_FLAG_SHOW_ERRORS) {
  563. SSLerr(SSL_F_SSL_CONF_CMD, SSL_R_BAD_VALUE);
  564. ERR_add_error_data(4, "cmd=", cmd, ", value=", value);
  565. }
  566. return 0;
  567. }
  568. if (cctx->flags & SSL_CONF_FLAG_SHOW_ERRORS) {
  569. SSLerr(SSL_F_SSL_CONF_CMD, SSL_R_UNKNOWN_CMD_NAME);
  570. ERR_add_error_data(2, "cmd=", cmd);
  571. }
  572. return -2;
  573. }
  574. int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv)
  575. {
  576. int rv;
  577. const char *arg = NULL, *argn;
  578. if (pargc && *pargc == 0)
  579. return 0;
  580. if (!pargc || *pargc > 0)
  581. arg = **pargv;
  582. if (arg == NULL)
  583. return 0;
  584. if (!pargc || *pargc > 1)
  585. argn = (*pargv)[1];
  586. else
  587. argn = NULL;
  588. cctx->flags &= ~SSL_CONF_FLAG_FILE;
  589. cctx->flags |= SSL_CONF_FLAG_CMDLINE;
  590. rv = SSL_CONF_cmd(cctx, arg, argn);
  591. if (rv > 0) {
  592. /* Success: update pargc, pargv */
  593. (*pargv) += rv;
  594. if (pargc)
  595. (*pargc) -= rv;
  596. return rv;
  597. }
  598. /* Unknown switch: indicate no arguments processed */
  599. if (rv == -2)
  600. return 0;
  601. /* Some error occurred processing command, return fatal error */
  602. if (rv == 0)
  603. return -1;
  604. return rv;
  605. }
  606. int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd)
  607. {
  608. if (ssl_conf_cmd_skip_prefix(cctx, &cmd)) {
  609. const ssl_conf_cmd_tbl *runcmd;
  610. runcmd = ssl_conf_cmd_lookup(cctx, cmd);
  611. if (runcmd)
  612. return runcmd->value_type;
  613. }
  614. return SSL_CONF_TYPE_UNKNOWN;
  615. }
  616. SSL_CONF_CTX *SSL_CONF_CTX_new(void)
  617. {
  618. SSL_CONF_CTX *ret = OPENSSL_malloc(sizeof(*ret));
  619. size_t i;
  620. if (ret) {
  621. ret->flags = 0;
  622. ret->prefix = NULL;
  623. ret->prefixlen = 0;
  624. ret->ssl = NULL;
  625. ret->ctx = NULL;
  626. ret->poptions = NULL;
  627. ret->pcert_flags = NULL;
  628. ret->tbl = NULL;
  629. ret->ntbl = 0;
  630. for (i = 0; i < SSL_PKEY_NUM; i++)
  631. ret->cert_filename[i] = NULL;
  632. }
  633. return ret;
  634. }
  635. int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx)
  636. {
  637. /* See if any certificates are missing private keys */
  638. size_t i;
  639. CERT *c = NULL;
  640. if (cctx->ctx)
  641. c = cctx->ctx->cert;
  642. else if (cctx->ssl)
  643. c = cctx->ssl->cert;
  644. if (c && cctx->flags & SSL_CONF_FLAG_REQUIRE_PRIVATE) {
  645. for (i = 0; i < SSL_PKEY_NUM; i++) {
  646. const char *p = cctx->cert_filename[i];
  647. /*
  648. * If missing private key try to load one from certificate file
  649. */
  650. if (p && !c->pkeys[i].privatekey) {
  651. if (!cmd_PrivateKey(cctx, p))
  652. return 0;
  653. }
  654. }
  655. }
  656. return 1;
  657. }
  658. void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx)
  659. {
  660. if (cctx) {
  661. size_t i;
  662. for (i = 0; i < SSL_PKEY_NUM; i++)
  663. OPENSSL_free(cctx->cert_filename[i]);
  664. OPENSSL_free(cctx->prefix);
  665. OPENSSL_free(cctx);
  666. }
  667. }
  668. unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags)
  669. {
  670. cctx->flags |= flags;
  671. return cctx->flags;
  672. }
  673. unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx, unsigned int flags)
  674. {
  675. cctx->flags &= ~flags;
  676. return cctx->flags;
  677. }
  678. int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre)
  679. {
  680. char *tmp = NULL;
  681. if (pre) {
  682. tmp = BUF_strdup(pre);
  683. if (tmp == NULL)
  684. return 0;
  685. }
  686. OPENSSL_free(cctx->prefix);
  687. cctx->prefix = tmp;
  688. if (tmp)
  689. cctx->prefixlen = strlen(tmp);
  690. else
  691. cctx->prefixlen = 0;
  692. return 1;
  693. }
  694. void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl)
  695. {
  696. cctx->ssl = ssl;
  697. cctx->ctx = NULL;
  698. if (ssl) {
  699. cctx->poptions = &ssl->options;
  700. cctx->pcert_flags = &ssl->cert->cert_flags;
  701. } else {
  702. cctx->poptions = NULL;
  703. cctx->pcert_flags = NULL;
  704. }
  705. }
  706. void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx)
  707. {
  708. cctx->ctx = ctx;
  709. cctx->ssl = NULL;
  710. if (ctx) {
  711. cctx->poptions = &ctx->options;
  712. cctx->pcert_flags = &ctx->cert->cert_flags;
  713. } else {
  714. cctx->poptions = NULL;
  715. cctx->pcert_flags = NULL;
  716. }
  717. }