1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/objects/obj_dat.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 <ctype.h>
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <limits.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/lhash.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/asn1.h>
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h>
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bn.h>
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* obj_dat.h is generated from objects.h by obj_dat.pl */
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_OBJECT
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "obj_dat.h"
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* You will have to load all the objects needed manually in the application */
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define NUM_NID 0
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define NUM_SN 0
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define NUM_LN 0
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define NUM_OBJ 0
77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic const unsigned char lvalues[1];
78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic const ASN1_OBJECT nid_objs[1];
79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic const unsigned int sn_objs[1];
80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic const unsigned int ln_objs[1];
81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic const unsigned int obj_objs[1];
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDECLARE_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, sn);
85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDECLARE_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, ln);
86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDECLARE_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, obj);
87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ADDED_DATA	0
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ADDED_SNAME	1
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ADDED_LNAME	2
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ADDED_NID	3
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct added_obj_st
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int type;
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT *obj;
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} ADDED_OBJ;
98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDECLARE_LHASH_OF(ADDED_OBJ);
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int new_nid=NUM_NID;
101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic LHASH_OF(ADDED_OBJ) *added=NULL;
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int sn_cmp(const ASN1_OBJECT * const *a, const unsigned int *b)
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{ return(strcmp((*a)->sn,nid_objs[*b].sn)); }
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIMPLEMENT_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, sn);
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int ln_cmp(const ASN1_OBJECT * const *a, const unsigned int *b)
109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{ return(strcmp((*a)->ln,nid_objs[*b].ln)); }
110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIMPLEMENT_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, ln);
112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic unsigned long added_obj_hash(const ADDED_OBJ *ca)
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const ASN1_OBJECT *a;
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long ret=0;
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *p;
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	a=ca->obj;
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch (ca->type)
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case ADDED_DATA:
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=a->length<<20L;
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p=(unsigned char *)a->data;
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<a->length; i++)
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ret^=p[i]<<((i*3)%24);
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case ADDED_SNAME:
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=lh_strhash(a->sn);
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case ADDED_LNAME:
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=lh_strhash(a->ln);
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case ADDED_NID:
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=a->nid;
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	default:
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* abort(); */
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret&=0x3fffffffL;
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret|=ca->type<<30L;
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_HASH_FN(added_obj, ADDED_OBJ)
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int added_obj_cmp(const ADDED_OBJ *ca, const ADDED_OBJ *cb)
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT *a,*b;
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=ca->type-cb->type;
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i) return(i);
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	a=ca->obj;
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	b=cb->obj;
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch (ca->type)
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case ADDED_DATA:
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=(a->length - b->length);
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i) return(i);
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(memcmp(a->data,b->data,(size_t)a->length));
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case ADDED_SNAME:
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (a->sn == NULL) return(-1);
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (b->sn == NULL) return(1);
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else return(strcmp(a->sn,b->sn));
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case ADDED_LNAME:
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (a->ln == NULL) return(-1);
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (b->ln == NULL) return(1);
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else return(strcmp(a->ln,b->ln));
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case ADDED_NID:
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(a->nid-b->nid);
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	default:
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* abort(); */
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_COMP_FN(added_obj, ADDED_OBJ)
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_added(void)
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (added != NULL) return(1);
183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	added=lh_ADDED_OBJ_new();
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(added != NULL);
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void cleanup1_doall(ADDED_OBJ *a)
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	a->obj->nid=0;
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	a->obj->flags|=ASN1_OBJECT_FLAG_DYNAMIC|
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	                ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_OBJECT_FLAG_DYNAMIC_DATA;
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void cleanup2_doall(ADDED_OBJ *a)
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{ a->obj->nid++; }
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void cleanup3_doall(ADDED_OBJ *a)
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (--a->obj->nid == 0)
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_OBJECT_free(a->obj);
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(a);
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_DOALL_FN(cleanup1, ADDED_OBJ)
206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_DOALL_FN(cleanup2, ADDED_OBJ)
207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic IMPLEMENT_LHASH_DOALL_FN(cleanup3, ADDED_OBJ)
208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* The purpose of obj_cleanup_defer is to avoid EVP_cleanup() attempting
210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * to use freed up OIDs. If neccessary the actual freeing up of OIDs is
211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * delayed.
212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */
213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint obj_cleanup_defer = 0;
215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid check_defer(int nid)
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!obj_cleanup_defer && nid >= NUM_NID)
219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			obj_cleanup_defer = 1;
220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid OBJ_cleanup(void)
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (obj_cleanup_defer)
225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		obj_cleanup_defer = 2;
227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return ;
228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (added == NULL) return;
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lh_ADDED_OBJ_down_load(added) = 0;
231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lh_ADDED_OBJ_doall(added,LHASH_DOALL_FN(cleanup1)); /* zero counters */
232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lh_ADDED_OBJ_doall(added,LHASH_DOALL_FN(cleanup2)); /* set counters */
233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lh_ADDED_OBJ_doall(added,LHASH_DOALL_FN(cleanup3)); /* free objects */
234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lh_ADDED_OBJ_free(added);
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	added=NULL;
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_new_nid(int num)
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=new_nid;
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	new_nid+=num;
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(i);
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_add_object(const ASN1_OBJECT *obj)
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT *o;
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ADDED_OBJ *ao[4]={NULL,NULL,NULL,NULL},*aop;
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (added == NULL)
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!init_added()) return(0);
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((o=OBJ_dup(obj)) == NULL) goto err;
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(ao[ADDED_NID]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((o->length != 0) && (obj->data != NULL))
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!(ao[ADDED_DATA]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (o->sn != NULL)
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!(ao[ADDED_SNAME]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (o->ln != NULL)
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!(ao[ADDED_LNAME]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=ADDED_DATA; i<=ADDED_NID; i++)
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ao[i] != NULL)
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ao[i]->type=i;
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ao[i]->obj=o;
270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			aop=lh_ADDED_OBJ_insert(added,ao[i]);
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* memory leak, buit should not normally matter */
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (aop != NULL)
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				OPENSSL_free(aop);
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	o->flags&= ~(ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_OBJECT_FLAG_DYNAMIC_DATA);
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(o->nid);
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr2:
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OBJerr(OBJ_F_OBJ_ADD_OBJECT,ERR_R_MALLOC_FAILURE);
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=ADDED_DATA; i<=ADDED_NID; i++)
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ao[i] != NULL) OPENSSL_free(ao[i]);
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (o != NULL) OPENSSL_free(o);
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(NID_undef);
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_OBJECT *OBJ_nid2obj(int n)
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ADDED_OBJ ad,*adp;
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT ob;
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((n >= 0) && (n < NUM_NID))
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((n != NID_undef) && (nid_objs[n].nid == NID_undef))
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OBJerr(OBJ_F_OBJ_NID2OBJ,OBJ_R_UNKNOWN_NID);
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(NULL);
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return((ASN1_OBJECT *)&(nid_objs[n]));
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (added == NULL)
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(NULL);
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.type=ADDED_NID;
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.obj= &ob;
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ob.nid=n;
310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		adp=lh_ADDED_OBJ_retrieve(added,&ad);
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (adp != NULL)
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(adp->obj);
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OBJerr(OBJ_F_OBJ_NID2OBJ,OBJ_R_UNKNOWN_NID);
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(NULL);
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char *OBJ_nid2sn(int n)
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ADDED_OBJ ad,*adp;
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT ob;
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((n >= 0) && (n < NUM_NID))
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((n != NID_undef) && (nid_objs[n].nid == NID_undef))
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OBJerr(OBJ_F_OBJ_NID2SN,OBJ_R_UNKNOWN_NID);
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(NULL);
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(nid_objs[n].sn);
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (added == NULL)
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(NULL);
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.type=ADDED_NID;
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.obj= &ob;
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ob.nid=n;
342221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		adp=lh_ADDED_OBJ_retrieve(added,&ad);
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (adp != NULL)
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(adp->obj->sn);
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OBJerr(OBJ_F_OBJ_NID2SN,OBJ_R_UNKNOWN_NID);
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(NULL);
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char *OBJ_nid2ln(int n)
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ADDED_OBJ ad,*adp;
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT ob;
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((n >= 0) && (n < NUM_NID))
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((n != NID_undef) && (nid_objs[n].nid == NID_undef))
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OBJerr(OBJ_F_OBJ_NID2LN,OBJ_R_UNKNOWN_NID);
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(NULL);
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(nid_objs[n].ln);
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (added == NULL)
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(NULL);
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.type=ADDED_NID;
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.obj= &ob;
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ob.nid=n;
374221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		adp=lh_ADDED_OBJ_retrieve(added,&ad);
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (adp != NULL)
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(adp->obj->ln);
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OBJerr(OBJ_F_OBJ_NID2LN,OBJ_R_UNKNOWN_NID);
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(NULL);
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int obj_cmp(const ASN1_OBJECT * const *ap, const unsigned int *bp)
386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int j;
388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const ASN1_OBJECT *a= *ap;
389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const ASN1_OBJECT *b= &nid_objs[*bp];
390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
391221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	j=(a->length - b->length);
392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        if (j) return(j);
393221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return(memcmp(a->data,b->data,a->length));
394221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIMPLEMENT_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, obj);
397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_obj2nid(const ASN1_OBJECT *a)
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const unsigned int *op;
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ADDED_OBJ ad,*adp;
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a == NULL)
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(NID_undef);
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a->nid != 0)
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(a->nid);
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (added != NULL)
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.type=ADDED_DATA;
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.obj=(ASN1_OBJECT *)a; /* XXX: ugly but harmless */
412221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		adp=lh_ADDED_OBJ_retrieve(added,&ad);
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (adp != NULL) return (adp->obj->nid);
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
415221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	op=OBJ_bsearch_obj(&a, obj_objs, NUM_OBJ);
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (op == NULL)
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(NID_undef);
418221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return(nid_objs[*op].nid);
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Convert an object name into an ASN1_OBJECT
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * if "noname" is not set then search for short and long names first.
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This will convert the "dotted" form into an object: unlike OBJ_txt2nid
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * it can be used with any objects, not just registered ones.
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name)
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int nid = NID_undef;
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT *op=NULL;
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *buf;
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *p;
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const unsigned char *cp;
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i, j;
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!no_name) {
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if( ((nid = OBJ_sn2nid(s)) != NID_undef) ||
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			((nid = OBJ_ln2nid(s)) != NID_undef) )
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					return OBJ_nid2obj(nid);
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Work out size of content octets */
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=a2d_ASN1_OBJECT(NULL,0,s,-1);
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i <= 0) {
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Don't clear the error */
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/*ERR_clear_error();*/
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Work out total size */
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	j = ASN1_object_size(0,i,V_ASN1_OBJECT);
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if((buf=(unsigned char *)OPENSSL_malloc(j)) == NULL) return NULL;
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p = buf;
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Write out tag+length */
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_put_object(&p,0,i,V_ASN1_OBJECT,V_ASN1_UNIVERSAL);
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Write out contents */
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	a2d_ASN1_OBJECT(p,i,s,-1);
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cp=buf;
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	op=d2i_ASN1_OBJECT(NULL,&cp,j);
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(buf);
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return op;
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name)
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,n=0,len,nid, first, use_bn;
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIGNUM *bl;
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long l;
471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const unsigned char *p;
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char tbuf[DECIMAL_SIZE(i)+DECIMAL_SIZE(l)+2];
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((a == NULL) || (a->data == NULL)) {
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		buf[0]='\0';
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(0);
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!no_name && (nid=OBJ_obj2nid(a)) != NID_undef)
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		const char *s;
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s=OBJ_nid2ln(nid);
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (s == NULL)
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s=OBJ_nid2sn(nid);
48698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		if (s)
48798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			{
48898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			if (buf)
48998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom				BUF_strlcpy(buf,s,buf_len);
49098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			n=strlen(s);
49198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			return n;
49298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			}
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len=a->length;
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p=a->data;
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	first = 1;
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bl = NULL;
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (len > 0)
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		l=0;
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		use_bn = 0;
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (;;)
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			unsigned char c = *p++;
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			len--;
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((len == 0) && (c & 0x80))
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (use_bn)
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!BN_add_word(bl, c & 0x7f))
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l |= c  & 0x7f;
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(c & 0x80))
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!use_bn && (l > (ULONG_MAX >> 7L)))
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!bl && !(bl = BN_new()))
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!BN_set_word(bl, l))
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				use_bn = 1;
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (use_bn)
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!BN_lshift(bl, bl, 7))
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l<<=7L;
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (first)
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			first = 0;
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (l >= 80)
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				i = 2;
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (use_bn)
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (!BN_sub_word(bl, 80))
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						goto err;
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					l -= 80;
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				i=(int)(l/40);
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l-=(long)(i*40);
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (buf && (buf_len > 0))
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*buf++ = i + '0';
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				buf_len--;
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			n++;
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (use_bn)
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			char *bndec;
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			bndec = BN_bn2dec(bl);
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!bndec)
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i = strlen(bndec);
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (buf)
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (buf_len > 0)
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					*buf++ = '.';
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf_len--;
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BUF_strlcpy(buf,bndec,buf_len);
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (i > buf_len)
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf += buf_len;
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf_len = 0;
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf+=i;
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf_len-=i;
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			n++;
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			n += i;
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OPENSSL_free(bndec);
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_snprintf(tbuf,sizeof tbuf,".%lu",l);
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i=strlen(tbuf);
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (buf && (buf_len > 0))
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BUF_strlcpy(buf,tbuf,buf_len);
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (i > buf_len)
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf += buf_len;
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf_len = 0;
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf+=i;
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf_len-=i;
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			n+=i;
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			l=0;
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bl)
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BN_free(bl);
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return n;
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bl)
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BN_free(bl);
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return -1;
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_txt2nid(const char *s)
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT *obj;
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int nid;
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	obj = OBJ_txt2obj(s, 0);
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nid = OBJ_obj2nid(obj);
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT_free(obj);
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return nid;
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_ln2nid(const char *s)
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
640221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ASN1_OBJECT o;
641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const ASN1_OBJECT *oo= &o;
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ADDED_OBJ ad,*adp;
643221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const unsigned int *op;
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	o.ln=s;
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (added != NULL)
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.type=ADDED_LNAME;
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.obj= &o;
650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		adp=lh_ADDED_OBJ_retrieve(added,&ad);
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (adp != NULL) return (adp->obj->nid);
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
653221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	op=OBJ_bsearch_ln(&oo, ln_objs, NUM_LN);
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (op == NULL) return(NID_undef);
655221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return(nid_objs[*op].nid);
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_sn2nid(const char *s)
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
660221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ASN1_OBJECT o;
661221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const ASN1_OBJECT *oo= &o;
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ADDED_OBJ ad,*adp;
663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const unsigned int *op;
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	o.sn=s;
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (added != NULL)
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.type=ADDED_SNAME;
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ad.obj= &o;
670221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		adp=lh_ADDED_OBJ_retrieve(added,&ad);
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (adp != NULL) return (adp->obj->nid);
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
673221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	op=OBJ_bsearch_sn(&oo, sn_objs, NUM_SN);
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (op == NULL) return(NID_undef);
675221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return(nid_objs[*op].nid);
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
678221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst void *OBJ_bsearch_(const void *key, const void *base, int num, int size,
679221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			 int (*cmp)(const void *, const void *))
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
681221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return OBJ_bsearch_ex_(key, base, num, size, cmp, 0);
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
684221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst void *OBJ_bsearch_ex_(const void *key, const void *base_, int num,
685221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			    int size,
686221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			    int (*cmp)(const void *, const void *),
687221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			    int flags)
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
689221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const char *base=base_;
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int l,h,i=0,c=0;
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char *p = NULL;
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (num == 0) return(NULL);
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l=0;
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	h=num;
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (l < h)
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=(l+h)/2;
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p= &(base[i*size]);
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		c=(*cmp)(key,p);
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (c < 0)
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			h=i;
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (c > 0)
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			l=i+1;
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* THIS IS A KLUDGE - Because the *_obj is sorted in ASCII order, and
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * I don't have perl (yet), we revert to a *LINEAR* search
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * when the object wasn't found in the binary search.
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c != 0)
714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<num; ++i)
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p= &(base[i*size]);
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c = (*cmp)(key,p);
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (c == 0 || (c < 0 && (flags & OBJ_BSEARCH_VALUE_ON_NOMATCH)))
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return p;
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c != 0 && !(flags & OBJ_BSEARCH_VALUE_ON_NOMATCH))
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p = NULL;
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (c == 0 && (flags & OBJ_BSEARCH_FIRST_VALUE_ON_MATCH))
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while(i > 0 && (*cmp)(key,&(base[(i-1)*size])) == 0)
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i--;
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p = &(base[i*size]);
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(p);
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_create_objects(BIO *in)
736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	MS_STATIC char buf[512];
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,num=0;
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *o,*s,*l=NULL;
740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s=o=NULL;
744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=BIO_gets(in,buf,512);
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i <= 0) return(num);
746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		buf[i-1]='\0';
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!isalnum((unsigned char)buf[0])) return(num);
748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		o=s=buf;
749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (isdigit((unsigned char)*s) || (*s == '.'))
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s++;
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*s != '\0')
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*(s++)='\0';
754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (isspace((unsigned char)*s))
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				s++;
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*s == '\0')
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				s=NULL;
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l=s;
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				while ((*l != '\0') && !isspace((unsigned char)*l))
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					l++;
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (*l != '\0')
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					*(l++)='\0';
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					while (isspace((unsigned char)*l))
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						l++;
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (*l == '\0') l=NULL;
769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					l=NULL;
772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s=NULL;
776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((o == NULL) || (*o == '\0')) return(num);
777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!OBJ_create(o,s,l)) return(num);
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		num++;
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* return(num); */
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OBJ_create(const char *oid, const char *sn, const char *ln)
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ok=0;
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT *op=NULL;
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *buf;
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=a2d_ASN1_OBJECT(NULL,0,oid,-1);
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i <= 0) return(0);
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((buf=(unsigned char *)OPENSSL_malloc(i)) == NULL)
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OBJerr(OBJ_F_OBJ_CREATE,ERR_R_MALLOC_FAILURE);
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(0);
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=a2d_ASN1_OBJECT(buf,i,oid,-1);
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i == 0)
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	op=(ASN1_OBJECT *)ASN1_OBJECT_create(OBJ_new_nid(1),buf,i,sn,ln);
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (op == NULL)
803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ok=OBJ_add_object(op);
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_OBJECT_free(op);
807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(buf);
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ok);
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
811