1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* v3_conf.c */
2e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project 1999.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1999-2002 The OpenSSL Project.  All rights reserved.
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the documentation and/or other materials provided with the
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    distribution.
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    software must display the following acknowledgment:
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    endorse or promote products derived from this software without
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prior written permission. For written permission, please contact
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    licensing@OpenSSL.org.
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL"
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    nor may "OpenSSL" appear in their names without prior written
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    permission of the OpenSSL Project.
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    acknowledgment:
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE.
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ====================================================================
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com).  This product includes software written by Tim
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com).
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* extension creation utilities */
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <ctype.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/conf.h>
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h>
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509v3.h>
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int v3_check_critical(char **value);
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int v3_check_generic(char **value);
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid, int crit, char *value);
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic X509_EXTENSION *v3_generic_extension(const char *ext, char *value, int crit, int type, X509V3_CTX *ctx);
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *conf_lhash_get_string(void *db, char *section, char *value);
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STACK_OF(CONF_VALUE) *conf_lhash_get_section(void *db, char *section);
75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method, int ext_nid,
76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				  int crit, void *ext_struc);
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned char *generic_asn1(char *value, X509V3_CTX *ctx, long *ext_len);
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* CONF *conf:  Config file    */
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* char *name:  Name    */
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* char *value:  Value    */
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, char *name,
82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 char *value)
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int crit;
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ext_type;
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_EXTENSION *ret;
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	crit = v3_check_critical(&value);
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((ext_type = v3_check_generic(&value)))
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return v3_generic_extension(name, value, crit, ext_type, ctx);
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = do_ext_nconf(conf, ctx, OBJ_sn2nid(name), crit, value);
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ret)
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_X509V3_EXT_NCONF,X509V3_R_ERROR_IN_EXTENSION);
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_add_error_data(4,"name=", name, ", value=", value);
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* CONF *conf:  Config file    */
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* char *value:  Value    */
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid,
102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				     char *value)
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int crit;
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ext_type;
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	crit = v3_check_critical(&value);
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((ext_type = v3_check_generic(&value)))
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return v3_generic_extension(OBJ_nid2sn(ext_nid),
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						 value, crit, ext_type, ctx);
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return do_ext_nconf(conf, ctx, ext_nid, crit, value);
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* CONF *conf:  Config file    */
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* char *value:  Value    */
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid,
116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				    int crit, char *value)
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const X509V3_EXT_METHOD *method;
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_EXTENSION *ext;
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(CONF_VALUE) *nval;
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *ext_struc;
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ext_nid == NID_undef)
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_DO_EXT_NCONF,X509V3_R_UNKNOWN_EXTENSION_NAME);
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(method = X509V3_EXT_get_nid(ext_nid)))
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_DO_EXT_NCONF,X509V3_R_UNKNOWN_EXTENSION);
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Now get internal extension representation based on type */
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (method->v2i)
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(*value == '@') nval = NCONF_get_section(conf, value + 1);
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else nval = X509V3_parse_list(value);
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(sk_CONF_VALUE_num(nval) <= 0)
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509V3err(X509V3_F_DO_EXT_NCONF,X509V3_R_INVALID_EXTENSION_STRING);
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_add_error_data(4, "name=", OBJ_nid2sn(ext_nid), ",section=", value);
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return NULL;
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ext_struc = method->v2i(method, ctx, nval);
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(*value != '@') sk_CONF_VALUE_pop_free(nval,
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project							 X509V3_conf_free);
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!ext_struc) return NULL;
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if(method->s2i)
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!(ext_struc = method->s2i(method, ctx, value))) return NULL;
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if(method->r2i)
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!ctx->db || !ctx->db_meth)
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509V3err(X509V3_F_DO_EXT_NCONF,X509V3_R_NO_CONFIG_DATABASE);
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return NULL;
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!(ext_struc = method->r2i(method, ctx, value))) return NULL;
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_DO_EXT_NCONF,X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED);
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_add_error_data(2, "name=", OBJ_nid2sn(ext_nid));
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ext  = do_ext_i2d(method, ext_nid, crit, ext_struc);
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(method->it) ASN1_item_free(ext_struc, ASN1_ITEM_ptr(method->it));
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else method->ext_free(ext_struc);
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ext;
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method, int ext_nid,
176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				  int crit, void *ext_struc)
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *ext_der;
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ext_len;
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OCTET_STRING *ext_oct;
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_EXTENSION *ext;
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Convert internal representation to DER */
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (method->it)
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ext_der = NULL;
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ext_len = ASN1_item_i2d(ext_struc, &ext_der, ASN1_ITEM_ptr(method->it));
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ext_len < 0) goto merr;
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 else
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		unsigned char *p;
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ext_len = method->i2d(ext_struc, NULL);
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!(ext_der = OPENSSL_malloc(ext_len))) goto merr;
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p = ext_der;
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		method->i2d(ext_struc, &p);
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(ext_oct = M_ASN1_OCTET_STRING_new())) goto merr;
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ext_oct->data = ext_der;
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ext_oct->length = ext_len;
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ext = X509_EXTENSION_create_by_NID(NULL, ext_nid, crit, ext_oct);
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ext) goto merr;
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	M_ASN1_OCTET_STRING_free(ext_oct);
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ext;
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	merr:
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509V3err(X509V3_F_DO_EXT_I2D,ERR_R_MALLOC_FAILURE);
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Given an internal structure, nid and critical flag create an extension */
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc)
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const X509V3_EXT_METHOD *method;
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(method = X509V3_EXT_get_nid(ext_nid))) {
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_X509V3_EXT_I2D,X509V3_R_UNKNOWN_EXTENSION);
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return do_ext_i2d(method, ext_nid, crit, ext_struc);
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Check the extension string for critical flag */
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int v3_check_critical(char **value)
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p = *value;
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((strlen(p) < 9) || strncmp(p, "critical,", 9)) return 0;
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p+=9;
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while(isspace((unsigned char)*p)) p++;
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*value = p;
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Check extension string for generic extension and return the type */
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int v3_check_generic(char **value)
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int gen_type = 0;
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p = *value;
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((strlen(p) >= 4) && !strncmp(p, "DER:", 4))
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p+=4;
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen_type = 1;
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if ((strlen(p) >= 5) && !strncmp(p, "ASN1:", 5))
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p+=5;
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen_type = 2;
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (isspace((unsigned char)*p)) p++;
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*value = p;
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return gen_type;
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Create a generic extension: for now just handle DER type */
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic X509_EXTENSION *v3_generic_extension(const char *ext, char *value,
261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					    int crit, int gen_type,
262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					    X509V3_CTX *ctx)
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *ext_der=NULL;
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long ext_len;
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT *obj=NULL;
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OCTET_STRING *oct=NULL;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_EXTENSION *extension=NULL;
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(obj = OBJ_txt2obj(ext, 0)))
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_V3_GENERIC_EXTENSION,X509V3_R_EXTENSION_NAME_ERROR);
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_add_error_data(2, "name=", ext);
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (gen_type == 1)
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ext_der = string_to_hex(value, &ext_len);
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (gen_type == 2)
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ext_der = generic_asn1(value, ctx, &ext_len);
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ext_der == NULL)
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_V3_GENERIC_EXTENSION,X509V3_R_EXTENSION_VALUE_ERROR);
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_add_error_data(2, "value=", value);
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(oct = M_ASN1_OCTET_STRING_new()))
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_V3_GENERIC_EXTENSION,ERR_R_MALLOC_FAILURE);
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	oct->data = ext_der;
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	oct->length = ext_len;
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ext_der = NULL;
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	extension = X509_EXTENSION_create_by_OBJ(NULL, obj, crit, oct);
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT_free(obj);
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	M_ASN1_OCTET_STRING_free(oct);
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ext_der) OPENSSL_free(ext_der);
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return extension;
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned char *generic_asn1(char *value, X509V3_CTX *ctx, long *ext_len)
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_TYPE *typ;
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *ext_der = NULL;
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	typ = ASN1_generate_v3(value, ctx);
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (typ == NULL)
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*ext_len = i2d_ASN1_TYPE(typ, &ext_der);
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_TYPE_free(typ);
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ext_der;
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This is the main function: add a bunch of extensions based on a config file
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * section to an extension STACK.
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, char *section,
326221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			    STACK_OF(X509_EXTENSION) **sk)
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_EXTENSION *ext;
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(CONF_VALUE) *nval;
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_VALUE *val;
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(nval = NCONF_get_section(conf, section))) return 0;
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i = 0; i < sk_CONF_VALUE_num(nval); i++)
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		val = sk_CONF_VALUE_value(nval, i);
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!(ext = X509V3_EXT_nconf(conf, ctx, val->name, val->value)))
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project								return 0;
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (sk) X509v3_add_ext(sk, ext, -1);
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_EXTENSION_free(ext);
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Convenience functions to add extensions to a certificate, CRL and request */
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section,
347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			 X509 *cert)
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(X509_EXTENSION) **sk = NULL;
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cert)
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sk = &cert->cert_info->extensions;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Same as above but for a CRL */
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section,
358221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			     X509_CRL *crl)
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(X509_EXTENSION) **sk = NULL;
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (crl)
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sk = &crl->crl->extensions;
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Add extensions to certificate request */
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section,
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     X509_REQ *req)
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(X509_EXTENSION) *extlist = NULL, **sk = NULL;
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (req)
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sk = &extlist;
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!i || !sk)
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return i;
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = X509_REQ_add_extensions(req, extlist);
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sk_X509_EXTENSION_pop_free(extlist, X509_EXTENSION_free);
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return i;
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Config database functions */
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar * X509V3_get_string(X509V3_CTX *ctx, char *name, char *section)
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!ctx->db || !ctx->db_meth || !ctx->db_meth->get_string)
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_X509V3_GET_STRING,X509V3_R_OPERATION_NOT_DEFINED);
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->db_meth->get_string)
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return ctx->db_meth->get_string(ctx->db, name, section);
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTACK_OF(CONF_VALUE) * X509V3_get_section(X509V3_CTX *ctx, char *section)
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!ctx->db || !ctx->db_meth || !ctx->db_meth->get_section)
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_X509V3_GET_SECTION,X509V3_R_OPERATION_NOT_DEFINED);
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->db_meth->get_section)
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return ctx->db_meth->get_section(ctx->db, section);
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509V3_string_free(X509V3_CTX *ctx, char *str)
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!str) return;
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->db_meth->free_string)
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ctx->db_meth->free_string(ctx->db, str);
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section)
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!section) return;
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->db_meth->free_section)
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ctx->db_meth->free_section(ctx->db, section);
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *nconf_get_string(void *db, char *section, char *value)
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NCONF_get_string(db, section, value);
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STACK_OF(CONF_VALUE) *nconf_get_section(void *db, char *section)
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NCONF_get_section(db, section);
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic X509V3_CONF_METHOD nconf_method = {
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectnconf_get_string,
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectnconf_get_section,
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectNULL,
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectNULL
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf)
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->db_meth = &nconf_method;
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->db = conf;
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subj, X509_REQ *req,
447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		    X509_CRL *crl, int flags)
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->issuer_cert = issuer;
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->subject_cert = subj;
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->crl = crl;
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->subject_req = req;
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->flags = flags;
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Old conf compatibility functions */
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromX509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				char *name, char *value)
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF ctmp;
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_set_nconf(&ctmp, conf);
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return X509V3_EXT_nconf(&ctmp, ctx, name, value);
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* LHASH *conf:  Config file    */
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* char *value:  Value    */
468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromX509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				    int ext_nid, char *value)
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF ctmp;
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_set_nconf(&ctmp, conf);
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return X509V3_EXT_nconf_nid(&ctmp, ctx, ext_nid, value);
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *conf_lhash_get_string(void *db, char *section, char *value)
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return CONF_get_string(db, section, value);
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STACK_OF(CONF_VALUE) *conf_lhash_get_section(void *db, char *section)
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return CONF_get_section(db, section);
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic X509V3_CONF_METHOD conf_lhash_method = {
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconf_lhash_get_string,
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconf_lhash_get_section,
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectNULL,
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectNULL
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash)
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->db_meth = &conf_lhash_method;
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->db = lhash;
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			char *section, X509 *cert)
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF ctmp;
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_set_nconf(&ctmp, conf);
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return X509V3_EXT_add_nconf(&ctmp, ctx, section, cert);
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Same as above but for a CRL */
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			    char *section, X509_CRL *crl)
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF ctmp;
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_set_nconf(&ctmp, conf);
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return X509V3_EXT_CRL_add_nconf(&ctmp, ctx, section, crl);
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Add extensions to certificate request */
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			    char *section, X509_REQ *req)
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF ctmp;
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_set_nconf(&ctmp, conf);
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return X509V3_EXT_REQ_add_nconf(&ctmp, ctx, section, req);
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
526