1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/asn1/a_object.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com).
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to.  The following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed.
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package.
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    documentation and/or other materials provided with the distribution.
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    must display the following acknowledgement:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes cryptographic software written by
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *     Eric Young (eay@cryptsoft.com)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    The word 'cryptographic' can be left out if the rouines from the library
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    being used are not cryptographic related :-).
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the apps directory (application code) you must include an acknowledgement:
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed.  i.e. this code cannot simply be
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.]
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <limits.h>
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/buffer.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/asn1.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h>
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bn.h>
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint i2d_ASN1_OBJECT(ASN1_OBJECT *a, unsigned char **pp)
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *p;
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int objsize;
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((a == NULL) || (a->data == NULL)) return(0);
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	objsize = ASN1_object_size(0,a->length,V_ASN1_OBJECT);
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (pp == NULL) return objsize;
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p= *pp;
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_put_object(&p,0,a->length,V_ASN1_OBJECT,V_ASN1_UNIVERSAL);
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(p,a->data,a->length);
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p+=a->length;
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*pp=p;
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(objsize);
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num)
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,first,len=0,c, use_bn;
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char ftmp[24], *tmp = ftmp;
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int tmpsize = sizeof ftmp;
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char *p;
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long l;
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIGNUM *bl = NULL;
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (num == 0)
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(0);
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (num == -1)
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		num=strlen(buf);
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p=buf;
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c= *(p++);
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	num--;
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((c >= '0') && (c <= '2'))
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		first= c-'0';
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1err(ASN1_F_A2D_ASN1_OBJECT,ASN1_R_FIRST_NUM_TOO_LARGE);
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (num <= 0)
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1err(ASN1_F_A2D_ASN1_OBJECT,ASN1_R_MISSING_SECOND_NUMBER);
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c= *(p++);
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	num--;
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (num <= 0) break;
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((c != '.') && (c != ' '))
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1err(ASN1_F_A2D_ASN1_OBJECT,ASN1_R_INVALID_SEPARATOR);
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		l=0;
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		use_bn = 0;
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (;;)
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (num <= 0) break;
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			num--;
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c= *(p++);
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((c == ' ') || (c == '.'))
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((c < '0') || (c > '9'))
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ASN1err(ASN1_F_A2D_ASN1_OBJECT,ASN1_R_INVALID_DIGIT);
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
142ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom			if (!use_bn && l >= ((ULONG_MAX - 80) / 10L))
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				use_bn = 1;
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!bl)
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					bl = BN_new();
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!bl || !BN_set_word(bl, l))
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (use_bn)
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!BN_mul_word(bl, 10L)
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					|| !BN_add_word(bl, c-'0'))
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l=l*10L+(long)(c-'0');
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (len == 0)
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((first < 2) && (l >= 40))
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ASN1err(ASN1_F_A2D_ASN1_OBJECT,ASN1_R_SECOND_NUMBER_TOO_LARGE);
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (use_bn)
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!BN_add_word(bl, first * 40))
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l+=(long)first*40;
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=0;
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (use_bn)
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			int blsize;
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			blsize = BN_num_bits(bl);
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			blsize = (blsize + 6)/7;
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (blsize > tmpsize)
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (tmp != ftmp)
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					OPENSSL_free(tmp);
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				tmpsize = blsize + 32;
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				tmp = OPENSSL_malloc(tmpsize);
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!tmp)
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while(blsize--)
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				tmp[i++] = (unsigned char)BN_div_word(bl, 0x80L);
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (;;)
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				tmp[i++]=(unsigned char)l&0x7f;
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l>>=7L;
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (l == 0L) break;
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (out != NULL)
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (len+i > olen)
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ASN1err(ASN1_F_A2D_ASN1_OBJECT,ASN1_R_BUFFER_TOO_SMALL);
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (--i > 0)
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				out[len++]=tmp[i]|0x80;
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			out[len++]=tmp[0];
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			len+=i;
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (tmp != ftmp)
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(tmp);
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bl)
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BN_free(bl);
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(len);
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (tmp != ftmp)
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(tmp);
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bl)
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BN_free(bl);
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint i2t_ASN1_OBJECT(char *buf, int buf_len, ASN1_OBJECT *a)
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return OBJ_obj2txt(buf, buf_len, a, 0);
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint i2a_ASN1_OBJECT(BIO *bp, ASN1_OBJECT *a)
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char buf[80], *p = buf;
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((a == NULL) || (a->data == NULL))
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(BIO_write(bp,"NULL",4));
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=i2t_ASN1_OBJECT(buf,sizeof buf,a);
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i > (int)(sizeof(buf) - 1))
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p = OPENSSL_malloc(i + 1);
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!p)
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return -1;
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i2t_ASN1_OBJECT(p,i + 1,a);
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i <= 0)
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return BIO_write(bp, "<INVALID>", 9);
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_write(bp,p,i);
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (p != buf)
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(p);
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(i);
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     long length)
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const unsigned char *p;
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long len;
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int tag,xclass;
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int inf,i;
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT *ret = NULL;
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p= *pp;
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	inf=ASN1_get_object(&p,&len,&tag,&xclass,length);
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (inf & 0x80)
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=ASN1_R_BAD_OBJECT_HEADER;
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (tag != V_ASN1_OBJECT)
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=ASN1_R_EXPECTING_AN_OBJECT;
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = c2i_ASN1_OBJECT(a, &p, len);
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ret) *pp = p;
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1err(ASN1_F_D2I_ASN1_OBJECT,i);
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(NULL);
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     long len)
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT *ret=NULL;
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const unsigned char *p;
291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	unsigned char *data;
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* Sanity check OID encoding: can't have leading 0x80 in
294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 * subidentifiers, see: X.690 8.19.2
29598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	 */
296ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom	for (i = 0, p = *pp; i < len; i++, p++)
29798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		{
298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (*p == 0x80 && (!i || !(p[-1] & 0x80)))
29998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			{
30098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			ASN1err(ASN1_F_C2I_ASN1_OBJECT,ASN1_R_INVALID_OBJECT_ENCODING);
30198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			return NULL;
30298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			}
30398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		}
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* only the ASN1_OBJECTs from the 'table' will have values
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * for ->sn or ->ln */
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((a == NULL) || ((*a) == NULL) ||
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		!((*a)->flags & ASN1_OBJECT_FLAG_DYNAMIC))
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((ret=ASN1_OBJECT_new()) == NULL) return(NULL);
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else	ret=(*a);
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p= *pp;
315221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* detach data from object */
316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	data = (unsigned char *)ret->data;
317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret->data = NULL;
318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* once detached we can change it */
319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if ((data == NULL) || (ret->length < len))
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
321221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ret->length=0;
322221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (data != NULL) OPENSSL_free(data);
323221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		data=(unsigned char *)OPENSSL_malloc(len ? (int)len : 1);
324221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (data == NULL)
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ i=ERR_R_MALLOC_FAILURE; goto err; }
326221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ret->flags|=ASN1_OBJECT_FLAG_DYNAMIC_DATA;
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	memcpy(data,p,(int)len);
329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* reattach data to object, after which it remains const */
330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret->data  =data;
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->length=(int)len;
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->sn=NULL;
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->ln=NULL;
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* ret->flags=ASN1_OBJECT_FLAG_DYNAMIC; we know it is dynamic */
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p+=len;
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a != NULL) (*a)=ret;
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*pp=p;
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1err(ASN1_F_C2I_ASN1_OBJECT,i);
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((ret != NULL) && ((a == NULL) || (*a != ret)))
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_OBJECT_free(ret);
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(NULL);
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_OBJECT *ASN1_OBJECT_new(void)
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT *ret;
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=(ASN1_OBJECT *)OPENSSL_malloc(sizeof(ASN1_OBJECT));
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret == NULL)
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1err(ASN1_F_ASN1_OBJECT_NEW,ERR_R_MALLOC_FAILURE);
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(NULL);
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->length=0;
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->data=NULL;
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->nid=0;
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->sn=NULL;
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->ln=NULL;
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->flags=ASN1_OBJECT_FLAG_DYNAMIC;
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid ASN1_OBJECT_free(ASN1_OBJECT *a)
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a == NULL) return;
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_STRINGS)
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef CONST_STRICT /* disable purely for compile-time strict const checking. Doing this on a "real" compile will cause memory leaks */
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (a->sn != NULL) OPENSSL_free((void *)a->sn);
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (a->ln != NULL) OPENSSL_free((void *)a->ln);
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		a->sn=a->ln=NULL;
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_DATA)
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
379221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (a->data != NULL) OPENSSL_free((void *)a->data);
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		a->data=NULL;
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		a->length=0;
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC)
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(a);
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len,
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const char *sn, const char *ln)
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT o;
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	o.sn=sn;
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	o.ln=ln;
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	o.data=data;
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	o.nid=nid;
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	o.length=len;
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	o.flags=ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_OBJECT_FLAG_DYNAMIC_DATA;
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(OBJ_dup(&o));
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_STACK_OF(ASN1_OBJECT)
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_ASN1_SET_OF(ASN1_OBJECT)
404