Coverage Report

Created: 2026-06-08 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libtasn1/lib/decoding.c
Line
Count
Source
1
/*
2
 * Copyright (C) 2002-2025 Free Software Foundation, Inc.
3
 *
4
 * This file is part of LIBTASN1.
5
 *
6
 * The LIBTASN1 library is free software; you can redistribute it
7
 * and/or modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * This library is distributed in the hope that it will be useful, but
12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library; if not, see
18
 * <https://www.gnu.org/licenses/>.
19
 */
20
21
#include <config.h>
22
23
/*****************************************************/
24
/* File: decoding.c                                  */
25
/* Description: Functions to manage DER decoding     */
26
/*****************************************************/
27
28
#include <int.h>
29
#include <parser_aux.h>
30
#include <gstr.h>
31
#include <structure.h>
32
#include <element.h>
33
#include <limits.h>
34
#include <intprops.h>
35
#include "c-ctype.h"
36
37
#ifdef DEBUG
38
# define warn() fprintf(stderr, "%s: %d\n", __func__, __LINE__)
39
#else
40
# define warn()
41
#endif
42
43
5.01M
#define IS_ERR(len, flags) (len < -1 || ((flags & ASN1_DECODE_FLAG_STRICT_DER) && len < 0))
44
45
2.84M
#define HAVE_TWO(x) (x>=2?1:0)
46
47
/* Decoding flags (dflags) used in several decoding functions.
48
 *  DECODE_FLAG_HAVE_TAG: The provided buffer includes a tag
49
 *  DECODE_FLAG_CONSTRUCTED: The provided buffer is of indefinite encoding (useful
50
 *                           when no tags are present).
51
 *  DECODE_FLAG_LEVEL1: Internal flag to indicate a level of recursion for BER strings.
52
 *  DECODE_FLAG_LEVEL2: Internal flag to indicate two levels of recursion for BER strings.
53
 *  DECODE_FLAG_LEVEL3: Internal flag to indicate three levels of recursion for BER strings.
54
 *                      This is the maximum levels of recursion possible to prevent stack
55
 *                      exhaustion.
56
 */
57
58
309k
#define DECODE_FLAG_HAVE_TAG 1
59
98.9k
#define DECODE_FLAG_CONSTRUCTED (1<<1)
60
126k
#define DECODE_FLAG_LEVEL1 (1<<2)
61
66.2k
#define DECODE_FLAG_LEVEL2 (1<<3)
62
10.7k
#define DECODE_FLAG_LEVEL3 (1<<4)
63
64
32.2M
#define DECR_LEN(l, s) do { \
65
32.2M
    l -= s; \
66
32.2M
    if (l < 0) { \
67
360
      warn(); \
68
360
      result = ASN1_DER_ERROR; \
69
360
      goto cleanup; \
70
360
    } \
71
32.2M
  } while (0)
72
73
static int
74
_asn1_get_indefinite_length_string (const unsigned char *der, int der_len,
75
            int *len);
76
77
static int
78
_asn1_decode_simple_ber (unsigned int etype, const unsigned char *der,
79
       unsigned int _der_len, unsigned char **str,
80
       unsigned int *str_len, unsigned int *ber_len,
81
       unsigned dflags);
82
83
static int
84
_asn1_decode_simple_der (unsigned int etype, const unsigned char *der,
85
       unsigned int _der_len, const unsigned char **str,
86
       unsigned int *str_len, unsigned dflags);
87
88
static void
89
_asn1_error_description_tag_error (asn1_node node, char *ErrorDescription)
90
1.80k
{
91
92
1.80k
  Estrcpy (ErrorDescription, ":: tag error near element '");
93
1.80k
  _asn1_hierarchical_name (node, ErrorDescription + strlen (ErrorDescription),
94
1.80k
         ASN1_MAX_ERROR_DESCRIPTION_SIZE - 40);
95
1.80k
  Estrcat (ErrorDescription, "'");
96
97
1.80k
}
98
99
/**
100
 * asn1_get_length_der:
101
 * @der: DER data to decode.
102
 * @der_len: Length of DER data to decode.
103
 * @len: Output variable containing the length of the DER length field.
104
 *
105
 * Extract a length field from DER data.
106
 *
107
 * Returns: Return the decoded length value, or -1 on indefinite
108
 *   length, or -2 when the value was too big to fit in a int, or -4
109
 *   when the decoded length value plus @len would exceed @der_len.
110
 **/
111
long
112
asn1_get_length_der (const unsigned char *der, int der_len, int *len)
113
12.6M
{
114
12.6M
  unsigned int ans;
115
12.6M
  int k, punt, sum;
116
117
12.6M
  *len = 0;
118
12.6M
  if (der_len <= 0)
119
8.68k
    return 0;
120
121
12.6M
  if (!(der[0] & 128))
122
10.5M
    {
123
      /* short form */
124
10.5M
      *len = 1;
125
10.5M
      ans = der[0];
126
10.5M
    }
127
2.08M
  else
128
2.08M
    {
129
      /* Long form */
130
2.08M
      k = der[0] & 0x7F;
131
2.08M
      punt = 1;
132
2.08M
      if (k)
133
2.05M
  {     /* definite length method */
134
2.05M
    ans = 0;
135
5.56M
    while (punt <= k && punt < der_len)
136
3.50M
      {
137
3.50M
        if (INT_MULTIPLY_OVERFLOW (ans, 256))
138
3.33k
    return -2;
139
3.50M
        ans *= 256;
140
141
3.50M
        if (INT_ADD_OVERFLOW (ans, ((unsigned) der[punt])))
142
0
    return -2;
143
3.50M
        ans += der[punt];
144
3.50M
        punt++;
145
3.50M
      }
146
2.05M
  }
147
25.9k
      else
148
25.9k
  {     /* indefinite length method */
149
25.9k
    *len = punt;
150
25.9k
    return -1;
151
25.9k
  }
152
153
2.05M
      *len = punt;
154
2.05M
    }
155
156
12.5M
  sum = ans;
157
12.5M
  if (ans >= INT_MAX || INT_ADD_OVERFLOW (sum, (*len)))
158
2.72k
    return -2;
159
12.5M
  sum += *len;
160
161
12.5M
  if (sum > der_len)
162
18.7k
    return -4;
163
164
12.5M
  return ans;
165
12.5M
}
166
167
/**
168
 * asn1_get_tag_der:
169
 * @der: DER data to decode.
170
 * @der_len: Length of DER data to decode.
171
 * @cls: Output variable containing decoded class.
172
 * @len: Output variable containing the length of the DER TAG data.
173
 * @tag: Output variable containing the decoded tag (may be %NULL).
174
 *
175
 * Decode the class and TAG from DER code.
176
 *
177
 * Returns: Returns %ASN1_SUCCESS on success, or an error.
178
 **/
179
int
180
asn1_get_tag_der (const unsigned char *der, int der_len,
181
      unsigned char *cls, int *len, unsigned long *tag)
182
14.2M
{
183
14.2M
  unsigned int ris;
184
14.2M
  int punt;
185
186
14.2M
  if (der == NULL || der_len < 2 || len == NULL)
187
2.69k
    return ASN1_DER_ERROR;
188
189
14.2M
  *cls = der[0] & 0xE0;
190
14.2M
  if ((der[0] & 0x1F) != 0x1F)
191
14.1M
    {
192
      /* short form */
193
14.1M
      *len = 1;
194
14.1M
      ris = der[0] & 0x1F;
195
14.1M
    }
196
86.6k
  else
197
86.6k
    {
198
      /* Long form */
199
86.6k
      punt = 1;
200
86.6k
      ris = 0;
201
307M
      while (punt < der_len && der[punt] & 128)
202
307M
  {
203
204
307M
    if (INT_MULTIPLY_OVERFLOW (ris, 128))
205
1.36k
      return ASN1_DER_ERROR;
206
307M
    ris *= 128;
207
208
307M
    if (INT_ADD_OVERFLOW (ris, ((unsigned) (der[punt] & 0x7F))))
209
0
      return ASN1_DER_ERROR;
210
307M
    ris += (der[punt] & 0x7F);
211
307M
    punt++;
212
307M
  }
213
214
85.2k
      if (punt >= der_len)
215
1.72k
  return ASN1_DER_ERROR;
216
217
83.5k
      if (INT_MULTIPLY_OVERFLOW (ris, 128))
218
2.00k
  return ASN1_DER_ERROR;
219
81.5k
      ris *= 128;
220
221
81.5k
      if (INT_ADD_OVERFLOW (ris, ((unsigned) (der[punt] & 0x7F))))
222
0
  return ASN1_DER_ERROR;
223
81.5k
      ris += (der[punt] & 0x7F);
224
81.5k
      punt++;
225
226
81.5k
      *len = punt;
227
81.5k
    }
228
229
14.2M
  if (tag)
230
14.2M
    *tag = ris;
231
14.2M
  return ASN1_SUCCESS;
232
14.2M
}
233
234
/**
235
 * asn1_get_length_ber:
236
 * @ber: BER data to decode.
237
 * @ber_len: Length of BER data to decode.
238
 * @len: Output variable containing the length of the BER length field.
239
 *
240
 * Extract a length field from BER data.  The difference to
241
 * asn1_get_length_der() is that this function will return a length
242
 * even if the value has indefinite encoding.
243
 *
244
 * Returns: Return the decoded length value, or negative value when
245
 *   the value was too big.
246
 *
247
 * Since: 2.0
248
 **/
249
long
250
asn1_get_length_ber (const unsigned char *ber, int ber_len, int *len)
251
81.6k
{
252
81.6k
  int ret;
253
81.6k
  long err;
254
255
81.6k
  ret = asn1_get_length_der (ber, ber_len, len);
256
257
81.6k
  if (ret == -1 && ber_len > 1)
258
3.87k
    {       /* indefinite length method */
259
3.87k
      err = _asn1_get_indefinite_length_string (ber + 1, ber_len - 1, &ret);
260
3.87k
      if (err != ASN1_SUCCESS)
261
2.11k
  return -3;
262
3.87k
    }
263
264
79.5k
  return ret;
265
81.6k
}
266
267
/**
268
 * asn1_get_octet_der:
269
 * @der: DER data to decode containing the OCTET SEQUENCE.
270
 * @der_len: The length of the @der data to decode.
271
 * @ret_len: Output variable containing the encoded length of the DER data.
272
 * @str: Pre-allocated output buffer to put decoded OCTET SEQUENCE in.
273
 * @str_size: Length of pre-allocated output buffer.
274
 * @str_len: Output variable containing the length of the contents of the OCTET SEQUENCE.
275
 *
276
 * Extract an OCTET SEQUENCE from DER data. Note that this function
277
 * expects the DER data past the tag field, i.e., the length and
278
 * content octets.
279
 *
280
 * Returns: Returns %ASN1_SUCCESS on success, or an error.
281
 **/
282
int
283
asn1_get_octet_der (const unsigned char *der, int der_len,
284
        int *ret_len, unsigned char *str, int str_size,
285
        int *str_len)
286
1.40M
{
287
1.40M
  int len_len = 0;
288
289
1.40M
  if (der_len <= 0)
290
0
    return ASN1_GENERIC_ERROR;
291
292
1.40M
  *str_len = asn1_get_length_der (der, der_len, &len_len);
293
294
1.40M
  if (*str_len < 0)
295
0
    return ASN1_DER_ERROR;
296
297
1.40M
  *ret_len = *str_len + len_len;
298
1.40M
  if (str_size >= *str_len)
299
781k
    {
300
781k
      if (*str_len > 0 && str != NULL)
301
772k
  memcpy (str, der + len_len, *str_len);
302
781k
    }
303
620k
  else
304
620k
    {
305
620k
      return ASN1_MEM_ERROR;
306
620k
    }
307
308
781k
  return ASN1_SUCCESS;
309
1.40M
}
310
311
312
/*-
313
 * _asn1_get_time_der:
314
 * @type: %ASN1_ETYPE_GENERALIZED_TIME or %ASN1_ETYPE_UTC_TIME
315
 * @der: DER data to decode containing the time
316
 * @der_len: Length of DER data to decode.
317
 * @ret_len: Output variable containing the length of the DER data.
318
 * @str: Pre-allocated output buffer to put the textual time in.
319
 * @str_size: Length of pre-allocated output buffer.
320
 * @flags: Zero or %ASN1_DECODE_FLAG_STRICT_DER
321
 *
322
 * Performs basic checks in the DER encoded time object and returns its textual form.
323
 * The textual form will be in the YYYYMMDD000000Z format for GeneralizedTime
324
 * and YYMMDD000000Z for UTCTime.
325
 *
326
 * Returns: %ASN1_SUCCESS on success, or an error.
327
 -*/
328
static int
329
_asn1_get_time_der (unsigned type, const unsigned char *der, int der_len,
330
        int *ret_len, char *str, int str_size, unsigned flags)
331
181k
{
332
181k
  int len_len, str_len;
333
181k
  unsigned i;
334
181k
  unsigned sign_count = 0;
335
181k
  unsigned dot_count = 0;
336
181k
  const unsigned char *p;
337
338
181k
  if (der_len <= 0 || str == NULL)
339
25
    return ASN1_DER_ERROR;
340
341
181k
  str_len = asn1_get_length_der (der, der_len, &len_len);
342
181k
  if (str_len <= 0 || str_size < str_len)
343
1.18k
    return ASN1_DER_ERROR;
344
345
  /* perform some sanity checks on the data */
346
180k
  if (str_len < 8)
347
64
    {
348
64
      warn ();
349
64
      return ASN1_TIME_ENCODING_ERROR;
350
64
    }
351
352
180k
  if ((flags & ASN1_DECODE_FLAG_STRICT_DER)
353
180k
      && !(flags & ASN1_DECODE_FLAG_ALLOW_INCORRECT_TIME))
354
180k
    {
355
180k
      p = &der[len_len];
356
2.38M
      for (i = 0; i < (unsigned) (str_len - 1); i++)
357
2.20M
  {
358
2.20M
    if (c_isdigit (p[i]) == 0)
359
2.82k
      {
360
2.82k
        if (type == ASN1_ETYPE_GENERALIZED_TIME)
361
2.72k
    {
362
      /* tolerate lax encodings */
363
2.72k
      if (p[i] == '.' && dot_count == 0)
364
2.48k
        {
365
2.48k
          dot_count++;
366
2.48k
          continue;
367
2.48k
        }
368
369
      /* This is not really valid DER, but there are
370
       * structures using that */
371
244
      if (!(flags & ASN1_DECODE_FLAG_STRICT_DER) &&
372
0
          (p[i] == '+' || p[i] == '-') && sign_count == 0)
373
0
        {
374
0
          sign_count++;
375
0
          continue;
376
0
        }
377
244
    }
378
379
335
        warn ();
380
335
        return ASN1_TIME_ENCODING_ERROR;
381
2.82k
      }
382
2.20M
  }
383
384
180k
      if (sign_count == 0 && p[str_len - 1] != 'Z')
385
127
  {
386
127
    warn ();
387
127
    return ASN1_TIME_ENCODING_ERROR;
388
127
  }
389
180k
    }
390
180k
  memcpy (str, der + len_len, str_len);
391
180k
  str[str_len] = 0;
392
180k
  *ret_len = str_len + len_len;
393
394
180k
  return ASN1_SUCCESS;
395
180k
}
396
397
/**
398
 * asn1_get_object_id_der:
399
 * @der: DER data to decode containing the OBJECT IDENTIFIER
400
 * @der_len: Length of DER data to decode.
401
 * @ret_len: Output variable containing the length of the DER data.
402
 * @str: Pre-allocated output buffer to put the textual object id in.
403
 * @str_size: Length of pre-allocated output buffer.
404
 *
405
 * Converts a DER encoded object identifier to its textual form. This
406
 * function expects the DER object identifier without the tag.
407
 *
408
 * Returns: %ASN1_SUCCESS on success, or an error.
409
 **/
410
int
411
asn1_get_object_id_der (const unsigned char *der, int der_len, int *ret_len,
412
      char *str, int str_size)
413
1.15M
{
414
1.15M
  int len_len, len, k;
415
1.15M
  int leading, parsed;
416
1.15M
  char temp[LTOSTR_MAX_SIZE];
417
1.15M
  uint64_t val, val1, val0;
418
419
1.15M
  *ret_len = 0;
420
1.15M
  if (str && str_size > 0)
421
1.15M
    str[0] = 0;     /* no oid */
422
423
1.15M
  if (str == NULL || der_len <= 0)
424
59
    return ASN1_GENERIC_ERROR;
425
426
1.15M
  len = asn1_get_length_der (der, der_len, &len_len);
427
428
1.15M
  if (len <= 0 || len + len_len > der_len)
429
1.86k
    return ASN1_DER_ERROR;
430
431
  /* leading octet can never be 0x80 */
432
1.15M
  if (der[len_len] == 0x80)
433
67
    return ASN1_DER_ERROR;
434
435
1.15M
  val0 = 0;
436
437
1.32M
  for (k = 0; k < len; k++)
438
1.30M
    {
439
1.30M
      if (INT_LEFT_SHIFT_OVERFLOW (val0, 7))
440
178
  return ASN1_DER_ERROR;
441
442
1.30M
      val0 <<= 7;
443
1.30M
      val0 |= der[len_len + k] & 0x7F;
444
1.30M
      if (!(der[len_len + k] & 0x80))
445
1.12M
  break;
446
1.30M
    }
447
1.15M
  parsed = ++k;
448
449
  /* val0 = (X*40) + Y, X={0,1,2}, Y<=39 when X={0,1} */
450
  /* X = val, Y = val1 */
451
452
  /* check if X == 0  */
453
1.15M
  val = 0;
454
1.15M
  val1 = val0;
455
1.15M
  if (val1 > 39)
456
1.08M
    {
457
1.08M
      val = 1;
458
1.08M
      val1 = val0 - 40;
459
1.08M
      if (val1 > 39)
460
682k
  {
461
682k
    val = 2;
462
682k
    val1 = val0 - 80;
463
682k
  }
464
1.08M
    }
465
466
1.15M
  _asn1_str_cpy (str, str_size, _asn1_ltostr (val, temp));
467
1.15M
  _asn1_str_cat (str, str_size, ".");
468
1.15M
  _asn1_str_cat (str, str_size, _asn1_ltostr (val1, temp));
469
470
1.15M
  val = 0;
471
1.15M
  leading = 1;
472
18.0M
  for (k = parsed; k < len; k++)
473
16.8M
    {
474
      /* X.690 mandates that the leading byte must never be 0x80
475
       */
476
16.8M
      if (leading != 0 && der[len_len + k] == 0x80)
477
163
  return ASN1_DER_ERROR;
478
16.8M
      leading = 0;
479
480
      /* check for wrap around */
481
16.8M
      if (INT_LEFT_SHIFT_OVERFLOW (val, 7))
482
313
  return ASN1_DER_ERROR;
483
484
16.8M
      val = val << 7;
485
16.8M
      val |= der[len_len + k] & 0x7F;
486
487
16.8M
      if (!(der[len_len + k] & 0x80))
488
15.4M
  {
489
15.4M
    _asn1_str_cat (str, str_size, ".");
490
15.4M
    _asn1_str_cat (str, str_size, _asn1_ltostr (val, temp));
491
15.4M
    val = 0;
492
15.4M
    leading = 1;
493
15.4M
  }
494
16.8M
    }
495
496
1.15M
  if (INT_ADD_OVERFLOW (len, len_len))
497
0
    return ASN1_DER_ERROR;
498
499
1.15M
  *ret_len = len + len_len;
500
501
1.15M
  return ASN1_SUCCESS;
502
1.15M
}
503
504
/**
505
 * asn1_get_bit_der:
506
 * @der: DER data to decode containing the BIT SEQUENCE.
507
 * @der_len: Length of DER data to decode.
508
 * @ret_len: Output variable containing the length of the DER data.
509
 * @str: Pre-allocated output buffer to put decoded BIT SEQUENCE in.
510
 * @str_size: Length of pre-allocated output buffer.
511
 * @bit_len: Output variable containing the size of the BIT SEQUENCE.
512
 *
513
 * Extract a BIT SEQUENCE from DER data.
514
 *
515
 * Returns: %ASN1_SUCCESS on success, or an error.
516
 **/
517
int
518
asn1_get_bit_der (const unsigned char *der, int der_len,
519
      int *ret_len, unsigned char *str, int str_size,
520
      int *bit_len)
521
175k
{
522
175k
  int len_len = 0, len_byte;
523
524
175k
  if (der_len <= 0)
525
0
    return ASN1_GENERIC_ERROR;
526
527
175k
  len_byte = asn1_get_length_der (der, der_len, &len_len) - 1;
528
175k
  if (len_byte < 0)
529
2.62k
    return ASN1_DER_ERROR;
530
531
172k
  *ret_len = len_byte + len_len + 1;
532
172k
  *bit_len = len_byte * 8 - der[len_len];
533
534
172k
  if (*bit_len < 0)
535
778
    return ASN1_DER_ERROR;
536
537
171k
  if (str_size >= len_byte)
538
87.8k
    {
539
87.8k
      if (len_byte > 0 && str)
540
87.8k
  memcpy (str, der + len_len + 1, len_byte);
541
87.8k
    }
542
84.0k
  else
543
84.0k
    {
544
84.0k
      return ASN1_MEM_ERROR;
545
84.0k
    }
546
547
87.8k
  return ASN1_SUCCESS;
548
171k
}
549
550
/* tag_len: the total tag length (explicit+inner)
551
 * inner_tag_len: the inner_tag length
552
 */
553
static int
554
_asn1_extract_tag_der (asn1_node node, const unsigned char *der, int der_len,
555
           int *tag_len, int *inner_tag_len, unsigned flags)
556
10.2M
{
557
10.2M
  asn1_node p;
558
10.2M
  int counter, len2, len3, is_tag_implicit;
559
10.2M
  int result;
560
10.2M
  unsigned long tag, tag_implicit = 0;
561
10.2M
  unsigned char class, class2, class_implicit = 0;
562
563
10.2M
  if (der_len <= 0)
564
3.54k
    return ASN1_GENERIC_ERROR;
565
566
10.1M
  counter = is_tag_implicit = 0;
567
568
10.1M
  if (node->type & CONST_TAG)
569
1.35M
    {
570
1.35M
      p = node->down;
571
3.26M
      while (p)
572
1.99M
  {
573
1.99M
    if (type_field (p->type) == ASN1_ETYPE_TAG)
574
1.36M
      {
575
1.36M
        if (p->type & CONST_APPLICATION)
576
0
    class2 = ASN1_CLASS_APPLICATION;
577
1.36M
        else if (p->type & CONST_UNIVERSAL)
578
0
    class2 = ASN1_CLASS_UNIVERSAL;
579
1.36M
        else if (p->type & CONST_PRIVATE)
580
0
    class2 = ASN1_CLASS_PRIVATE;
581
1.36M
        else
582
1.36M
    class2 = ASN1_CLASS_CONTEXT_SPECIFIC;
583
584
1.36M
        if (p->type & CONST_EXPLICIT)
585
318k
    {
586
318k
      if (asn1_get_tag_der
587
318k
          (der + counter, der_len, &class, &len2,
588
318k
           &tag) != ASN1_SUCCESS)
589
1.37k
        return ASN1_DER_ERROR;
590
591
316k
      DECR_LEN (der_len, len2);
592
316k
      counter += len2;
593
594
316k
      if (flags & ASN1_DECODE_FLAG_STRICT_DER)
595
274k
        len3 =
596
274k
          asn1_get_length_der (der + counter, der_len, &len2);
597
42.8k
      else
598
42.8k
        len3 =
599
42.8k
          asn1_get_length_ber (der + counter, der_len, &len2);
600
316k
      if (len3 < 0)
601
9.28k
        return ASN1_DER_ERROR;
602
603
307k
      DECR_LEN (der_len, len2);
604
307k
      counter += len2;
605
606
307k
      if (!is_tag_implicit)
607
307k
        {
608
307k
          if ((class != (class2 | ASN1_CLASS_STRUCTURED)) ||
609
240k
        (tag != strtoul ((char *) p->value, NULL, 10)))
610
74.5k
      return ASN1_TAG_ERROR;
611
307k
        }
612
0
      else
613
0
        {   /* ASN1_TAG_IMPLICIT */
614
0
          if ((class != class_implicit) || (tag != tag_implicit))
615
0
      return ASN1_TAG_ERROR;
616
0
        }
617
233k
      is_tag_implicit = 0;
618
233k
    }
619
1.05M
        else
620
1.05M
    {   /* ASN1_TAG_IMPLICIT */
621
1.05M
      if (!is_tag_implicit)
622
1.05M
        {
623
1.05M
          if ((type_field (node->type) == ASN1_ETYPE_SEQUENCE) ||
624
850k
        (type_field (node->type) == ASN1_ETYPE_SEQUENCE_OF)
625
846k
        || (type_field (node->type) == ASN1_ETYPE_SET)
626
846k
        || (type_field (node->type) == ASN1_ETYPE_SET_OF))
627
208k
      class2 |= ASN1_CLASS_STRUCTURED;
628
1.05M
          class_implicit = class2;
629
1.05M
          tag_implicit = strtoul ((char *) p->value, NULL, 10);
630
1.05M
          is_tag_implicit = 1;
631
1.05M
        }
632
1.05M
    }
633
1.36M
      }
634
1.91M
    p = p->right;
635
1.91M
  }
636
1.35M
    }
637
638
10.1M
  if (is_tag_implicit)
639
1.05M
    {
640
1.05M
      if (asn1_get_tag_der
641
1.05M
    (der + counter, der_len, &class, &len2, &tag) != ASN1_SUCCESS)
642
2.65k
  return ASN1_DER_ERROR;
643
644
1.04M
      DECR_LEN (der_len, len2);
645
646
1.04M
      if ((class != class_implicit) || (tag != tag_implicit))
647
594k
  {
648
594k
    if (type_field (node->type) == ASN1_ETYPE_OCTET_STRING)
649
20.9k
      {
650
20.9k
        class_implicit |= ASN1_CLASS_STRUCTURED;
651
20.9k
        if ((class != class_implicit) || (tag != tag_implicit))
652
20.7k
    return ASN1_TAG_ERROR;
653
20.9k
      }
654
573k
    else
655
573k
      return ASN1_TAG_ERROR;
656
594k
  }
657
1.04M
    }
658
9.06M
  else
659
9.06M
    {
660
9.06M
      unsigned type = type_field (node->type);
661
9.06M
      if (type == ASN1_ETYPE_TAG)
662
24.4k
  {
663
24.4k
    *tag_len = 0;
664
24.4k
    if (inner_tag_len)
665
24.4k
      *inner_tag_len = 0;
666
24.4k
    return ASN1_SUCCESS;
667
24.4k
  }
668
669
9.03M
      if (asn1_get_tag_der
670
9.03M
    (der + counter, der_len, &class, &len2, &tag) != ASN1_SUCCESS)
671
2.24k
  return ASN1_DER_ERROR;
672
673
9.03M
      DECR_LEN (der_len, len2);
674
675
9.03M
      switch (type)
676
9.03M
  {
677
0
  case ASN1_ETYPE_NULL:
678
394k
  case ASN1_ETYPE_BOOLEAN:
679
1.07M
  case ASN1_ETYPE_INTEGER:
680
1.07M
  case ASN1_ETYPE_ENUMERATED:
681
2.23M
  case ASN1_ETYPE_OBJECT_ID:
682
2.23M
  case ASN1_ETYPE_GENERALSTRING:
683
2.23M
  case ASN1_ETYPE_NUMERIC_STRING:
684
2.23M
  case ASN1_ETYPE_IA5_STRING:
685
2.31M
  case ASN1_ETYPE_TELETEX_STRING:
686
2.43M
  case ASN1_ETYPE_PRINTABLE_STRING:
687
2.47M
  case ASN1_ETYPE_UNIVERSAL_STRING:
688
2.54M
  case ASN1_ETYPE_BMP_STRING:
689
2.57M
  case ASN1_ETYPE_UTF8_STRING:
690
2.57M
  case ASN1_ETYPE_VISIBLE_STRING:
691
2.70M
  case ASN1_ETYPE_BIT_STRING:
692
4.62M
  case ASN1_ETYPE_SEQUENCE:
693
5.14M
  case ASN1_ETYPE_SEQUENCE_OF:
694
5.14M
  case ASN1_ETYPE_SET:
695
5.80M
  case ASN1_ETYPE_SET_OF:
696
5.90M
  case ASN1_ETYPE_GENERALIZED_TIME:
697
6.36M
  case ASN1_ETYPE_UTC_TIME:
698
6.36M
    if ((class != _asn1_tags[type].class)
699
6.29M
        || (tag != _asn1_tags[type].tag))
700
539k
      return ASN1_DER_ERROR;
701
5.82M
    break;
702
703
5.82M
  case ASN1_ETYPE_OCTET_STRING:
704
    /* OCTET STRING is handled differently to allow
705
     * BER encodings (structured class). */
706
494k
    if (((class != ASN1_CLASS_UNIVERSAL)
707
11.6k
         && (class != (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED)))
708
494k
        || (tag != ASN1_TAG_OCTET_STRING))
709
10.6k
      return ASN1_DER_ERROR;
710
483k
    break;
711
2.17M
  case ASN1_ETYPE_ANY:
712
2.17M
    counter -= len2;
713
2.17M
    break;
714
0
  case ASN1_ETYPE_CHOICE:
715
0
    counter -= len2;
716
0
    break;
717
0
  default:
718
0
    return ASN1_DER_ERROR;
719
0
    break;
720
9.03M
  }
721
9.03M
    }
722
723
8.93M
  counter += len2;
724
8.93M
  *tag_len = counter;
725
8.93M
  if (inner_tag_len)
726
8.40M
    *inner_tag_len = len2;
727
8.93M
  return ASN1_SUCCESS;
728
729
0
cleanup:
730
0
  return result;
731
10.1M
}
732
733
static int
734
extract_tag_der_recursive (asn1_node node, const unsigned char *der,
735
         int der_len, int *ret_len, int *inner_len,
736
         unsigned flags)
737
10.2M
{
738
10.2M
  asn1_node p;
739
10.2M
  int ris = ASN1_DER_ERROR;
740
741
10.2M
  if (type_field (node->type) == ASN1_ETYPE_CHOICE)
742
531k
    {
743
531k
      p = node->down;
744
531k
      while (p)
745
531k
  {
746
531k
    ris =
747
531k
      _asn1_extract_tag_der (p, der, der_len, ret_len, inner_len,
748
531k
           flags);
749
531k
    if (ris == ASN1_SUCCESS)
750
531k
      break;
751
0
    p = p->right;
752
0
  }
753
754
531k
      *ret_len = 0;
755
531k
      return ris;
756
531k
    }
757
9.66M
  else
758
9.66M
    return _asn1_extract_tag_der (node, der, der_len, ret_len, inner_len,
759
9.66M
          flags);
760
10.2M
}
761
762
static int
763
_asn1_delete_not_used (asn1_node node)
764
396k
{
765
396k
  asn1_node p, p2;
766
767
396k
  if (node == NULL)
768
0
    return ASN1_ELEMENT_NOT_FOUND;
769
770
396k
  p = node;
771
11.8M
  while (p)
772
11.4M
    {
773
11.4M
      if (p->type & CONST_NOT_USED)
774
96.0k
  {
775
96.0k
    p2 = NULL;
776
96.0k
    if (p != node)
777
96.0k
      {
778
96.0k
        p2 = _asn1_find_left (p);
779
96.0k
        if (!p2)
780
2.02k
    p2 = _asn1_find_up (p);
781
96.0k
      }
782
96.0k
    asn1_delete_structure (&p);
783
96.0k
    p = p2;
784
96.0k
  }
785
786
11.4M
      if (!p)
787
0
  break;     /* reach node */
788
789
11.4M
      if (p->down)
790
5.24M
  {
791
5.24M
    p = p->down;
792
5.24M
  }
793
6.24M
      else
794
6.24M
  {
795
6.24M
    if (p == node)
796
26.6k
      p = NULL;
797
6.21M
    else if (p->right)
798
2.80M
      p = p->right;
799
3.41M
    else
800
3.41M
      {
801
5.24M
        while (1)
802
5.24M
    {
803
5.24M
      p = _asn1_find_up (p);
804
5.24M
      if (p == node)
805
370k
        {
806
370k
          p = NULL;
807
370k
          break;
808
370k
        }
809
4.87M
      if (p->right)
810
3.04M
        {
811
3.04M
          p = p->right;
812
3.04M
          break;
813
3.04M
        }
814
4.87M
    }
815
3.41M
      }
816
6.24M
  }
817
11.4M
    }
818
396k
  return ASN1_SUCCESS;
819
396k
}
820
821
static int
822
_asn1_get_indefinite_length_string (const unsigned char *der,
823
            int der_len, int *len)
824
4.98k
{
825
4.98k
  int len2, len3, counter, indefinite;
826
4.98k
  int result;
827
4.98k
  unsigned long tag;
828
4.98k
  unsigned char class;
829
830
4.98k
  counter = indefinite = 0;
831
832
1.40M
  while (1)
833
1.40M
    {
834
1.40M
      if (HAVE_TWO (der_len) && (der[counter] == 0)
835
42.3k
    && (der[counter + 1] == 0))
836
3.57k
  {
837
3.57k
    counter += 2;
838
3.57k
    DECR_LEN (der_len, 2);
839
840
3.57k
    indefinite--;
841
3.57k
    if (indefinite <= 0)
842
2.83k
      break;
843
739
    else
844
739
      continue;
845
3.57k
  }
846
847
1.40M
      if (asn1_get_tag_der
848
1.40M
    (der + counter, der_len, &class, &len2, &tag) != ASN1_SUCCESS)
849
872
  return ASN1_DER_ERROR;
850
851
1.40M
      DECR_LEN (der_len, len2);
852
1.40M
      counter += len2;
853
854
1.40M
      len2 = asn1_get_length_der (der + counter, der_len, &len3);
855
1.40M
      if (len2 < -1)
856
1.27k
  return ASN1_DER_ERROR;
857
858
1.39M
      if (len2 == -1)
859
4.16k
  {
860
4.16k
    indefinite++;
861
4.16k
    counter += 1;
862
4.16k
    DECR_LEN (der_len, 1);
863
4.16k
  }
864
1.39M
      else
865
1.39M
  {
866
1.39M
    counter += len2 + len3;
867
1.39M
    DECR_LEN (der_len, len2 + len3);
868
1.39M
  }
869
1.39M
    }
870
871
2.83k
  *len = counter;
872
2.83k
  return ASN1_SUCCESS;
873
874
0
cleanup:
875
0
  return result;
876
4.98k
}
877
878
static void
879
delete_unneeded_choice_fields (asn1_node p)
880
531k
{
881
531k
  asn1_node p2;
882
883
1.50M
  while (p->right)
884
977k
    {
885
977k
      p2 = p->right;
886
977k
      asn1_delete_structure (&p2);
887
977k
    }
888
531k
}
889
890
891
/**
892
 * asn1_der_decoding2
893
 * @element: pointer to an ASN1 structure.
894
 * @ider: vector that contains the DER encoding.
895
 * @max_ider_len: pointer to an integer giving the information about the
896
 *   maximal number of bytes occupied by *@ider. The real size of the DER
897
 *   encoding is returned through this pointer.
898
 * @flags: flags controlling the behaviour of the function.
899
 * @errorDescription: null-terminated string contains details when an
900
 *   error occurred.
901
 *
902
 * Fill the structure *@element with values of a DER encoding string. The
903
 * structure must just be created with function asn1_create_element().
904
 *
905
 * If %ASN1_DECODE_FLAG_ALLOW_PADDING flag is set then the function will ignore
906
 * padding after the decoded DER data. Upon a successful return the value of
907
 * *@max_ider_len will be set to the number of bytes decoded.
908
 *
909
 * If %ASN1_DECODE_FLAG_STRICT_DER flag is set then the function will
910
 * not decode any BER-encoded elements.
911
 *
912
 * Returns: %ASN1_SUCCESS if DER encoding OK, %ASN1_ELEMENT_NOT_FOUND
913
 *   if @ELEMENT is %NULL, and %ASN1_TAG_ERROR or
914
 *   %ASN1_DER_ERROR if the der encoding doesn't match the structure
915
 *   name (*@ELEMENT deleted).
916
 **/
917
int
918
asn1_der_decoding2 (asn1_node *element, const void *ider, int *max_ider_len,
919
        unsigned int flags, char *errorDescription)
920
494k
{
921
494k
  asn1_node node, p, p2, p3;
922
494k
  char temp[128];
923
494k
  int counter, len2, len3, len4, move, ris, tlen;
924
494k
  struct node_tail_cache_st tcache = { NULL, NULL };
925
494k
  unsigned char class;
926
494k
  unsigned long tag;
927
494k
  int tag_len;
928
494k
  int indefinite, result, total_len = *max_ider_len, ider_len = *max_ider_len;
929
494k
  int inner_tag_len;
930
494k
  unsigned char *ptmp;
931
494k
  const unsigned char *ptag;
932
494k
  const unsigned char *der = ider;
933
934
494k
  node = *element;
935
936
494k
  if (errorDescription != NULL)
937
99.0k
    errorDescription[0] = 0;
938
939
494k
  if (node == NULL)
940
0
    return ASN1_ELEMENT_NOT_FOUND;
941
942
494k
  if (node->type & CONST_OPTION)
943
0
    {
944
0
      result = ASN1_GENERIC_ERROR;
945
0
      warn ();
946
0
      goto cleanup;
947
0
    }
948
949
494k
  counter = 0;
950
494k
  move = DOWN;
951
494k
  p = node;
952
14.7M
  while (1)
953
14.7M
    {
954
14.7M
      tag_len = 0;
955
14.7M
      inner_tag_len = 0;
956
14.7M
      ris = ASN1_SUCCESS;
957
14.7M
      if (move != UP)
958
9.14M
  {
959
9.14M
    if (p->type & CONST_SET)
960
0
      {
961
0
        p2 = _asn1_find_up (p);
962
0
        len2 = p2->tmp_ival;
963
0
        if (len2 == -1)
964
0
    {
965
0
      if (HAVE_TWO (ider_len) && !der[counter]
966
0
          && !der[counter + 1])
967
0
        {
968
0
          p = p2;
969
0
          move = UP;
970
0
          counter += 2;
971
0
          DECR_LEN (ider_len, 2);
972
0
          continue;
973
0
        }
974
0
    }
975
0
        else if (counter == len2)
976
0
    {
977
0
      p = p2;
978
0
      move = UP;
979
0
      continue;
980
0
    }
981
0
        else if (counter > len2)
982
0
    {
983
0
      result = ASN1_DER_ERROR;
984
0
      warn ();
985
0
      goto cleanup;
986
0
    }
987
0
        p2 = p2->down;
988
0
        while (p2)
989
0
    {
990
0
      if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
991
0
        {
992
0
          ris =
993
0
      extract_tag_der_recursive (p2, der + counter,
994
0
               ider_len, &len2, NULL,
995
0
               flags);
996
0
          if (ris == ASN1_SUCCESS)
997
0
      {
998
0
        p2->type &= ~CONST_NOT_USED;
999
0
        p = p2;
1000
0
        break;
1001
0
      }
1002
0
        }
1003
0
      p2 = p2->right;
1004
0
    }
1005
0
        if (p2 == NULL)
1006
0
    {
1007
0
      result = ASN1_DER_ERROR;
1008
0
      warn ();
1009
0
      goto cleanup;
1010
0
    }
1011
0
      }
1012
1013
    /* the position in the DER structure this starts */
1014
9.14M
    p->start = counter;
1015
9.14M
    p->end = total_len - 1;
1016
1017
9.14M
    if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
1018
1.07M
      {
1019
1.07M
        p2 = _asn1_find_up (p);
1020
1.07M
        len2 = p2->tmp_ival;
1021
1.07M
        if (counter == len2)
1022
228k
    {
1023
228k
      if (p->right)
1024
40.3k
        {
1025
40.3k
          p2 = p->right;
1026
40.3k
          move = RIGHT;
1027
40.3k
        }
1028
188k
      else
1029
188k
        move = UP;
1030
1031
228k
      if (p->type & CONST_OPTION)
1032
220k
        asn1_delete_structure (&p);
1033
1034
228k
      p = p2;
1035
228k
      continue;
1036
228k
    }
1037
1.07M
      }
1038
1039
8.91M
    if (type_field (p->type) == ASN1_ETYPE_CHOICE)
1040
547k
      {
1041
1.31M
        while (p->down)
1042
1.30M
    {
1043
1.30M
      ris =
1044
1.30M
        extract_tag_der_recursive (p->down, der + counter,
1045
1.30M
                 ider_len, &len2, NULL, flags);
1046
1047
1.30M
      if (ris == ASN1_SUCCESS)
1048
531k
        {
1049
531k
          delete_unneeded_choice_fields (p->down);
1050
531k
          break;
1051
531k
        }
1052
772k
      else if (ris == ASN1_ERROR_TYPE_ANY)
1053
0
        {
1054
0
          result = ASN1_ERROR_TYPE_ANY;
1055
0
          warn ();
1056
0
          goto cleanup;
1057
0
        }
1058
772k
      else
1059
772k
        {
1060
772k
          p2 = p->down;
1061
772k
          asn1_delete_structure (&p2);
1062
772k
        }
1063
1.30M
    }
1064
1065
547k
        if (p->down == NULL)
1066
15.2k
    {
1067
15.2k
      if (!(p->type & CONST_OPTION))
1068
11.9k
        {
1069
11.9k
          result = ASN1_DER_ERROR;
1070
11.9k
          warn ();
1071
11.9k
          goto cleanup;
1072
11.9k
        }
1073
15.2k
    }
1074
531k
        else if (type_field (p->type) != ASN1_ETYPE_CHOICE)
1075
0
    p = p->down;
1076
1077
535k
        p->start = counter;
1078
535k
      }
1079
1080
8.90M
    if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
1081
846k
      {
1082
846k
        p2 = _asn1_find_up (p);
1083
846k
        len2 = p2->tmp_ival;
1084
1085
846k
        if ((len2 != -1) && (counter > len2))
1086
3.25k
    ris = ASN1_TAG_ERROR;
1087
846k
      }
1088
1089
8.90M
    if (ris == ASN1_SUCCESS)
1090
8.89M
      ris =
1091
8.89M
        extract_tag_der_recursive (p, der + counter, ider_len,
1092
8.89M
           &tag_len, &inner_tag_len, flags);
1093
1094
8.90M
    if (ris != ASN1_SUCCESS)
1095
472k
      {
1096
472k
        if (p->type & CONST_OPTION)
1097
114k
    {
1098
114k
      p->type |= CONST_NOT_USED;
1099
114k
      move = RIGHT;
1100
114k
    }
1101
357k
        else if (p->type & CONST_DEFAULT)
1102
299k
    {
1103
299k
      _asn1_set_value (p, NULL, 0);
1104
299k
      move = RIGHT;
1105
299k
    }
1106
58.0k
        else
1107
58.0k
    {
1108
58.0k
      if (errorDescription != NULL)
1109
1.80k
        _asn1_error_description_tag_error (p, errorDescription);
1110
1111
58.0k
      result = ASN1_TAG_ERROR;
1112
58.0k
      warn ();
1113
58.0k
      goto cleanup;
1114
58.0k
    }
1115
472k
      }
1116
8.43M
    else
1117
8.43M
      {
1118
8.43M
        DECR_LEN (ider_len, tag_len);
1119
8.43M
        counter += tag_len;
1120
8.43M
      }
1121
8.90M
  }
1122
1123
14.4M
      if (ris == ASN1_SUCCESS)
1124
13.9M
  {
1125
13.9M
    switch (type_field (p->type))
1126
13.9M
      {
1127
1.86k
      case ASN1_ETYPE_NULL:
1128
1.86k
        DECR_LEN (ider_len, 1);
1129
1.86k
        if (der[counter])
1130
3
    {
1131
3
      result = ASN1_DER_ERROR;
1132
3
      warn ();
1133
3
      goto cleanup;
1134
3
    }
1135
1.85k
        counter++;
1136
1.85k
        move = RIGHT;
1137
1.85k
        break;
1138
106k
      case ASN1_ETYPE_BOOLEAN:
1139
106k
        DECR_LEN (ider_len, 2);
1140
1141
106k
        if (der[counter++] != 1)
1142
92
    {
1143
92
      result = ASN1_DER_ERROR;
1144
92
      warn ();
1145
92
      goto cleanup;
1146
92
    }
1147
106k
        if (der[counter++] == 0)
1148
8.98k
    _asn1_set_value (p, "F", 1);
1149
97.8k
        else
1150
97.8k
    _asn1_set_value (p, "T", 1);
1151
106k
        move = RIGHT;
1152
106k
        break;
1153
644k
      case ASN1_ETYPE_INTEGER:
1154
649k
      case ASN1_ETYPE_ENUMERATED:
1155
649k
        len2 = asn1_get_length_der (der + counter, ider_len, &len3);
1156
649k
        if (len2 < 0)
1157
1.93k
    {
1158
1.93k
      result = ASN1_DER_ERROR;
1159
1.93k
      warn ();
1160
1.93k
      goto cleanup;
1161
1.93k
    }
1162
1163
647k
        DECR_LEN (ider_len, len3 + len2);
1164
1165
647k
        _asn1_set_value (p, der + counter, len3 + len2);
1166
647k
        counter += len3 + len2;
1167
647k
        move = RIGHT;
1168
647k
        break;
1169
1.15M
      case ASN1_ETYPE_OBJECT_ID:
1170
1.15M
        result =
1171
1.15M
    asn1_get_object_id_der (der + counter, ider_len, &len2,
1172
1.15M
          temp, sizeof (temp));
1173
1.15M
        if (result != ASN1_SUCCESS)
1174
2.64k
    {
1175
2.64k
      warn ();
1176
2.64k
      goto cleanup;
1177
2.64k
    }
1178
1179
1.15M
        DECR_LEN (ider_len, len2);
1180
1181
1.15M
        tlen = strlen (temp);
1182
1.15M
        if (tlen > 0)
1183
1.15M
    _asn1_set_value (p, temp, tlen + 1);
1184
1185
1.15M
        counter += len2;
1186
1.15M
        move = RIGHT;
1187
1.15M
        break;
1188
38.2k
      case ASN1_ETYPE_GENERALIZED_TIME:
1189
181k
      case ASN1_ETYPE_UTC_TIME:
1190
181k
        result =
1191
181k
    _asn1_get_time_der (type_field (p->type), der + counter,
1192
181k
            ider_len, &len2, temp, sizeof (temp) - 1,
1193
181k
            flags);
1194
181k
        if (result != ASN1_SUCCESS)
1195
1.73k
    {
1196
1.73k
      warn ();
1197
1.73k
      goto cleanup;
1198
1.73k
    }
1199
1200
180k
        DECR_LEN (ider_len, len2);
1201
1202
180k
        tlen = strlen (temp);
1203
180k
        if (tlen > 0)
1204
180k
    _asn1_set_value (p, temp, tlen);
1205
1206
180k
        counter += len2;
1207
180k
        move = RIGHT;
1208
180k
        break;
1209
489k
      case ASN1_ETYPE_OCTET_STRING:
1210
489k
        if (counter < inner_tag_len)
1211
0
    {
1212
0
      result = ASN1_DER_ERROR;
1213
0
      warn ();
1214
0
      goto cleanup;
1215
0
    }
1216
1217
489k
        ptag = der + counter - inner_tag_len;
1218
489k
        if ((flags & ASN1_DECODE_FLAG_STRICT_DER)
1219
6.59k
      || !(ptag[0] & ASN1_CLASS_STRUCTURED))
1220
488k
    {
1221
488k
      if (ptag[0] & ASN1_CLASS_STRUCTURED)
1222
146
        {
1223
146
          result = ASN1_DER_ERROR;
1224
146
          warn ();
1225
146
          goto cleanup;
1226
146
        }
1227
1228
487k
      len2 = asn1_get_length_der (der + counter, ider_len, &len3);
1229
487k
      if (len2 < 0)
1230
1.73k
        {
1231
1.73k
          result = ASN1_DER_ERROR;
1232
1.73k
          warn ();
1233
1.73k
          goto cleanup;
1234
1.73k
        }
1235
1236
486k
      DECR_LEN (ider_len, len3 + len2);
1237
1238
486k
      _asn1_set_value (p, der + counter, len3 + len2);
1239
486k
      counter += len3 + len2;
1240
486k
    }
1241
1.36k
        else
1242
1.36k
    {
1243
1.36k
      unsigned dflags = 0, vlen, ber_len;
1244
1245
1.36k
      if (ptag[0] & ASN1_CLASS_STRUCTURED)
1246
1.36k
        dflags |= DECODE_FLAG_CONSTRUCTED;
1247
1248
1.36k
      result =
1249
1.36k
        _asn1_decode_simple_ber (type_field (p->type),
1250
1.36k
               der + counter, ider_len, &ptmp,
1251
1.36k
               &vlen, &ber_len, dflags);
1252
1.36k
      if (result != ASN1_SUCCESS)
1253
594
        {
1254
594
          warn ();
1255
594
          goto cleanup;
1256
594
        }
1257
1258
774
      DECR_LEN (ider_len, ber_len);
1259
1260
774
      _asn1_set_value_lv (p, ptmp, vlen);
1261
1262
774
      counter += ber_len;
1263
774
      free (ptmp);
1264
774
    }
1265
486k
        move = RIGHT;
1266
486k
        break;
1267
169
      case ASN1_ETYPE_GENERALSTRING:
1268
169
      case ASN1_ETYPE_NUMERIC_STRING:
1269
83.4k
      case ASN1_ETYPE_IA5_STRING:
1270
88.7k
      case ASN1_ETYPE_TELETEX_STRING:
1271
115k
      case ASN1_ETYPE_PRINTABLE_STRING:
1272
120k
      case ASN1_ETYPE_UNIVERSAL_STRING:
1273
138k
      case ASN1_ETYPE_BMP_STRING:
1274
141k
      case ASN1_ETYPE_UTF8_STRING:
1275
141k
      case ASN1_ETYPE_VISIBLE_STRING:
1276
274k
      case ASN1_ETYPE_BIT_STRING:
1277
274k
        len2 = asn1_get_length_der (der + counter, ider_len, &len3);
1278
274k
        if (len2 < 0)
1279
2.17k
    {
1280
2.17k
      result = ASN1_DER_ERROR;
1281
2.17k
      warn ();
1282
2.17k
      goto cleanup;
1283
2.17k
    }
1284
1285
272k
        DECR_LEN (ider_len, len3 + len2);
1286
1287
272k
        _asn1_set_value (p, der + counter, len3 + len2);
1288
272k
        counter += len3 + len2;
1289
272k
        move = RIGHT;
1290
272k
        break;
1291
3.50M
      case ASN1_ETYPE_SEQUENCE:
1292
3.50M
      case ASN1_ETYPE_SET:
1293
3.50M
        if (move == UP)
1294
1.58M
    {
1295
1.58M
      len2 = p->tmp_ival;
1296
1.58M
      p->tmp_ival = 0;
1297
1.58M
      if (len2 == -1)
1298
11.2k
        {   /* indefinite length method */
1299
11.2k
          DECR_LEN (ider_len, 2);
1300
11.0k
          if ((der[counter]) || der[counter + 1])
1301
165
      {
1302
165
        result = ASN1_DER_ERROR;
1303
165
        warn ();
1304
165
        goto cleanup;
1305
165
      }
1306
10.9k
          counter += 2;
1307
10.9k
        }
1308
1.57M
      else
1309
1.57M
        {   /* definite length method */
1310
1.57M
          if (len2 != counter)
1311
8.17k
      {
1312
8.17k
        result = ASN1_DER_ERROR;
1313
8.17k
        warn ();
1314
8.17k
        goto cleanup;
1315
8.17k
      }
1316
1.57M
        }
1317
1.57M
      move = RIGHT;
1318
1.57M
    }
1319
1.92M
        else
1320
1.92M
    {   /* move==DOWN || move==RIGHT */
1321
1.92M
      len3 = asn1_get_length_der (der + counter, ider_len, &len2);
1322
1.92M
      if (IS_ERR (len3, flags))
1323
2.84k
        {
1324
2.84k
          result = ASN1_DER_ERROR;
1325
2.84k
          warn ();
1326
2.84k
          goto cleanup;
1327
2.84k
        }
1328
1329
1.92M
      DECR_LEN (ider_len, len2);
1330
1.92M
      counter += len2;
1331
1332
1.92M
      if (len3 > 0)
1333
1.66M
        {
1334
1.66M
          p->tmp_ival = counter + len3;
1335
1.66M
          move = DOWN;
1336
1.66M
        }
1337
259k
      else if (len3 == 0)
1338
245k
        {
1339
245k
          p2 = p->down;
1340
895k
          while (p2)
1341
650k
      {
1342
650k
        if (type_field (p2->type) != ASN1_ETYPE_TAG)
1343
649k
          {
1344
649k
            p3 = p2->right;
1345
649k
            asn1_delete_structure (&p2);
1346
649k
            p2 = p3;
1347
649k
          }
1348
806
        else
1349
806
          p2 = p2->right;
1350
650k
      }
1351
245k
          move = RIGHT;
1352
245k
        }
1353
14.5k
      else
1354
14.5k
        {   /* indefinite length method */
1355
14.5k
          p->tmp_ival = -1;
1356
14.5k
          move = DOWN;
1357
14.5k
        }
1358
1.92M
    }
1359
3.49M
        break;
1360
3.49M
      case ASN1_ETYPE_SEQUENCE_OF:
1361
4.36M
      case ASN1_ETYPE_SET_OF:
1362
4.36M
        if (move == UP)
1363
3.45M
    {
1364
3.45M
      len2 = p->tmp_ival;
1365
3.45M
      if (len2 == -1)
1366
17.4k
        {   /* indefinite length method */
1367
17.4k
          if (!HAVE_TWO (ider_len)
1368
17.3k
        || ((der[counter]) || der[counter + 1]))
1369
16.7k
      {
1370
16.7k
        result = _asn1_append_sequence_set (p, &tcache);
1371
16.7k
        if (result != 0)
1372
0
          {
1373
0
            warn ();
1374
0
            goto cleanup;
1375
0
          }
1376
16.7k
        p = tcache.tail;
1377
16.7k
        move = RIGHT;
1378
16.7k
        continue;
1379
16.7k
      }
1380
1381
638
          p->tmp_ival = 0;
1382
638
          tcache.tail = NULL; /* finished decoding this structure */
1383
638
          tcache.head = NULL;
1384
638
          DECR_LEN (ider_len, 2);
1385
638
          counter += 2;
1386
638
        }
1387
3.43M
      else
1388
3.43M
        {   /* definite length method */
1389
3.43M
          if (len2 > counter)
1390
2.74M
      {
1391
2.74M
        result = _asn1_append_sequence_set (p, &tcache);
1392
2.74M
        if (result != 0)
1393
0
          {
1394
0
            warn ();
1395
0
            goto cleanup;
1396
0
          }
1397
2.74M
        p = tcache.tail;
1398
2.74M
        move = RIGHT;
1399
2.74M
        continue;
1400
2.74M
      }
1401
1402
690k
          p->tmp_ival = 0;
1403
690k
          tcache.tail = NULL; /* finished decoding this structure */
1404
690k
          tcache.head = NULL;
1405
1406
690k
          if (len2 != counter)
1407
730
      {
1408
730
        result = ASN1_DER_ERROR;
1409
730
        warn ();
1410
730
        goto cleanup;
1411
730
      }
1412
690k
        }
1413
3.45M
    }
1414
919k
        else
1415
919k
    {   /* move==DOWN || move==RIGHT */
1416
919k
      len3 = asn1_get_length_der (der + counter, ider_len, &len2);
1417
919k
      if (IS_ERR (len3, flags))
1418
1.85k
        {
1419
1.85k
          result = ASN1_DER_ERROR;
1420
1.85k
          warn ();
1421
1.85k
          goto cleanup;
1422
1.85k
        }
1423
1424
917k
      DECR_LEN (ider_len, len2);
1425
917k
      counter += len2;
1426
917k
      if (len3)
1427
702k
        {
1428
702k
          if (len3 > 0)
1429
701k
      { /* definite length method */
1430
701k
        p->tmp_ival = counter + len3;
1431
701k
      }
1432
953
          else
1433
953
      { /* indefinite length method */
1434
953
        p->tmp_ival = -1;
1435
953
      }
1436
1437
702k
          p2 = p->down;
1438
702k
          if (p2 == NULL)
1439
0
      {
1440
0
        result = ASN1_DER_ERROR;
1441
0
        warn ();
1442
0
        goto cleanup;
1443
0
      }
1444
1445
770k
          while ((type_field (p2->type) == ASN1_ETYPE_TAG)
1446
702k
           || (type_field (p2->type) == ASN1_ETYPE_SIZE))
1447
67.8k
      p2 = p2->right;
1448
702k
          if (p2->right == NULL)
1449
702k
      {
1450
702k
        result = _asn1_append_sequence_set (p, &tcache);
1451
702k
        if (result != 0)
1452
0
          {
1453
0
            warn ();
1454
0
            goto cleanup;
1455
0
          }
1456
702k
      }
1457
702k
          p = p2;
1458
702k
        }
1459
917k
    }
1460
1.60M
        move = RIGHT;
1461
1.60M
        break;
1462
2.17M
      case ASN1_ETYPE_ANY:
1463
        /* Check indefinite length method in an EXPLICIT TAG */
1464
1465
2.17M
        if (!(flags & ASN1_DECODE_FLAG_STRICT_DER)
1466
67.5k
      && (p->type & CONST_TAG) && tag_len == 2
1467
4.73k
      && (der[counter - 1] == 0x80))
1468
1.26k
    indefinite = 1;
1469
2.17M
        else
1470
2.17M
    indefinite = 0;
1471
1472
2.17M
        if (asn1_get_tag_der
1473
2.17M
      (der + counter, ider_len, &class, &len2,
1474
2.17M
       &tag) != ASN1_SUCCESS)
1475
200
    {
1476
200
      result = ASN1_DER_ERROR;
1477
200
      warn ();
1478
200
      goto cleanup;
1479
200
    }
1480
1481
2.17M
        DECR_LEN (ider_len, len2);
1482
1483
2.17M
        len4 =
1484
2.17M
    asn1_get_length_der (der + counter + len2, ider_len, &len3);
1485
2.17M
        if (IS_ERR (len4, flags))
1486
1.93k
    {
1487
1.93k
      result = ASN1_DER_ERROR;
1488
1.93k
      warn ();
1489
1.93k
      goto cleanup;
1490
1.93k
    }
1491
2.17M
        if (len4 != -1)  /* definite */
1492
2.17M
    {
1493
2.17M
      len2 += len4;
1494
1495
2.17M
      DECR_LEN (ider_len, len4 + len3);
1496
2.17M
      _asn1_set_value_lv (p, der + counter, len2 + len3);
1497
2.17M
      counter += len2 + len3;
1498
2.17M
    }
1499
1.10k
        else    /* == -1 */
1500
1.10k
    {   /* indefinite length */
1501
1.10k
      ider_len += len2; /* undo DECR_LEN */
1502
1503
1.10k
      if (counter == 0)
1504
0
        {
1505
0
          result = ASN1_DER_ERROR;
1506
0
          warn ();
1507
0
          goto cleanup;
1508
0
        }
1509
1510
1.10k
      result =
1511
1.10k
        _asn1_get_indefinite_length_string (der + counter,
1512
1.10k
              ider_len, &len2);
1513
1.10k
      if (result != ASN1_SUCCESS)
1514
38
        {
1515
38
          warn ();
1516
38
          goto cleanup;
1517
38
        }
1518
1519
1.06k
      DECR_LEN (ider_len, len2);
1520
1.06k
      _asn1_set_value_lv (p, der + counter, len2);
1521
1.06k
      counter += len2;
1522
1523
1.06k
    }
1524
1525
        /* Check if a couple of 0x00 are present due to an EXPLICIT TAG with
1526
           an indefinite length method. */
1527
2.17M
        if (indefinite)
1528
1.26k
    {
1529
1.26k
      DECR_LEN (ider_len, 2);
1530
1.22k
      if (!der[counter] && !der[counter + 1])
1531
1.17k
        {
1532
1.17k
          counter += 2;
1533
1.17k
        }
1534
46
      else
1535
46
        {
1536
46
          result = ASN1_DER_ERROR;
1537
46
          warn ();
1538
46
          goto cleanup;
1539
46
        }
1540
1.22k
    }
1541
1542
2.17M
        move = RIGHT;
1543
2.17M
        break;
1544
1.08M
      default:
1545
1.08M
        move = (move == UP) ? RIGHT : DOWN;
1546
1.08M
        break;
1547
13.9M
      }
1548
13.9M
  }
1549
1550
11.6M
      if (p)
1551
11.6M
  {
1552
11.6M
    p->end = counter - 1;
1553
11.6M
  }
1554
1555
11.6M
      if (p == node && move != DOWN)
1556
396k
  break;
1557
1558
11.2M
      if (move == DOWN)
1559
2.23M
  {
1560
2.23M
    if (p->down)
1561
2.20M
      p = p->down;
1562
24.4k
    else
1563
24.4k
      move = RIGHT;
1564
2.23M
  }
1565
11.2M
      if ((move == RIGHT) && !(p->type & CONST_SET))
1566
9.01M
  {
1567
9.01M
    if (p->right)
1568
3.64M
      p = p->right;
1569
5.36M
    else
1570
5.36M
      move = UP;
1571
9.01M
  }
1572
11.2M
      if (move == UP)
1573
5.36M
  {
1574
    /* If we are parsing a sequence or set and p is a direct
1575
       child of it, no need to traverse the list back to the leftmost node. */
1576
5.36M
    if (tcache.tail == p)
1577
2.97M
      p = tcache.head;
1578
2.39M
    else
1579
2.39M
      p = _asn1_find_up (p);
1580
5.36M
  }
1581
11.2M
    }
1582
1583
396k
  _asn1_delete_not_used (*element);
1584
1585
396k
  if ((ider_len < 0) ||
1586
396k
      (!(flags & ASN1_DECODE_FLAG_ALLOW_PADDING) && (ider_len != 0)))
1587
882
    {
1588
882
      warn ();
1589
882
      result = ASN1_DER_ERROR;
1590
882
      goto cleanup;
1591
882
    }
1592
1593
395k
  *max_ider_len = total_len - ider_len;
1594
1595
395k
  return ASN1_SUCCESS;
1596
1597
98.1k
cleanup:
1598
98.1k
  asn1_delete_structure (element);
1599
98.1k
  return result;
1600
396k
}
1601
1602
1603
/**
1604
 * asn1_der_decoding:
1605
 * @element: pointer to an ASN1 structure.
1606
 * @ider: vector that contains the DER encoding.
1607
 * @ider_len: number of bytes of *@ider: @ider[0]..@ider[len-1].
1608
 * @errorDescription: null-terminated string contains details when an
1609
 *   error occurred.
1610
 *
1611
 * Fill the structure *@element with values of a DER encoding
1612
 * string. The structure must just be created with function
1613
 * asn1_create_element().
1614
 *
1615
 * Note that the *@element variable is provided as a pointer for
1616
 * historical reasons.
1617
 *
1618
 * Returns: %ASN1_SUCCESS if DER encoding OK, %ASN1_ELEMENT_NOT_FOUND
1619
 *   if @ELEMENT is %NULL, and %ASN1_TAG_ERROR or
1620
 *   %ASN1_DER_ERROR if the der encoding doesn't match the structure
1621
 *   name (*@ELEMENT deleted).
1622
 **/
1623
int
1624
asn1_der_decoding (asn1_node *element, const void *ider, int ider_len,
1625
       char *errorDescription)
1626
103k
{
1627
103k
  return asn1_der_decoding2 (element, ider, &ider_len, 0, errorDescription);
1628
103k
}
1629
1630
/**
1631
 * asn1_der_decoding_element:
1632
 * @structure: pointer to an ASN1 structure
1633
 * @elementName: name of the element to fill
1634
 * @ider: vector that contains the DER encoding of the whole structure.
1635
 * @len: number of bytes of *der: der[0]..der[len-1]
1636
 * @errorDescription: null-terminated string contains details when an
1637
 *   error occurred.
1638
 *
1639
 * Fill the element named @ELEMENTNAME with values of a DER encoding
1640
 * string.  The structure must just be created with function
1641
 * asn1_create_element().  The DER vector must contain the encoding
1642
 * string of the whole @STRUCTURE.  If an error occurs during the
1643
 * decoding procedure, the *@STRUCTURE is deleted and set equal to
1644
 * %NULL.
1645
 *
1646
 * This function is deprecated and may just be an alias to asn1_der_decoding
1647
 * in future versions. Use asn1_der_decoding() instead.
1648
 *
1649
 * Returns: %ASN1_SUCCESS if DER encoding OK, %ASN1_ELEMENT_NOT_FOUND
1650
 *   if ELEMENT is %NULL or @elementName == NULL, and
1651
 *   %ASN1_TAG_ERROR or %ASN1_DER_ERROR if the der encoding doesn't
1652
 *   match the structure @structure (*ELEMENT deleted).
1653
 **/
1654
int
1655
asn1_der_decoding_element (asn1_node *structure, const char *elementName,
1656
         const void *ider, int len, char *errorDescription)
1657
0
{
1658
0
  return asn1_der_decoding (structure, ider, len, errorDescription);
1659
0
}
1660
1661
/**
1662
 * asn1_der_decoding_startEnd:
1663
 * @element: pointer to an ASN1 element
1664
 * @ider: vector that contains the DER encoding.
1665
 * @ider_len: number of bytes of *@ider: @ider[0]..@ider[len-1]
1666
 * @name_element: an element of NAME structure.
1667
 * @start: the position of the first byte of NAME_ELEMENT decoding
1668
 *   (@ider[*start])
1669
 * @end: the position of the last byte of NAME_ELEMENT decoding
1670
 *  (@ider[*end])
1671
 *
1672
 * Find the start and end point of an element in a DER encoding
1673
 * string. I mean that if you have a der encoding and you have already
1674
 * used the function asn1_der_decoding() to fill a structure, it may
1675
 * happen that you want to find the piece of string concerning an
1676
 * element of the structure.
1677
 *
1678
 * One example is the sequence "tbsCertificate" inside an X509
1679
 * certificate.
1680
 *
1681
 * Note that since libtasn1 3.7 the @ider and @ider_len parameters
1682
 * can be omitted, if the element is already decoded using asn1_der_decoding().
1683
 *
1684
 * Returns: %ASN1_SUCCESS if DER encoding OK, %ASN1_ELEMENT_NOT_FOUND
1685
 *   if ELEMENT is %asn1_node EMPTY or @name_element is not a valid
1686
 *   element, %ASN1_TAG_ERROR or %ASN1_DER_ERROR if the der encoding
1687
 *   doesn't match the structure ELEMENT.
1688
 **/
1689
int
1690
asn1_der_decoding_startEnd (asn1_node element, const void *ider, int ider_len,
1691
          const char *name_element, int *start, int *end)
1692
169k
{
1693
169k
  asn1_node node, node_to_find;
1694
169k
  int result = ASN1_DER_ERROR;
1695
1696
169k
  node = element;
1697
1698
169k
  if (node == NULL)
1699
0
    return ASN1_ELEMENT_NOT_FOUND;
1700
1701
169k
  node_to_find = asn1_find_node (node, name_element);
1702
1703
169k
  if (node_to_find == NULL)
1704
1.19k
    return ASN1_ELEMENT_NOT_FOUND;
1705
1706
168k
  *start = node_to_find->start;
1707
168k
  *end = node_to_find->end;
1708
1709
168k
  if (*start == 0 && *end == 0)
1710
0
    {
1711
0
      if (ider == NULL || ider_len == 0)
1712
0
  return ASN1_GENERIC_ERROR;
1713
1714
      /* it seems asn1_der_decoding() wasn't called before. Do it now */
1715
0
      result = asn1_der_decoding (&node, ider, ider_len, NULL);
1716
0
      if (result != ASN1_SUCCESS)
1717
0
  {
1718
0
    warn ();
1719
0
    return result;
1720
0
  }
1721
1722
0
      node_to_find = asn1_find_node (node, name_element);
1723
0
      if (node_to_find == NULL)
1724
0
  return ASN1_ELEMENT_NOT_FOUND;
1725
1726
0
      *start = node_to_find->start;
1727
0
      *end = node_to_find->end;
1728
0
    }
1729
1730
168k
  if (*end < *start)
1731
0
    return ASN1_GENERIC_ERROR;
1732
1733
168k
  return ASN1_SUCCESS;
1734
168k
}
1735
1736
/**
1737
 * asn1_expand_any_defined_by:
1738
 * @definitions: ASN1 definitions
1739
 * @element: pointer to an ASN1 structure
1740
 *
1741
 * Expands every "ANY DEFINED BY" element of a structure created from
1742
 * a DER decoding process (asn1_der_decoding function). The element
1743
 * ANY must be defined by an OBJECT IDENTIFIER. The type used to
1744
 * expand the element ANY is the first one following the definition of
1745
 * the actual value of the OBJECT IDENTIFIER.
1746
 *
1747
 * Returns: %ASN1_SUCCESS if Substitution OK, %ASN1_ERROR_TYPE_ANY if
1748
 *   some "ANY DEFINED BY" element couldn't be expanded due to a
1749
 *   problem in OBJECT_ID -> TYPE association, or other error codes
1750
 *   depending on DER decoding.
1751
 **/
1752
int
1753
asn1_expand_any_defined_by (asn1_node_const definitions, asn1_node *element)
1754
0
{
1755
0
  char name[2 * ASN1_MAX_NAME_SIZE + 2], value[ASN1_MAX_NAME_SIZE];
1756
0
  int retCode = ASN1_SUCCESS, result;
1757
0
  int len, len2, len3;
1758
0
  asn1_node_const p2;
1759
0
  asn1_node p, p3, aux = NULL;
1760
0
  char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
1761
0
  const char *definitionsName;
1762
1763
0
  if ((definitions == NULL) || (*element == NULL))
1764
0
    return ASN1_ELEMENT_NOT_FOUND;
1765
1766
0
  definitionsName = definitions->name;
1767
1768
0
  p = *element;
1769
0
  while (p)
1770
0
    {
1771
1772
0
      switch (type_field (p->type))
1773
0
  {
1774
0
  case ASN1_ETYPE_ANY:
1775
0
    if ((p->type & CONST_DEFINED_BY) && (p->value))
1776
0
      {
1777
        /* search the "DEF_BY" element */
1778
0
        p2 = p->down;
1779
0
        while ((p2) && (type_field (p2->type) != ASN1_ETYPE_CONSTANT))
1780
0
    p2 = p2->right;
1781
1782
0
        if (!p2)
1783
0
    {
1784
0
      retCode = ASN1_ERROR_TYPE_ANY;
1785
0
      break;
1786
0
    }
1787
1788
0
        p3 = _asn1_find_up (p);
1789
1790
0
        if (!p3)
1791
0
    {
1792
0
      retCode = ASN1_ERROR_TYPE_ANY;
1793
0
      break;
1794
0
    }
1795
1796
0
        p3 = p3->down;
1797
0
        while (p3)
1798
0
    {
1799
0
      if (!(strcmp (p3->name, p2->name)))
1800
0
        break;
1801
0
      p3 = p3->right;
1802
0
    }
1803
1804
0
        if ((!p3) || (type_field (p3->type) != ASN1_ETYPE_OBJECT_ID) ||
1805
0
      (p3->value == NULL))
1806
0
    {
1807
1808
0
      p3 = _asn1_find_up (p);
1809
0
      p3 = _asn1_find_up (p3);
1810
1811
0
      if (!p3)
1812
0
        {
1813
0
          retCode = ASN1_ERROR_TYPE_ANY;
1814
0
          break;
1815
0
        }
1816
1817
0
      p3 = p3->down;
1818
1819
0
      while (p3)
1820
0
        {
1821
0
          if (!(strcmp (p3->name, p2->name)))
1822
0
      break;
1823
0
          p3 = p3->right;
1824
0
        }
1825
1826
0
      if ((!p3) || (type_field (p3->type) != ASN1_ETYPE_OBJECT_ID)
1827
0
          || (p3->value == NULL))
1828
0
        {
1829
0
          retCode = ASN1_ERROR_TYPE_ANY;
1830
0
          break;
1831
0
        }
1832
0
    }
1833
1834
        /* search the OBJECT_ID into definitions */
1835
0
        p2 = definitions->down;
1836
0
        while (p2)
1837
0
    {
1838
0
      if ((type_field (p2->type) == ASN1_ETYPE_OBJECT_ID) &&
1839
0
          (p2->type & CONST_ASSIGN))
1840
0
        {
1841
0
          snprintf (name, sizeof (name), "%s.%s", definitionsName,
1842
0
        p2->name);
1843
1844
0
          len = ASN1_MAX_NAME_SIZE;
1845
0
          result =
1846
0
      asn1_read_value (definitions, name, value, &len);
1847
1848
0
          if ((result == ASN1_SUCCESS)
1849
0
        && (!_asn1_strcmp (p3->value, value)))
1850
0
      {
1851
0
        p2 = p2->right; /* pointer to the structure to
1852
               use for expansion */
1853
0
        while ((p2) && (p2->type & CONST_ASSIGN))
1854
0
          p2 = p2->right;
1855
1856
0
        if (p2)
1857
0
          {
1858
0
            snprintf (name, sizeof (name), "%s.%s",
1859
0
          definitionsName, p2->name);
1860
1861
0
            result =
1862
0
        asn1_create_element (definitions, name, &aux);
1863
0
            if (result == ASN1_SUCCESS)
1864
0
        {
1865
0
          _asn1_cpy_name (aux, p);
1866
0
          len2 =
1867
0
            asn1_get_length_der (p->value,
1868
0
               p->value_len, &len3);
1869
0
          if (len2 < 0)
1870
0
            return ASN1_DER_ERROR;
1871
1872
0
          result =
1873
0
            asn1_der_decoding (&aux, p->value + len3,
1874
0
                   len2,
1875
0
                   errorDescription);
1876
0
          if (result == ASN1_SUCCESS)
1877
0
            {
1878
1879
0
              _asn1_set_right (aux, p->right);
1880
0
              _asn1_set_right (p, aux);
1881
1882
0
              result = asn1_delete_structure (&p);
1883
0
              if (result == ASN1_SUCCESS)
1884
0
          {
1885
0
            p = aux;
1886
0
            aux = NULL;
1887
0
            break;
1888
0
          }
1889
0
              else
1890
0
          { /* error with asn1_delete_structure */
1891
0
            asn1_delete_structure (&aux);
1892
0
            retCode = result;
1893
0
            break;
1894
0
          }
1895
0
            }
1896
0
          else
1897
0
            { /* error with asn1_der_decoding */
1898
0
              retCode = result;
1899
0
              break;
1900
0
            }
1901
0
        }
1902
0
            else
1903
0
        { /* error with asn1_create_element */
1904
0
          retCode = result;
1905
0
          break;
1906
0
        }
1907
0
          }
1908
0
        else
1909
0
          { /* error with the pointer to the structure to expand */
1910
0
            retCode = ASN1_ERROR_TYPE_ANY;
1911
0
            break;
1912
0
          }
1913
0
      }
1914
0
        }
1915
0
      p2 = p2->right;
1916
0
    }    /* end while */
1917
1918
0
        if (!p2)
1919
0
    {
1920
0
      retCode = ASN1_ERROR_TYPE_ANY;
1921
0
      break;
1922
0
    }
1923
1924
0
      }
1925
0
    break;
1926
0
  default:
1927
0
    break;
1928
0
  }
1929
1930
1931
0
      if (p->down)
1932
0
  {
1933
0
    p = p->down;
1934
0
  }
1935
0
      else if (p == *element)
1936
0
  {
1937
0
    p = NULL;
1938
0
    break;
1939
0
  }
1940
0
      else if (p->right)
1941
0
  p = p->right;
1942
0
      else
1943
0
  {
1944
0
    while (1)
1945
0
      {
1946
0
        p = _asn1_find_up (p);
1947
0
        if (p == *element)
1948
0
    {
1949
0
      p = NULL;
1950
0
      break;
1951
0
    }
1952
0
        if (p->right)
1953
0
    {
1954
0
      p = p->right;
1955
0
      break;
1956
0
    }
1957
0
      }
1958
0
  }
1959
0
    }
1960
1961
0
  return retCode;
1962
0
}
1963
1964
/**
1965
 * asn1_expand_octet_string:
1966
 * @definitions: ASN1 definitions
1967
 * @element: pointer to an ASN1 structure
1968
 * @octetName: name of the OCTET STRING field to expand.
1969
 * @objectName: name of the OBJECT IDENTIFIER field to use to define
1970
 *    the type for expansion.
1971
 *
1972
 * Expands an "OCTET STRING" element of a structure created from a DER
1973
 * decoding process (the asn1_der_decoding() function).  The type used
1974
 * for expansion is the first one following the definition of the
1975
 * actual value of the OBJECT IDENTIFIER indicated by OBJECTNAME.
1976
 *
1977
 * Returns: %ASN1_SUCCESS if substitution OK, %ASN1_ELEMENT_NOT_FOUND
1978
 *   if @objectName or @octetName are not correct,
1979
 *   %ASN1_VALUE_NOT_VALID if it wasn't possible to find the type to
1980
 *   use for expansion, or other errors depending on DER decoding.
1981
 **/
1982
int
1983
asn1_expand_octet_string (asn1_node_const definitions, asn1_node *element,
1984
        const char *octetName, const char *objectName)
1985
0
{
1986
0
  char name[2 * ASN1_MAX_NAME_SIZE + 1], value[ASN1_MAX_NAME_SIZE];
1987
0
  int retCode = ASN1_SUCCESS, result;
1988
0
  int len, len2, len3;
1989
0
  asn1_node_const p2;
1990
0
  asn1_node aux = NULL;
1991
0
  asn1_node octetNode = NULL, objectNode = NULL;
1992
0
  char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
1993
1994
0
  if ((definitions == NULL) || (*element == NULL))
1995
0
    return ASN1_ELEMENT_NOT_FOUND;
1996
1997
0
  octetNode = asn1_find_node (*element, octetName);
1998
0
  if (octetNode == NULL)
1999
0
    return ASN1_ELEMENT_NOT_FOUND;
2000
0
  if (type_field (octetNode->type) != ASN1_ETYPE_OCTET_STRING)
2001
0
    return ASN1_ELEMENT_NOT_FOUND;
2002
0
  if (octetNode->value == NULL)
2003
0
    return ASN1_VALUE_NOT_FOUND;
2004
2005
0
  objectNode = asn1_find_node (*element, objectName);
2006
0
  if (objectNode == NULL)
2007
0
    return ASN1_ELEMENT_NOT_FOUND;
2008
2009
0
  if (type_field (objectNode->type) != ASN1_ETYPE_OBJECT_ID)
2010
0
    return ASN1_ELEMENT_NOT_FOUND;
2011
2012
0
  if (objectNode->value == NULL)
2013
0
    return ASN1_VALUE_NOT_FOUND;
2014
2015
2016
  /* search the OBJECT_ID into definitions */
2017
0
  p2 = definitions->down;
2018
0
  while (p2)
2019
0
    {
2020
0
      if ((type_field (p2->type) == ASN1_ETYPE_OBJECT_ID) &&
2021
0
    (p2->type & CONST_ASSIGN))
2022
0
  {
2023
0
    strcpy (name, definitions->name);
2024
0
    strcat (name, ".");
2025
0
    strcat (name, p2->name);
2026
2027
0
    len = sizeof (value);
2028
0
    result = asn1_read_value (definitions, name, value, &len);
2029
2030
0
    if ((result == ASN1_SUCCESS)
2031
0
        && (!_asn1_strcmp (objectNode->value, value)))
2032
0
      {
2033
2034
0
        p2 = p2->right; /* pointer to the structure to
2035
           use for expansion */
2036
0
        while ((p2) && (p2->type & CONST_ASSIGN))
2037
0
    p2 = p2->right;
2038
2039
0
        if (p2)
2040
0
    {
2041
0
      strcpy (name, definitions->name);
2042
0
      strcat (name, ".");
2043
0
      strcat (name, p2->name);
2044
2045
0
      result = asn1_create_element (definitions, name, &aux);
2046
0
      if (result == ASN1_SUCCESS)
2047
0
        {
2048
0
          _asn1_cpy_name (aux, octetNode);
2049
0
          len2 =
2050
0
      asn1_get_length_der (octetNode->value,
2051
0
               octetNode->value_len, &len3);
2052
0
          if (len2 < 0)
2053
0
      return ASN1_DER_ERROR;
2054
2055
0
          result =
2056
0
      asn1_der_decoding (&aux, octetNode->value + len3,
2057
0
             len2, errorDescription);
2058
0
          if (result == ASN1_SUCCESS)
2059
0
      {
2060
2061
0
        _asn1_set_right (aux, octetNode->right);
2062
0
        _asn1_set_right (octetNode, aux);
2063
2064
0
        result = asn1_delete_structure (&octetNode);
2065
0
        if (result == ASN1_SUCCESS)
2066
0
          {
2067
0
            aux = NULL;
2068
0
            break;
2069
0
          }
2070
0
        else
2071
0
          { /* error with asn1_delete_structure */
2072
0
            asn1_delete_structure (&aux);
2073
0
            retCode = result;
2074
0
            break;
2075
0
          }
2076
0
      }
2077
0
          else
2078
0
      { /* error with asn1_der_decoding */
2079
0
        retCode = result;
2080
0
        break;
2081
0
      }
2082
0
        }
2083
0
      else
2084
0
        {   /* error with asn1_create_element */
2085
0
          retCode = result;
2086
0
          break;
2087
0
        }
2088
0
    }
2089
0
        else
2090
0
    {   /* error with the pointer to the structure to expand */
2091
0
      retCode = ASN1_VALUE_NOT_VALID;
2092
0
      break;
2093
0
    }
2094
0
      }
2095
0
  }
2096
2097
0
      p2 = p2->right;
2098
2099
0
    }
2100
2101
0
  if (!p2)
2102
0
    retCode = ASN1_VALUE_NOT_VALID;
2103
2104
0
  return retCode;
2105
0
}
2106
2107
/*-
2108
 * _asn1_decode_simple_der:
2109
 * @etype: The type of the string to be encoded (ASN1_ETYPE_)
2110
 * @der: the encoded string
2111
 * @_der_len: the bytes of the encoded string
2112
 * @str: a pointer to the data
2113
 * @str_len: the length of the data
2114
 * @dflags: DECODE_FLAG_*
2115
 *
2116
 * Decodes a simple DER encoded type (e.g. a string, which is not constructed).
2117
 * The output is a pointer inside the @der.
2118
 *
2119
 * Returns: %ASN1_SUCCESS if successful or an error value.
2120
 -*/
2121
static int
2122
_asn1_decode_simple_der (unsigned int etype, const unsigned char *der,
2123
       unsigned int _der_len, const unsigned char **str,
2124
       unsigned int *str_len, unsigned dflags)
2125
100k
{
2126
100k
  int tag_len, len_len;
2127
100k
  const unsigned char *p;
2128
100k
  int der_len = _der_len;
2129
100k
  unsigned char class;
2130
100k
  unsigned long tag;
2131
100k
  long ret;
2132
2133
100k
  if (der == NULL || der_len == 0)
2134
0
    return ASN1_VALUE_NOT_VALID;
2135
2136
100k
  if (ETYPE_OK (etype) == 0 || ETYPE_IS_STRING (etype) == 0)
2137
0
    return ASN1_VALUE_NOT_VALID;
2138
2139
  /* doesn't handle constructed classes */
2140
100k
  class = ETYPE_CLASS (etype);
2141
100k
  if (class != ASN1_CLASS_UNIVERSAL)
2142
0
    return ASN1_VALUE_NOT_VALID;
2143
2144
100k
  p = der;
2145
2146
100k
  if (dflags & DECODE_FLAG_HAVE_TAG)
2147
100k
    {
2148
100k
      ret = asn1_get_tag_der (p, der_len, &class, &tag_len, &tag);
2149
100k
      if (ret != ASN1_SUCCESS)
2150
0
  return ret;
2151
2152
100k
      if (class != ETYPE_CLASS (etype) || tag != ETYPE_TAG (etype))
2153
5.06k
  {
2154
5.06k
    warn ();
2155
5.06k
    return ASN1_DER_ERROR;
2156
5.06k
  }
2157
2158
95.7k
      p += tag_len;
2159
95.7k
      der_len -= tag_len;
2160
95.7k
      if (der_len <= 0)
2161
18
  return ASN1_DER_ERROR;
2162
95.7k
    }
2163
2164
95.7k
  ret = asn1_get_length_der (p, der_len, &len_len);
2165
95.7k
  if (ret < 0)
2166
371
    return ASN1_DER_ERROR;
2167
2168
95.3k
  p += len_len;
2169
95.3k
  der_len -= len_len;
2170
95.3k
  if (der_len <= 0)
2171
57
    return ASN1_DER_ERROR;
2172
2173
95.3k
  *str_len = ret;
2174
95.3k
  *str = p;
2175
2176
95.3k
  return ASN1_SUCCESS;
2177
95.3k
}
2178
2179
/**
2180
 * asn1_decode_simple_der:
2181
 * @etype: The type of the string to be encoded (ASN1_ETYPE_)
2182
 * @der: the encoded string
2183
 * @_der_len: the bytes of the encoded string
2184
 * @str: a pointer to the data
2185
 * @str_len: the length of the data
2186
 *
2187
 * Decodes a simple DER encoded type (e.g. a string, which is not constructed).
2188
 * The output is a pointer inside the @der.
2189
 *
2190
 * Returns: %ASN1_SUCCESS if successful or an error value.
2191
 **/
2192
int
2193
asn1_decode_simple_der (unsigned int etype, const unsigned char *der,
2194
      unsigned int _der_len, const unsigned char **str,
2195
      unsigned int *str_len)
2196
13.1k
{
2197
13.1k
  return _asn1_decode_simple_der (etype, der, _der_len, str, str_len,
2198
13.1k
          DECODE_FLAG_HAVE_TAG);
2199
13.1k
}
2200
2201
static int
2202
append (uint8_t **dst, unsigned *dst_size, const unsigned char *src,
2203
  unsigned src_size)
2204
152k
{
2205
152k
  if (src_size == 0)
2206
12.4k
    return ASN1_SUCCESS;
2207
2208
139k
  *dst = _asn1_realloc (*dst, *dst_size + src_size);
2209
139k
  if (*dst == NULL)
2210
0
    return ASN1_MEM_ALLOC_ERROR;
2211
139k
  memcpy (*dst + *dst_size, src, src_size);
2212
139k
  *dst_size += src_size;
2213
139k
  return ASN1_SUCCESS;
2214
139k
}
2215
2216
/*-
2217
 * _asn1_decode_simple_ber:
2218
 * @etype: The type of the string to be encoded (ASN1_ETYPE_)
2219
 * @der: the encoded string
2220
 * @_der_len: the bytes of the encoded string
2221
 * @str: a pointer to the data
2222
 * @str_len: the length of the data
2223
 * @ber_len: the total length occupied by BER (may be %NULL)
2224
 * @have_tag: whether a DER tag is included
2225
 *
2226
 * Decodes a BER encoded type. The output is an allocated value
2227
 * of the data. This decodes BER STRINGS only. Other types are
2228
 * decoded as DER.
2229
 *
2230
 * Returns: %ASN1_SUCCESS if successful or an error value.
2231
 -*/
2232
static int
2233
_asn1_decode_simple_ber (unsigned int etype, const unsigned char *der,
2234
       unsigned int _der_len, unsigned char **str,
2235
       unsigned int *str_len, unsigned int *ber_len,
2236
       unsigned dflags)
2237
98.5k
{
2238
98.5k
  int tag_len, len_len;
2239
98.5k
  const unsigned char *p;
2240
98.5k
  int der_len = _der_len;
2241
98.5k
  uint8_t *total = NULL;
2242
98.5k
  unsigned total_size = 0;
2243
98.5k
  unsigned char class;
2244
98.5k
  unsigned long tag;
2245
98.5k
  unsigned char *out = NULL;
2246
98.5k
  const unsigned char *cout = NULL;
2247
98.5k
  unsigned out_len;
2248
98.5k
  long result;
2249
2250
98.5k
  if (ber_len)
2251
67.5k
    *ber_len = 0;
2252
2253
98.5k
  if (der == NULL || der_len == 0)
2254
24
    {
2255
24
      warn ();
2256
24
      return ASN1_VALUE_NOT_VALID;
2257
24
    }
2258
2259
98.5k
  if (ETYPE_OK (etype) == 0)
2260
0
    {
2261
0
      warn ();
2262
0
      return ASN1_VALUE_NOT_VALID;
2263
0
    }
2264
2265
  /* doesn't handle constructed + definite classes */
2266
98.5k
  class = ETYPE_CLASS (etype);
2267
98.5k
  if (class != ASN1_CLASS_UNIVERSAL)
2268
0
    {
2269
0
      warn ();
2270
0
      return ASN1_VALUE_NOT_VALID;
2271
0
    }
2272
2273
98.5k
  p = der;
2274
2275
98.5k
  if (dflags & DECODE_FLAG_HAVE_TAG)
2276
97.1k
    {
2277
97.1k
      result = asn1_get_tag_der (p, der_len, &class, &tag_len, &tag);
2278
97.1k
      if (result != ASN1_SUCCESS)
2279
129
  {
2280
129
    warn ();
2281
129
    return result;
2282
129
  }
2283
2284
97.0k
      if (tag != ETYPE_TAG (etype))
2285
875
  {
2286
875
    warn ();
2287
875
    return ASN1_DER_ERROR;
2288
875
  }
2289
2290
96.1k
      p += tag_len;
2291
2292
96.1k
      DECR_LEN (der_len, tag_len);
2293
2294
96.1k
      if (ber_len)
2295
65.6k
  *ber_len += tag_len;
2296
96.1k
    }
2297
2298
  /* indefinite constructed */
2299
97.5k
  if ((((dflags & DECODE_FLAG_CONSTRUCTED) || class == ASN1_CLASS_STRUCTURED)
2300
9.50k
       && ETYPE_IS_STRING (etype)) && !(dflags & DECODE_FLAG_LEVEL3))
2301
9.47k
    {
2302
9.47k
      if (der_len == 0)
2303
6
  {
2304
6
    warn ();
2305
6
    result = ASN1_DER_ERROR;
2306
6
    goto cleanup;
2307
6
  }
2308
2309
9.46k
      if (der_len > 0 && p[0] == 0x80)  /* indefinite */
2310
1.70k
  {
2311
1.70k
    len_len = 1;
2312
1.70k
    DECR_LEN (der_len, len_len);
2313
1.70k
    p += len_len;
2314
2315
1.70k
    if (ber_len)
2316
938
      *ber_len += len_len;
2317
2318
    /* decode the available octet strings */
2319
1.70k
    do
2320
61.7k
      {
2321
61.7k
        unsigned tmp_len;
2322
61.7k
        unsigned flags = DECODE_FLAG_HAVE_TAG;
2323
2324
61.7k
        if (dflags & DECODE_FLAG_LEVEL1)
2325
1.95k
    flags |= DECODE_FLAG_LEVEL2;
2326
59.7k
        else if (dflags & DECODE_FLAG_LEVEL2)
2327
663
    flags |= DECODE_FLAG_LEVEL3;
2328
59.1k
        else
2329
59.1k
    flags |= DECODE_FLAG_LEVEL1;
2330
2331
61.7k
        result =
2332
61.7k
    _asn1_decode_simple_ber (etype, p, der_len, &out, &out_len,
2333
61.7k
           &tmp_len, flags);
2334
61.7k
        if (result != ASN1_SUCCESS)
2335
914
    {
2336
914
      warn ();
2337
914
      goto cleanup;
2338
914
    }
2339
2340
60.8k
        p += tmp_len;
2341
60.8k
        DECR_LEN (der_len, tmp_len);
2342
2343
60.8k
        if (ber_len)
2344
46.7k
    *ber_len += tmp_len;
2345
2346
60.8k
        DECR_LEN (der_len, 2); /* we need the EOC */
2347
2348
60.7k
        result = append (&total, &total_size, out, out_len);
2349
60.7k
        if (result != ASN1_SUCCESS)
2350
0
    {
2351
0
      warn ();
2352
0
      goto cleanup;
2353
0
    }
2354
2355
60.7k
        free (out);
2356
60.7k
        out = NULL;
2357
2358
60.7k
        if (p[0] == 0 && p[1] == 0)  /* EOC */
2359
691
    {
2360
691
      if (ber_len)
2361
434
        *ber_len += 2;
2362
691
      break;
2363
691
    }
2364
2365
        /* no EOC */
2366
60.0k
        der_len += 2;
2367
2368
60.0k
        if (der_len == 2)
2369
51
    {
2370
51
      warn ();
2371
51
      result = ASN1_DER_ERROR;
2372
51
      goto cleanup;
2373
51
    }
2374
60.0k
      }
2375
60.0k
    while (1);
2376
1.70k
  }
2377
7.75k
      else      /* constructed */
2378
7.75k
  {
2379
7.75k
    long const_len;
2380
2381
7.75k
    result = asn1_get_length_ber (p, der_len, &len_len);
2382
7.75k
    if (result < 0)
2383
248
      {
2384
248
        warn ();
2385
248
        result = ASN1_DER_ERROR;
2386
248
        goto cleanup;
2387
248
      }
2388
2389
7.50k
    DECR_LEN (der_len, len_len);
2390
7.50k
    p += len_len;
2391
2392
7.50k
    const_len = result;
2393
2394
7.50k
    if (ber_len)
2395
7.23k
      *ber_len += len_len;
2396
2397
    /* decode the available octet strings */
2398
11.3k
    while (const_len > 0)
2399
4.49k
      {
2400
4.49k
        unsigned tmp_len;
2401
4.49k
        unsigned flags = DECODE_FLAG_HAVE_TAG;
2402
2403
4.49k
        if (dflags & DECODE_FLAG_LEVEL1)
2404
2.27k
    flags |= DECODE_FLAG_LEVEL2;
2405
2.22k
        else if (dflags & DECODE_FLAG_LEVEL2)
2406
567
    flags |= DECODE_FLAG_LEVEL3;
2407
1.65k
        else
2408
1.65k
    flags |= DECODE_FLAG_LEVEL1;
2409
2410
4.49k
        result =
2411
4.49k
    _asn1_decode_simple_ber (etype, p, der_len, &out, &out_len,
2412
4.49k
           &tmp_len, flags);
2413
4.49k
        if (result != ASN1_SUCCESS)
2414
602
    {
2415
602
      warn ();
2416
602
      goto cleanup;
2417
602
    }
2418
2419
3.88k
        p += tmp_len;
2420
3.88k
        DECR_LEN (der_len, tmp_len);
2421
3.88k
        DECR_LEN (const_len, tmp_len);
2422
2423
3.79k
        if (ber_len)
2424
3.05k
    *ber_len += tmp_len;
2425
2426
3.79k
        result = append (&total, &total_size, out, out_len);
2427
3.79k
        if (result != ASN1_SUCCESS)
2428
0
    {
2429
0
      warn ();
2430
0
      goto cleanup;
2431
0
    }
2432
2433
3.79k
        free (out);
2434
3.79k
        out = NULL;
2435
3.79k
      }
2436
7.50k
  }
2437
9.46k
    }
2438
88.0k
  else if (class == ETYPE_CLASS (etype))
2439
87.9k
    {
2440
87.9k
      if (ber_len)
2441
58.5k
  {
2442
58.5k
    result = asn1_get_length_der (p, der_len, &len_len);
2443
58.5k
    if (result < 0)
2444
218
      {
2445
218
        warn ();
2446
218
        result = ASN1_DER_ERROR;
2447
218
        goto cleanup;
2448
218
      }
2449
58.3k
    *ber_len += result + len_len;
2450
58.3k
  }
2451
2452
      /* non-string values are decoded as DER */
2453
87.7k
      result =
2454
87.7k
  _asn1_decode_simple_der (etype, der, _der_len, &cout, &out_len,
2455
87.7k
         dflags);
2456
87.7k
      if (result != ASN1_SUCCESS)
2457
226
  {
2458
226
    warn ();
2459
226
    goto cleanup;
2460
226
  }
2461
2462
87.4k
      result = append (&total, &total_size, cout, out_len);
2463
87.4k
      if (result != ASN1_SUCCESS)
2464
0
  {
2465
0
    warn ();
2466
0
    goto cleanup;
2467
0
  }
2468
87.4k
    }
2469
123
  else
2470
123
    {
2471
123
      warn ();
2472
123
      result = ASN1_DER_ERROR;
2473
123
      goto cleanup;
2474
123
    }
2475
2476
95.0k
  *str = total;
2477
95.0k
  *str_len = total_size;
2478
2479
95.0k
  return ASN1_SUCCESS;
2480
2.53k
cleanup:
2481
2.53k
  free (out);
2482
2.53k
  free (total);
2483
2.53k
  return result;
2484
97.5k
}
2485
2486
/**
2487
 * asn1_decode_simple_ber:
2488
 * @etype: The type of the string to be encoded (ASN1_ETYPE_)
2489
 * @der: the encoded string
2490
 * @_der_len: the bytes of the encoded string
2491
 * @str: a pointer to the data
2492
 * @str_len: the length of the data
2493
 * @ber_len: the total length occupied by BER (may be %NULL)
2494
 *
2495
 * Decodes a BER encoded type. The output is an allocated value
2496
 * of the data. This decodes BER STRINGS only. Other types are
2497
 * decoded as DER.
2498
 *
2499
 * Returns: %ASN1_SUCCESS if successful or an error value.
2500
 **/
2501
int
2502
asn1_decode_simple_ber (unsigned int etype, const unsigned char *der,
2503
      unsigned int _der_len, unsigned char **str,
2504
      unsigned int *str_len, unsigned int *ber_len)
2505
30.9k
{
2506
30.9k
  return _asn1_decode_simple_ber (etype, der, _der_len, str, str_len, ber_len,
2507
30.9k
          DECODE_FLAG_HAVE_TAG);
2508
30.9k
}