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