1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* a_strnid.c */ 2e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project 1999. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1999 The OpenSSL Project. All rights reserved. 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the documentation and/or other materials provided with the 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribution. 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * software must display the following acknowledgment: 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * endorse or promote products derived from this software without 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * prior written permission. For written permission, please contact 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * licensing@OpenSSL.org. 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL" 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nor may "OpenSSL" appear in their names without prior written 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permission of the OpenSSL Project. 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * acknowledgment: 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE. 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ==================================================================== 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com). This product includes software written by Tim 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com). 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <ctype.h> 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h" 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/asn1.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STACK_OF(ASN1_STRING_TABLE) *stable = NULL; 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void st_free(ASN1_STRING_TABLE *tbl); 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int sk_table_cmp(const ASN1_STRING_TABLE * const *a, 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const ASN1_STRING_TABLE * const *b); 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This is the global mask for the mbstring functions: this is use to 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * mask out certain types (such as BMPString and UTF8String) because 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * certain software (e.g. Netscape) has problems with them. 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long global_mask = 0xFFFFFFFFL; 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid ASN1_STRING_set_default_mask(unsigned long mask) 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project global_mask = mask; 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned long ASN1_STRING_get_default_mask(void) 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return global_mask; 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This function sets the default to various "flavours" of configuration. 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * based on an ASCII string. Currently this is: 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * MASK:XXXX : a numerical mask value. 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nobmp : Don't use BMPStrings (just Printable, T61). 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * pkix : PKIX recommendation in RFC2459. 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * utf8only : only use UTF8Strings (RFC2459 recommendation for 2004). 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * default: the default value, Printable, T61, BMP. 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 9881c4de7869b646592127e952cda763abf8305069Brian Carlstromint ASN1_STRING_set_default_mask_asc(const char *p) 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long mask; 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *end; 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!strncmp(p, "MASK:", 5)) { 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!p[5]) return 0; 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mask = strtoul(p + 5, &end, 0); 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(*end) return 0; 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else if(!strcmp(p, "nombstr")) 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mask = ~((unsigned long)(B_ASN1_BMPSTRING|B_ASN1_UTF8STRING)); 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if(!strcmp(p, "pkix")) 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mask = ~((unsigned long)B_ASN1_T61STRING); 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if(!strcmp(p, "utf8only")) mask = B_ASN1_UTF8STRING; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if(!strcmp(p, "default")) 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mask = 0xFFFFFFFFL; 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else return 0; 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_STRING_set_default_mask(mask); 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The following function generates an ASN1_STRING based on limits in a table. 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Frequently the types and length of an ASN1_STRING are restricted by a 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * corresponding OID. For example certificates and certificate requests. 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in, 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int inlen, int inform, int nid) 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_STRING_TABLE *tbl; 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_STRING *str = NULL; 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long mask; 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret; 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!out) out = &str; 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tbl = ASN1_STRING_TABLE_get(nid); 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(tbl) { 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mask = tbl->mask; 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!(tbl->flags & STABLE_NO_MASK)) mask &= global_mask; 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = ASN1_mbstring_ncopy(out, in, inlen, inform, mask, 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tbl->minsize, tbl->maxsize); 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else ret = ASN1_mbstring_copy(out, in, inlen, inform, DIRSTRING_TYPE & global_mask); 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(ret <= 0) return NULL; 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return *out; 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Now the tables and helper functions for the string table: 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* size limits: this stuff is taken straight from RFC3280 */ 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ub_name 32768 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ub_common_name 64 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ub_locality_name 128 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ub_state_name 128 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ub_organization_name 64 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ub_organization_unit_name 64 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ub_title 64 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ub_email_address 128 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ub_serial_number 64 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This table must be kept in NID order */ 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic const ASN1_STRING_TABLE tbl_standard[] = { 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_commonName, 1, ub_common_name, DIRSTRING_TYPE, 0}, 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_countryName, 2, 2, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK}, 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_localityName, 1, ub_locality_name, DIRSTRING_TYPE, 0}, 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_stateOrProvinceName, 1, ub_state_name, DIRSTRING_TYPE, 0}, 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_organizationName, 1, ub_organization_name, DIRSTRING_TYPE, 0}, 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_organizationalUnitName, 1, ub_organization_unit_name, DIRSTRING_TYPE, 0}, 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_pkcs9_emailAddress, 1, ub_email_address, B_ASN1_IA5STRING, STABLE_NO_MASK}, 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_pkcs9_unstructuredName, 1, -1, PKCS9STRING_TYPE, 0}, 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_pkcs9_challengePassword, 1, -1, PKCS9STRING_TYPE, 0}, 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_pkcs9_unstructuredAddress, 1, -1, DIRSTRING_TYPE, 0}, 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_givenName, 1, ub_name, DIRSTRING_TYPE, 0}, 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_surname, 1, ub_name, DIRSTRING_TYPE, 0}, 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_initials, 1, ub_name, DIRSTRING_TYPE, 0}, 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_serialNumber, 1, ub_serial_number, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK}, 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_friendlyName, -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK}, 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_name, 1, ub_name, DIRSTRING_TYPE, 0}, 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_dnQualifier, -1, -1, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK}, 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_domainComponent, 1, -1, B_ASN1_IA5STRING, STABLE_NO_MASK}, 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{NID_ms_csp_name, -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK} 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int sk_table_cmp(const ASN1_STRING_TABLE * const *a, 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const ASN1_STRING_TABLE * const *b) 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return (*a)->nid - (*b)->nid; 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDECLARE_OBJ_BSEARCH_CMP_FN(ASN1_STRING_TABLE, ASN1_STRING_TABLE, table); 189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int table_cmp(const ASN1_STRING_TABLE *a, const ASN1_STRING_TABLE *b) 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return a->nid - b->nid; 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIMPLEMENT_OBJ_BSEARCH_CMP_FN(ASN1_STRING_TABLE, ASN1_STRING_TABLE, table); 196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid) 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int idx; 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_STRING_TABLE *ttmp; 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_STRING_TABLE fnd; 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project fnd.nid = nid; 203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ttmp = OBJ_bsearch_table(&fnd, tbl_standard, 204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(tbl_standard)/sizeof(ASN1_STRING_TABLE)); 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(ttmp) return ttmp; 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!stable) return NULL; 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project idx = sk_ASN1_STRING_TABLE_find(stable, &fnd); 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(idx < 0) return NULL; 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return sk_ASN1_STRING_TABLE_value(stable, idx); 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_STRING_TABLE_add(int nid, 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long minsize, long maxsize, unsigned long mask, 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long flags) 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_STRING_TABLE *tmp; 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char new_nid = 0; 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags &= ~STABLE_FLAGS_MALLOC; 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!stable) stable = sk_ASN1_STRING_TABLE_new(sk_table_cmp); 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!stable) { 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1err(ASN1_F_ASN1_STRING_TABLE_ADD, ERR_R_MALLOC_FAILURE); 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!(tmp = ASN1_STRING_TABLE_get(nid))) { 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp = OPENSSL_malloc(sizeof(ASN1_STRING_TABLE)); 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!tmp) { 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1err(ASN1_F_ASN1_STRING_TABLE_ADD, 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_R_MALLOC_FAILURE); 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp->flags = flags | STABLE_FLAGS_MALLOC; 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp->nid = nid; 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project new_nid = 1; 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else tmp->flags = (tmp->flags & STABLE_FLAGS_MALLOC) | flags; 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(minsize != -1) tmp->minsize = minsize; 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(maxsize != -1) tmp->maxsize = maxsize; 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp->mask = mask; 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(new_nid) sk_ASN1_STRING_TABLE_push(stable, tmp); 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid ASN1_STRING_TABLE_cleanup(void) 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(ASN1_STRING_TABLE) *tmp; 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp = stable; 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!tmp) return; 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project stable = NULL; 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_ASN1_STRING_TABLE_pop_free(tmp, st_free); 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void st_free(ASN1_STRING_TABLE *tbl) 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(tbl->flags & STABLE_FLAGS_MALLOC) OPENSSL_free(tbl); 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_STACK_OF(ASN1_STRING_TABLE) 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef STRING_TABLE_TEST 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmain() 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_STRING_TABLE *tmp; 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i, last_nid = -1; 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (tmp = tbl_standard, i = 0; 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i < sizeof(tbl_standard)/sizeof(ASN1_STRING_TABLE); i++, tmp++) 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tmp->nid < last_nid) 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project last_nid = 0; 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project last_nid = tmp->nid; 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (last_nid != 0) 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("Table order OK\n"); 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project exit(0); 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (tmp = tbl_standard, i = 0; 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i < sizeof(tbl_standard)/sizeof(ASN1_STRING_TABLE); i++, tmp++) 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("Index %d, NID %d, Name=%s\n", i, tmp->nid, 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OBJ_nid2ln(tmp->nid)); 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 291