1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* v3_utl.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/* X509 v3 extension utilities */
59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h>
62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <ctype.h>
63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "cryptlib.h"
64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/conf.h>
65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/x509v3.h>
66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/bn.h>
67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic char *strip_spaces(char *name);
69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sk_strcmp(const char * const *a, const char * const *b);
70480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name, GENERAL_NAMES *gens);
71480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic void str_free(OPENSSL_STRING str);
72480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email);
73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ipv4_from_asc(unsigned char *v4, const char *in);
75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ipv6_from_asc(unsigned char *v6, const char *in);
76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ipv6_cb(const char *elem, int len, void *usr);
77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ipv6_hex(unsigned char *out, const char *in, int inlen);
78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Add a CONF_VALUE name value pair to stack */
80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509V3_add_value(const char *name, const char *value,
82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						STACK_OF(CONF_VALUE) **extlist)
83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	CONF_VALUE *vtmp = NULL;
85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *tname = NULL, *tvalue = NULL;
86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(name && !(tname = BUF_strdup(name))) goto err;
87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(value && !(tvalue = BUF_strdup(value))) goto err;
88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(vtmp = (CONF_VALUE *)OPENSSL_malloc(sizeof(CONF_VALUE)))) goto err;
89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!*extlist && !(*extlist = sk_CONF_VALUE_new_null())) goto err;
90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	vtmp->section = NULL;
91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	vtmp->name = tname;
92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	vtmp->value = tvalue;
93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!sk_CONF_VALUE_push(*extlist, vtmp)) goto err;
94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err:
96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509V3err(X509V3_F_X509V3_ADD_VALUE,ERR_R_MALLOC_FAILURE);
97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(vtmp) OPENSSL_free(vtmp);
98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(tname) OPENSSL_free(tname);
99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(tvalue) OPENSSL_free(tvalue);
100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 0;
101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509V3_add_value_uchar(const char *name, const unsigned char *value,
104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			   STACK_OF(CONF_VALUE) **extlist)
105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org    {
106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org    return X509V3_add_value(name,(const char *)value,extlist);
107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org    }
108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Free function for STACK_OF(CONF_VALUE) */
110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid X509V3_conf_free(CONF_VALUE *conf)
112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!conf) return;
114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(conf->name) OPENSSL_free(conf->name);
115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(conf->value) OPENSSL_free(conf->value);
116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(conf->section) OPENSSL_free(conf->section);
117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_free(conf);
118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509V3_add_value_bool(const char *name, int asn1_bool,
121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						STACK_OF(CONF_VALUE) **extlist)
122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(asn1_bool) return X509V3_add_value(name, "TRUE", extlist);
124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return X509V3_add_value(name, "FALSE", extlist);
125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509V3_add_value_bool_nf(char *name, int asn1_bool,
128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						STACK_OF(CONF_VALUE) **extlist)
129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(asn1_bool) return X509V3_add_value(name, "TRUE", extlist);
131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgchar *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *method, ASN1_ENUMERATED *a)
136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIGNUM *bntmp = NULL;
138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *strtmp = NULL;
139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!a) return NULL;
140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(bntmp = ASN1_ENUMERATED_to_BN(a, NULL)) ||
141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	    !(strtmp = BN_bn2dec(bntmp)) )
142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_I2S_ASN1_ENUMERATED,ERR_R_MALLOC_FAILURE);
143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BN_free(bntmp);
144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return strtmp;
145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgchar *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *method, ASN1_INTEGER *a)
148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIGNUM *bntmp = NULL;
150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *strtmp = NULL;
151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!a) return NULL;
152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(bntmp = ASN1_INTEGER_to_BN(a, NULL)) ||
153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	    !(strtmp = BN_bn2dec(bntmp)) )
154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_I2S_ASN1_INTEGER,ERR_R_MALLOC_FAILURE);
155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BN_free(bntmp);
156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return strtmp;
157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *method, char *value)
160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIGNUM *bn = NULL;
162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_INTEGER *aint;
163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int isneg, ishex;
164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int ret;
165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!value) {
166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_INVALID_NULL_VALUE);
167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	bn = BN_new();
170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (value[0] == '-') {
171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		value++;
172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		isneg = 1;
173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	} else isneg = 0;
174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (value[0] == '0' && ((value[1] == 'x') || (value[1] == 'X'))) {
176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		value += 2;
177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ishex = 1;
178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	} else ishex = 0;
179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (ishex) ret = BN_hex2bn(&bn, value);
181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else ret = BN_dec2bn(&bn, value);
182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!ret || value[ret]) {
184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BN_free(bn);
185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_BN_DEC2BN_ERROR);
186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (isneg && BN_is_zero(bn)) isneg = 0;
190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	aint = BN_to_ASN1_INTEGER(bn, NULL);
192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BN_free(bn);
193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!aint) {
194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_BN_TO_ASN1_INTEGER_ERROR);
195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (isneg) aint->type |= V_ASN1_NEG;
198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return aint;
199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509V3_add_value_int(const char *name, ASN1_INTEGER *aint,
202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	     STACK_OF(CONF_VALUE) **extlist)
203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *strtmp;
205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int ret;
206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!aint) return 1;
207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(strtmp = i2s_ASN1_INTEGER(NULL, aint))) return 0;
208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ret = X509V3_add_value(name, strtmp, extlist);
209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_free(strtmp);
210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool)
214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *btmp;
216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(btmp = value->value)) goto err;
217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!strcmp(btmp, "TRUE") || !strcmp(btmp, "true")
218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 || !strcmp(btmp, "Y") || !strcmp(btmp, "y")
219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		|| !strcmp(btmp, "YES") || !strcmp(btmp, "yes")) {
220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		*asn1_bool = 0xff;
221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 1;
222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	} else if(!strcmp(btmp, "FALSE") || !strcmp(btmp, "false")
223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 || !strcmp(btmp, "N") || !strcmp(btmp, "n")
224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		|| !strcmp(btmp, "NO") || !strcmp(btmp, "no")) {
225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		*asn1_bool = 0;
226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 1;
227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err:
229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509V3err(X509V3_F_X509V3_GET_VALUE_BOOL,X509V3_R_INVALID_BOOLEAN_STRING);
230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509V3_conf_err(value);
231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 0;
232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint)
235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_INTEGER *itmp;
237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(itmp = s2i_ASN1_INTEGER(NULL, value->value))) {
238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_conf_err(value);
239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	*aint = itmp;
242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define HDR_NAME	1
246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define HDR_VALUE	2
247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/*#define DEBUG*/
249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgSTACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line)
251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *p, *q, c;
253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *ntmp, *vtmp;
254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	STACK_OF(CONF_VALUE) *values = NULL;
255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *linebuf;
256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int state;
257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* We are going to modify the line so copy it first */
258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	linebuf = BUF_strdup(line);
259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	state = HDR_NAME;
260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ntmp = NULL;
261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Go through all characters */
262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for(p = linebuf, q = linebuf; (c = *p) && (c!='\r') && (c!='\n'); p++) {
263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		switch(state) {
265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			case HDR_NAME:
266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if(c == ':') {
267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				state = HDR_VALUE;
268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				*p = 0;
269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ntmp = strip_spaces(q);
270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if(!ntmp) {
271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					X509V3err(X509V3_F_X509V3_PARSE_LIST, X509V3_R_INVALID_NULL_NAME);
272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto err;
273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				q = p + 1;
275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			} else if(c == ',') {
276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				*p = 0;
277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ntmp = strip_spaces(q);
278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				q = p + 1;
279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if 0
280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				printf("%s\n", ntmp);
281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if(!ntmp) {
283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					X509V3err(X509V3_F_X509V3_PARSE_LIST, X509V3_R_INVALID_NULL_NAME);
284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto err;
285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				X509V3_add_value(ntmp, NULL, &values);
287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			break ;
289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			case HDR_VALUE:
291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if(c == ',') {
292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				state = HDR_NAME;
293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				*p = 0;
294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				vtmp = strip_spaces(q);
295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if 0
296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				printf("%s\n", ntmp);
297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if(!vtmp) {
299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					X509V3err(X509V3_F_X509V3_PARSE_LIST, X509V3_R_INVALID_NULL_VALUE);
300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto err;
301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				X509V3_add_value(ntmp, vtmp, &values);
303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ntmp = NULL;
304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				q = p + 1;
305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(state == HDR_VALUE) {
311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		vtmp = strip_spaces(q);
312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if 0
313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		printf("%s=%s\n", ntmp, vtmp);
314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!vtmp) {
316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509V3err(X509V3_F_X509V3_PARSE_LIST, X509V3_R_INVALID_NULL_VALUE);
317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto err;
318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value(ntmp, vtmp, &values);
320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	} else {
321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ntmp = strip_spaces(q);
322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if 0
323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		printf("%s\n", ntmp);
324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!ntmp) {
326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509V3err(X509V3_F_X509V3_PARSE_LIST, X509V3_R_INVALID_NULL_NAME);
327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto err;
328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_add_value(ntmp, NULL, &values);
330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgOPENSSL_free(linebuf);
332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgreturn values;
333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr:
335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgOPENSSL_free(linebuf);
336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgsk_CONF_VALUE_pop_free(values, X509V3_conf_free);
337c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgreturn NULL;
338c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
339c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
340c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
341c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Delete leading and trailing spaces from a string */
342c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic char *strip_spaces(char *name)
343c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
344c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *p, *q;
345c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Skip over leading spaces */
346c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	p = name;
347c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	while(*p && isspace((unsigned char)*p)) p++;
348c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!*p) return NULL;
349c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	q = p + strlen(p) - 1;
350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	while((q != p) && isspace((unsigned char)*q)) q--;
351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(p != q) q[1] = 0;
352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!*p) return NULL;
353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return p;
354c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* hex string utilities */
357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Given a buffer of length 'len' return a OPENSSL_malloc'ed string with its
359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * hex representation
360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * @@@ (Contents of buffer are always kept in ASCII, also on EBCDIC machines)
361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
363480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgchar *hex_to_string(const unsigned char *buffer, long len)
364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *tmp, *q;
366480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	const unsigned char *p;
367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
3687453c6c0666947e06d87565404f4397a4b387f91digit@chromium.org	static const char hexdig[] = "0123456789ABCDEF";
369c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!buffer || !len) return NULL;
370c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(tmp = OPENSSL_malloc(len * 3 + 1))) {
371c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_HEX_TO_STRING,ERR_R_MALLOC_FAILURE);
372c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
373c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
374c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	q = tmp;
375c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for(i = 0, p = buffer; i < len; i++,p++) {
376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		*q++ = hexdig[(*p >> 4) & 0xf];
377c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		*q++ = hexdig[*p & 0xf];
378c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		*q++ = ':';
379c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
380c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	q[-1] = 0;
381c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef CHARSET_EBCDIC
382c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ebcdic2ascii(tmp, tmp, q - tmp - 1);
383c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
384c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
385c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return tmp;
386c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
387c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
388c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Give a string of hex digits convert to
389c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * a buffer
390c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
391c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
392480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgunsigned char *string_to_hex(const char *str, long *len)
393c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
394c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char *hexbuf, *q;
395c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char ch, cl, *p;
396c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!str) {
397c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3err(X509V3_F_STRING_TO_HEX,X509V3_R_INVALID_NULL_ARGUMENT);
398c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
399c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
400c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!(hexbuf = OPENSSL_malloc(strlen(str) >> 1))) goto err;
401c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for(p = (unsigned char *)str, q = hexbuf; *p;) {
402c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ch = *p++;
403c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef CHARSET_EBCDIC
404c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ch = os_toebcdic[ch];
405c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
406c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(ch == ':') continue;
407c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		cl = *p++;
408c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef CHARSET_EBCDIC
409c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		cl = os_toebcdic[cl];
410c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
411c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!cl) {
412c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509V3err(X509V3_F_STRING_TO_HEX,X509V3_R_ODD_NUMBER_OF_DIGITS);
413c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			OPENSSL_free(hexbuf);
414c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return NULL;
415c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
416c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(isupper(ch)) ch = tolower(ch);
417c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(isupper(cl)) cl = tolower(cl);
418c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
419c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if((ch >= '0') && (ch <= '9')) ch -= '0';
420c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if ((ch >= 'a') && (ch <= 'f')) ch -= 'a' - 10;
421c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else goto badhex;
422c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
423c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if((cl >= '0') && (cl <= '9')) cl -= '0';
424c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if ((cl >= 'a') && (cl <= 'f')) cl -= 'a' - 10;
425c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else goto badhex;
426c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
427c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		*q++ = (ch << 4) | cl;
428c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
429c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
430c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(len) *len = q - hexbuf;
431c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
432c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return hexbuf;
433c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
434c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err:
435c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(hexbuf) OPENSSL_free(hexbuf);
436c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509V3err(X509V3_F_STRING_TO_HEX,ERR_R_MALLOC_FAILURE);
437c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return NULL;
438c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
439c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	badhex:
440c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_free(hexbuf);
441c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509V3err(X509V3_F_STRING_TO_HEX,X509V3_R_ILLEGAL_HEX_DIGIT);
442c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return NULL;
443c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
444c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
445c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
446c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* V2I name comparison function: returns zero if 'name' matches
447c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * cmp or cmp.*
448c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
449c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
450c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint name_cmp(const char *name, const char *cmp)
451c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
452c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int len, ret;
453c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char c;
454c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	len = strlen(cmp);
455c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if((ret = strncmp(name, cmp, len))) return ret;
456c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	c = name[len];
457c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!c || (c=='.')) return 0;
458c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
459c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
460c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
461c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sk_strcmp(const char * const *a, const char * const *b)
462c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
463c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return strcmp(*a, *b);
464c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
465c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
466480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgSTACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x)
467c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
468c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAMES *gens;
469480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	STACK_OF(OPENSSL_STRING) *ret;
470480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
471c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
472c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ret = get_email(X509_get_subject_name(x), gens);
473c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
474c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
475c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
476c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
477480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgSTACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x)
478c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
479c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	AUTHORITY_INFO_ACCESS *info;
480480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	STACK_OF(OPENSSL_STRING) *ret = NULL;
481c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
482480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
483c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	info = X509_get_ext_d2i(x, NID_info_access, NULL, NULL);
484c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!info)
485c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
486c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++)
487c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
488c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
489c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (OBJ_obj2nid(ad->method) == NID_ad_OCSP)
490c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
491c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (ad->location->type == GEN_URI)
492c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
493c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (!append_ia5(&ret, ad->location->d.uniformResourceIdentifier))
494c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
495c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
496c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
497c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
498c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	AUTHORITY_INFO_ACCESS_free(info);
499c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
500c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
501c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
502480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgSTACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x)
503c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
504c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAMES *gens;
505c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	STACK_OF(X509_EXTENSION) *exts;
506480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	STACK_OF(OPENSSL_STRING) *ret;
507480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
508c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	exts = X509_REQ_get_extensions(x);
509c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	gens = X509V3_get_d2i(exts, NID_subject_alt_name, NULL, NULL);
510c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ret = get_email(X509_REQ_get_subject_name(x), gens);
511c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
512c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
513c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
514c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
515c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
516c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
517480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name, GENERAL_NAMES *gens)
518c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
519480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	STACK_OF(OPENSSL_STRING) *ret = NULL;
520c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_NAME_ENTRY *ne;
521c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_IA5STRING *email;
522c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	GENERAL_NAME *gen;
523c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
524c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Now add any email address(es) to STACK */
525c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	i = -1;
526c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* First supplied X509_NAME */
527c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	while((i = X509_NAME_get_index_by_NID(name,
528c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					 NID_pkcs9_emailAddress, i)) >= 0) {
529c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ne = X509_NAME_get_entry(name, i);
530c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		email = X509_NAME_ENTRY_get_data(ne);
531c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!append_ia5(&ret, email)) return NULL;
532c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
533c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for(i = 0; i < sk_GENERAL_NAME_num(gens); i++)
534c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
535c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		gen = sk_GENERAL_NAME_value(gens, i);
536c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(gen->type != GEN_EMAIL) continue;
537c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(!append_ia5(&ret, gen->d.ia5)) return NULL;
538c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
539c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
540c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
541c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
542480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic void str_free(OPENSSL_STRING str)
543c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
544c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_free(str);
545c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
546c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
547480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email)
548c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
549c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *emtmp;
550c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* First some sanity checks */
551c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(email->type != V_ASN1_IA5STRING) return 1;
552c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!email->data || !email->length) return 1;
553480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	if(!*sk) *sk = sk_OPENSSL_STRING_new(sk_strcmp);
554c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!*sk) return 0;
555c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Don't add duplicates */
556480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	if(sk_OPENSSL_STRING_find(*sk, (char *)email->data) != -1) return 1;
557c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	emtmp = BUF_strdup((char *)email->data);
558480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	if(!emtmp || !sk_OPENSSL_STRING_push(*sk, emtmp)) {
559c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509_email_free(*sk);
560c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		*sk = NULL;
561c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
562c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
563c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
564c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
565c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
566480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgvoid X509_email_free(STACK_OF(OPENSSL_STRING) *sk)
567c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
568480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	sk_OPENSSL_STRING_pop_free(sk, str_free);
569c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
570c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
571c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Convert IP addresses both IPv4 and IPv6 into an
572c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OCTET STRING compatible with RFC3280.
573c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
574c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
575c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc)
576c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
577c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char ipout[16];
578c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_OCTET_STRING *ret;
579c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int iplen;
580c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
581c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* If string contains a ':' assume IPv6 */
582c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
583c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	iplen = a2i_ipadd(ipout, ipasc);
584c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
585c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!iplen)
586c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
587c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
588c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ret = ASN1_OCTET_STRING_new();
589c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!ret)
590c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
591c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!ASN1_OCTET_STRING_set(ret, ipout, iplen))
592c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
593c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ASN1_OCTET_STRING_free(ret);
594c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
595c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
596c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
597c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
598c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
599c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc)
600c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
601c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_OCTET_STRING *ret = NULL;
602c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char ipout[32];
603c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *iptmp = NULL, *p;
604c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int iplen1, iplen2;
605c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	p = strchr(ipasc,'/');
606c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!p)
607c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
608c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	iptmp = BUF_strdup(ipasc);
609c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!iptmp)
610c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return NULL;
611c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	p = iptmp + (p - ipasc);
612c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	*p++ = 0;
613c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
614c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	iplen1 = a2i_ipadd(ipout, iptmp);
615c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
616c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!iplen1)
617c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto err;
618c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
619c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	iplen2 = a2i_ipadd(ipout + iplen1, p);
620c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
621c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_free(iptmp);
622c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	iptmp = NULL;
623c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
624c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!iplen2 || (iplen1 != iplen2))
625c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto err;
626c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
627c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ret = ASN1_OCTET_STRING_new();
628c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!ret)
629c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto err;
630c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!ASN1_OCTET_STRING_set(ret, ipout, iplen1 + iplen2))
631c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto err;
632c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
633c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
634c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
635c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err:
636c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (iptmp)
637c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		OPENSSL_free(iptmp);
638c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (ret)
639c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ASN1_OCTET_STRING_free(ret);
640c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return NULL;
641c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
642c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
643c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
644c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint a2i_ipadd(unsigned char *ipout, const char *ipasc)
645c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
646c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* If string contains a ':' assume IPv6 */
647c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
648c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (strchr(ipasc, ':'))
649c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
650c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!ipv6_from_asc(ipout, ipasc))
651c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return 0;
652c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 16;
653c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
654c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
655c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
656c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!ipv4_from_asc(ipout, ipasc))
657c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return 0;
658c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 4;
659c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
660c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
661c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
662c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ipv4_from_asc(unsigned char *v4, const char *in)
663c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
664c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int a0, a1, a2, a3;
665c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (sscanf(in, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) != 4)
666c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
667c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if ((a0 < 0) || (a0 > 255) || (a1 < 0) || (a1 > 255)
668c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		|| (a2 < 0) || (a2 > 255) || (a3 < 0) || (a3 > 255))
669c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
670c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	v4[0] = a0;
671c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	v4[1] = a1;
672c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	v4[2] = a2;
673c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	v4[3] = a3;
674c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
675c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
676c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
677c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgtypedef struct {
678c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Temporary store for IPV6 output */
679c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		unsigned char tmp[16];
680c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Total number of bytes in tmp */
681c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		int total;
682c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* The position of a zero (corresponding to '::') */
683c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		int zero_pos;
684c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Number of zeroes */
685c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		int zero_cnt;
686c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	} IPV6_STAT;
687c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
688c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
689c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ipv6_from_asc(unsigned char *v6, const char *in)
690c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
691c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	IPV6_STAT v6stat;
692c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	v6stat.total = 0;
693c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	v6stat.zero_pos = -1;
694c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	v6stat.zero_cnt = 0;
695c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Treat the IPv6 representation as a list of values
696c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * separated by ':'. The presence of a '::' will parse
697c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 	 * as one, two or three zero length elements.
698c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 */
699c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!CONF_parse_list(in, ':', 0, ipv6_cb, &v6stat))
700c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
701c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
702c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Now for some sanity checks */
703c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
704c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (v6stat.zero_pos == -1)
705c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
706c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* If no '::' must have exactly 16 bytes */
707c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (v6stat.total != 16)
708c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return 0;
709c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
710c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
711c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
712c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* If '::' must have less than 16 bytes */
713c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (v6stat.total == 16)
714c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return 0;
715c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* More than three zeroes is an error */
716c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (v6stat.zero_cnt > 3)
717c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return 0;
718c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Can only have three zeroes if nothing else present */
719c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (v6stat.zero_cnt == 3)
720c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
721c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (v6stat.total > 0)
722c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				return 0;
723c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
724c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Can only have two zeroes if at start or end */
725c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (v6stat.zero_cnt == 2)
726c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
727c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if ((v6stat.zero_pos != 0)
728c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				&& (v6stat.zero_pos != v6stat.total))
729c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				return 0;
730c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
731c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
732c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Can only have one zero if *not* start or end */
733c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
734c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if ((v6stat.zero_pos == 0)
735c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				|| (v6stat.zero_pos == v6stat.total))
736c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				return 0;
737c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
738c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
739c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
740c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Format result */
741c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
742c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (v6stat.zero_pos >= 0)
743c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
744c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Copy initial part */
745c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		memcpy(v6, v6stat.tmp, v6stat.zero_pos);
746c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Zero middle */
747c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total);
748c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Copy final part */
749c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (v6stat.total != v6stat.zero_pos)
750c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total,
751c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				v6stat.tmp + v6stat.zero_pos,
752c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				v6stat.total - v6stat.zero_pos);
753c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
754c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
755c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		memcpy(v6, v6stat.tmp, 16);
756c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
757c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
758c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
759c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
760c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ipv6_cb(const char *elem, int len, void *usr)
761c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
762c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	IPV6_STAT *s = usr;
763c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Error if 16 bytes written */
764c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (s->total == 16)
765c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
766c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (len == 0)
767c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
768c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Zero length element, corresponds to '::' */
769c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (s->zero_pos == -1)
770c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			s->zero_pos = s->total;
771c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* If we've already got a :: its an error */
772c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (s->zero_pos != s->total)
773c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return 0;
774c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		s->zero_cnt++;
775c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
776c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
777c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
778c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* If more than 4 characters could be final a.b.c.d form */
779c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (len > 4)
780c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
781c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			/* Need at least 4 bytes left */
782c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (s->total > 12)
783c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				return 0;
784c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			/* Must be end of string */
785c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (elem[len])
786c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				return 0;
787c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!ipv4_from_asc(s->tmp + s->total, elem))
788c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				return 0;
789c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			s->total += 4;
790c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
791c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
792c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
793c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!ipv6_hex(s->tmp + s->total, elem, len))
794c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				return 0;
795c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			s->total += 2;
796c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
797c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
798c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
799c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
800c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
801c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Convert a string of up to 4 hex digits into the corresponding
802c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IPv6 form.
803c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
804c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
805c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int ipv6_hex(unsigned char *out, const char *in, int inlen)
806c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
807c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char c;
808c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned int num = 0;
809c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (inlen > 4)
810c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
811c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	while(inlen--)
812c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
813c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		c = *in++;
814c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		num <<= 4;
815c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if ((c >= '0') && (c <= '9'))
816c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			num |= c - '0';
817c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if ((c >= 'A') && (c <= 'F'))
818c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			num |= c - 'A' + 10;
819c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if ((c >= 'a') && (c <= 'f'))
820c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			num |=  c - 'a' + 10;
821c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
822c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return 0;
823c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
824c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	out[0] = num >> 8;
825c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	out[1] = num & 0xff;
826c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
827c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
828c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
829c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
830c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE)*dn_sk,
831c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						unsigned long chtype)
832c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
833c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	CONF_VALUE *v;
834c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i, mval;
835c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *p, *type;
836c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!nm)
837c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
838c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
839c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++)
840c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
841c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		v=sk_CONF_VALUE_value(dn_sk,i);
842c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		type=v->name;
843c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		/* Skip past any leading X. X: X, etc to allow for
844c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 * multiple instances
845c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 */
846c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for(p = type; *p ; p++)
847c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef CHARSET_EBCDIC
848c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if ((*p == ':') || (*p == ',') || (*p == '.'))
849c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else
850c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if ((*p == os_toascii[':']) || (*p == os_toascii[',']) || (*p == os_toascii['.']))
851c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
852c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
853c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				p++;
854c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if(*p) type = p;
855c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				break;
856c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
857c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef CHARSET_EBCDIC
858c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (*type == '+')
859c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else
860c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (*type == os_toascii['+'])
861c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
862c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
863c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			mval = -1;
864c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			type++;
865c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
866c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
867c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			mval = 0;
868c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!X509_NAME_add_entry_by_txt(nm,type, chtype,
869c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				(unsigned char *) v->value,-1,-1,mval))
870c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					return 0;
871c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
872c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
873c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
874c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
875