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