1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* tasn_new.c */ 2e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project 2000. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 2000-2004 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 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stddef.h> 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/asn1.h> 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/asn1t.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int combine); 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it); 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it); 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it) 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_VALUE *ret = NULL; 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ASN1_item_ex_new(&ret, it) > 0) 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Allocate an ASN1 structure */ 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return asn1_item_ex_combine_new(pval, it, 0); 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int combine) 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const ASN1_TEMPLATE *tt = NULL; 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const ASN1_COMPAT_FUNCS *cf; 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const ASN1_EXTERN_FUNCS *ef; 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const ASN1_AUX *aux = it->funcs; 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_aux_cb *asn1_cb; 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_VALUE **pseqval; 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (aux && aux->asn1_cb) 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_cb = aux->asn1_cb; 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_cb = 0; 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!combine) *pval = NULL; 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CRYPTO_MDEBUG 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it->sname) 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_push_info(it->sname); 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch(it->itype) 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_EXTERN: 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ef = it->funcs; 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ef && ef->asn1_ex_new) 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ef->asn1_ex_new(pval, it)) 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto memerr; 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_COMPAT: 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cf = it->funcs; 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cf && cf->asn1_new) { 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = cf->asn1_new(); 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!*pval) 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto memerr; 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_PRIMITIVE: 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it->templates) 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ASN1_template_new(pval, it->templates)) 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto memerr; 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!ASN1_primitive_new(pval, it)) 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto memerr; 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_MSTRING: 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ASN1_primitive_new(pval, it)) 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto memerr; 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_CHOICE: 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (asn1_cb) 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL); 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!i) 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto auxerr; 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i==2) 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CRYPTO_MDEBUG 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it->sname) 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_pop_info(); 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!combine) 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = OPENSSL_malloc(it->size); 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!*pval) 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto memerr; 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(*pval, 0, it->size); 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_set_choice_selector(pval, -1, it); 169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL)) 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto auxerr; 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_NDEF_SEQUENCE: 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_SEQUENCE: 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (asn1_cb) 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL); 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!i) 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto auxerr; 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i==2) 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CRYPTO_MDEBUG 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it->sname) 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_pop_info(); 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!combine) 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = OPENSSL_malloc(it->size); 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!*pval) 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto memerr; 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(*pval, 0, it->size); 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_do_lock(pval, 0, it); 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_enc_init(pval, it); 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pseqval = asn1_get_field_ptr(pval, tt); 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ASN1_template_new(pseqval, tt)) 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto memerr; 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL)) 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto auxerr; 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CRYPTO_MDEBUG 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it->sname) CRYPTO_pop_info(); 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memerr: 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1err(ASN1_F_ASN1_ITEM_EX_COMBINE_NEW, ERR_R_MALLOC_FAILURE); 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CRYPTO_MDEBUG 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it->sname) CRYPTO_pop_info(); 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project auxerr: 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1err(ASN1_F_ASN1_ITEM_EX_COMBINE_NEW, ASN1_R_AUX_ERROR); 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_item_ex_free(pval, it); 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CRYPTO_MDEBUG 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it->sname) CRYPTO_pop_info(); 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const ASN1_EXTERN_FUNCS *ef; 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch(it->itype) 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_EXTERN: 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ef = it->funcs; 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ef && ef->asn1_ex_clear) 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ef->asn1_ex_clear(pval, it); 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else *pval = NULL; 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_PRIMITIVE: 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it->templates) 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_template_clear(pval, it->templates); 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_primitive_clear(pval, it); 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_MSTRING: 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_primitive_clear(pval, it); 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_COMPAT: 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_CHOICE: 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_SEQUENCE: 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ASN1_ITYPE_NDEF_SEQUENCE: 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = NULL; 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const ASN1_ITEM *it = ASN1_ITEM_ptr(tt->item); 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret; 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tt->flags & ASN1_TFLG_OPTIONAL) 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_template_clear(pval, tt); 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If ANY DEFINED BY nothing to do */ 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tt->flags & ASN1_TFLG_ADB_MASK) 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = NULL; 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CRYPTO_MDEBUG 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tt->field_name) 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_push_info(tt->field_name); 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If SET OF or SEQUENCE OF, its a STACK */ 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tt->flags & ASN1_TFLG_SK_MASK) 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(ASN1_VALUE) *skval; 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project skval = sk_ASN1_VALUE_new_null(); 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!skval) 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1err(ASN1_F_ASN1_TEMPLATE_NEW, ERR_R_MALLOC_FAILURE); 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 0; 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto done; 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = (ASN1_VALUE *)skval; 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 1; 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto done; 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Otherwise pass it back to the item routine */ 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = asn1_item_ex_combine_new(pval, it, tt->flags & ASN1_TFLG_COMBINE); 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project done: 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CRYPTO_MDEBUG 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it->sname) 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_pop_info(); 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If ADB or STACK just NULL the field */ 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tt->flags & (ASN1_TFLG_ADB_MASK|ASN1_TFLG_SK_MASK)) 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = NULL; 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_item_clear(pval, ASN1_ITEM_ptr(tt->item)); 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* NB: could probably combine most of the real XXX_new() behaviour and junk 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * all the old functions. 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_TYPE *typ; 328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_STRING *str; 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int utype; 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it && it->funcs) 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const ASN1_PRIMITIVE_FUNCS *pf = it->funcs; 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (pf->prim_new) 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return pf->prim_new(pval, it); 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!it || (it->itype == ASN1_ITYPE_MSTRING)) 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project utype = -1; 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project utype = it->utype; 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch(utype) 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case V_ASN1_OBJECT: 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = (ASN1_VALUE *)OBJ_nid2obj(NID_undef); 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case V_ASN1_BOOLEAN: 349221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *(ASN1_BOOLEAN *)pval = it->size; 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case V_ASN1_NULL: 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = (ASN1_VALUE *)1; 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case V_ASN1_ANY: 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project typ = OPENSSL_malloc(sizeof(ASN1_TYPE)); 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!typ) 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project typ->value.ptr = NULL; 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project typ->type = -1; 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = (ASN1_VALUE *)typ; 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 366221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str = ASN1_STRING_type_new(utype); 367221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (it->itype == ASN1_ITYPE_MSTRING && str) 368221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str->flags |= ASN1_STRING_FLAG_MSTRING; 369221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *pval = (ASN1_VALUE *)str; 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*pval) 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 377221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int utype; 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (it && it->funcs) 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const ASN1_PRIMITIVE_FUNCS *pf = it->funcs; 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (pf->prim_clear) 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pf->prim_clear(pval, it); 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pval = NULL; 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!it || (it->itype == ASN1_ITYPE_MSTRING)) 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project utype = -1; 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project utype = it->utype; 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (utype == V_ASN1_BOOLEAN) 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *(ASN1_BOOLEAN *)pval = it->size; 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else *pval = NULL; 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 397