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