LCOV - code coverage report
Current view: top level - third_party/openssl/crypto/x509v3 - v3_conf.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 0 206 0.0 %
Date: 2015-10-10 Functions: 0 29 0.0 %

          Line data    Source code
       1             : /* v3_conf.c */
       2             : /*
       3             :  * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
       4             :  * 1999.
       5             :  */
       6             : /* ====================================================================
       7             :  * Copyright (c) 1999-2002 The OpenSSL Project.  All rights reserved.
       8             :  *
       9             :  * Redistribution and use in source and binary forms, with or without
      10             :  * modification, are permitted provided that the following conditions
      11             :  * are met:
      12             :  *
      13             :  * 1. Redistributions of source code must retain the above copyright
      14             :  *    notice, this list of conditions and the following disclaimer.
      15             :  *
      16             :  * 2. Redistributions in binary form must reproduce the above copyright
      17             :  *    notice, this list of conditions and the following disclaimer in
      18             :  *    the documentation and/or other materials provided with the
      19             :  *    distribution.
      20             :  *
      21             :  * 3. All advertising materials mentioning features or use of this
      22             :  *    software must display the following acknowledgment:
      23             :  *    "This product includes software developed by the OpenSSL Project
      24             :  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
      25             :  *
      26             :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      27             :  *    endorse or promote products derived from this software without
      28             :  *    prior written permission. For written permission, please contact
      29             :  *    licensing@OpenSSL.org.
      30             :  *
      31             :  * 5. Products derived from this software may not be called "OpenSSL"
      32             :  *    nor may "OpenSSL" appear in their names without prior written
      33             :  *    permission of the OpenSSL Project.
      34             :  *
      35             :  * 6. Redistributions of any form whatsoever must retain the following
      36             :  *    acknowledgment:
      37             :  *    "This product includes software developed by the OpenSSL Project
      38             :  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
      39             :  *
      40             :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      41             :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      42             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      43             :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      44             :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      45             :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      46             :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      47             :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      49             :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      50             :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      51             :  * OF THE POSSIBILITY OF SUCH DAMAGE.
      52             :  * ====================================================================
      53             :  *
      54             :  * This product includes cryptographic software written by Eric Young
      55             :  * (eay@cryptsoft.com).  This product includes software written by Tim
      56             :  * Hudson (tjh@cryptsoft.com).
      57             :  *
      58             :  */
      59             : /* extension creation utilities */
      60             : 
      61             : #include <stdio.h>
      62             : #include <ctype.h>
      63             : #include "cryptlib.h"
      64             : #include <openssl/conf.h>
      65             : #include <openssl/x509.h>
      66             : #include <openssl/x509v3.h>
      67             : 
      68             : static int v3_check_critical(char **value);
      69             : static int v3_check_generic(char **value);
      70             : static X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid,
      71             :                                     int crit, char *value);
      72             : static X509_EXTENSION *v3_generic_extension(const char *ext, char *value,
      73             :                                             int crit, int type,
      74             :                                             X509V3_CTX *ctx);
      75             : static char *conf_lhash_get_string(void *db, char *section, char *value);
      76             : static STACK_OF(CONF_VALUE) *conf_lhash_get_section(void *db, char *section);
      77             : static X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method,
      78             :                                   int ext_nid, int crit, void *ext_struc);
      79             : static unsigned char *generic_asn1(char *value, X509V3_CTX *ctx,
      80             :                                    long *ext_len);
      81             : /* CONF *conf:  Config file    */
      82             : /* char *name:  Name    */
      83             : /* char *value:  Value    */
      84           0 : X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, char *name,
      85             :                                  char *value)
      86             : {
      87             :     int crit;
      88             :     int ext_type;
      89             :     X509_EXTENSION *ret;
      90           0 :     crit = v3_check_critical(&value);
      91           0 :     if ((ext_type = v3_check_generic(&value)))
      92           0 :         return v3_generic_extension(name, value, crit, ext_type, ctx);
      93           0 :     ret = do_ext_nconf(conf, ctx, OBJ_sn2nid(name), crit, value);
      94           0 :     if (!ret) {
      95           0 :         X509V3err(X509V3_F_X509V3_EXT_NCONF, X509V3_R_ERROR_IN_EXTENSION);
      96           0 :         ERR_add_error_data(4, "name=", name, ", value=", value);
      97             :     }
      98           0 :     return ret;
      99             : }
     100             : 
     101             : /* CONF *conf:  Config file    */
     102             : /* char *value:  Value    */
     103           0 : X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid,
     104             :                                      char *value)
     105             : {
     106             :     int crit;
     107             :     int ext_type;
     108           0 :     crit = v3_check_critical(&value);
     109           0 :     if ((ext_type = v3_check_generic(&value)))
     110           0 :         return v3_generic_extension(OBJ_nid2sn(ext_nid),
     111             :                                     value, crit, ext_type, ctx);
     112           0 :     return do_ext_nconf(conf, ctx, ext_nid, crit, value);
     113             : }
     114             : 
     115             : /* CONF *conf:  Config file    */
     116             : /* char *value:  Value    */
     117           0 : static X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid,
     118             :                                     int crit, char *value)
     119             : {
     120           0 :     const X509V3_EXT_METHOD *method;
     121             :     X509_EXTENSION *ext;
     122             :     STACK_OF(CONF_VALUE) *nval;
     123             :     void *ext_struc;
     124           0 :     if (ext_nid == NID_undef) {
     125           0 :         X509V3err(X509V3_F_DO_EXT_NCONF, X509V3_R_UNKNOWN_EXTENSION_NAME);
     126           0 :         return NULL;
     127             :     }
     128           0 :     if (!(method = X509V3_EXT_get_nid(ext_nid))) {
     129           0 :         X509V3err(X509V3_F_DO_EXT_NCONF, X509V3_R_UNKNOWN_EXTENSION);
     130           0 :         return NULL;
     131             :     }
     132             :     /* Now get internal extension representation based on type */
     133           0 :     if (method->v2i) {
     134           0 :         if (*value == '@')
     135           0 :             nval = NCONF_get_section(conf, value + 1);
     136             :         else
     137           0 :             nval = X509V3_parse_list(value);
     138           0 :         if (sk_CONF_VALUE_num(nval) <= 0) {
     139           0 :             X509V3err(X509V3_F_DO_EXT_NCONF,
     140             :                       X509V3_R_INVALID_EXTENSION_STRING);
     141           0 :             ERR_add_error_data(4, "name=", OBJ_nid2sn(ext_nid), ",section=",
     142             :                                value);
     143           0 :             return NULL;
     144             :         }
     145           0 :         ext_struc = method->v2i(method, ctx, nval);
     146           0 :         if (*value != '@')
     147           0 :             sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
     148           0 :         if (!ext_struc)
     149             :             return NULL;
     150           0 :     } else if (method->s2i) {
     151           0 :         if (!(ext_struc = method->s2i(method, ctx, value)))
     152             :             return NULL;
     153           0 :     } else if (method->r2i) {
     154           0 :         if (!ctx->db || !ctx->db_meth) {
     155           0 :             X509V3err(X509V3_F_DO_EXT_NCONF, X509V3_R_NO_CONFIG_DATABASE);
     156           0 :             return NULL;
     157             :         }
     158           0 :         if (!(ext_struc = method->r2i(method, ctx, value)))
     159             :             return NULL;
     160             :     } else {
     161           0 :         X509V3err(X509V3_F_DO_EXT_NCONF,
     162             :                   X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED);
     163           0 :         ERR_add_error_data(2, "name=", OBJ_nid2sn(ext_nid));
     164           0 :         return NULL;
     165             :     }
     166             : 
     167           0 :     ext = do_ext_i2d(method, ext_nid, crit, ext_struc);
     168           0 :     if (method->it)
     169           0 :         ASN1_item_free(ext_struc, ASN1_ITEM_ptr(method->it));
     170             :     else
     171           0 :         method->ext_free(ext_struc);
     172           0 :     return ext;
     173             : 
     174             : }
     175             : 
     176           0 : static X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method,
     177             :                                   int ext_nid, int crit, void *ext_struc)
     178             : {
     179             :     unsigned char *ext_der;
     180             :     int ext_len;
     181             :     ASN1_OCTET_STRING *ext_oct;
     182             :     X509_EXTENSION *ext;
     183             :     /* Convert internal representation to DER */
     184           0 :     if (method->it) {
     185           0 :         ext_der = NULL;
     186           0 :         ext_len =
     187             :             ASN1_item_i2d(ext_struc, &ext_der, ASN1_ITEM_ptr(method->it));
     188           0 :         if (ext_len < 0)
     189             :             goto merr;
     190             :     } else {
     191             :         unsigned char *p;
     192           0 :         ext_len = method->i2d(ext_struc, NULL);
     193           0 :         if (!(ext_der = OPENSSL_malloc(ext_len)))
     194             :             goto merr;
     195           0 :         p = ext_der;
     196           0 :         method->i2d(ext_struc, &p);
     197             :     }
     198           0 :     if (!(ext_oct = M_ASN1_OCTET_STRING_new()))
     199             :         goto merr;
     200           0 :     ext_oct->data = ext_der;
     201           0 :     ext_oct->length = ext_len;
     202             : 
     203           0 :     ext = X509_EXTENSION_create_by_NID(NULL, ext_nid, crit, ext_oct);
     204           0 :     if (!ext)
     205             :         goto merr;
     206           0 :     M_ASN1_OCTET_STRING_free(ext_oct);
     207             : 
     208             :     return ext;
     209             : 
     210             :  merr:
     211           0 :     X509V3err(X509V3_F_DO_EXT_I2D, ERR_R_MALLOC_FAILURE);
     212             :     return NULL;
     213             : 
     214             : }
     215             : 
     216             : /* Given an internal structure, nid and critical flag create an extension */
     217             : 
     218           0 : X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc)
     219             : {
     220           0 :     const X509V3_EXT_METHOD *method;
     221           0 :     if (!(method = X509V3_EXT_get_nid(ext_nid))) {
     222           0 :         X509V3err(X509V3_F_X509V3_EXT_I2D, X509V3_R_UNKNOWN_EXTENSION);
     223           0 :         return NULL;
     224             :     }
     225           0 :     return do_ext_i2d(method, ext_nid, crit, ext_struc);
     226             : }
     227             : 
     228             : /* Check the extension string for critical flag */
     229           0 : static int v3_check_critical(char **value)
     230             : {
     231           0 :     char *p = *value;
     232           0 :     if ((strlen(p) < 9) || strncmp(p, "critical,", 9))
     233             :         return 0;
     234           0 :     p += 9;
     235           0 :     while (isspace((unsigned char)*p))
     236           0 :         p++;
     237           0 :     *value = p;
     238           0 :     return 1;
     239             : }
     240             : 
     241             : /* Check extension string for generic extension and return the type */
     242           0 : static int v3_check_generic(char **value)
     243             : {
     244             :     int gen_type = 0;
     245           0 :     char *p = *value;
     246           0 :     if ((strlen(p) >= 4) && !strncmp(p, "DER:", 4)) {
     247           0 :         p += 4;
     248           0 :         gen_type = 1;
     249           0 :     } else if ((strlen(p) >= 5) && !strncmp(p, "ASN1:", 5)) {
     250           0 :         p += 5;
     251           0 :         gen_type = 2;
     252             :     } else
     253             :         return 0;
     254             : 
     255           0 :     while (isspace((unsigned char)*p))
     256           0 :         p++;
     257           0 :     *value = p;
     258           0 :     return gen_type;
     259             : }
     260             : 
     261             : /* Create a generic extension: for now just handle DER type */
     262           0 : static X509_EXTENSION *v3_generic_extension(const char *ext, char *value,
     263             :                                             int crit, int gen_type,
     264             :                                             X509V3_CTX *ctx)
     265             : {
     266             :     unsigned char *ext_der = NULL;
     267             :     long ext_len;
     268             :     ASN1_OBJECT *obj = NULL;
     269             :     ASN1_OCTET_STRING *oct = NULL;
     270             :     X509_EXTENSION *extension = NULL;
     271           0 :     if (!(obj = OBJ_txt2obj(ext, 0))) {
     272           0 :         X509V3err(X509V3_F_V3_GENERIC_EXTENSION,
     273             :                   X509V3_R_EXTENSION_NAME_ERROR);
     274           0 :         ERR_add_error_data(2, "name=", ext);
     275           0 :         goto err;
     276             :     }
     277             : 
     278           0 :     if (gen_type == 1)
     279           0 :         ext_der = string_to_hex(value, &ext_len);
     280           0 :     else if (gen_type == 2)
     281           0 :         ext_der = generic_asn1(value, ctx, &ext_len);
     282             : 
     283           0 :     if (ext_der == NULL) {
     284           0 :         X509V3err(X509V3_F_V3_GENERIC_EXTENSION,
     285             :                   X509V3_R_EXTENSION_VALUE_ERROR);
     286           0 :         ERR_add_error_data(2, "value=", value);
     287           0 :         goto err;
     288             :     }
     289             : 
     290           0 :     if (!(oct = M_ASN1_OCTET_STRING_new())) {
     291           0 :         X509V3err(X509V3_F_V3_GENERIC_EXTENSION, ERR_R_MALLOC_FAILURE);
     292           0 :         goto err;
     293             :     }
     294             : 
     295           0 :     oct->data = ext_der;
     296           0 :     oct->length = ext_len;
     297             :     ext_der = NULL;
     298             : 
     299           0 :     extension = X509_EXTENSION_create_by_OBJ(NULL, obj, crit, oct);
     300             : 
     301             :  err:
     302           0 :     ASN1_OBJECT_free(obj);
     303           0 :     M_ASN1_OCTET_STRING_free(oct);
     304           0 :     if (ext_der)
     305           0 :         OPENSSL_free(ext_der);
     306           0 :     return extension;
     307             : 
     308             : }
     309             : 
     310           0 : static unsigned char *generic_asn1(char *value, X509V3_CTX *ctx,
     311             :                                    long *ext_len)
     312             : {
     313             :     ASN1_TYPE *typ;
     314           0 :     unsigned char *ext_der = NULL;
     315           0 :     typ = ASN1_generate_v3(value, ctx);
     316           0 :     if (typ == NULL)
     317             :         return NULL;
     318           0 :     *ext_len = i2d_ASN1_TYPE(typ, &ext_der);
     319           0 :     ASN1_TYPE_free(typ);
     320           0 :     return ext_der;
     321             : }
     322             : 
     323             : /*
     324             :  * This is the main function: add a bunch of extensions based on a config
     325             :  * file section to an extension STACK.
     326             :  */
     327             : 
     328           0 : int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, char *section,
     329             :                             STACK_OF(X509_EXTENSION) **sk)
     330             : {
     331             :     X509_EXTENSION *ext;
     332             :     STACK_OF(CONF_VALUE) *nval;
     333             :     CONF_VALUE *val;
     334             :     int i;
     335           0 :     if (!(nval = NCONF_get_section(conf, section)))
     336             :         return 0;
     337           0 :     for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
     338           0 :         val = sk_CONF_VALUE_value(nval, i);
     339           0 :         if (!(ext = X509V3_EXT_nconf(conf, ctx, val->name, val->value)))
     340             :             return 0;
     341           0 :         if (sk)
     342           0 :             X509v3_add_ext(sk, ext, -1);
     343           0 :         X509_EXTENSION_free(ext);
     344             :     }
     345             :     return 1;
     346             : }
     347             : 
     348             : /*
     349             :  * Convenience functions to add extensions to a certificate, CRL and request
     350             :  */
     351             : 
     352           0 : int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section,
     353             :                          X509 *cert)
     354             : {
     355             :     STACK_OF(X509_EXTENSION) **sk = NULL;
     356           0 :     if (cert)
     357           0 :         sk = &cert->cert_info->extensions;
     358           0 :     return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
     359             : }
     360             : 
     361             : /* Same as above but for a CRL */
     362             : 
     363           0 : int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section,
     364             :                              X509_CRL *crl)
     365             : {
     366             :     STACK_OF(X509_EXTENSION) **sk = NULL;
     367           0 :     if (crl)
     368           0 :         sk = &crl->crl->extensions;
     369           0 :     return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
     370             : }
     371             : 
     372             : /* Add extensions to certificate request */
     373             : 
     374           0 : int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section,
     375             :                              X509_REQ *req)
     376             : {
     377           0 :     STACK_OF(X509_EXTENSION) *extlist = NULL, **sk = NULL;
     378             :     int i;
     379           0 :     if (req)
     380             :         sk = &extlist;
     381           0 :     i = X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
     382           0 :     if (!i || !sk)
     383             :         return i;
     384           0 :     i = X509_REQ_add_extensions(req, extlist);
     385           0 :     sk_X509_EXTENSION_pop_free(extlist, X509_EXTENSION_free);
     386           0 :     return i;
     387             : }
     388             : 
     389             : /* Config database functions */
     390             : 
     391           0 : char *X509V3_get_string(X509V3_CTX *ctx, char *name, char *section)
     392             : {
     393           0 :     if (!ctx->db || !ctx->db_meth || !ctx->db_meth->get_string) {
     394           0 :         X509V3err(X509V3_F_X509V3_GET_STRING, X509V3_R_OPERATION_NOT_DEFINED);
     395           0 :         return NULL;
     396             :     }
     397           0 :     if (ctx->db_meth->get_string)
     398           0 :         return ctx->db_meth->get_string(ctx->db, name, section);
     399             :     return NULL;
     400             : }
     401             : 
     402           0 : STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, char *section)
     403             : {
     404           0 :     if (!ctx->db || !ctx->db_meth || !ctx->db_meth->get_section) {
     405           0 :         X509V3err(X509V3_F_X509V3_GET_SECTION,
     406             :                   X509V3_R_OPERATION_NOT_DEFINED);
     407           0 :         return NULL;
     408             :     }
     409           0 :     if (ctx->db_meth->get_section)
     410           0 :         return ctx->db_meth->get_section(ctx->db, section);
     411             :     return NULL;
     412             : }
     413             : 
     414           0 : void X509V3_string_free(X509V3_CTX *ctx, char *str)
     415             : {
     416           0 :     if (!str)
     417           0 :         return;
     418           0 :     if (ctx->db_meth->free_string)
     419           0 :         ctx->db_meth->free_string(ctx->db, str);
     420             : }
     421             : 
     422           0 : void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section)
     423             : {
     424           0 :     if (!section)
     425           0 :         return;
     426           0 :     if (ctx->db_meth->free_section)
     427           0 :         ctx->db_meth->free_section(ctx->db, section);
     428             : }
     429             : 
     430           0 : static char *nconf_get_string(void *db, char *section, char *value)
     431             : {
     432           0 :     return NCONF_get_string(db, section, value);
     433             : }
     434             : 
     435           0 : static STACK_OF(CONF_VALUE) *nconf_get_section(void *db, char *section)
     436             : {
     437           0 :     return NCONF_get_section(db, section);
     438             : }
     439             : 
     440             : static X509V3_CONF_METHOD nconf_method = {
     441             :     nconf_get_string,
     442             :     nconf_get_section,
     443             :     NULL,
     444             :     NULL
     445             : };
     446             : 
     447           0 : void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf)
     448             : {
     449           0 :     ctx->db_meth = &nconf_method;
     450           0 :     ctx->db = conf;
     451           0 : }
     452             : 
     453           0 : void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subj, X509_REQ *req,
     454             :                     X509_CRL *crl, int flags)
     455             : {
     456           0 :     ctx->issuer_cert = issuer;
     457           0 :     ctx->subject_cert = subj;
     458           0 :     ctx->crl = crl;
     459           0 :     ctx->subject_req = req;
     460           0 :     ctx->flags = flags;
     461           0 : }
     462             : 
     463             : /* Old conf compatibility functions */
     464             : 
     465           0 : X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
     466             :                                 char *name, char *value)
     467             : {
     468             :     CONF ctmp;
     469           0 :     CONF_set_nconf(&ctmp, conf);
     470           0 :     return X509V3_EXT_nconf(&ctmp, ctx, name, value);
     471             : }
     472             : 
     473             : /* LHASH *conf:  Config file    */
     474             : /* char *value:  Value    */
     475           0 : X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf,
     476             :                                     X509V3_CTX *ctx, int ext_nid, char *value)
     477             : {
     478             :     CONF ctmp;
     479           0 :     CONF_set_nconf(&ctmp, conf);
     480           0 :     return X509V3_EXT_nconf_nid(&ctmp, ctx, ext_nid, value);
     481             : }
     482             : 
     483           0 : static char *conf_lhash_get_string(void *db, char *section, char *value)
     484             : {
     485           0 :     return CONF_get_string(db, section, value);
     486             : }
     487             : 
     488           0 : static STACK_OF(CONF_VALUE) *conf_lhash_get_section(void *db, char *section)
     489             : {
     490           0 :     return CONF_get_section(db, section);
     491             : }
     492             : 
     493             : static X509V3_CONF_METHOD conf_lhash_method = {
     494             :     conf_lhash_get_string,
     495             :     conf_lhash_get_section,
     496             :     NULL,
     497             :     NULL
     498             : };
     499             : 
     500           0 : void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash)
     501             : {
     502           0 :     ctx->db_meth = &conf_lhash_method;
     503           0 :     ctx->db = lhash;
     504           0 : }
     505             : 
     506           0 : int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
     507             :                         char *section, X509 *cert)
     508             : {
     509             :     CONF ctmp;
     510           0 :     CONF_set_nconf(&ctmp, conf);
     511           0 :     return X509V3_EXT_add_nconf(&ctmp, ctx, section, cert);
     512             : }
     513             : 
     514             : /* Same as above but for a CRL */
     515             : 
     516           0 : int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
     517             :                             char *section, X509_CRL *crl)
     518             : {
     519             :     CONF ctmp;
     520           0 :     CONF_set_nconf(&ctmp, conf);
     521           0 :     return X509V3_EXT_CRL_add_nconf(&ctmp, ctx, section, crl);
     522             : }
     523             : 
     524             : /* Add extensions to certificate request */
     525             : 
     526           0 : int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
     527             :                             char *section, X509_REQ *req)
     528             : {
     529             :     CONF ctmp;
     530           0 :     CONF_set_nconf(&ctmp, conf);
     531           0 :     return X509V3_EXT_REQ_add_nconf(&ctmp, ctx, section, req);
     532             : }

Generated by: LCOV version 1.10