1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* v3_alt.c */
2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * project.
4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* ====================================================================
6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright (c) 1999-2003 The OpenSSL Project.  All rights reserved.
7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without
9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions
10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met:
11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the above copyright
13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    notice, this list of conditions and the following disclaimer.
14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright
16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    notice, this list of conditions and the following disclaimer in
17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    the documentation and/or other materials provided with the
18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    distribution.
19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this
21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    software must display the following acknowledgment:
22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    "This product includes software developed by the OpenSSL Project
23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    endorse or promote products derived from this software without
27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    prior written permission. For written permission, please contact
28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    licensing@OpenSSL.org.
29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 5. Products derived from this software may not be called "OpenSSL"
31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    nor may "OpenSSL" appear in their names without prior written
32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    permission of the OpenSSL Project.
33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 6. Redistributions of any form whatsoever must retain the following
35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    acknowledgment:
36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    "This product includes software developed by the OpenSSL Project
37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OF THE POSSIBILITY OF SUCH DAMAGE.
51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ====================================================================
52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This product includes cryptographic software written by Eric Young
54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * (eay@cryptsoft.com).  This product includes software written by Tim
55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Hudson (tjh@cryptsoft.com).
56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h>
60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "cryptlib.h"
61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/conf.h>
62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/x509v3.h>
63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p);
67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens);
68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int do_othername(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx);
69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int do_dirname(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx);
70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgconst X509V3_EXT_METHOD v3_alt[] = {
72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{ NID_subject_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES),
73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org0,0,0,0,
74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org0,0,
75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org(X509V3_EXT_I2V)i2v_GENERAL_NAMES,
76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org(X509V3_EXT_V2I)v2i_subject_alt,
77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgNULL, NULL, NULL},
78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{ NID_issuer_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES),
80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org0,0,0,0,
81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org0,0,
82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org(X509V3_EXT_I2V)i2v_GENERAL_NAMES,
83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org(X509V3_EXT_V2I)v2i_issuer_alt,
84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgNULL, NULL, NULL},
85480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
86480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org{ NID_certificate_issuer, 0, ASN1_ITEM_ref(GENERAL_NAMES),
87480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org0,0,0,0,
88480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org0,0,
89480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org(X509V3_EXT_I2V)i2v_GENERAL_NAMES,
90480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgNULL, NULL, NULL, NULL},
91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org};
92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgSTACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method,
94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		GENERAL_NAMES *gens, STACK_OF(CONF_VALUE) *ret)
95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAME *gen;
98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for(i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		gen = sk_GENERAL_NAME_value(gens, i);
100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ret = i2v_GENERAL_NAME(method, gen, ret);
101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!ret) return sk_CONF_VALUE_new_null();
103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgSTACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method,
107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret)
108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char *p;
110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char oline[256], htmp[5];
111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	switch (gen->type)
113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_OTHERNAME:
115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value("othername","<unsupported>", &ret);
116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_X400:
119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value("X400Name","<unsupported>", &ret);
120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_EDIPARTY:
123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value("EdiPartyName","<unsupported>", &ret);
124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_EMAIL:
127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value_uchar("email",gen->d.ia5->data, &ret);
128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_DNS:
131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value_uchar("DNS",gen->d.ia5->data, &ret);
132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_URI:
135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value_uchar("URI",gen->d.ia5->data, &ret);
136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_DIRNAME:
139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509_NAME_oneline(gen->d.dirn, oline, 256);
140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value("DirName",oline, &ret);
141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_IPADD:
144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		p = gen->d.ip->data;
145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(gen->d.ip->length == 4)
146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_snprintf(oline, sizeof oline,
147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				     "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if(gen->d.ip->length == 16)
149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			oline[0] = 0;
151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			for (i = 0; i < 8; i++)
152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_snprintf(htmp, sizeof htmp,
154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					     "%X", p[0] << 8 | p[1]);
155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				p += 2;
156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				strcat(oline, htmp);
157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (i != 7)
158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					strcat(oline, ":");
159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509V3_add_value("IP Address","<invalid>", &ret);
164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			break;
165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value("IP Address",oline, &ret);
167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_RID:
170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		i2t_ASN1_OBJECT(oline, 256, gen->d.rid);
171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value("Registered ID",oline, &ret);
172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen)
178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char *p;
180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	switch (gen->type)
182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_OTHERNAME:
184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(out, "othername:<unsupported>");
185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_X400:
188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(out, "X400Name:<unsupported>");
189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_EDIPARTY:
192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Maybe fix this: it is supported now */
193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(out, "EdiPartyName:<unsupported>");
194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_EMAIL:
197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(out, "email:%s",gen->d.ia5->data);
198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_DNS:
201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(out, "DNS:%s",gen->d.ia5->data);
202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_URI:
205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(out, "URI:%s",gen->d.ia5->data);
206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_DIRNAME:
209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(out, "DirName: ");
210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509_NAME_print_ex(out, gen->d.dirn, 0, XN_FLAG_ONELINE);
211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_IPADD:
214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		p = gen->d.ip->data;
215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(gen->d.ip->length == 4)
216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(out, "IP Address:%d.%d.%d.%d",
217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						p[0], p[1], p[2], p[3]);
218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if(gen->d.ip->length == 16)
219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(out, "IP Address");
221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			for (i = 0; i < 8; i++)
222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(out, ":%X", p[0] << 8 | p[1]);
224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				p += 2;
225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_puts(out, "\n");
227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(out,"IP Address:<invalid>");
231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			break;
232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		case GEN_RID:
236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(out, "Registered ID");
237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		i2a_ASN1_OBJECT(out, gen->d.rid);
238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		break;
239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method,
244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAMES *gens = NULL;
247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	CONF_VALUE *cnf;
248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(gens = sk_GENERAL_NAME_new_null())) {
250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_V2I_ISSUER_ALT,ERR_R_MALLOC_FAILURE);
251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for(i = 0; i < sk_CONF_VALUE_num(nval); i++) {
254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		cnf = sk_CONF_VALUE_value(nval, i);
255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!name_cmp(cnf->name, "issuer") && cnf->value &&
256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						!strcmp(cnf->value, "copy")) {
257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if(!copy_issuer(ctx, gens)) goto err;
258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		} else {
259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			GENERAL_NAME *gen;
260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf)))
261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org								 goto err;
262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			sk_GENERAL_NAME_push(gens, gen);
263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return gens;
266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err:
267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return NULL;
269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Append subject altname of issuer to issuer alt name of subject */
272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens)
274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAMES *ialt;
276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAME *gen;
277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_EXTENSION *ext;
278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(ctx && (ctx->flags == CTX_TEST)) return 1;
280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!ctx || !ctx->issuer_cert) {
281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_COPY_ISSUER,X509V3_R_NO_ISSUER_DETAILS);
282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto err;
283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        i = X509_get_ext_by_NID(ctx->issuer_cert, NID_subject_alt_name, -1);
285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(i < 0) return 1;
286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        if(!(ext = X509_get_ext(ctx->issuer_cert, i)) ||
287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                        !(ialt = X509V3_EXT_d2i(ext)) ) {
288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_COPY_ISSUER,X509V3_R_ISSUER_DECODE_ERROR);
289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto err;
290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for(i = 0; i < sk_GENERAL_NAME_num(ialt); i++) {
293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		gen = sk_GENERAL_NAME_value(ialt, i);
294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!sk_GENERAL_NAME_push(gens, gen)) {
295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509V3err(X509V3_F_COPY_ISSUER,ERR_R_MALLOC_FAILURE);
296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto err;
297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	sk_GENERAL_NAME_free(ialt);
300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err:
304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 0;
305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method,
309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAMES *gens = NULL;
312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	CONF_VALUE *cnf;
313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(gens = sk_GENERAL_NAME_new_null())) {
315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_V2I_SUBJECT_ALT,ERR_R_MALLOC_FAILURE);
316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for(i = 0; i < sk_CONF_VALUE_num(nval); i++) {
319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		cnf = sk_CONF_VALUE_value(nval, i);
320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!name_cmp(cnf->name, "email") && cnf->value &&
321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						!strcmp(cnf->value, "copy")) {
322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if(!copy_email(ctx, gens, 0)) goto err;
323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		} else if(!name_cmp(cnf->name, "email") && cnf->value &&
324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						!strcmp(cnf->value, "move")) {
325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if(!copy_email(ctx, gens, 1)) goto err;
326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		} else {
327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			GENERAL_NAME *gen;
328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf)))
329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org								 goto err;
330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			sk_GENERAL_NAME_push(gens, gen);
331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return gens;
334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err:
335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return NULL;
337c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
338c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
339c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Copy any email addresses in a certificate or request to
340c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * GENERAL_NAMES
341c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
342c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
343c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p)
344c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
345c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_NAME *nm;
346c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_IA5STRING *email = NULL;
347c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_NAME_ENTRY *ne;
348c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAME *gen = NULL;
349c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(ctx != NULL && ctx->flags == CTX_TEST)
351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 1;
352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!ctx || (!ctx->subject_cert && !ctx->subject_req)) {
353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_COPY_EMAIL,X509V3_R_NO_SUBJECT_DETAILS);
354c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto err;
355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Find the subject name */
357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(ctx->subject_cert) nm = X509_get_subject_name(ctx->subject_cert);
358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else nm = X509_REQ_get_subject_name(ctx->subject_req);
359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Now add any email address(es) to STACK */
361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	i = -1;
362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	while((i = X509_NAME_get_index_by_NID(nm,
363c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					 NID_pkcs9_emailAddress, i)) >= 0) {
364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ne = X509_NAME_get_entry(nm, i);
365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		email = M_ASN1_IA5STRING_dup(X509_NAME_ENTRY_get_data(ne));
366c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                if (move_p)
367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                        {
368c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                        X509_NAME_delete_entry(nm, i);
369c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509_NAME_ENTRY_free(ne);
370c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                        i--;
371c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                        }
372c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!email || !(gen = GENERAL_NAME_new())) {
373c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509V3err(X509V3_F_COPY_EMAIL,ERR_R_MALLOC_FAILURE);
374c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto err;
375c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		gen->d.ia5 = email;
377c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		email = NULL;
378c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		gen->type = GEN_EMAIL;
379c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!sk_GENERAL_NAME_push(gens, gen)) {
380c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509V3err(X509V3_F_COPY_EMAIL,ERR_R_MALLOC_FAILURE);
381c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto err;
382c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
383c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		gen = NULL;
384c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
385c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
386c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
387c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
388c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
389c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err:
390c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAME_free(gen);
391c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	M_ASN1_IA5STRING_free(email);
392c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 0;
393c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
394c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
395c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
396480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgGENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method,
397480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
398c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
399c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAME *gen;
400c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAMES *gens = NULL;
401c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	CONF_VALUE *cnf;
402c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
403c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(gens = sk_GENERAL_NAME_new_null())) {
404c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE);
405c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
406c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
407c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for(i = 0; i < sk_CONF_VALUE_num(nval); i++) {
408c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		cnf = sk_CONF_VALUE_value(nval, i);
409c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) goto err;
410c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		sk_GENERAL_NAME_push(gens, gen);
411c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
412c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return gens;
413c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err:
414c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
415c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return NULL;
416c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
417c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
418480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgGENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
419480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			       CONF_VALUE *cnf)
420c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
421c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return v2i_GENERAL_NAME_ex(NULL, method, ctx, cnf, 0);
422c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
423c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
424480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgGENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out,
425480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			       const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
426480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			       int gen_type, char *value, int is_nc)
427c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
428c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char is_string = 0;
429c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAME *gen = NULL;
430c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
431c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!value)
432c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
433480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_MISSING_VALUE);
434c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
435c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
436c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
437c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (out)
438c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		gen = out;
439c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
440c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
441c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		gen = GENERAL_NAME_new();
442c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(gen == NULL)
443c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
444480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			X509V3err(X509V3_F_A2I_GENERAL_NAME,ERR_R_MALLOC_FAILURE);
445c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return NULL;
446c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
447c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
448c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
449480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	switch (gen_type)
450c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
451480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		case GEN_URI:
452480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		case GEN_EMAIL:
453480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		case GEN_DNS:
454c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		is_string = 1;
455480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		break;
456480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
457480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		case GEN_RID:
458c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
459c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ASN1_OBJECT *obj;
460c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!(obj = OBJ_txt2obj(value,0)))
461c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
462480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_BAD_OBJECT);
463c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ERR_add_error_data(2, "value=", value);
464c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto err;
465c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
466c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		gen->d.rid = obj;
467c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
468480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		break;
469480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
470480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		case GEN_IPADD:
471c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (is_nc)
472c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			gen->d.ip = a2i_IPADDRESS_NC(value);
473c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
474c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			gen->d.ip = a2i_IPADDRESS(value);
475c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(gen->d.ip == NULL)
476c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
477480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_BAD_IP_ADDRESS);
478c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ERR_add_error_data(2, "value=", value);
479c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto err;
480c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
481480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		break;
482480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
483480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		case GEN_DIRNAME:
484c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!do_dirname(gen, value, ctx))
485c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
486480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_DIRNAME_ERROR);
487c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto err;
488c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
489480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		break;
490480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
491480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		case GEN_OTHERNAME:
492c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!do_othername(gen, value, ctx))
493c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
494480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_OTHERNAME_ERROR);
495c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto err;
496c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
497480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		break;
498480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		default:
499480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_UNSUPPORTED_TYPE);
500c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto err;
501c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
502c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
503c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(is_string)
504c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
505c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!(gen->d.ia5 = M_ASN1_IA5STRING_new()) ||
506c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			      !ASN1_STRING_set(gen->d.ia5, (unsigned char*)value,
507c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					       strlen(value)))
508c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
509480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			X509V3err(X509V3_F_A2I_GENERAL_NAME,ERR_R_MALLOC_FAILURE);
510c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto err;
511c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
512c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
513c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
514480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	gen->type = gen_type;
515c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
516c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return gen;
517c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
518c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err:
519c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!out)
520c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		GENERAL_NAME_free(gen);
521c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return NULL;
522c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
523c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
524480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgGENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out,
525480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				  const X509V3_EXT_METHOD *method,
526480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				  X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc)
527480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	{
528480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	int type;
529480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
530480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	char *name, *value;
531480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
532480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	name = cnf->name;
533480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	value = cnf->value;
534480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
535480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	if(!value)
536480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		{
537480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_MISSING_VALUE);
538480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		return NULL;
539480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		}
540480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
541480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	if(!name_cmp(name, "email"))
542480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		type = GEN_EMAIL;
543480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	else if(!name_cmp(name, "URI"))
544480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		type = GEN_URI;
545480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	else if(!name_cmp(name, "DNS"))
546480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		type = GEN_DNS;
547480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	else if(!name_cmp(name, "RID"))
548480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		type = GEN_RID;
549480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	else if(!name_cmp(name, "IP"))
550480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		type = GEN_IPADD;
551480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	else if(!name_cmp(name, "dirName"))
552480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		type = GEN_DIRNAME;
553480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	else if(!name_cmp(name, "otherName"))
554480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		type = GEN_OTHERNAME;
555480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	else
556480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		{
557480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_UNSUPPORTED_OPTION);
558480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		ERR_add_error_data(2, "name=", name);
559480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		return NULL;
560480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		}
561480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
562480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	return a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc);
563480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
564480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	}
565480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
566c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int do_othername(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx)
567c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
568c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *objtmp = NULL, *p;
569c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int objlen;
570c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!(p = strchr(value, ';')))
571c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
572c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!(gen->d.otherName = OTHERNAME_new()))
573c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
574c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Free this up because we will overwrite it.
575c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * no need to free type_id because it is static
576c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 */
577c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_TYPE_free(gen->d.otherName->value);
578c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!(gen->d.otherName->value = ASN1_generate_v3(p + 1, ctx)))
579c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
580c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	objlen = p - value;
581c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	objtmp = OPENSSL_malloc(objlen + 1);
582c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	strncpy(objtmp, value, objlen);
583c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	objtmp[objlen] = 0;
584c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	gen->d.otherName->type_id = OBJ_txt2obj(objtmp, 0);
585c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_free(objtmp);
586c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!gen->d.otherName->type_id)
587c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
588c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
589c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
590c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
591c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int do_dirname(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx)
592c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
593c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int ret;
594c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	STACK_OF(CONF_VALUE) *sk;
595c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_NAME *nm;
596c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!(nm = X509_NAME_new()))
597c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
598c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	sk = X509V3_get_section(ctx, value);
599c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!sk)
600c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
601c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_DO_DIRNAME,X509V3_R_SECTION_NOT_FOUND);
602c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ERR_add_error_data(2, "section=", value);
603c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509_NAME_free(nm);
604c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
605c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
606c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* FIXME: should allow other character types... */
607c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ret = X509V3_NAME_from_section(nm, sk, MBSTRING_ASC);
608c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!ret)
609c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509_NAME_free(nm);
610c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	gen->d.dirn = nm;
611c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509V3_section_free(ctx, sk);
612c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
613c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
614c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
615