Home | History | Annotate | Download | only in asn1
      1 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      2  * All rights reserved.
      3  *
      4  * This package is an SSL implementation written
      5  * by Eric Young (eay (at) cryptsoft.com).
      6  * The implementation was written so as to conform with Netscapes SSL.
      7  *
      8  * This library is free for commercial and non-commercial use as long as
      9  * the following conditions are aheared to.  The following conditions
     10  * apply to all code found in this distribution, be it the RC4, RSA,
     11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     12  * included with this distribution is covered by the same copyright terms
     13  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     14  *
     15  * Copyright remains Eric Young's, and as such any Copyright notices in
     16  * the code are not to be removed.
     17  * If this package is used in a product, Eric Young should be given attribution
     18  * as the author of the parts of the library used.
     19  * This can be in the form of a textual message at program startup or
     20  * in documentation (online or textual) provided with the package.
     21  *
     22  * Redistribution and use in source and binary forms, with or without
     23  * modification, are permitted provided that the following conditions
     24  * are met:
     25  * 1. Redistributions of source code must retain the copyright
     26  *    notice, this list of conditions and the following disclaimer.
     27  * 2. Redistributions in binary form must reproduce the above copyright
     28  *    notice, this list of conditions and the following disclaimer in the
     29  *    documentation and/or other materials provided with the distribution.
     30  * 3. All advertising materials mentioning features or use of this software
     31  *    must display the following acknowledgement:
     32  *    "This product includes cryptographic software written by
     33  *     Eric Young (eay (at) cryptsoft.com)"
     34  *    The word 'cryptographic' can be left out if the rouines from the library
     35  *    being used are not cryptographic related :-).
     36  * 4. If you include any Windows specific code (or a derivative thereof) from
     37  *    the apps directory (application code) you must include an acknowledgement:
     38  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     39  *
     40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     50  * SUCH DAMAGE.
     51  *
     52  * The licence and distribution terms for any publically available version or
     53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     54  * copied and put under another distribution licence
     55  * [including the GNU Public Licence.] */
     56 
     57 #include <openssl/asn1.h>
     58 
     59 #include <string.h>
     60 
     61 #include <openssl/asn1t.h>
     62 #include <openssl/buf.h>
     63 #include <openssl/err.h>
     64 #include <openssl/mem.h>
     65 
     66 #include "../internal.h"
     67 
     68 
     69 static int asn1_check_eoc(const unsigned char **in, long len);
     70 static int asn1_find_end(const unsigned char **in, long len, char inf);
     71 
     72 static int asn1_collect(BUF_MEM *buf, const unsigned char **in, long len,
     73 			char inf, int tag, int aclass, int depth);
     74 
     75 static int collect_data(BUF_MEM *buf, const unsigned char **p, long plen);
     76 
     77 static int asn1_check_tlen(long *olen, int *otag, unsigned char *oclass,
     78 				char *inf, char *cst,
     79 				const unsigned char **in, long len,
     80 				int exptag, int expclass, char opt,
     81 				ASN1_TLC *ctx);
     82 
     83 static int asn1_template_ex_d2i(ASN1_VALUE **pval,
     84 				const unsigned char **in, long len,
     85 				const ASN1_TEMPLATE *tt, char opt,
     86 				ASN1_TLC *ctx);
     87 static int asn1_template_noexp_d2i(ASN1_VALUE **val,
     88 				const unsigned char **in, long len,
     89 				const ASN1_TEMPLATE *tt, char opt,
     90 				ASN1_TLC *ctx);
     91 static int asn1_d2i_ex_primitive(ASN1_VALUE **pval,
     92 				const unsigned char **in, long len,
     93 				const ASN1_ITEM *it,
     94 				int tag, int aclass, char opt, ASN1_TLC *ctx);
     95 
     96 /* Table to convert tags to bit values, used for MSTRING type */
     97 static const unsigned long tag2bit[32] = {
     98 0,	0,	0,	B_ASN1_BIT_STRING,	/* tags  0 -  3 */
     99 B_ASN1_OCTET_STRING,	0,	0,		B_ASN1_UNKNOWN,/* tags  4- 7 */
    100 B_ASN1_UNKNOWN,	B_ASN1_UNKNOWN,	B_ASN1_UNKNOWN,	B_ASN1_UNKNOWN,/* tags  8-11 */
    101 B_ASN1_UTF8STRING,B_ASN1_UNKNOWN,B_ASN1_UNKNOWN,B_ASN1_UNKNOWN,/* tags 12-15 */
    102 B_ASN1_SEQUENCE,0,B_ASN1_NUMERICSTRING,B_ASN1_PRINTABLESTRING, /* tags 16-19 */
    103 B_ASN1_T61STRING,B_ASN1_VIDEOTEXSTRING,B_ASN1_IA5STRING,       /* tags 20-22 */
    104 B_ASN1_UTCTIME, B_ASN1_GENERALIZEDTIME,			       /* tags 23-24 */
    105 B_ASN1_GRAPHICSTRING,B_ASN1_ISO64STRING,B_ASN1_GENERALSTRING,  /* tags 25-27 */
    106 B_ASN1_UNIVERSALSTRING,B_ASN1_UNKNOWN,B_ASN1_BMPSTRING,B_ASN1_UNKNOWN, /* tags 28-31 */
    107 	};
    108 
    109 unsigned long ASN1_tag2bit(int tag)
    110 	{
    111 	if ((tag < 0) || (tag > 30)) return 0;
    112 	return tag2bit[tag];
    113 	}
    114 
    115 /* Macro to initialize and invalidate the cache */
    116 
    117 #define asn1_tlc_clear(c)	if (c) (c)->valid = 0
    118 /* Version to avoid compiler warning about 'c' always non-NULL */
    119 #define asn1_tlc_clear_nc(c)	(c)->valid = 0
    120 
    121 /* Decode an ASN1 item, this currently behaves just
    122  * like a standard 'd2i' function. 'in' points to
    123  * a buffer to read the data from, in future we will
    124  * have more advanced versions that can input data
    125  * a piece at a time and this will simply be a special
    126  * case.
    127  */
    128 
    129 ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **pval,
    130 		const unsigned char **in, long len, const ASN1_ITEM *it)
    131 	{
    132 	ASN1_TLC c;
    133 	ASN1_VALUE *ptmpval = NULL;
    134 	if (!pval)
    135 		pval = &ptmpval;
    136 	asn1_tlc_clear_nc(&c);
    137 	if (ASN1_item_ex_d2i(pval, in, len, it, -1, 0, 0, &c) > 0)
    138 		return *pval;
    139 	return NULL;
    140 	}
    141 
    142 int ASN1_template_d2i(ASN1_VALUE **pval,
    143 		const unsigned char **in, long len, const ASN1_TEMPLATE *tt)
    144 	{
    145 	ASN1_TLC c;
    146 	asn1_tlc_clear_nc(&c);
    147 	return asn1_template_ex_d2i(pval, in, len, tt, 0, &c);
    148 	}
    149 
    150 
    151 /* Decode an item, taking care of IMPLICIT tagging, if any.
    152  * If 'opt' set and tag mismatch return -1 to handle OPTIONAL
    153  */
    154 
    155 int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
    156 			const ASN1_ITEM *it,
    157 			int tag, int aclass, char opt, ASN1_TLC *ctx)
    158 	{
    159 	const ASN1_TEMPLATE *tt, *errtt = NULL;
    160 	const ASN1_COMPAT_FUNCS *cf;
    161 	const ASN1_EXTERN_FUNCS *ef;
    162 	const ASN1_AUX *aux = it->funcs;
    163 	ASN1_aux_cb *asn1_cb;
    164 	const unsigned char *p = NULL, *q;
    165 	unsigned char *wp=NULL;	/* BIG FAT WARNING!  BREAKS CONST WHERE USED */
    166 	unsigned char imphack = 0, oclass;
    167 	char seq_eoc, seq_nolen, cst, isopt;
    168 	long tmplen;
    169 	int i;
    170 	int otag;
    171 	int ret = 0;
    172 	ASN1_VALUE **pchptr, *ptmpval;
    173 	int combine = aclass & ASN1_TFLG_COMBINE;
    174 	if (!pval)
    175 		return 0;
    176 	if (aux && aux->asn1_cb)
    177 		asn1_cb = aux->asn1_cb;
    178 	else asn1_cb = 0;
    179 
    180 	switch(it->itype)
    181 		{
    182 		case ASN1_ITYPE_PRIMITIVE:
    183 		if (it->templates)
    184 			{
    185 			/* tagging or OPTIONAL is currently illegal on an item
    186 			 * template because the flags can't get passed down.
    187 			 * In practice this isn't a problem: we include the
    188 			 * relevant flags from the item template in the
    189 			 * template itself.
    190 			 */
    191 			if ((tag != -1) || opt)
    192 				{
    193 				OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE);
    194 				goto err;
    195 				}
    196 			return asn1_template_ex_d2i(pval, in, len,
    197 					it->templates, opt, ctx);
    198 		}
    199 		return asn1_d2i_ex_primitive(pval, in, len, it,
    200 						tag, aclass, opt, ctx);
    201 		break;
    202 
    203 		case ASN1_ITYPE_MSTRING:
    204 		p = *in;
    205 		/* Just read in tag and class */
    206 		ret = asn1_check_tlen(NULL, &otag, &oclass, NULL, NULL,
    207 						&p, len, -1, 0, 1, ctx);
    208 		if (!ret)
    209 			{
    210 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    211 			goto err;
    212 			}
    213 
    214 		/* Must be UNIVERSAL class */
    215 		if (oclass != V_ASN1_UNIVERSAL)
    216 			{
    217 			/* If OPTIONAL, assume this is OK */
    218 			if (opt) return -1;
    219 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_MSTRING_NOT_UNIVERSAL);
    220 			goto err;
    221 			}
    222 		/* Check tag matches bit map */
    223 		if (!(ASN1_tag2bit(otag) & it->utype))
    224 			{
    225 			/* If OPTIONAL, assume this is OK */
    226 			if (opt)
    227 				return -1;
    228 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_MSTRING_WRONG_TAG);
    229 			goto err;
    230 			}
    231 		return asn1_d2i_ex_primitive(pval, in, len,
    232 						it, otag, 0, 0, ctx);
    233 
    234 		case ASN1_ITYPE_EXTERN:
    235 		/* Use new style d2i */
    236 		ef = it->funcs;
    237 		return ef->asn1_ex_d2i(pval, in, len,
    238 						it, tag, aclass, opt, ctx);
    239 
    240 		case ASN1_ITYPE_COMPAT:
    241 		/* we must resort to old style evil hackery */
    242 		cf = it->funcs;
    243 
    244 		/* If OPTIONAL see if it is there */
    245 		if (opt)
    246 			{
    247 			int exptag;
    248 			p = *in;
    249 			if (tag == -1)
    250 				exptag = it->utype;
    251 			else exptag = tag;
    252 			/* Don't care about anything other than presence
    253 			 * of expected tag */
    254 
    255 			ret = asn1_check_tlen(NULL, NULL, NULL, NULL, NULL,
    256 					&p, len, exptag, aclass, 1, ctx);
    257 			if (!ret)
    258 				{
    259 				OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    260 				goto err;
    261 				}
    262 			if (ret == -1)
    263 				return -1;
    264 			}
    265 
    266 		/* This is the old style evil hack IMPLICIT handling:
    267 		 * since the underlying code is expecting a tag and
    268 		 * class other than the one present we change the
    269 		 * buffer temporarily then change it back afterwards.
    270 		 * This doesn't and never did work for tags > 30.
    271 		 *
    272 		 * Yes this is *horrible* but it is only needed for
    273 		 * old style d2i which will hopefully not be around
    274 		 * for much longer.
    275 		 * FIXME: should copy the buffer then modify it so
    276 		 * the input buffer can be const: we should *always*
    277 		 * copy because the old style d2i might modify the
    278 		 * buffer.
    279 		 */
    280 
    281 		if (tag != -1)
    282 			{
    283 			wp = *(unsigned char **)in;
    284 			imphack = *wp;
    285 			if (p == NULL)
    286 				{
    287 				OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    288 				goto err;
    289 				}
    290 			*wp = (unsigned char)((*p & V_ASN1_CONSTRUCTED)
    291 								| it->utype);
    292 			}
    293 
    294 		ptmpval = cf->asn1_d2i(pval, in, len);
    295 
    296 		if (tag != -1)
    297 			*wp = imphack;
    298 
    299 		if (ptmpval)
    300 			return 1;
    301 
    302 		OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    303 		goto err;
    304 
    305 
    306 		case ASN1_ITYPE_CHOICE:
    307 		if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL))
    308 				goto auxerr;
    309 
    310 		if (*pval)
    311 			{
    312 			/* Free up and zero CHOICE value if initialised */
    313 			i = asn1_get_choice_selector(pval, it);
    314 			if ((i >= 0) && (i < it->tcount))
    315 				{
    316 				tt = it->templates + i;
    317 				pchptr = asn1_get_field_ptr(pval, tt);
    318 				ASN1_template_free(pchptr, tt);
    319 				asn1_set_choice_selector(pval, -1, it);
    320 				}
    321 			}
    322 		else if (!ASN1_item_ex_new(pval, it))
    323 			{
    324 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    325 			goto err;
    326 			}
    327 		/* CHOICE type, try each possibility in turn */
    328 		p = *in;
    329 		for (i = 0, tt=it->templates; i < it->tcount; i++, tt++)
    330 			{
    331 			pchptr = asn1_get_field_ptr(pval, tt);
    332 			/* We mark field as OPTIONAL so its absence
    333 			 * can be recognised.
    334 			 */
    335 			ret = asn1_template_ex_d2i(pchptr, &p, len, tt, 1, ctx);
    336 			/* If field not present, try the next one */
    337 			if (ret == -1)
    338 				continue;
    339 			/* If positive return, read OK, break loop */
    340 			if (ret > 0)
    341 				break;
    342 			/* Otherwise must be an ASN1 parsing error */
    343 			errtt = tt;
    344 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    345 			goto err;
    346 			}
    347 
    348 		/* Did we fall off the end without reading anything? */
    349 		if (i == it->tcount)
    350 			{
    351 			/* If OPTIONAL, this is OK */
    352 			if (opt)
    353 				{
    354 				/* Free and zero it */
    355 				ASN1_item_ex_free(pval, it);
    356 				return -1;
    357 				}
    358 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NO_MATCHING_CHOICE_TYPE);
    359 			goto err;
    360 			}
    361 
    362 		asn1_set_choice_selector(pval, i, it);
    363 		if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL))
    364 				goto auxerr;
    365 		*in = p;
    366 		return 1;
    367 
    368 		case ASN1_ITYPE_NDEF_SEQUENCE:
    369 		case ASN1_ITYPE_SEQUENCE:
    370 		p = *in;
    371 		tmplen = len;
    372 
    373 		/* If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL */
    374 		if (tag == -1)
    375 			{
    376 			tag = V_ASN1_SEQUENCE;
    377 			aclass = V_ASN1_UNIVERSAL;
    378 			}
    379 		/* Get SEQUENCE length and update len, p */
    380 		ret = asn1_check_tlen(&len, NULL, NULL, &seq_eoc, &cst,
    381 					&p, len, tag, aclass, opt, ctx);
    382 		if (!ret)
    383 			{
    384 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    385 			goto err;
    386 			}
    387 		else if (ret == -1)
    388 			return -1;
    389 		if (aux && (aux->flags & ASN1_AFLG_BROKEN))
    390 			{
    391 			len = tmplen - (p - *in);
    392 			seq_nolen = 1;
    393 			}
    394 		/* If indefinite we don't do a length check */
    395 		else seq_nolen = seq_eoc;
    396 		if (!cst)
    397 			{
    398 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_NOT_CONSTRUCTED);
    399 			goto err;
    400 			}
    401 
    402 		if (!*pval && !ASN1_item_ex_new(pval, it))
    403 			{
    404 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    405 			goto err;
    406 			}
    407 
    408 		if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL))
    409 				goto auxerr;
    410 
    411 		/* Free up and zero any ADB found */
    412 		for (i = 0, tt = it->templates; i < it->tcount; i++, tt++)
    413 			{
    414 			if (tt->flags & ASN1_TFLG_ADB_MASK)
    415 				{
    416 				const ASN1_TEMPLATE *seqtt;
    417 				ASN1_VALUE **pseqval;
    418 				seqtt = asn1_do_adb(pval, tt, 1);
    419 				pseqval = asn1_get_field_ptr(pval, seqtt);
    420 				ASN1_template_free(pseqval, seqtt);
    421 				}
    422 			}
    423 
    424 		/* Get each field entry */
    425 		for (i = 0, tt = it->templates; i < it->tcount; i++, tt++)
    426 			{
    427 			const ASN1_TEMPLATE *seqtt;
    428 			ASN1_VALUE **pseqval;
    429 			seqtt = asn1_do_adb(pval, tt, 1);
    430 			if (!seqtt)
    431 				goto err;
    432 			pseqval = asn1_get_field_ptr(pval, seqtt);
    433 			/* Have we ran out of data? */
    434 			if (!len)
    435 				break;
    436 			q = p;
    437 			if (asn1_check_eoc(&p, len))
    438 				{
    439 				if (!seq_eoc)
    440 					{
    441 					OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNEXPECTED_EOC);
    442 					goto err;
    443 					}
    444 				len -= p - q;
    445 				seq_eoc = 0;
    446 				q = p;
    447 				break;
    448 				}
    449 			/* This determines the OPTIONAL flag value. The field
    450 			 * cannot be omitted if it is the last of a SEQUENCE
    451 			 * and there is still data to be read. This isn't
    452 			 * strictly necessary but it increases efficiency in
    453 			 * some cases.
    454 			 */
    455 			if (i == (it->tcount - 1))
    456 				isopt = 0;
    457 			else isopt = (char)(seqtt->flags & ASN1_TFLG_OPTIONAL);
    458 			/* attempt to read in field, allowing each to be
    459 			 * OPTIONAL */
    460 
    461 			ret = asn1_template_ex_d2i(pseqval, &p, len,
    462 							seqtt, isopt, ctx);
    463 			if (!ret)
    464 				{
    465 				errtt = seqtt;
    466 				goto err;
    467 				}
    468 			else if (ret == -1)
    469 				{
    470 				/* OPTIONAL component absent.
    471 				 * Free and zero the field.
    472 				 */
    473 				ASN1_template_free(pseqval, seqtt);
    474 				continue;
    475 				}
    476 			/* Update length */
    477 			len -= p - q;
    478 			}
    479 
    480 		/* Check for EOC if expecting one */
    481 		if (seq_eoc && !asn1_check_eoc(&p, len))
    482 			{
    483 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_EOC);
    484 			goto err;
    485 			}
    486 		/* Check all data read */
    487 		if (!seq_nolen && len)
    488 			{
    489 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_LENGTH_MISMATCH);
    490 			goto err;
    491 			}
    492 
    493 		/* If we get here we've got no more data in the SEQUENCE,
    494 		 * however we may not have read all fields so check all
    495 		 * remaining are OPTIONAL and clear any that are.
    496 		 */
    497 		for (; i < it->tcount; tt++, i++)
    498 			{
    499 			const ASN1_TEMPLATE *seqtt;
    500 			seqtt = asn1_do_adb(pval, tt, 1);
    501 			if (!seqtt)
    502 				goto err;
    503 			if (seqtt->flags & ASN1_TFLG_OPTIONAL)
    504 				{
    505 				ASN1_VALUE **pseqval;
    506 				pseqval = asn1_get_field_ptr(pval, seqtt);
    507 				ASN1_template_free(pseqval, seqtt);
    508 				}
    509 			else
    510 				{
    511 				errtt = seqtt;
    512 				OPENSSL_PUT_ERROR(ASN1, ASN1_R_FIELD_MISSING);
    513 				goto err;
    514 				}
    515 			}
    516 		/* Save encoding */
    517 		if (!asn1_enc_save(pval, *in, p - *in, it))
    518 			goto auxerr;
    519 		if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL))
    520 				goto auxerr;
    521 		*in = p;
    522 		return 1;
    523 
    524 		default:
    525 		return 0;
    526 		}
    527 	auxerr:
    528 	OPENSSL_PUT_ERROR(ASN1, ASN1_R_AUX_ERROR);
    529 	err:
    530 	if (combine == 0)
    531 		ASN1_item_ex_free(pval, it);
    532 	if (errtt)
    533 		ERR_add_error_data(4, "Field=", errtt->field_name,
    534 					", Type=", it->sname);
    535 	else
    536 		ERR_add_error_data(2, "Type=", it->sname);
    537 	return 0;
    538 	}
    539 
    540 /* Templates are handled with two separate functions.
    541  * One handles any EXPLICIT tag and the other handles the rest.
    542  */
    543 
    544 static int asn1_template_ex_d2i(ASN1_VALUE **val,
    545 				const unsigned char **in, long inlen,
    546 				const ASN1_TEMPLATE *tt, char opt,
    547 							ASN1_TLC *ctx)
    548 	{
    549 	int flags, aclass;
    550 	int ret;
    551 	long len;
    552 	const unsigned char *p, *q;
    553 	char exp_eoc;
    554 	if (!val)
    555 		return 0;
    556 	flags = tt->flags;
    557 	aclass = flags & ASN1_TFLG_TAG_CLASS;
    558 
    559 	p = *in;
    560 
    561 	/* Check if EXPLICIT tag expected */
    562 	if (flags & ASN1_TFLG_EXPTAG)
    563 		{
    564 		char cst;
    565 		/* Need to work out amount of data available to the inner
    566 		 * content and where it starts: so read in EXPLICIT header to
    567 		 * get the info.
    568 		 */
    569 		ret = asn1_check_tlen(&len, NULL, NULL, &exp_eoc, &cst,
    570 					&p, inlen, tt->tag, aclass, opt, ctx);
    571 		q = p;
    572 		if (!ret)
    573 			{
    574 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    575 			return 0;
    576 			}
    577 		else if (ret == -1)
    578 			return -1;
    579 		if (!cst)
    580 			{
    581 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED);
    582 			return 0;
    583 			}
    584 		/* We've found the field so it can't be OPTIONAL now */
    585 		ret = asn1_template_noexp_d2i(val, &p, len, tt, 0, ctx);
    586 		if (!ret)
    587 			{
    588 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    589 			return 0;
    590 			}
    591 		/* We read the field in OK so update length */
    592 		len -= p - q;
    593 		if (exp_eoc)
    594 			{
    595 			/* If NDEF we must have an EOC here */
    596 			if (!asn1_check_eoc(&p, len))
    597 				{
    598 				OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_EOC);
    599 				goto err;
    600 				}
    601 			}
    602 		else
    603 			{
    604 			/* Otherwise we must hit the EXPLICIT tag end or its
    605 			 * an error */
    606 			if (len)
    607 				{
    608 				OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPLICIT_LENGTH_MISMATCH);
    609 				goto err;
    610 				}
    611 			}
    612 		}
    613 		else
    614 			return asn1_template_noexp_d2i(val, in, inlen,
    615 								tt, opt, ctx);
    616 
    617 	*in = p;
    618 	return 1;
    619 
    620 	err:
    621 	ASN1_template_free(val, tt);
    622 	return 0;
    623 	}
    624 
    625 static int asn1_template_noexp_d2i(ASN1_VALUE **val,
    626 				const unsigned char **in, long len,
    627 				const ASN1_TEMPLATE *tt, char opt,
    628 				ASN1_TLC *ctx)
    629 	{
    630 	int flags, aclass;
    631 	int ret;
    632 	const unsigned char *p;
    633 	if (!val)
    634 		return 0;
    635 	flags = tt->flags;
    636 	aclass = flags & ASN1_TFLG_TAG_CLASS;
    637 
    638 	p = *in;
    639 
    640 	if (flags & ASN1_TFLG_SK_MASK)
    641 		{
    642 		/* SET OF, SEQUENCE OF */
    643 		int sktag, skaclass;
    644 		char sk_eoc;
    645 		/* First work out expected inner tag value */
    646 		if (flags & ASN1_TFLG_IMPTAG)
    647 			{
    648 			sktag = tt->tag;
    649 			skaclass = aclass;
    650 			}
    651 		else
    652 			{
    653 			skaclass = V_ASN1_UNIVERSAL;
    654 			if (flags & ASN1_TFLG_SET_OF)
    655 				sktag = V_ASN1_SET;
    656 			else
    657 				sktag = V_ASN1_SEQUENCE;
    658 			}
    659 		/* Get the tag */
    660 		ret = asn1_check_tlen(&len, NULL, NULL, &sk_eoc, NULL,
    661 					&p, len, sktag, skaclass, opt, ctx);
    662 		if (!ret)
    663 			{
    664 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    665 			return 0;
    666 			}
    667 		else if (ret == -1)
    668 			return -1;
    669 		if (!*val)
    670 			*val = (ASN1_VALUE *)sk_new_null();
    671 		else
    672 			{
    673 			/* We've got a valid STACK: free up any items present */
    674 			STACK_OF(ASN1_VALUE) *sktmp
    675 			    = (STACK_OF(ASN1_VALUE) *)*val;
    676 			ASN1_VALUE *vtmp;
    677 			while(sk_ASN1_VALUE_num(sktmp) > 0)
    678 				{
    679 				vtmp = sk_ASN1_VALUE_pop(sktmp);
    680 				ASN1_item_ex_free(&vtmp,
    681 						ASN1_ITEM_ptr(tt->item));
    682 				}
    683 			}
    684 
    685 		if (!*val)
    686 			{
    687 			OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
    688 			goto err;
    689 			}
    690 
    691 		/* Read as many items as we can */
    692 		while(len > 0)
    693 			{
    694 			ASN1_VALUE *skfield;
    695 			const unsigned char *q = p;
    696 			/* See if EOC found */
    697 			if (asn1_check_eoc(&p, len))
    698 				{
    699 				if (!sk_eoc)
    700 					{
    701 					OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNEXPECTED_EOC);
    702 					goto err;
    703 					}
    704 				len -= p - q;
    705 				sk_eoc = 0;
    706 				break;
    707 				}
    708 			skfield = NULL;
    709 			if (!ASN1_item_ex_d2i(&skfield, &p, len,
    710 						ASN1_ITEM_ptr(tt->item),
    711 						-1, 0, 0, ctx))
    712 				{
    713 				OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    714 				goto err;
    715 				}
    716 			len -= p - q;
    717 			if (!sk_ASN1_VALUE_push((STACK_OF(ASN1_VALUE) *)*val,
    718 						skfield))
    719 				{
    720 				OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
    721 				goto err;
    722 				}
    723 			}
    724 		if (sk_eoc)
    725 			{
    726 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_EOC);
    727 			goto err;
    728 			}
    729 		}
    730 	else if (flags & ASN1_TFLG_IMPTAG)
    731 		{
    732 		/* IMPLICIT tagging */
    733 		ret = ASN1_item_ex_d2i(val, &p, len,
    734 			ASN1_ITEM_ptr(tt->item), tt->tag, aclass, opt, ctx);
    735 		if (!ret)
    736 			{
    737 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    738 			goto err;
    739 			}
    740 		else if (ret == -1)
    741 			return -1;
    742 		}
    743 	else
    744 		{
    745 		/* Nothing special */
    746 		ret = ASN1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item),
    747 							-1, tt->flags & ASN1_TFLG_COMBINE, opt, ctx);
    748 		if (!ret)
    749 			{
    750 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    751 			goto err;
    752 			}
    753 		else if (ret == -1)
    754 			return -1;
    755 		}
    756 
    757 	*in = p;
    758 	return 1;
    759 
    760 	err:
    761 	ASN1_template_free(val, tt);
    762 	return 0;
    763 	}
    764 
    765 static int asn1_d2i_ex_primitive(ASN1_VALUE **pval,
    766 				const unsigned char **in, long inlen,
    767 				const ASN1_ITEM *it,
    768 				int tag, int aclass, char opt, ASN1_TLC *ctx)
    769         OPENSSL_SUPPRESS_POTENTIALLY_UNINITIALIZED_WARNINGS
    770 	{
    771 	int ret = 0, utype;
    772 	long plen;
    773 	char cst, inf, free_cont = 0;
    774 	const unsigned char *p;
    775 	BUF_MEM buf;
    776 	const unsigned char *cont = NULL;
    777 	long len;
    778 	if (!pval)
    779 		{
    780 		OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NULL);
    781 		return 0; /* Should never happen */
    782 		}
    783 
    784 	if (it->itype == ASN1_ITYPE_MSTRING)
    785 		{
    786 		utype = tag;
    787 		tag = -1;
    788 		}
    789 	else
    790 		utype = it->utype;
    791 
    792 	if (utype == V_ASN1_ANY)
    793 		{
    794 		/* If type is ANY need to figure out type from tag */
    795 		unsigned char oclass;
    796 		if (tag >= 0)
    797 			{
    798 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TAGGED_ANY);
    799 			return 0;
    800 			}
    801 		if (opt)
    802 			{
    803 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OPTIONAL_ANY);
    804 			return 0;
    805 			}
    806 		p = *in;
    807 		ret = asn1_check_tlen(NULL, &utype, &oclass, NULL, NULL,
    808 					&p, inlen, -1, 0, 0, ctx);
    809 		if (!ret)
    810 			{
    811 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    812 			return 0;
    813 			}
    814 		if (oclass != V_ASN1_UNIVERSAL)
    815 			utype = V_ASN1_OTHER;
    816 		}
    817 	if (tag == -1)
    818 		{
    819 		tag = utype;
    820 		aclass = V_ASN1_UNIVERSAL;
    821 		}
    822 	p = *in;
    823 	/* Check header */
    824 	ret = asn1_check_tlen(&plen, NULL, NULL, &inf, &cst,
    825 				&p, inlen, tag, aclass, opt, ctx);
    826 	if (!ret)
    827 		{
    828 		OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
    829 		return 0;
    830 		}
    831 	else if (ret == -1)
    832 		return -1;
    833         ret = 0;
    834 	/* SEQUENCE, SET and "OTHER" are left in encoded form */
    835 	if ((utype == V_ASN1_SEQUENCE)
    836 		|| (utype == V_ASN1_SET) || (utype == V_ASN1_OTHER))
    837 		{
    838 		/* Clear context cache for type OTHER because the auto clear
    839 		 * when we have a exact match wont work
    840 		 */
    841 		if (utype == V_ASN1_OTHER)
    842 			{
    843 			asn1_tlc_clear(ctx);
    844 			}
    845 		/* SEQUENCE and SET must be constructed */
    846 		else if (!cst)
    847 			{
    848 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_CONSTRUCTED);
    849 			return 0;
    850 			}
    851 
    852 		cont = *in;
    853 		/* If indefinite length constructed find the real end */
    854 		if (inf)
    855 			{
    856 			if (!asn1_find_end(&p, plen, inf))
    857 				 goto err;
    858 			len = p - cont;
    859 			}
    860 		else
    861 			{
    862 			len = p - cont + plen;
    863 			p += plen;
    864 			buf.data = NULL;
    865 			}
    866 		}
    867 	else if (cst)
    868 		{
    869 		if (utype == V_ASN1_NULL || utype == V_ASN1_BOOLEAN
    870 			|| utype == V_ASN1_OBJECT || utype == V_ASN1_INTEGER
    871 			|| utype == V_ASN1_ENUMERATED)
    872 			{
    873 			/* These types only have primitive encodings. */
    874 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE);
    875 			return 0;
    876 			}
    877 
    878 		buf.length = 0;
    879 		buf.max = 0;
    880 		buf.data = NULL;
    881 		/* Should really check the internal tags are correct but
    882 		 * some things may get this wrong. The relevant specs
    883 		 * say that constructed string types should be OCTET STRINGs
    884 		 * internally irrespective of the type. So instead just check
    885 		 * for UNIVERSAL class and ignore the tag.
    886 		 */
    887 		if (!asn1_collect(&buf, &p, plen, inf, -1, V_ASN1_UNIVERSAL, 0))
    888 			{
    889 			free_cont = 1;
    890 			goto err;
    891 			}
    892 		len = buf.length;
    893 		/* Append a final null to string */
    894 		if (!BUF_MEM_grow_clean(&buf, len + 1))
    895 			{
    896 			OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
    897 			return 0;
    898 			}
    899 		buf.data[len] = 0;
    900 		cont = (const unsigned char *)buf.data;
    901 		free_cont = 1;
    902 		}
    903 	else
    904 		{
    905 		cont = p;
    906 		len = plen;
    907 		p += plen;
    908 		}
    909 
    910 	/* We now have content length and type: translate into a structure */
    911 	if (!asn1_ex_c2i(pval, cont, len, utype, &free_cont, it))
    912 		goto err;
    913 
    914 	*in = p;
    915 	ret = 1;
    916 	err:
    917 	if (free_cont && buf.data) OPENSSL_free(buf.data);
    918 	return ret;
    919 	}
    920 
    921 /* Translate ASN1 content octets into a structure */
    922 
    923 int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
    924 			int utype, char *free_cont, const ASN1_ITEM *it)
    925 	{
    926 	ASN1_VALUE **opval = NULL;
    927 	ASN1_STRING *stmp;
    928 	ASN1_TYPE *typ = NULL;
    929 	int ret = 0;
    930 	const ASN1_PRIMITIVE_FUNCS *pf;
    931 	ASN1_INTEGER **tint;
    932 	pf = it->funcs;
    933 
    934 	if (pf && pf->prim_c2i)
    935 		return pf->prim_c2i(pval, cont, len, utype, free_cont, it);
    936 	/* If ANY type clear type and set pointer to internal value */
    937 	if (it->utype == V_ASN1_ANY)
    938 		{
    939 		if (!*pval)
    940 			{
    941 			typ = ASN1_TYPE_new();
    942 			if (typ == NULL)
    943 				goto err;
    944 			*pval = (ASN1_VALUE *)typ;
    945 			}
    946 		else
    947 			typ = (ASN1_TYPE *)*pval;
    948 
    949 		if (utype != typ->type)
    950 			ASN1_TYPE_set(typ, utype, NULL);
    951 		opval = pval;
    952 		pval = &typ->value.asn1_value;
    953 		}
    954 	switch(utype)
    955 		{
    956 		case V_ASN1_OBJECT:
    957 		if (!c2i_ASN1_OBJECT((ASN1_OBJECT **)pval, &cont, len))
    958 			goto err;
    959 		break;
    960 
    961 		case V_ASN1_NULL:
    962 		if (len)
    963 			{
    964 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NULL_IS_WRONG_LENGTH);
    965 			goto err;
    966 			}
    967 		*pval = (ASN1_VALUE *)1;
    968 		break;
    969 
    970 		case V_ASN1_BOOLEAN:
    971 		if (len != 1)
    972 			{
    973 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH);
    974 			goto err;
    975 			}
    976 		else
    977 			{
    978 			ASN1_BOOLEAN *tbool;
    979 			tbool = (ASN1_BOOLEAN *)pval;
    980 			*tbool = *cont;
    981 			}
    982 		break;
    983 
    984 		case V_ASN1_BIT_STRING:
    985 		if (!c2i_ASN1_BIT_STRING((ASN1_BIT_STRING **)pval, &cont, len))
    986 			goto err;
    987 		break;
    988 
    989 		case V_ASN1_INTEGER:
    990 		case V_ASN1_NEG_INTEGER:
    991 		case V_ASN1_ENUMERATED:
    992 		case V_ASN1_NEG_ENUMERATED:
    993 		tint = (ASN1_INTEGER **)pval;
    994 		if (!c2i_ASN1_INTEGER(tint, &cont, len))
    995 			goto err;
    996 		/* Fixup type to match the expected form */
    997 		(*tint)->type = utype | ((*tint)->type & V_ASN1_NEG);
    998 		break;
    999 
   1000 		case V_ASN1_OCTET_STRING:
   1001 		case V_ASN1_NUMERICSTRING:
   1002 		case V_ASN1_PRINTABLESTRING:
   1003 		case V_ASN1_T61STRING:
   1004 		case V_ASN1_VIDEOTEXSTRING:
   1005 		case V_ASN1_IA5STRING:
   1006 		case V_ASN1_UTCTIME:
   1007 		case V_ASN1_GENERALIZEDTIME:
   1008 		case V_ASN1_GRAPHICSTRING:
   1009 		case V_ASN1_VISIBLESTRING:
   1010 		case V_ASN1_GENERALSTRING:
   1011 		case V_ASN1_UNIVERSALSTRING:
   1012 		case V_ASN1_BMPSTRING:
   1013 		case V_ASN1_UTF8STRING:
   1014 		case V_ASN1_OTHER:
   1015 		case V_ASN1_SET:
   1016 		case V_ASN1_SEQUENCE:
   1017 		default:
   1018 		if (utype == V_ASN1_BMPSTRING && (len & 1))
   1019 			{
   1020 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_BMPSTRING_IS_WRONG_LENGTH);
   1021 			goto err;
   1022 			}
   1023 		if (utype == V_ASN1_UNIVERSALSTRING && (len & 3))
   1024 			{
   1025 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH);
   1026 			goto err;
   1027 			}
   1028 		/* All based on ASN1_STRING and handled the same */
   1029 		if (!*pval)
   1030 			{
   1031 			stmp = ASN1_STRING_type_new(utype);
   1032 			if (!stmp)
   1033 				{
   1034 				OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
   1035 				goto err;
   1036 				}
   1037 			*pval = (ASN1_VALUE *)stmp;
   1038 			}
   1039 		else
   1040 			{
   1041 			stmp = (ASN1_STRING *)*pval;
   1042 			stmp->type = utype;
   1043 			}
   1044 		/* If we've already allocated a buffer use it */
   1045 		if (*free_cont)
   1046 			{
   1047 			if (stmp->data)
   1048 				OPENSSL_free(stmp->data);
   1049 			stmp->data = (unsigned char *)cont; /* UGLY CAST! RL */
   1050 			stmp->length = len;
   1051 			*free_cont = 0;
   1052 			}
   1053 		else
   1054 			{
   1055 			if (!ASN1_STRING_set(stmp, cont, len))
   1056 				{
   1057 				OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
   1058 				ASN1_STRING_free(stmp);
   1059 				*pval = NULL;
   1060 				goto err;
   1061 				}
   1062 			}
   1063 		break;
   1064 		}
   1065 	/* If ASN1_ANY and NULL type fix up value */
   1066 	if (typ && (utype == V_ASN1_NULL))
   1067 		 typ->value.ptr = NULL;
   1068 
   1069 	ret = 1;
   1070 	err:
   1071 	if (!ret)
   1072 		{
   1073 		ASN1_TYPE_free(typ);
   1074 		if (opval)
   1075 			*opval = NULL;
   1076 		}
   1077 	return ret;
   1078 	}
   1079 
   1080 
   1081 /* This function finds the end of an ASN1 structure when passed its maximum
   1082  * length, whether it is indefinite length and a pointer to the content.
   1083  * This is more efficient than calling asn1_collect because it does not
   1084  * recurse on each indefinite length header.
   1085  */
   1086 
   1087 static int asn1_find_end(const unsigned char **in, long len, char inf)
   1088 	{
   1089 	int expected_eoc;
   1090 	long plen;
   1091 	const unsigned char *p = *in, *q;
   1092 	/* If not indefinite length constructed just add length */
   1093 	if (inf == 0)
   1094 		{
   1095 		*in += len;
   1096 		return 1;
   1097 		}
   1098 	expected_eoc = 1;
   1099 	/* Indefinite length constructed form. Find the end when enough EOCs
   1100 	 * are found. If more indefinite length constructed headers
   1101 	 * are encountered increment the expected eoc count otherwise just
   1102 	 * skip to the end of the data.
   1103 	 */
   1104 	while (len > 0)
   1105 		{
   1106 		if(asn1_check_eoc(&p, len))
   1107 			{
   1108 			expected_eoc--;
   1109 			if (expected_eoc == 0)
   1110 				break;
   1111 			len -= 2;
   1112 			continue;
   1113 			}
   1114 		q = p;
   1115 		/* Just read in a header: only care about the length */
   1116 		if(!asn1_check_tlen(&plen, NULL, NULL, &inf, NULL, &p, len,
   1117 				-1, 0, 0, NULL))
   1118 			{
   1119 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
   1120 			return 0;
   1121 			}
   1122 		if (inf)
   1123 			expected_eoc++;
   1124 		else
   1125 			p += plen;
   1126 		len -= p - q;
   1127 		}
   1128 	if (expected_eoc)
   1129 		{
   1130 		OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_EOC);
   1131 		return 0;
   1132 		}
   1133 	*in = p;
   1134 	return 1;
   1135 	}
   1136 /* This function collects the asn1 data from a constructred string
   1137  * type into a buffer. The values of 'in' and 'len' should refer
   1138  * to the contents of the constructed type and 'inf' should be set
   1139  * if it is indefinite length.
   1140  */
   1141 
   1142 #ifndef ASN1_MAX_STRING_NEST
   1143 /* This determines how many levels of recursion are permitted in ASN1
   1144  * string types. If it is not limited stack overflows can occur. If set
   1145  * to zero no recursion is allowed at all. Although zero should be adequate
   1146  * examples exist that require a value of 1. So 5 should be more than enough.
   1147  */
   1148 #define ASN1_MAX_STRING_NEST 5
   1149 #endif
   1150 
   1151 
   1152 static int asn1_collect(BUF_MEM *buf, const unsigned char **in, long len,
   1153 			char inf, int tag, int aclass, int depth)
   1154 	{
   1155 	const unsigned char *p, *q;
   1156 	long plen;
   1157 	char cst, ininf;
   1158 	p = *in;
   1159 	inf &= 1;
   1160 	/* If no buffer and not indefinite length constructed just pass over
   1161 	 * the encoded data */
   1162 	if (!buf && !inf)
   1163 		{
   1164 		*in += len;
   1165 		return 1;
   1166 		}
   1167 	while(len > 0)
   1168 		{
   1169 		q = p;
   1170 		/* Check for EOC */
   1171 		if (asn1_check_eoc(&p, len))
   1172 			{
   1173 			/* EOC is illegal outside indefinite length
   1174 			 * constructed form */
   1175 			if (!inf)
   1176 				{
   1177 				OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNEXPECTED_EOC);
   1178 				return 0;
   1179 				}
   1180 			inf = 0;
   1181 			break;
   1182 			}
   1183 
   1184 		if (!asn1_check_tlen(&plen, NULL, NULL, &ininf, &cst, &p,
   1185 					len, tag, aclass, 0, NULL))
   1186 			{
   1187 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
   1188 			return 0;
   1189 			}
   1190 
   1191 		/* If indefinite length constructed update max length */
   1192 		if (cst)
   1193 			{
   1194 			if (depth >= ASN1_MAX_STRING_NEST)
   1195 				{
   1196 				OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_STRING);
   1197 				return 0;
   1198 				}
   1199 			if (!asn1_collect(buf, &p, plen, ininf, tag, aclass,
   1200 						depth + 1))
   1201 				return 0;
   1202 			}
   1203 		else if (plen && !collect_data(buf, &p, plen))
   1204 			return 0;
   1205 		len -= p - q;
   1206 		}
   1207 	if (inf)
   1208 		{
   1209 		OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_EOC);
   1210 		return 0;
   1211 		}
   1212 	*in = p;
   1213 	return 1;
   1214 	}
   1215 
   1216 static int collect_data(BUF_MEM *buf, const unsigned char **p, long plen)
   1217 	{
   1218 	int len;
   1219 	if (buf)
   1220 		{
   1221 		len = buf->length;
   1222 		if (!BUF_MEM_grow_clean(buf, len + plen))
   1223 			{
   1224 			OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
   1225 			return 0;
   1226 			}
   1227 		memcpy(buf->data + len, *p, plen);
   1228 		}
   1229 	*p += plen;
   1230 	return 1;
   1231 	}
   1232 
   1233 /* Check for ASN1 EOC and swallow it if found */
   1234 
   1235 static int asn1_check_eoc(const unsigned char **in, long len)
   1236 	{
   1237 	const unsigned char *p;
   1238 	if (len < 2) return 0;
   1239 	p = *in;
   1240 	if (!p[0] && !p[1])
   1241 		{
   1242 		*in += 2;
   1243 		return 1;
   1244 		}
   1245 	return 0;
   1246 	}
   1247 
   1248 /* Check an ASN1 tag and length: a bit like ASN1_get_object
   1249  * but it sets the length for indefinite length constructed
   1250  * form, we don't know the exact length but we can set an
   1251  * upper bound to the amount of data available minus the
   1252  * header length just read.
   1253  */
   1254 
   1255 static int asn1_check_tlen(long *olen, int *otag, unsigned char *oclass,
   1256 				char *inf, char *cst,
   1257 				const unsigned char **in, long len,
   1258 				int exptag, int expclass, char opt,
   1259 				ASN1_TLC *ctx)
   1260 	{
   1261 	int i;
   1262 	int ptag, pclass;
   1263 	long plen;
   1264 	const unsigned char *p, *q;
   1265 	p = *in;
   1266 	q = p;
   1267 
   1268 	if (ctx && ctx->valid)
   1269 		{
   1270 		i = ctx->ret;
   1271 		plen = ctx->plen;
   1272 		pclass = ctx->pclass;
   1273 		ptag = ctx->ptag;
   1274 		p += ctx->hdrlen;
   1275 		}
   1276 	else
   1277 		{
   1278 		i = ASN1_get_object(&p, &plen, &ptag, &pclass, len);
   1279 		if (ctx)
   1280 			{
   1281 			ctx->ret = i;
   1282 			ctx->plen = plen;
   1283 			ctx->pclass = pclass;
   1284 			ctx->ptag = ptag;
   1285 			ctx->hdrlen = p - q;
   1286 			ctx->valid = 1;
   1287 			/* If definite length, and no error, length +
   1288 			 * header can't exceed total amount of data available.
   1289 			 */
   1290 			if (!(i & 0x81) && ((plen + ctx->hdrlen) > len))
   1291 				{
   1292 				OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG);
   1293 				asn1_tlc_clear(ctx);
   1294 				return 0;
   1295 				}
   1296 			}
   1297 		}
   1298 
   1299 	if (i & 0x80)
   1300 		{
   1301 		OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER);
   1302 		asn1_tlc_clear(ctx);
   1303 		return 0;
   1304 		}
   1305 	if (exptag >= 0)
   1306 		{
   1307 		if ((exptag != ptag) || (expclass != pclass))
   1308 			{
   1309 			/* If type is OPTIONAL, not an error:
   1310 			 * indicate missing type.
   1311 			 */
   1312 			if (opt) return -1;
   1313 			asn1_tlc_clear(ctx);
   1314 			OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TAG);
   1315 			return 0;
   1316 			}
   1317 		/* We have a tag and class match:
   1318 		 * assume we are going to do something with it */
   1319 		asn1_tlc_clear(ctx);
   1320 		}
   1321 
   1322 	if (i & 1)
   1323 		plen = len - (p - q);
   1324 
   1325 	if (inf)
   1326 		*inf = i & 1;
   1327 
   1328 	if (cst)
   1329 		*cst = i & V_ASN1_CONSTRUCTED;
   1330 
   1331 	if (olen)
   1332 		*olen = plen;
   1333 
   1334 	if (oclass)
   1335 		*oclass = pclass;
   1336 
   1337 	if (otag)
   1338 		*otag = ptag;
   1339 
   1340 	*in = p;
   1341 	return 1;
   1342 	}
   1343