1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* v3_utl.c */
2e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1999-2003 The OpenSSL Project.  All rights reserved.
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the documentation and/or other materials provided with the
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    distribution.
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    software must display the following acknowledgment:
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    endorse or promote products derived from this software without
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prior written permission. For written permission, please contact
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    licensing@OpenSSL.org.
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL"
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    nor may "OpenSSL" appear in their names without prior written
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    permission of the OpenSSL Project.
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    acknowledgment:
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE.
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ====================================================================
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com).  This product includes software written by Tim
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com).
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* X509 v3 extension utilities */
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <ctype.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/conf.h>
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509v3.h>
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bn.h>
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *strip_spaces(char *name);
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int sk_strcmp(const char * const *a, const char * const *b);
70221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name, GENERAL_NAMES *gens);
71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void str_free(OPENSSL_STRING str);
72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email);
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ipv4_from_asc(unsigned char *v4, const char *in);
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ipv6_from_asc(unsigned char *v6, const char *in);
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ipv6_cb(const char *elem, int len, void *usr);
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ipv6_hex(unsigned char *out, const char *in, int inlen);
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Add a CONF_VALUE name value pair to stack */
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_add_value(const char *name, const char *value,
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						STACK_OF(CONF_VALUE) **extlist)
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_VALUE *vtmp = NULL;
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *tname = NULL, *tvalue = NULL;
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(name && !(tname = BUF_strdup(name))) goto err;
87e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if(value && !(tvalue = BUF_strdup(value))) goto err;
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(vtmp = (CONF_VALUE *)OPENSSL_malloc(sizeof(CONF_VALUE)))) goto err;
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!*extlist && !(*extlist = sk_CONF_VALUE_new_null())) goto err;
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vtmp->section = NULL;
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vtmp->name = tname;
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vtmp->value = tvalue;
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!sk_CONF_VALUE_push(*extlist, vtmp)) goto err;
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509V3err(X509V3_F_X509V3_ADD_VALUE,ERR_R_MALLOC_FAILURE);
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(vtmp) OPENSSL_free(vtmp);
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(tname) OPENSSL_free(tname);
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(tvalue) OPENSSL_free(tvalue);
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_add_value_uchar(const char *name, const unsigned char *value,
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			   STACK_OF(CONF_VALUE) **extlist)
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return X509V3_add_value(name,(const char *)value,extlist);
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Free function for STACK_OF(CONF_VALUE) */
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509V3_conf_free(CONF_VALUE *conf)
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!conf) return;
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(conf->name) OPENSSL_free(conf->name);
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(conf->value) OPENSSL_free(conf->value);
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(conf->section) OPENSSL_free(conf->section);
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(conf);
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_add_value_bool(const char *name, int asn1_bool,
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						STACK_OF(CONF_VALUE) **extlist)
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(asn1_bool) return X509V3_add_value(name, "TRUE", extlist);
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return X509V3_add_value(name, "FALSE", extlist);
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_add_value_bool_nf(char *name, int asn1_bool,
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						STACK_OF(CONF_VALUE) **extlist)
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(asn1_bool) return X509V3_add_value(name, "TRUE", extlist);
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *method, ASN1_ENUMERATED *a)
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIGNUM *bntmp = NULL;
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *strtmp = NULL;
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!a) return NULL;
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(bntmp = ASN1_ENUMERATED_to_BN(a, NULL)) ||
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    !(strtmp = BN_bn2dec(bntmp)) )
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_I2S_ASN1_ENUMERATED,ERR_R_MALLOC_FAILURE);
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_free(bntmp);
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return strtmp;
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *method, ASN1_INTEGER *a)
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIGNUM *bntmp = NULL;
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *strtmp = NULL;
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!a) return NULL;
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(bntmp = ASN1_INTEGER_to_BN(a, NULL)) ||
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    !(strtmp = BN_bn2dec(bntmp)) )
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_I2S_ASN1_INTEGER,ERR_R_MALLOC_FAILURE);
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_free(bntmp);
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return strtmp;
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *method, char *value)
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIGNUM *bn = NULL;
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_INTEGER *aint;
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int isneg, ishex;
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!value) {
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_INVALID_NULL_VALUE);
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bn = BN_new();
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (value[0] == '-') {
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		value++;
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		isneg = 1;
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} else isneg = 0;
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (value[0] == '0' && ((value[1] == 'x') || (value[1] == 'X'))) {
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		value += 2;
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ishex = 1;
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} else ishex = 0;
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ishex) ret = BN_hex2bn(&bn, value);
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else ret = BN_dec2bn(&bn, value);
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ret || value[ret]) {
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BN_free(bn);
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_BN_DEC2BN_ERROR);
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (isneg && BN_is_zero(bn)) isneg = 0;
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	aint = BN_to_ASN1_INTEGER(bn, NULL);
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_free(bn);
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!aint) {
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_BN_TO_ASN1_INTEGER_ERROR);
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (isneg) aint->type |= V_ASN1_NEG;
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return aint;
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_add_value_int(const char *name, ASN1_INTEGER *aint,
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     STACK_OF(CONF_VALUE) **extlist)
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *strtmp;
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!aint) return 1;
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(strtmp = i2s_ASN1_INTEGER(NULL, aint))) return 0;
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = X509V3_add_value(name, strtmp, extlist);
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(strtmp);
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool)
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *btmp;
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(btmp = value->value)) goto err;
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!strcmp(btmp, "TRUE") || !strcmp(btmp, "true")
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 || !strcmp(btmp, "Y") || !strcmp(btmp, "y")
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		|| !strcmp(btmp, "YES") || !strcmp(btmp, "yes")) {
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*asn1_bool = 0xff;
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} else if(!strcmp(btmp, "FALSE") || !strcmp(btmp, "false")
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 || !strcmp(btmp, "N") || !strcmp(btmp, "n")
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		|| !strcmp(btmp, "NO") || !strcmp(btmp, "no")) {
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*asn1_bool = 0;
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509V3err(X509V3_F_X509V3_GET_VALUE_BOOL,X509V3_R_INVALID_BOOLEAN_STRING);
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509V3_conf_err(value);
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint)
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_INTEGER *itmp;
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(itmp = s2i_ASN1_INTEGER(NULL, value->value))) {
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_conf_err(value);
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*aint = itmp;
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define HDR_NAME	1
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define HDR_VALUE	2
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*#define DEBUG*/
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line)
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p, *q, c;
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *ntmp, *vtmp;
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(CONF_VALUE) *values = NULL;
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *linebuf;
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int state;
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* We are going to modify the line so copy it first */
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	linebuf = BUF_strdup(line);
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	state = HDR_NAME;
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ntmp = NULL;
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Go through all characters */
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(p = linebuf, q = linebuf; (c = *p) && (c!='\r') && (c!='\n'); p++) {
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		switch(state) {
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case HDR_NAME:
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(c == ':') {
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				state = HDR_VALUE;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*p = 0;
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ntmp = strip_spaces(q);
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if(!ntmp) {
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					X509V3err(X509V3_F_X509V3_PARSE_LIST, X509V3_R_INVALID_NULL_NAME);
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				q = p + 1;
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			} else if(c == ',') {
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*p = 0;
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ntmp = strip_spaces(q);
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				q = p + 1;
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				printf("%s\n", ntmp);
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if(!ntmp) {
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					X509V3err(X509V3_F_X509V3_PARSE_LIST, X509V3_R_INVALID_NULL_NAME);
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				X509V3_add_value(ntmp, NULL, &values);
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break ;
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case HDR_VALUE:
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(c == ',') {
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				state = HDR_NAME;
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*p = 0;
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				vtmp = strip_spaces(q);
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				printf("%s\n", ntmp);
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if(!vtmp) {
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					X509V3err(X509V3_F_X509V3_PARSE_LIST, X509V3_R_INVALID_NULL_VALUE);
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				X509V3_add_value(ntmp, vtmp, &values);
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ntmp = NULL;
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				q = p + 1;
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(state == HDR_VALUE) {
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		vtmp = strip_spaces(q);
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		printf("%s=%s\n", ntmp, vtmp);
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!vtmp) {
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509V3err(X509V3_F_X509V3_PARSE_LIST, X509V3_R_INVALID_NULL_VALUE);
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value(ntmp, vtmp, &values);
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} else {
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ntmp = strip_spaces(q);
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		printf("%s\n", ntmp);
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!ntmp) {
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509V3err(X509V3_F_X509V3_PARSE_LIST, X509V3_R_INVALID_NULL_NAME);
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3_add_value(ntmp, NULL, &values);
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOPENSSL_free(linebuf);
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectreturn values;
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOPENSSL_free(linebuf);
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsk_CONF_VALUE_pop_free(values, X509V3_conf_free);
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectreturn NULL;
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Delete leading and trailing spaces from a string */
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic char *strip_spaces(char *name)
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p, *q;
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Skip over leading spaces */
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p = name;
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while(*p && isspace((unsigned char)*p)) p++;
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!*p) return NULL;
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	q = p + strlen(p) - 1;
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while((q != p) && isspace((unsigned char)*q)) q--;
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(p != q) q[1] = 0;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!*p) return NULL;
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return p;
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* hex string utilities */
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Given a buffer of length 'len' return a OPENSSL_malloc'ed string with its
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * hex representation
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * @@@ (Contents of buffer are always kept in ASCII, also on EBCDIC machines)
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
363221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromchar *hex_to_string(const unsigned char *buffer, long len)
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *tmp, *q;
366221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const unsigned char *p;
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
368365d7e8ba65197a3bad7349848dc13be13d6922aDavid 'Digit' Turner	static const char hexdig[] = "0123456789ABCDEF";
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!buffer || !len) return NULL;
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(tmp = OPENSSL_malloc(len * 3 + 1))) {
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_HEX_TO_STRING,ERR_R_MALLOC_FAILURE);
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	q = tmp;
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(i = 0, p = buffer; i < len; i++,p++) {
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*q++ = hexdig[(*p >> 4) & 0xf];
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*q++ = hexdig[*p & 0xf];
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*q++ = ':';
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	q[-1] = 0;
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ebcdic2ascii(tmp, tmp, q - tmp - 1);
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return tmp;
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Give a string of hex digits convert to
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * a buffer
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromunsigned char *string_to_hex(const char *str, long *len)
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *hexbuf, *q;
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char ch, cl, *p;
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!str) {
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509V3err(X509V3_F_STRING_TO_HEX,X509V3_R_INVALID_NULL_ARGUMENT);
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!(hexbuf = OPENSSL_malloc(strlen(str) >> 1))) goto err;
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(p = (unsigned char *)str, q = hexbuf; *p;) {
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ch = *p++;
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ch = os_toebcdic[ch];
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(ch == ':') continue;
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cl = *p++;
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cl = os_toebcdic[cl];
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!cl) {
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509V3err(X509V3_F_STRING_TO_HEX,X509V3_R_ODD_NUMBER_OF_DIGITS);
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OPENSSL_free(hexbuf);
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return NULL;
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(isupper(ch)) ch = tolower(ch);
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(isupper(cl)) cl = tolower(cl);
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if((ch >= '0') && (ch <= '9')) ch -= '0';
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if ((ch >= 'a') && (ch <= 'f')) ch -= 'a' - 10;
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else goto badhex;
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if((cl >= '0') && (cl <= '9')) cl -= '0';
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if ((cl >= 'a') && (cl <= 'f')) cl -= 'a' - 10;
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else goto badhex;
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*q++ = (ch << 4) | cl;
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(len) *len = q - hexbuf;
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return hexbuf;
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(hexbuf) OPENSSL_free(hexbuf);
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509V3err(X509V3_F_STRING_TO_HEX,ERR_R_MALLOC_FAILURE);
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	badhex:
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(hexbuf);
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509V3err(X509V3_F_STRING_TO_HEX,X509V3_R_ILLEGAL_HEX_DIGIT);
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* V2I name comparison function: returns zero if 'name' matches
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * cmp or cmp.*
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint name_cmp(const char *name, const char *cmp)
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int len, ret;
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char c;
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len = strlen(cmp);
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if((ret = strncmp(name, cmp, len))) return ret;
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c = name[len];
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!c || (c=='.')) return 0;
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int sk_strcmp(const char * const *a, const char * const *b)
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return strcmp(*a, *b);
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromSTACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x)
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAMES *gens;
469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	STACK_OF(OPENSSL_STRING) *ret;
470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = get_email(X509_get_subject_name(x), gens);
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromSTACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x)
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	AUTHORITY_INFO_ACCESS *info;
480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	STACK_OF(OPENSSL_STRING) *ret = NULL;
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	info = X509_get_ext_d2i(x, NID_info_access, NULL, NULL);
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!info)
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++)
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (OBJ_obj2nid(ad->method) == NID_ad_OCSP)
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (ad->location->type == GEN_URI)
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!append_ia5(&ret, ad->location->d.uniformResourceIdentifier))
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	AUTHORITY_INFO_ACCESS_free(info);
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromSTACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x)
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAMES *gens;
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(X509_EXTENSION) *exts;
506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	STACK_OF(OPENSSL_STRING) *ret;
507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	exts = X509_REQ_get_extensions(x);
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	gens = X509V3_get_d2i(exts, NID_subject_alt_name, NULL, NULL);
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = get_email(X509_REQ_get_subject_name(x), gens);
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name, GENERAL_NAMES *gens)
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	STACK_OF(OPENSSL_STRING) *ret = NULL;
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_NAME_ENTRY *ne;
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_IA5STRING *email;
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	GENERAL_NAME *gen;
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Now add any email address(es) to STACK */
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = -1;
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* First supplied X509_NAME */
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while((i = X509_NAME_get_index_by_NID(name,
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					 NID_pkcs9_emailAddress, i)) >= 0) {
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ne = X509_NAME_get_entry(name, i);
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		email = X509_NAME_ENTRY_get_data(ne);
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!append_ia5(&ret, email)) return NULL;
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(i = 0; i < sk_GENERAL_NAME_num(gens); i++)
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		gen = sk_GENERAL_NAME_value(gens, i);
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(gen->type != GEN_EMAIL) continue;
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!append_ia5(&ret, gen->d.ia5)) return NULL;
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void str_free(OPENSSL_STRING str)
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(str);
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email)
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *emtmp;
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* First some sanity checks */
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(email->type != V_ASN1_IA5STRING) return 1;
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!email->data || !email->length) return 1;
553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(!*sk) *sk = sk_OPENSSL_STRING_new(sk_strcmp);
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!*sk) return 0;
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Don't add duplicates */
556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(sk_OPENSSL_STRING_find(*sk, (char *)email->data) != -1) return 1;
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	emtmp = BUF_strdup((char *)email->data);
558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(!emtmp || !sk_OPENSSL_STRING_push(*sk, emtmp)) {
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_email_free(*sk);
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*sk = NULL;
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid X509_email_free(STACK_OF(OPENSSL_STRING) *sk)
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sk_OPENSSL_STRING_pop_free(sk, str_free);
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Convert IP addresses both IPv4 and IPv6 into an
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OCTET STRING compatible with RFC3280.
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc)
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char ipout[16];
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OCTET_STRING *ret;
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int iplen;
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* If string contains a ':' assume IPv6 */
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	iplen = a2i_ipadd(ipout, ipasc);
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!iplen)
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = ASN1_OCTET_STRING_new();
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ret)
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ASN1_OCTET_STRING_set(ret, ipout, iplen))
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_OCTET_STRING_free(ret);
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc)
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OCTET_STRING *ret = NULL;
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char ipout[32];
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *iptmp = NULL, *p;
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int iplen1, iplen2;
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p = strchr(ipasc,'/');
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!p)
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	iptmp = BUF_strdup(ipasc);
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!iptmp)
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p = iptmp + (p - ipasc);
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*p++ = 0;
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	iplen1 = a2i_ipadd(ipout, iptmp);
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!iplen1)
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	iplen2 = a2i_ipadd(ipout + iplen1, p);
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(iptmp);
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	iptmp = NULL;
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!iplen2 || (iplen1 != iplen2))
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = ASN1_OCTET_STRING_new();
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ret)
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ASN1_OCTET_STRING_set(ret, ipout, iplen1 + iplen2))
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (iptmp)
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(iptmp);
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret)
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_OCTET_STRING_free(ret);
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint a2i_ipadd(unsigned char *ipout, const char *ipasc)
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* If string contains a ':' assume IPv6 */
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (strchr(ipasc, ':'))
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!ipv6_from_asc(ipout, ipasc))
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 16;
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!ipv4_from_asc(ipout, ipasc))
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 4;
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ipv4_from_asc(unsigned char *v4, const char *in)
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int a0, a1, a2, a3;
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sscanf(in, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) != 4)
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((a0 < 0) || (a0 > 255) || (a1 < 0) || (a1 > 255)
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		|| (a2 < 0) || (a2 > 255) || (a3 < 0) || (a3 > 255))
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v4[0] = a0;
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v4[1] = a1;
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v4[2] = a2;
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v4[3] = a3;
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct {
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Temporary store for IPV6 output */
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		unsigned char tmp[16];
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Total number of bytes in tmp */
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int total;
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* The position of a zero (corresponding to '::') */
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int zero_pos;
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Number of zeroes */
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int zero_cnt;
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} IPV6_STAT;
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ipv6_from_asc(unsigned char *v6, const char *in)
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	IPV6_STAT v6stat;
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v6stat.total = 0;
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v6stat.zero_pos = -1;
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v6stat.zero_cnt = 0;
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Treat the IPv6 representation as a list of values
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * separated by ':'. The presence of a '::' will parse
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 	 * as one, two or three zero length elements.
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!CONF_parse_list(in, ':', 0, ipv6_cb, &v6stat))
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Now for some sanity checks */
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (v6stat.zero_pos == -1)
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* If no '::' must have exactly 16 bytes */
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (v6stat.total != 16)
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* If '::' must have less than 16 bytes */
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (v6stat.total == 16)
714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* More than three zeroes is an error */
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (v6stat.zero_cnt > 3)
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Can only have three zeroes if nothing else present */
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (v6stat.zero_cnt == 3)
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (v6stat.total > 0)
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Can only have two zeroes if at start or end */
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (v6stat.zero_cnt == 2)
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((v6stat.zero_pos != 0)
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				&& (v6stat.zero_pos != v6stat.total))
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Can only have one zero if *not* start or end */
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((v6stat.zero_pos == 0)
735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				|| (v6stat.zero_pos == v6stat.total))
736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Format result */
741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
742e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (v6stat.zero_pos >= 0)
743e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
744e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* Copy initial part */
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(v6, v6stat.tmp, v6stat.zero_pos);
746e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* Zero middle */
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total);
748e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* Copy final part */
749e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (v6stat.total != v6stat.zero_pos)
750e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total,
751e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				v6stat.tmp + v6stat.zero_pos,
752e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				v6stat.total - v6stat.zero_pos);
753e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
754e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	else
755e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		memcpy(v6, v6stat.tmp, 16);
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ipv6_cb(const char *elem, int len, void *usr)
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	IPV6_STAT *s = usr;
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Error if 16 bytes written */
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (s->total == 16)
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (len == 0)
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Zero length element, corresponds to '::' */
769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (s->zero_pos == -1)
770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s->zero_pos = s->total;
771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* If we've already got a :: its an error */
772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (s->zero_pos != s->total)
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s->zero_cnt++;
775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* If more than 4 characters could be final a.b.c.d form */
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (len > 4)
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* Need at least 4 bytes left */
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (s->total > 12)
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* Must be end of string */
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (elem[len])
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!ipv4_from_asc(s->tmp + s->total, elem))
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s->total += 4;
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!ipv6_hex(s->tmp + s->total, elem, len))
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s->total += 2;
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Convert a string of up to 4 hex digits into the corresponding
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IPv6 form.
803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ipv6_hex(unsigned char *out, const char *in, int inlen)
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char c;
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int num = 0;
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (inlen > 4)
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while(inlen--)
812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		c = *in++;
814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		num <<= 4;
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((c >= '0') && (c <= '9'))
816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			num |= c - '0';
817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if ((c >= 'A') && (c <= 'F'))
818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			num |= c - 'A' + 10;
819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if ((c >= 'a') && (c <= 'f'))
820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			num |=  c - 'a' + 10;
821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	out[0] = num >> 8;
825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	out[1] = num & 0xff;
826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE)*dn_sk,
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						unsigned long chtype)
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CONF_VALUE *v;
834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i, mval;
835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p, *type;
836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!nm)
837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++)
840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		v=sk_CONF_VALUE_value(dn_sk,i);
842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		type=v->name;
843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Skip past any leading X. X: X, etc to allow for
844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * multiple instances
845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 */
846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for(p = type; *p ; p++)
847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef CHARSET_EBCDIC
848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((*p == ':') || (*p == ',') || (*p == '.'))
849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((*p == os_toascii[':']) || (*p == os_toascii[',']) || (*p == os_toascii['.']))
851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				p++;
854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if(*p) type = p;
855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef CHARSET_EBCDIC
858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*type == '+')
859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*type == os_toascii['+'])
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mval = -1;
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			type++;
865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mval = 0;
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!X509_NAME_add_entry_by_txt(nm,type, chtype,
869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(unsigned char *) v->value,-1,-1,mval))
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					return 0;
871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
875