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