1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* v3_alt.c */
2e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1999-2003 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
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/conf.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509v3.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p);
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens);
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_othername(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx);
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_dirname(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx);
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst X509V3_EXT_METHOD v3_alt[] = {
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ NID_subject_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES),
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0,0,0,0,
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0,0,
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project(X509V3_EXT_I2V)i2v_GENERAL_NAMES,
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project(X509V3_EXT_V2I)v2i_subject_alt,
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectNULL, NULL, NULL},
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ NID_issuer_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES),
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0,0,0,0,
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0,0,
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project(X509V3_EXT_I2V)i2v_GENERAL_NAMES,
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project(X509V3_EXT_V2I)v2i_issuer_alt,
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectNULL, NULL, NULL},
85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ NID_certificate_issuer, 0, ASN1_ITEM_ref(GENERAL_NAMES),
87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom0,0,0,0,
88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom0,0,
89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom(X509V3_EXT_I2V)i2v_GENERAL_NAMES,
90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromNULL, NULL, NULL, NULL},
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method,
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		GENERAL_NAMES *gens, STACK_OF(CONF_VALUE) *ret)
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAME *gen;
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen = sk_GENERAL_NAME_value(gens, i);
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret = i2v_GENERAL_NAME(method, gen, ret);
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!ret) return sk_CONF_VALUE_new_null();
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method,
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret)
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *p;
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char oline[256], htmp[5];
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch (gen->type)
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_OTHERNAME:
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value("othername","<unsupported>", &ret);
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_X400:
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value("X400Name","<unsupported>", &ret);
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_EDIPARTY:
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value("EdiPartyName","<unsupported>", &ret);
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_EMAIL:
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value_uchar("email",gen->d.ia5->data, &ret);
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_DNS:
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value_uchar("DNS",gen->d.ia5->data, &ret);
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_URI:
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value_uchar("URI",gen->d.ia5->data, &ret);
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_DIRNAME:
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_NAME_oneline(gen->d.dirn, oline, 256);
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value("DirName",oline, &ret);
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_IPADD:
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p = gen->d.ip->data;
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(gen->d.ip->length == 4)
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_snprintf(oline, sizeof oline,
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				     "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if(gen->d.ip->length == 16)
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			oline[0] = 0;
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (i = 0; i < 8; i++)
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_snprintf(htmp, sizeof htmp,
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					     "%X", p[0] << 8 | p[1]);
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				p += 2;
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				strcat(oline, htmp);
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (i != 7)
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					strcat(oline, ":");
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509V3_add_value("IP Address","<invalid>", &ret);
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value("IP Address",oline, &ret);
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_RID:
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i2t_ASN1_OBJECT(oline, 256, gen->d.rid);
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value("Registered ID",oline, &ret);
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen)
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *p;
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch (gen->type)
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_OTHERNAME:
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(out, "othername:<unsupported>");
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_X400:
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(out, "X400Name:<unsupported>");
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_EDIPARTY:
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Maybe fix this: it is supported now */
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(out, "EdiPartyName:<unsupported>");
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_EMAIL:
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(out, "email:%s",gen->d.ia5->data);
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_DNS:
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(out, "DNS:%s",gen->d.ia5->data);
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_URI:
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(out, "URI:%s",gen->d.ia5->data);
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_DIRNAME:
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(out, "DirName: ");
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_NAME_print_ex(out, gen->d.dirn, 0, XN_FLAG_ONELINE);
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_IPADD:
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p = gen->d.ip->data;
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(gen->d.ip->length == 4)
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(out, "IP Address:%d.%d.%d.%d",
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						p[0], p[1], p[2], p[3]);
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if(gen->d.ip->length == 16)
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(out, "IP Address");
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (i = 0; i < 8; i++)
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(out, ":%X", p[0] << 8 | p[1]);
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				p += 2;
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_puts(out, "\n");
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(out,"IP Address:<invalid>");
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case GEN_RID:
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(out, "Registered ID");
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i2a_ASN1_OBJECT(out, gen->d.rid);
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method,
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAMES *gens = NULL;
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_VALUE *cnf;
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(gens = sk_GENERAL_NAME_new_null())) {
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_V2I_ISSUER_ALT,ERR_R_MALLOC_FAILURE);
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(i = 0; i < sk_CONF_VALUE_num(nval); i++) {
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cnf = sk_CONF_VALUE_value(nval, i);
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!name_cmp(cnf->name, "issuer") && cnf->value &&
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						!strcmp(cnf->value, "copy")) {
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!copy_issuer(ctx, gens)) goto err;
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		} else {
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			GENERAL_NAME *gen;
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf)))
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project								 goto err;
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sk_GENERAL_NAME_push(gens, gen);
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return gens;
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Append subject altname of issuer to issuer alt name of subject */
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens)
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAMES *ialt;
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAME *gen;
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_EXTENSION *ext;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ctx && (ctx->flags == CTX_TEST)) return 1;
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!ctx || !ctx->issuer_cert) {
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_COPY_ISSUER,X509V3_R_NO_ISSUER_DETAILS);
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        i = X509_get_ext_by_NID(ctx->issuer_cert, NID_subject_alt_name, -1);
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(i < 0) return 1;
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if(!(ext = X509_get_ext(ctx->issuer_cert, i)) ||
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        !(ialt = X509V3_EXT_d2i(ext)) ) {
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_COPY_ISSUER,X509V3_R_ISSUER_DECODE_ERROR);
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(i = 0; i < sk_GENERAL_NAME_num(ialt); i++) {
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen = sk_GENERAL_NAME_value(ialt, i);
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!sk_GENERAL_NAME_push(gens, gen)) {
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509V3err(X509V3_F_COPY_ISSUER,ERR_R_MALLOC_FAILURE);
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sk_GENERAL_NAME_free(ialt);
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method,
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAMES *gens = NULL;
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_VALUE *cnf;
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(gens = sk_GENERAL_NAME_new_null())) {
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_V2I_SUBJECT_ALT,ERR_R_MALLOC_FAILURE);
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(i = 0; i < sk_CONF_VALUE_num(nval); i++) {
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cnf = sk_CONF_VALUE_value(nval, i);
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!name_cmp(cnf->name, "email") && cnf->value &&
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						!strcmp(cnf->value, "copy")) {
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!copy_email(ctx, gens, 0)) goto err;
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		} else if(!name_cmp(cnf->name, "email") && cnf->value &&
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						!strcmp(cnf->value, "move")) {
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!copy_email(ctx, gens, 1)) goto err;
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		} else {
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			GENERAL_NAME *gen;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf)))
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project								 goto err;
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sk_GENERAL_NAME_push(gens, gen);
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return gens;
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copy any email addresses in a certificate or request to
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * GENERAL_NAMES
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p)
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_NAME *nm;
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_IA5STRING *email = NULL;
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_NAME_ENTRY *ne;
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAME *gen = NULL;
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ctx != NULL && ctx->flags == CTX_TEST)
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!ctx || (!ctx->subject_cert && !ctx->subject_req)) {
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_COPY_EMAIL,X509V3_R_NO_SUBJECT_DETAILS);
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Find the subject name */
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ctx->subject_cert) nm = X509_get_subject_name(ctx->subject_cert);
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else nm = X509_REQ_get_subject_name(ctx->subject_req);
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Now add any email address(es) to STACK */
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = -1;
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while((i = X509_NAME_get_index_by_NID(nm,
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					 NID_pkcs9_emailAddress, i)) >= 0) {
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ne = X509_NAME_get_entry(nm, i);
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		email = M_ASN1_IA5STRING_dup(X509_NAME_ENTRY_get_data(ne));
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                if (move_p)
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        {
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        X509_NAME_delete_entry(nm, i);
36998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			X509_NAME_ENTRY_free(ne);
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        i--;
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        }
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!email || !(gen = GENERAL_NAME_new())) {
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509V3err(X509V3_F_COPY_EMAIL,ERR_R_MALLOC_FAILURE);
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen->d.ia5 = email;
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		email = NULL;
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen->type = GEN_EMAIL;
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!sk_GENERAL_NAME_push(gens, gen)) {
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509V3err(X509V3_F_COPY_EMAIL,ERR_R_MALLOC_FAILURE);
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen = NULL;
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAME_free(gen);
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	M_ASN1_IA5STRING_free(email);
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromGENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method,
397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAME *gen;
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAMES *gens = NULL;
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_VALUE *cnf;
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(gens = sk_GENERAL_NAME_new_null())) {
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE);
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(i = 0; i < sk_CONF_VALUE_num(nval); i++) {
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cnf = sk_CONF_VALUE_value(nval, i);
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) goto err;
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sk_GENERAL_NAME_push(gens, gen);
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return gens;
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
418221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromGENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
419221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			       CONF_VALUE *cnf)
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return v2i_GENERAL_NAME_ex(NULL, method, ctx, cnf, 0);
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromGENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out,
425221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			       const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			       int gen_type, char *value, int is_nc)
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char is_string = 0;
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAME *gen = NULL;
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!value)
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_MISSING_VALUE);
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (out)
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen = out;
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen = GENERAL_NAME_new();
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(gen == NULL)
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			X509V3err(X509V3_F_A2I_GENERAL_NAME,ERR_R_MALLOC_FAILURE);
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return NULL;
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	switch (gen_type)
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		case GEN_URI:
452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		case GEN_EMAIL:
453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		case GEN_DNS:
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		is_string = 1;
455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		break;
456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		case GEN_RID:
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_OBJECT *obj;
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!(obj = OBJ_txt2obj(value,0)))
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_BAD_OBJECT);
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_add_error_data(2, "value=", value);
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen->d.rid = obj;
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		break;
469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		case GEN_IPADD:
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (is_nc)
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			gen->d.ip = a2i_IPADDRESS_NC(value);
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			gen->d.ip = a2i_IPADDRESS(value);
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(gen->d.ip == NULL)
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_BAD_IP_ADDRESS);
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_add_error_data(2, "value=", value);
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		break;
482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		case GEN_DIRNAME:
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!do_dirname(gen, value, ctx))
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_DIRNAME_ERROR);
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		break;
490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		case GEN_OTHERNAME:
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!do_othername(gen, value, ctx))
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_OTHERNAME_ERROR);
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		break;
498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		default:
499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_UNSUPPORTED_TYPE);
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(is_string)
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!(gen->d.ia5 = M_ASN1_IA5STRING_new()) ||
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			      !ASN1_STRING_set(gen->d.ia5, (unsigned char*)value,
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					       strlen(value)))
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			X509V3err(X509V3_F_A2I_GENERAL_NAME,ERR_R_MALLOC_FAILURE);
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	gen->type = gen_type;
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return gen;
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
519e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (!out)
520e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		GENERAL_NAME_free(gen);
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromGENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out,
525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				  const X509V3_EXT_METHOD *method,
526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				  X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc)
527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int type;
529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	char *name, *value;
531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	name = cnf->name;
533221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	value = cnf->value;
534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(!value)
536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_MISSING_VALUE);
538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return NULL;
539221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(!name_cmp(name, "email"))
542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		type = GEN_EMAIL;
543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else if(!name_cmp(name, "URI"))
544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		type = GEN_URI;
545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else if(!name_cmp(name, "DNS"))
546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		type = GEN_DNS;
547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else if(!name_cmp(name, "RID"))
548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		type = GEN_RID;
549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else if(!name_cmp(name, "IP"))
550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		type = GEN_IPADD;
551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else if(!name_cmp(name, "dirName"))
552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		type = GEN_DIRNAME;
553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else if(!name_cmp(name, "otherName"))
554221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		type = GEN_OTHERNAME;
555221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else
556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
557221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_UNSUPPORTED_OPTION);
558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ERR_add_error_data(2, "name=", name);
559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return NULL;
560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
561221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
562221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc);
563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_othername(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx)
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *objtmp = NULL, *p;
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int objlen;
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(p = strchr(value, ';')))
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(gen->d.otherName = OTHERNAME_new()))
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Free this up because we will overwrite it.
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * no need to free type_id because it is static
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_TYPE_free(gen->d.otherName->value);
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(gen->d.otherName->value = ASN1_generate_v3(p + 1, ctx)))
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	objlen = p - value;
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	objtmp = OPENSSL_malloc(objlen + 1);
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	strncpy(objtmp, value, objlen);
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	objtmp[objlen] = 0;
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	gen->d.otherName->type_id = OBJ_txt2obj(objtmp, 0);
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(objtmp);
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!gen->d.otherName->type_id)
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_dirname(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx)
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(CONF_VALUE) *sk;
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_NAME *nm;
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(nm = X509_NAME_new()))
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sk = X509V3_get_section(ctx, value);
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!sk)
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_DO_DIRNAME,X509V3_R_SECTION_NOT_FOUND);
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_add_error_data(2, "section=", value);
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_NAME_free(nm);
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* FIXME: should allow other character types... */
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = X509V3_NAME_from_section(nm, sk, MBSTRING_ASC);
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ret)
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_NAME_free(nm);
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	gen->d.dirn = nm;
61198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	X509V3_section_free(ctx, sk);
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
615