2 * Copyright (C) 2002-2012 Free Software Foundation, Inc.
4 * This file is part of LIBTASN1.
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.
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.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 /*****************************************************/
24 /* File: decoding.c */
25 /* Description: Functions to manage DER decoding */
26 /*****************************************************/
29 #include "parser_aux.h"
31 #include "structure.h"
36 _asn1_get_indefinite_length_string (const unsigned char *der
, int *len
);
39 _asn1_error_description_tag_error (ASN1_TYPE node
, char *ErrorDescription
)
42 Estrcpy (ErrorDescription
, ":: tag error near element '");
43 _asn1_hierarchical_name (node
, ErrorDescription
+ strlen (ErrorDescription
),
44 ASN1_MAX_ERROR_DESCRIPTION_SIZE
- 40);
45 Estrcat (ErrorDescription
, "'");
50 * asn1_get_length_der:
51 * @der: DER data to decode.
52 * @der_len: Length of DER data to decode.
53 * @len: Output variable containing the length of the DER length field.
55 * Extract a length field from DER data.
57 * Returns: Return the decoded length value, or -1 on indefinite
58 * length, or -2 when the value was too big to fit in a int, or -4
59 * when the decoded length value plus @len would exceed @der_len.
62 asn1_get_length_der (const unsigned char *der
, int der_len
, int *len
)
64 unsigned int ans
, sum
, last
;
83 { /* definite length method */
85 while (punt
<= k
&& punt
< der_len
)
89 ans
= (ans
*256) + der
[punt
++];
91 /* we wrapped around, no bignum support... */
96 { /* indefinite length method */
106 /* check for overflow as well INT_MAX as a maximum upper
107 * limit for length */
108 if (sum
>= INT_MAX
|| sum
< ans
)
119 * @der: DER data to decode.
120 * @der_len: Length of DER data to decode.
121 * @cls: Output variable containing decoded class.
122 * @len: Output variable containing the length of the DER TAG data.
123 * @tag: Output variable containing the decoded tag.
125 * Decode the class and TAG from DER code.
127 * Returns: Returns %ASN1_SUCCESS on success, or an error.
130 asn1_get_tag_der (const unsigned char *der
, int der_len
,
131 unsigned char *cls
, int *len
, unsigned long *tag
)
133 unsigned int punt
, ris
;
136 if (der
== NULL
|| der_len
< 2 || len
== NULL
)
137 return ASN1_DER_ERROR
;
139 *cls
= der
[0] & 0xE0;
140 if ((der
[0] & 0x1F) != 0x1F)
151 while (punt
<= der_len
&& der
[punt
] & 128)
155 ris
= (ris
* 128) + (der
[punt
++] & 0x7F);
157 /* wrapped around, and no bignums... */
158 return ASN1_DER_ERROR
;
162 return ASN1_DER_ERROR
;
166 ris
= (ris
* 128) + (der
[punt
++] & 0x7F);
168 return ASN1_DER_ERROR
;
178 * asn1_get_length_ber:
179 * @ber: BER data to decode.
180 * @ber_len: Length of BER data to decode.
181 * @len: Output variable containing the length of the BER length field.
183 * Extract a length field from BER data. The difference to
184 * asn1_get_length_der() is that this function will return a length
185 * even if the value has indefinite encoding.
187 * Returns: Return the decoded length value, or negative value when
188 * the value was too big.
193 asn1_get_length_ber (const unsigned char *ber
, int ber_len
, int *len
)
198 ret
= asn1_get_length_der (ber
, ber_len
, len
);
200 { /* indefinite length method */
202 err
= _asn1_get_indefinite_length_string (ber
+ 1, &ret
);
203 if (err
!= ASN1_SUCCESS
)
211 * asn1_get_octet_der:
212 * @der: DER data to decode containing the OCTET SEQUENCE.
213 * @der_len: Length of DER data to decode.
214 * @ret_len: Output variable containing the length of the DER data.
215 * @str: Pre-allocated output buffer to put decoded OCTET SEQUENCE in.
216 * @str_size: Length of pre-allocated output buffer.
217 * @str_len: Output variable containing the length of the OCTET SEQUENCE.
219 * Extract an OCTET SEQUENCE from DER data.
221 * Returns: Returns %ASN1_SUCCESS on success, or an error.
224 asn1_get_octet_der (const unsigned char *der
, int der_len
,
225 int *ret_len
, unsigned char *str
, int str_size
,
231 return ASN1_GENERIC_ERROR
;
233 /* if(str==NULL) return ASN1_SUCCESS; */
234 *str_len
= asn1_get_length_der (der
, der_len
, &len_len
);
237 return ASN1_DER_ERROR
;
239 *ret_len
= *str_len
+ len_len
;
240 if (str_size
>= *str_len
)
241 memcpy (str
, der
+ len_len
, *str_len
);
244 return ASN1_MEM_ERROR
;
250 /* Returns ASN1_SUCCESS on success or an error code on error.
253 _asn1_get_time_der (const unsigned char *der
, int der_len
, int *ret_len
,
254 char *str
, int str_size
)
256 int len_len
, str_len
;
258 if (der_len
<= 0 || str
== NULL
)
259 return ASN1_DER_ERROR
;
260 str_len
= asn1_get_length_der (der
, der_len
, &len_len
);
261 if (str_len
< 0 || str_size
< str_len
)
262 return ASN1_DER_ERROR
;
263 memcpy (str
, der
+ len_len
, str_len
);
265 *ret_len
= str_len
+ len_len
;
271 _asn1_get_objectid_der (const unsigned char *der
, int der_len
, int *ret_len
,
272 char *str
, int str_size
)
277 unsigned long val
, val1
, prev_val
;
280 if (str
&& str_size
> 0)
281 str
[0] = 0; /* no oid */
283 if (str
== NULL
|| der_len
<= 0)
284 return ASN1_GENERIC_ERROR
;
285 len
= asn1_get_length_der (der
, der_len
, &len_len
);
287 if (len
< 0 || len
> der_len
|| len_len
> der_len
)
288 return ASN1_DER_ERROR
;
290 val1
= der
[len_len
] / 40;
291 val
= der
[len_len
] - val1
* 40;
293 _asn1_str_cpy (str
, str_size
, _asn1_ltostr (val1
, temp
));
294 _asn1_str_cat (str
, str_size
, ".");
295 _asn1_str_cat (str
, str_size
, _asn1_ltostr (val
, temp
));
300 for (k
= 1; k
< len
; k
++)
302 /* X.690 mandates that the leading byte must never be 0x80
304 if (leading
!= 0 && der
[len_len
+ k
] == 0x80)
305 return ASN1_DER_ERROR
;
308 /* check for wrap around */
310 val
|= der
[len_len
+ k
] & 0x7F;
313 return ASN1_DER_ERROR
;
317 if (!(der
[len_len
+ k
] & 0x80))
319 _asn1_str_cat (str
, str_size
, ".");
320 _asn1_str_cat (str
, str_size
, _asn1_ltostr (val
, temp
));
326 *ret_len
= len
+ len_len
;
333 * @der: DER data to decode containing the BIT SEQUENCE.
334 * @der_len: Length of DER data to decode.
335 * @ret_len: Output variable containing the length of the DER data.
336 * @str: Pre-allocated output buffer to put decoded BIT SEQUENCE in.
337 * @str_size: Length of pre-allocated output buffer.
338 * @bit_len: Output variable containing the size of the BIT SEQUENCE.
340 * Extract a BIT SEQUENCE from DER data.
342 * Returns: Return %ASN1_SUCCESS on success, or an error.
345 asn1_get_bit_der (const unsigned char *der
, int der_len
,
346 int *ret_len
, unsigned char *str
, int str_size
,
349 int len_len
, len_byte
;
352 return ASN1_GENERIC_ERROR
;
353 len_byte
= asn1_get_length_der (der
, der_len
, &len_len
) - 1;
355 return ASN1_DER_ERROR
;
357 *ret_len
= len_byte
+ len_len
+ 1;
358 *bit_len
= len_byte
* 8 - der
[len_len
];
360 if (str_size
>= len_byte
)
361 memcpy (str
, der
+ len_len
+ 1, len_byte
);
364 return ASN1_MEM_ERROR
;
371 _asn1_extract_tag_der (ASN1_TYPE node
, const unsigned char *der
, int der_len
,
375 int counter
, len2
, len3
, is_tag_implicit
;
376 unsigned long tag
, tag_implicit
= 0;
377 unsigned char class, class2
, class_implicit
= 0;
380 return ASN1_GENERIC_ERROR
;
382 counter
= is_tag_implicit
= 0;
384 if (node
->type
& CONST_TAG
)
389 if (type_field (p
->type
) == TYPE_TAG
)
391 if (p
->type
& CONST_APPLICATION
)
392 class2
= ASN1_CLASS_APPLICATION
;
393 else if (p
->type
& CONST_UNIVERSAL
)
394 class2
= ASN1_CLASS_UNIVERSAL
;
395 else if (p
->type
& CONST_PRIVATE
)
396 class2
= ASN1_CLASS_PRIVATE
;
398 class2
= ASN1_CLASS_CONTEXT_SPECIFIC
;
400 if (p
->type
& CONST_EXPLICIT
)
403 (der
+ counter
, der_len
- counter
, &class, &len2
,
404 &tag
) != ASN1_SUCCESS
)
405 return ASN1_DER_ERROR
;
407 if (counter
+ len2
> der_len
)
408 return ASN1_DER_ERROR
;
412 asn1_get_length_ber (der
+ counter
, der_len
- counter
,
415 return ASN1_DER_ERROR
;
418 if (counter
> der_len
)
419 return ASN1_DER_ERROR
;
421 if (!is_tag_implicit
)
423 if ((class != (class2
| ASN1_CLASS_STRUCTURED
)) ||
424 (tag
!= strtoul ((char *) p
->value
, NULL
, 10)))
425 return ASN1_TAG_ERROR
;
428 { /* ASN1_TAG_IMPLICIT */
429 if ((class != class_implicit
) || (tag
!= tag_implicit
))
430 return ASN1_TAG_ERROR
;
435 { /* ASN1_TAG_IMPLICIT */
436 if (!is_tag_implicit
)
438 if ((type_field (node
->type
) == TYPE_SEQUENCE
) ||
439 (type_field (node
->type
) == TYPE_SEQUENCE_OF
) ||
440 (type_field (node
->type
) == TYPE_SET
) ||
441 (type_field (node
->type
) == TYPE_SET_OF
))
442 class2
|= ASN1_CLASS_STRUCTURED
;
443 class_implicit
= class2
;
444 tag_implicit
= strtoul ((char *) p
->value
, NULL
, 10);
456 (der
+ counter
, der_len
- counter
, &class, &len2
,
457 &tag
) != ASN1_SUCCESS
)
458 return ASN1_DER_ERROR
;
459 if (counter
+ len2
> der_len
)
460 return ASN1_DER_ERROR
;
462 if ((class != class_implicit
) || (tag
!= tag_implicit
))
464 if (type_field (node
->type
) == TYPE_OCTET_STRING
)
466 class_implicit
|= ASN1_CLASS_STRUCTURED
;
467 if ((class != class_implicit
) || (tag
!= tag_implicit
))
468 return ASN1_TAG_ERROR
;
471 return ASN1_TAG_ERROR
;
476 if (type_field (node
->type
) == TYPE_TAG
)
484 (der
+ counter
, der_len
- counter
, &class, &len2
,
485 &tag
) != ASN1_SUCCESS
)
486 return ASN1_DER_ERROR
;
488 if (counter
+ len2
> der_len
)
489 return ASN1_DER_ERROR
;
491 switch (type_field (node
->type
))
494 if ((class != ASN1_CLASS_UNIVERSAL
) || (tag
!= ASN1_TAG_NULL
))
495 return ASN1_DER_ERROR
;
498 if ((class != ASN1_CLASS_UNIVERSAL
) || (tag
!= ASN1_TAG_BOOLEAN
))
499 return ASN1_DER_ERROR
;
502 if ((class != ASN1_CLASS_UNIVERSAL
) || (tag
!= ASN1_TAG_INTEGER
))
503 return ASN1_DER_ERROR
;
505 case TYPE_ENUMERATED
:
506 if ((class != ASN1_CLASS_UNIVERSAL
) || (tag
!= ASN1_TAG_ENUMERATED
))
507 return ASN1_DER_ERROR
;
510 if ((class != ASN1_CLASS_UNIVERSAL
) || (tag
!= ASN1_TAG_OBJECT_ID
))
511 return ASN1_DER_ERROR
;
514 if (node
->type
& CONST_UTC
)
516 if ((class != ASN1_CLASS_UNIVERSAL
)
517 || (tag
!= ASN1_TAG_UTCTime
))
518 return ASN1_DER_ERROR
;
522 if ((class != ASN1_CLASS_UNIVERSAL
)
523 || (tag
!= ASN1_TAG_GENERALIZEDTime
))
524 return ASN1_DER_ERROR
;
527 case TYPE_OCTET_STRING
:
528 if (((class != ASN1_CLASS_UNIVERSAL
)
529 && (class != (ASN1_CLASS_UNIVERSAL
| ASN1_CLASS_STRUCTURED
)))
530 || (tag
!= ASN1_TAG_OCTET_STRING
))
531 return ASN1_DER_ERROR
;
533 case TYPE_GENERALSTRING
:
534 if ((class != ASN1_CLASS_UNIVERSAL
)
535 || (tag
!= ASN1_TAG_GENERALSTRING
))
536 return ASN1_DER_ERROR
;
538 case TYPE_BIT_STRING
:
539 if ((class != ASN1_CLASS_UNIVERSAL
) || (tag
!= ASN1_TAG_BIT_STRING
))
540 return ASN1_DER_ERROR
;
543 case TYPE_SEQUENCE_OF
:
544 if ((class != (ASN1_CLASS_UNIVERSAL
| ASN1_CLASS_STRUCTURED
))
545 || (tag
!= ASN1_TAG_SEQUENCE
))
546 return ASN1_DER_ERROR
;
550 if ((class != (ASN1_CLASS_UNIVERSAL
| ASN1_CLASS_STRUCTURED
))
551 || (tag
!= ASN1_TAG_SET
))
552 return ASN1_DER_ERROR
;
558 return ASN1_DER_ERROR
;
569 _asn1_delete_not_used (ASN1_TYPE node
)
574 return ASN1_ELEMENT_NOT_FOUND
;
579 if (p
->type
& CONST_NOT_USED
)
584 p2
= _asn1_find_left (p
);
586 p2
= _asn1_find_up (p
);
588 asn1_delete_structure (&p
);
593 break; /* reach node */
609 p
= _asn1_find_up (p
);
628 _asn1_extract_der_octet (ASN1_TYPE node
, const unsigned char *der
,
632 int counter2
, counter_end
;
634 len2
= asn1_get_length_der (der
, der_len
, &len3
);
636 return ASN1_DER_ERROR
;
641 counter_end
= der_len
- 2;
643 counter_end
= der_len
;
645 while (counter2
< counter_end
)
647 len2
= asn1_get_length_der (der
+ counter2
, der_len
- counter2
, &len3
);
650 return ASN1_DER_ERROR
;
654 _asn1_append_value (node
, der
+ counter2
+ len3
, len2
);
660 _asn1_extract_der_octet (node
, der
+ counter2
+ len3
,
661 der_len
- counter2
- len3
);
666 counter2
+= len2
+ len3
+ 1;
673 _asn1_get_octet_string (const unsigned char *der
, ASN1_TYPE node
, int *len
)
675 int len2
, len3
, counter
, tot_len
, indefinite
;
679 if (*(der
- 1) & ASN1_CLASS_STRUCTURED
)
682 indefinite
= asn1_get_length_der (der
, *len
, &len3
);
684 return ASN1_DER_ERROR
;
692 if (counter
> (*len
))
693 return ASN1_DER_ERROR
;
695 if (indefinite
== -1)
697 if ((der
[counter
] == 0) && (der
[counter
+ 1] == 0))
703 else if (counter
>= indefinite
)
706 if (der
[counter
] != ASN1_TAG_OCTET_STRING
)
707 return ASN1_DER_ERROR
;
711 len2
= asn1_get_length_der (der
+ counter
, *len
- counter
, &len3
);
713 return ASN1_DER_ERROR
;
715 counter
+= len3
+ len2
;
722 unsigned char temp
[DER_LEN
];
725 len2
= sizeof (temp
);
727 asn1_length_der (tot_len
, temp
, &len2
);
728 _asn1_set_value (node
, temp
, len2
);
732 ret
= _asn1_extract_der_octet (node
, der
, *len
);
733 if (ret
!= ASN1_SUCCESS
)
739 { /* NOT STRUCTURED */
740 len2
= asn1_get_length_der (der
, *len
, &len3
);
742 return ASN1_DER_ERROR
;
744 _asn1_set_value (node
, der
, len3
+ len2
);
745 counter
= len3
+ len2
;
754 _asn1_get_indefinite_length_string (const unsigned char *der
, int *len
)
756 int len2
, len3
, counter
, indefinite
;
760 counter
= indefinite
= 0;
764 if ((*len
) < counter
)
765 return ASN1_DER_ERROR
;
767 if ((der
[counter
] == 0) && (der
[counter
+ 1] == 0))
778 (der
+ counter
, *len
- counter
, &class, &len2
,
779 &tag
) != ASN1_SUCCESS
)
780 return ASN1_DER_ERROR
;
781 if (counter
+ len2
> *len
)
782 return ASN1_DER_ERROR
;
784 len2
= asn1_get_length_der (der
+ counter
, *len
- counter
, &len3
);
786 return ASN1_DER_ERROR
;
794 counter
+= len2
+ len3
;
805 * @element: pointer to an ASN1 structure.
806 * @ider: vector that contains the DER encoding.
807 * @len: number of bytes of *@ider: @ider[0]..@ider[len-1].
808 * @errorDescription: null-terminated string contains details when an
811 * Fill the structure *@ELEMENT with values of a DER encoding
812 * string. The structure must just be created with function
813 * asn1_create_element(). If an error occurs during the decoding
814 * procedure, the *@ELEMENT is deleted and set equal to
817 * Returns: %ASN1_SUCCESS if DER encoding OK, %ASN1_ELEMENT_NOT_FOUND
818 * if @ELEMENT is %ASN1_TYPE_EMPTY, and %ASN1_TAG_ERROR or
819 * %ASN1_DER_ERROR if the der encoding doesn't match the structure
820 * name (*@ELEMENT deleted).
823 asn1_der_decoding (ASN1_TYPE
* element
, const void *ider
, int len
,
824 char *errorDescription
)
826 ASN1_TYPE node
, p
, p2
, p3
;
828 int counter
, len2
, len3
, len4
, move
, ris
, tlen
;
831 int indefinite
, result
;
832 const unsigned char *der
= ider
;
836 if (node
== ASN1_TYPE_EMPTY
)
837 return ASN1_ELEMENT_NOT_FOUND
;
839 if (node
->type
& CONST_OPTION
)
841 result
= ASN1_GENERIC_ERROR
;
853 if (p
->type
& CONST_SET
)
855 p2
= _asn1_find_up (p
);
856 len2
= _asn1_strtol (p2
->value
, NULL
, 10);
859 if (!der
[counter
] && !der
[counter
+ 1])
867 else if (counter
== len2
)
873 else if (counter
> len2
)
875 result
= ASN1_DER_ERROR
;
881 if ((p2
->type
& CONST_SET
) && (p2
->type
& CONST_NOT_USED
))
883 if (type_field (p2
->type
) != TYPE_CHOICE
)
885 _asn1_extract_tag_der (p2
, der
+ counter
,
886 len
- counter
, &len2
);
893 _asn1_extract_tag_der (p3
, der
+ counter
,
894 len
- counter
, &len2
);
895 if (ris
== ASN1_SUCCESS
)
900 if (ris
== ASN1_SUCCESS
)
902 p2
->type
&= ~CONST_NOT_USED
;
911 result
= ASN1_DER_ERROR
;
916 if ((p
->type
& CONST_OPTION
) || (p
->type
& CONST_DEFAULT
))
918 p2
= _asn1_find_up (p
);
919 len2
= _asn1_strtol (p2
->value
, NULL
, 10);
930 if (p
->type
& CONST_OPTION
)
931 asn1_delete_structure (&p
);
938 if (type_field (p
->type
) == TYPE_CHOICE
)
944 _asn1_extract_tag_der (p
->down
, der
+ counter
,
945 len
- counter
, &len2
);
947 ris
= ASN1_DER_ERROR
;
948 if (ris
== ASN1_SUCCESS
)
950 while (p
->down
->right
)
953 asn1_delete_structure (&p2
);
957 else if (ris
== ASN1_ERROR_TYPE_ANY
)
959 result
= ASN1_ERROR_TYPE_ANY
;
965 asn1_delete_structure (&p2
);
971 if (!(p
->type
& CONST_OPTION
))
973 result
= ASN1_DER_ERROR
;
981 if ((p
->type
& CONST_OPTION
) || (p
->type
& CONST_DEFAULT
))
983 p2
= _asn1_find_up (p
);
984 len2
= _asn1_strtol (p2
->value
, NULL
, 10);
985 if ((len2
!= -1) && (counter
> len2
))
986 ris
= ASN1_TAG_ERROR
;
989 if (ris
== ASN1_SUCCESS
)
991 _asn1_extract_tag_der (p
, der
+ counter
, len
- counter
, &len2
);
992 if (ris
!= ASN1_SUCCESS
)
994 if (p
->type
& CONST_OPTION
)
996 p
->type
|= CONST_NOT_USED
;
999 else if (p
->type
& CONST_DEFAULT
)
1001 _asn1_set_value (p
, NULL
, 0);
1006 if (errorDescription
!= NULL
)
1007 _asn1_error_description_tag_error (p
, errorDescription
);
1009 result
= ASN1_TAG_ERROR
;
1017 if (ris
== ASN1_SUCCESS
)
1019 switch (type_field (p
->type
))
1024 result
= ASN1_DER_ERROR
;
1031 if (der
[counter
++] != 1)
1033 result
= ASN1_DER_ERROR
;
1036 if (der
[counter
++] == 0)
1037 _asn1_set_value (p
, "F", 1);
1039 _asn1_set_value (p
, "T", 1);
1043 case TYPE_ENUMERATED
:
1045 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
1048 result
= ASN1_DER_ERROR
;
1052 _asn1_set_value (p
, der
+ counter
, len3
+ len2
);
1053 counter
+= len3
+ len2
;
1056 case TYPE_OBJECT_ID
:
1058 _asn1_get_objectid_der (der
+ counter
, len
- counter
, &len2
,
1059 temp
, sizeof (temp
));
1060 if (result
!= ASN1_SUCCESS
)
1063 tlen
= strlen (temp
);
1065 _asn1_set_value (p
, temp
, tlen
+ 1);
1071 _asn1_get_time_der (der
+ counter
, len
- counter
, &len2
, temp
,
1073 if (result
!= ASN1_SUCCESS
)
1076 tlen
= strlen (temp
);
1078 _asn1_set_value (p
, temp
, tlen
+ 1);
1082 case TYPE_OCTET_STRING
:
1083 len3
= len
- counter
;
1084 result
= _asn1_get_octet_string (der
+ counter
, p
, &len3
);
1085 if (result
!= ASN1_SUCCESS
)
1091 case TYPE_GENERALSTRING
:
1093 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
1096 result
= ASN1_DER_ERROR
;
1100 _asn1_set_value (p
, der
+ counter
, len3
+ len2
);
1101 counter
+= len3
+ len2
;
1104 case TYPE_BIT_STRING
:
1106 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
1109 result
= ASN1_DER_ERROR
;
1113 _asn1_set_value (p
, der
+ counter
, len3
+ len2
);
1114 counter
+= len3
+ len2
;
1121 len2
= _asn1_strtol (p
->value
, NULL
, 10);
1122 _asn1_set_value (p
, NULL
, 0);
1124 { /* indefinite length method */
1125 if (len
- counter
+ 1 > 0)
1127 if ((der
[counter
]) || der
[counter
+ 1])
1129 result
= ASN1_DER_ERROR
;
1135 result
= ASN1_DER_ERROR
;
1141 { /* definite length method */
1142 if (len2
!= counter
)
1144 result
= ASN1_DER_ERROR
;
1151 { /* move==DOWN || move==RIGHT */
1153 asn1_get_length_der (der
+ counter
, len
- counter
, &len2
);
1156 result
= ASN1_DER_ERROR
;
1162 _asn1_ltostr (counter
+ len3
, temp
);
1163 tlen
= strlen (temp
);
1165 _asn1_set_value (p
, temp
, tlen
+ 1);
1173 if (type_field (p2
->type
) != TYPE_TAG
)
1176 asn1_delete_structure (&p2
);
1185 { /* indefinite length method */
1186 _asn1_set_value (p
, "-1", 3);
1191 case TYPE_SEQUENCE_OF
:
1195 len2
= _asn1_strtol (p
->value
, NULL
, 10);
1197 { /* indefinite length method */
1198 if ((counter
+ 2) > len
)
1200 result
= ASN1_DER_ERROR
;
1204 if ((der
[counter
]) || der
[counter
+ 1])
1206 _asn1_append_sequence_set (p
);
1213 _asn1_set_value (p
, NULL
, 0);
1217 { /* definite length method */
1220 _asn1_append_sequence_set (p
);
1227 _asn1_set_value (p
, NULL
, 0);
1228 if (len2
!= counter
)
1230 result
= ASN1_DER_ERROR
;
1236 { /* move==DOWN || move==RIGHT */
1238 asn1_get_length_der (der
+ counter
, len
- counter
, &len2
);
1241 result
= ASN1_DER_ERROR
;
1248 { /* definite length method */
1249 _asn1_ltostr (counter
+ len3
, temp
);
1250 tlen
= strlen (temp
);
1253 _asn1_set_value (p
, temp
, tlen
+ 1);
1256 { /* indefinite length method */
1257 _asn1_set_value (p
, "-1", 3);
1260 while ((type_field (p2
->type
) == TYPE_TAG
)
1261 || (type_field (p2
->type
) == TYPE_SIZE
))
1263 if (p2
->right
== NULL
)
1264 _asn1_append_sequence_set (p
);
1271 if (asn1_get_tag_der
1272 (der
+ counter
, len
- counter
, &class, &len2
,
1273 &tag
) != ASN1_SUCCESS
)
1275 result
= ASN1_DER_ERROR
;
1279 if (counter
+ len2
> len
)
1281 result
= ASN1_DER_ERROR
;
1285 asn1_get_length_der (der
+ counter
+ len2
,
1286 len
- counter
- len2
, &len3
);
1289 result
= ASN1_DER_ERROR
;
1295 _asn1_set_value_octet (p
, der
+ counter
, len2
+ len3
);
1296 counter
+= len2
+ len3
;
1299 { /* indefinite length */
1300 /* Check indefinite lenth method in an EXPLICIT TAG */
1301 if ((p
->type
& CONST_TAG
) && (der
[counter
- 1] == 0x80))
1306 len2
= len
- counter
;
1308 _asn1_get_indefinite_length_string (der
+ counter
, &len2
);
1309 if (result
!= ASN1_SUCCESS
)
1312 _asn1_set_value_octet (p
, der
+ counter
, len2
);
1315 /* Check if a couple of 0x00 are present due to an EXPLICIT TAG with
1316 an indefinite length method. */
1319 if (!der
[counter
] && !der
[counter
+ 1])
1325 result
= ASN1_DER_ERROR
;
1333 move
= (move
== UP
) ? RIGHT
: DOWN
;
1338 if (p
== node
&& move
!= DOWN
)
1348 if ((move
== RIGHT
) && !(p
->type
& CONST_SET
))
1356 p
= _asn1_find_up (p
);
1359 _asn1_delete_not_used (*element
);
1363 result
= ASN1_DER_ERROR
;
1367 return ASN1_SUCCESS
;
1370 asn1_delete_structure (element
);
1375 #define SAME_BRANCH 2
1376 #define OTHER_BRANCH 3
1380 * asn1_der_decoding_element:
1381 * @structure: pointer to an ASN1 structure
1382 * @elementName: name of the element to fill
1383 * @ider: vector that contains the DER encoding of the whole structure.
1384 * @len: number of bytes of *der: der[0]..der[len-1]
1385 * @errorDescription: null-terminated string contains details when an
1388 * Fill the element named @ELEMENTNAME with values of a DER encoding
1389 * string. The structure must just be created with function
1390 * asn1_create_element(). The DER vector must contain the encoding
1391 * string of the whole @STRUCTURE. If an error occurs during the
1392 * decoding procedure, the *@STRUCTURE is deleted and set equal to
1395 * Returns: %ASN1_SUCCESS if DER encoding OK, %ASN1_ELEMENT_NOT_FOUND
1396 * if ELEMENT is %ASN1_TYPE_EMPTY or @elementName == NULL, and
1397 * %ASN1_TAG_ERROR or %ASN1_DER_ERROR if the der encoding doesn't
1398 * match the structure @structure (*ELEMENT deleted).
1401 asn1_der_decoding_element (ASN1_TYPE
* structure
, const char *elementName
,
1402 const void *ider
, int len
, char *errorDescription
)
1404 ASN1_TYPE node
, p
, p2
, p3
, nodeFound
= ASN1_TYPE_EMPTY
;
1405 char temp
[128], currentName
[ASN1_MAX_NAME_SIZE
* 10], *dot_p
, *char_p
;
1406 int nameLen
= ASN1_MAX_NAME_SIZE
* 10 - 1, state
;
1407 int counter
, len2
, len3
, len4
, move
, ris
, tlen
;
1408 unsigned char class;
1410 int indefinite
, result
;
1411 const unsigned char *der
= ider
;
1415 if (node
== ASN1_TYPE_EMPTY
)
1416 return ASN1_ELEMENT_NOT_FOUND
;
1418 if (elementName
== NULL
)
1420 result
= ASN1_ELEMENT_NOT_FOUND
;
1424 if (node
->type
& CONST_OPTION
)
1426 result
= ASN1_GENERIC_ERROR
;
1430 if ((*structure
)->name
)
1431 { /* Has *structure got a name? */
1432 nameLen
-= strlen ((*structure
)->name
);
1434 strcpy (currentName
, (*structure
)->name
);
1437 result
= ASN1_MEM_ERROR
;
1440 if (!(strcmp (currentName
, elementName
)))
1443 nodeFound
= *structure
;
1445 else if (!memcmp (currentName
, elementName
, strlen (currentName
)))
1446 state
= SAME_BRANCH
;
1448 state
= OTHER_BRANCH
;
1451 { /* *structure doesn't have a name? */
1453 if (elementName
[0] == 0)
1456 nodeFound
= *structure
;
1460 state
= SAME_BRANCH
;
1474 if (p
->type
& CONST_SET
)
1476 p2
= _asn1_find_up (p
);
1477 len2
= _asn1_strtol (p2
->value
, NULL
, 10);
1478 if (counter
== len2
)
1484 else if (counter
> len2
)
1486 result
= ASN1_DER_ERROR
;
1492 if ((p2
->type
& CONST_SET
) && (p2
->type
& CONST_NOT_USED
))
1494 if (type_field (p2
->type
) != TYPE_CHOICE
)
1496 _asn1_extract_tag_der (p2
, der
+ counter
,
1497 len
- counter
, &len2
);
1504 _asn1_extract_tag_der (p3
, der
+ counter
,
1505 len
- counter
, &len2
);
1506 if (ris
== ASN1_SUCCESS
)
1511 if (ris
== ASN1_SUCCESS
)
1513 p2
->type
&= ~CONST_NOT_USED
;
1522 result
= ASN1_DER_ERROR
;
1527 if ((p
->type
& CONST_OPTION
) || (p
->type
& CONST_DEFAULT
))
1529 p2
= _asn1_find_up (p
);
1530 len2
= _asn1_strtol (p2
->value
, NULL
, 10);
1531 if (counter
== len2
)
1541 if (p
->type
& CONST_OPTION
)
1542 asn1_delete_structure (&p
);
1549 if (type_field (p
->type
) == TYPE_CHOICE
)
1555 _asn1_extract_tag_der (p
->down
, der
+ counter
,
1556 len
- counter
, &len2
);
1558 ris
= ASN1_DER_ERROR
;
1559 if (ris
== ASN1_SUCCESS
)
1561 while (p
->down
->right
)
1563 p2
= p
->down
->right
;
1564 asn1_delete_structure (&p2
);
1568 else if (ris
== ASN1_ERROR_TYPE_ANY
)
1570 result
= ASN1_ERROR_TYPE_ANY
;
1576 asn1_delete_structure (&p2
);
1580 if (p
->down
== NULL
)
1582 if (!(p
->type
& CONST_OPTION
))
1584 result
= ASN1_DER_ERROR
;
1592 if ((p
->type
& CONST_OPTION
) || (p
->type
& CONST_DEFAULT
))
1594 p2
= _asn1_find_up (p
);
1595 len2
= _asn1_strtol (p2
->value
, NULL
, 10);
1597 ris
= ASN1_TAG_ERROR
;
1600 if (ris
== ASN1_SUCCESS
)
1602 _asn1_extract_tag_der (p
, der
+ counter
, len
- counter
, &len2
);
1603 if (ris
!= ASN1_SUCCESS
)
1605 if (p
->type
& CONST_OPTION
)
1607 p
->type
|= CONST_NOT_USED
;
1610 else if (p
->type
& CONST_DEFAULT
)
1612 _asn1_set_value (p
, NULL
, 0);
1617 if (errorDescription
!= NULL
)
1618 _asn1_error_description_tag_error (p
, errorDescription
);
1620 result
= ASN1_TAG_ERROR
;
1628 if (ris
== ASN1_SUCCESS
)
1630 switch (type_field (p
->type
))
1635 result
= ASN1_DER_ERROR
;
1646 if (der
[counter
++] != 1)
1648 result
= ASN1_DER_ERROR
;
1654 if (der
[counter
++] == 0)
1655 _asn1_set_value (p
, "F", 1);
1657 _asn1_set_value (p
, "T", 1);
1669 case TYPE_ENUMERATED
:
1671 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
1674 result
= ASN1_DER_ERROR
;
1680 if (len3
+ len2
> len
- counter
)
1682 result
= ASN1_DER_ERROR
;
1685 _asn1_set_value (p
, der
+ counter
, len3
+ len2
);
1690 counter
+= len3
+ len2
;
1693 case TYPE_OBJECT_ID
:
1697 _asn1_get_objectid_der (der
+ counter
, len
- counter
,
1698 &len2
, temp
, sizeof (temp
));
1699 if (result
!= ASN1_SUCCESS
)
1702 tlen
= strlen (temp
);
1705 _asn1_set_value (p
, temp
, tlen
+ 1);
1713 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
1716 result
= ASN1_DER_ERROR
;
1729 _asn1_get_time_der (der
+ counter
, len
- counter
, &len2
,
1730 temp
, sizeof (temp
) - 1);
1731 if (result
!= ASN1_SUCCESS
)
1734 tlen
= strlen (temp
);
1736 _asn1_set_value (p
, temp
, tlen
+ 1);
1744 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
1747 result
= ASN1_DER_ERROR
;
1756 case TYPE_OCTET_STRING
:
1757 len3
= len
- counter
;
1760 result
= _asn1_get_octet_string (der
+ counter
, p
, &len3
);
1765 result
= _asn1_get_octet_string (der
+ counter
, NULL
, &len3
);
1767 if (result
!= ASN1_SUCCESS
)
1773 case TYPE_GENERALSTRING
:
1775 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
1778 result
= ASN1_DER_ERROR
;
1784 if (len3
+ len2
> len
- counter
)
1786 result
= ASN1_DER_ERROR
;
1789 _asn1_set_value (p
, der
+ counter
, len3
+ len2
);
1794 counter
+= len3
+ len2
;
1797 case TYPE_BIT_STRING
:
1799 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
1802 result
= ASN1_DER_ERROR
;
1807 if (len3
+ len2
> len
- counter
)
1809 result
= ASN1_DER_ERROR
;
1812 _asn1_set_value (p
, der
+ counter
, len3
+ len2
);
1817 counter
+= len3
+ len2
;
1824 len2
= _asn1_strtol (p
->value
, NULL
, 10);
1825 _asn1_set_value (p
, NULL
, 0);
1827 { /* indefinite length method */
1828 if ((der
[counter
]) || der
[counter
+ 1])
1830 result
= ASN1_DER_ERROR
;
1836 { /* definite length method */
1837 if (len2
!= counter
)
1839 result
= ASN1_DER_ERROR
;
1848 { /* move==DOWN || move==RIGHT */
1849 if (state
== OTHER_BRANCH
)
1852 asn1_get_length_der (der
+ counter
, len
- counter
,
1856 result
= ASN1_DER_ERROR
;
1859 counter
+= len2
+ len3
;
1863 { /* state==SAME_BRANCH or state==FOUND */
1865 asn1_get_length_der (der
+ counter
, len
- counter
,
1869 result
= ASN1_DER_ERROR
;
1875 _asn1_ltostr (counter
+ len3
, temp
);
1876 tlen
= strlen (temp
);
1879 _asn1_set_value (p
, temp
, tlen
+ 1);
1887 if (type_field (p2
->type
) != TYPE_TAG
)
1890 asn1_delete_structure (&p2
);
1899 { /* indefinite length method */
1900 _asn1_set_value (p
, "-1", 3);
1906 case TYPE_SEQUENCE_OF
:
1910 len2
= _asn1_strtol (p
->value
, NULL
, 10);
1913 _asn1_append_sequence_set (p
);
1920 _asn1_set_value (p
, NULL
, 0);
1921 if (len2
!= counter
)
1923 result
= ASN1_DER_ERROR
;
1931 { /* move==DOWN || move==RIGHT */
1932 if (state
== OTHER_BRANCH
)
1935 asn1_get_length_der (der
+ counter
, len
- counter
,
1939 result
= ASN1_DER_ERROR
;
1942 counter
+= len2
+ len3
;
1946 { /* state==FOUND or state==SAME_BRANCH */
1948 asn1_get_length_der (der
+ counter
, len
- counter
,
1952 result
= ASN1_DER_ERROR
;
1958 _asn1_ltostr (counter
+ len3
, temp
);
1959 tlen
= strlen (temp
);
1962 _asn1_set_value (p
, temp
, tlen
+ 1);
1964 while ((type_field (p2
->type
) == TYPE_TAG
)
1965 || (type_field (p2
->type
) == TYPE_SIZE
))
1967 if (p2
->right
== NULL
)
1968 _asn1_append_sequence_set (p
);
1977 if (asn1_get_tag_der
1978 (der
+ counter
, len
- counter
, &class, &len2
,
1979 &tag
) != ASN1_SUCCESS
)
1981 result
= ASN1_DER_ERROR
;
1985 if (counter
+ len2
> len
)
1987 result
= ASN1_DER_ERROR
;
1992 asn1_get_length_der (der
+ counter
+ len2
,
1993 len
- counter
- len2
, &len3
);
1996 result
= ASN1_DER_ERROR
;
2005 _asn1_set_value_octet (p
, der
+ counter
, len2
+ len3
);
2010 counter
+= len2
+ len3
;
2013 { /* indefinite length */
2014 /* Check indefinite lenth method in an EXPLICIT TAG */
2015 if ((p
->type
& CONST_TAG
) && (der
[counter
- 1] == 0x80))
2020 len2
= len
- counter
;
2022 _asn1_get_indefinite_length_string (der
+ counter
, &len2
);
2023 if (result
!= ASN1_SUCCESS
)
2028 _asn1_set_value_octet (p
, der
+ counter
, len2
);
2036 /* Check if a couple of 0x00 are present due to an EXPLICIT TAG with
2037 an indefinite length method. */
2040 if (!der
[counter
] && !der
[counter
+ 1])
2046 result
= ASN1_DER_ERROR
;
2055 move
= (move
== UP
) ? RIGHT
: DOWN
;
2060 if ((p
== node
&& move
!= DOWN
) || (state
== EXIT
))
2071 nameLen
-= strlen (p
->name
) + 1;
2075 strcat (currentName
, ".");
2076 strcat (currentName
, p
->name
);
2080 result
= ASN1_MEM_ERROR
;
2083 if (!(strcmp (currentName
, elementName
)))
2090 (currentName
, elementName
, strlen (currentName
)))
2091 state
= SAME_BRANCH
;
2093 state
= OTHER_BRANCH
;
2100 if ((move
== RIGHT
) && !(p
->type
& CONST_SET
))
2108 dot_p
= char_p
= currentName
;
2109 while ((char_p
= strchr (char_p
, '.')))
2115 nameLen
+= strlen (currentName
) - (dot_p
- currentName
);
2118 nameLen
-= strlen (p
->name
);
2120 strcat (currentName
, p
->name
);
2123 result
= ASN1_MEM_ERROR
;
2127 if (!(strcmp (currentName
, elementName
)))
2134 (currentName
, elementName
, strlen (currentName
)))
2135 state
= SAME_BRANCH
;
2137 state
= OTHER_BRANCH
;
2146 p
= _asn1_find_up (p
);
2150 dot_p
= char_p
= currentName
;
2151 while ((char_p
= strchr (char_p
, '.')))
2157 nameLen
+= strlen (currentName
) - (dot_p
- currentName
);
2160 if (!(strcmp (currentName
, elementName
)))
2166 if (!memcmp (currentName
, elementName
, strlen (currentName
)))
2167 state
= SAME_BRANCH
;
2169 state
= OTHER_BRANCH
;
2174 _asn1_delete_not_used (*structure
);
2178 result
= ASN1_DER_ERROR
;
2182 return ASN1_SUCCESS
;
2185 asn1_delete_structure (structure
);
2190 * asn1_der_decoding_startEnd:
2191 * @element: pointer to an ASN1 element
2192 * @ider: vector that contains the DER encoding.
2193 * @len: number of bytes of *@ider: @ider[0]..@ider[len-1]
2194 * @name_element: an element of NAME structure.
2195 * @start: the position of the first byte of NAME_ELEMENT decoding
2197 * @end: the position of the last byte of NAME_ELEMENT decoding
2200 * Find the start and end point of an element in a DER encoding
2201 * string. I mean that if you have a der encoding and you have already
2202 * used the function asn1_der_decoding() to fill a structure, it may
2203 * happen that you want to find the piece of string concerning an
2204 * element of the structure.
2206 * One example is the sequence "tbsCertificate" inside an X509
2209 * Returns: %ASN1_SUCCESS if DER encoding OK, %ASN1_ELEMENT_NOT_FOUND
2210 * if ELEMENT is %ASN1_TYPE EMPTY or @name_element is not a valid
2211 * element, %ASN1_TAG_ERROR or %ASN1_DER_ERROR if the der encoding
2212 * doesn't match the structure ELEMENT.
2215 asn1_der_decoding_startEnd (ASN1_TYPE element
, const void *ider
, int len
,
2216 const char *name_element
, int *start
, int *end
)
2218 ASN1_TYPE node
, node_to_find
, p
, p2
, p3
;
2219 int counter
, len2
, len3
, len4
, move
, ris
;
2220 unsigned char class;
2223 const unsigned char *der
= ider
;
2227 if (node
== ASN1_TYPE_EMPTY
)
2228 return ASN1_ELEMENT_NOT_FOUND
;
2230 node_to_find
= asn1_find_node (node
, name_element
);
2232 if (node_to_find
== NULL
)
2233 return ASN1_ELEMENT_NOT_FOUND
;
2235 if (node_to_find
== node
)
2239 return ASN1_SUCCESS
;
2242 if (node
->type
& CONST_OPTION
)
2243 return ASN1_GENERIC_ERROR
;
2254 if (p
->type
& CONST_SET
)
2256 p2
= _asn1_find_up (p
);
2257 len2
= _asn1_strtol (p2
->value
, NULL
, 10);
2260 if (!der
[counter
] && !der
[counter
+ 1])
2268 else if (counter
== len2
)
2274 else if (counter
> len2
)
2275 return ASN1_DER_ERROR
;
2279 if ((p2
->type
& CONST_SET
) && (p2
->type
& CONST_NOT_USED
))
2281 if (type_field (p2
->type
) != TYPE_CHOICE
)
2283 _asn1_extract_tag_der (p2
, der
+ counter
,
2284 len
- counter
, &len2
);
2289 _asn1_extract_tag_der (p3
, der
+ counter
,
2290 len
- counter
, &len2
);
2292 if (ris
== ASN1_SUCCESS
)
2294 p2
->type
&= ~CONST_NOT_USED
;
2302 return ASN1_DER_ERROR
;
2305 if (p
== node_to_find
)
2308 if (type_field (p
->type
) == TYPE_CHOICE
)
2312 _asn1_extract_tag_der (p
, der
+ counter
, len
- counter
,
2314 if (p
== node_to_find
)
2318 if (ris
== ASN1_SUCCESS
)
2320 _asn1_extract_tag_der (p
, der
+ counter
, len
- counter
, &len2
);
2321 if (ris
!= ASN1_SUCCESS
)
2323 if (p
->type
& CONST_OPTION
)
2325 p
->type
|= CONST_NOT_USED
;
2328 else if (p
->type
& CONST_DEFAULT
)
2334 return ASN1_TAG_ERROR
;
2341 if (ris
== ASN1_SUCCESS
)
2343 switch (type_field (p
->type
))
2347 return ASN1_DER_ERROR
;
2352 if (der
[counter
++] != 1)
2353 return ASN1_DER_ERROR
;
2358 case TYPE_ENUMERATED
:
2360 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
2362 return ASN1_DER_ERROR
;
2363 counter
+= len3
+ len2
;
2366 case TYPE_OBJECT_ID
:
2368 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
2370 return ASN1_DER_ERROR
;
2371 counter
+= len2
+ len3
;
2376 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
2378 return ASN1_DER_ERROR
;
2379 counter
+= len2
+ len3
;
2382 case TYPE_OCTET_STRING
:
2383 len3
= len
- counter
;
2384 ris
= _asn1_get_octet_string (der
+ counter
, NULL
, &len3
);
2385 if (ris
!= ASN1_SUCCESS
)
2390 case TYPE_GENERALSTRING
:
2392 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
2394 return ASN1_DER_ERROR
;
2395 counter
+= len3
+ len2
;
2398 case TYPE_BIT_STRING
:
2400 asn1_get_length_der (der
+ counter
, len
- counter
, &len3
);
2402 return ASN1_DER_ERROR
;
2403 counter
+= len3
+ len2
;
2411 asn1_get_length_der (der
+ counter
, len
- counter
, &len2
);
2413 return ASN1_DER_ERROR
;
2422 if (!der
[counter
] && !der
[counter
+ 1]) /* indefinite length method */
2427 case TYPE_SEQUENCE_OF
:
2432 asn1_get_length_der (der
+ counter
, len
- counter
, &len2
);
2434 return ASN1_DER_ERROR
;
2436 if ((len3
== -1) && !der
[counter
] && !der
[counter
+ 1])
2441 while ((type_field (p2
->type
) == TYPE_TAG
) ||
2442 (type_field (p2
->type
) == TYPE_SIZE
))
2449 if (!der
[counter
] && !der
[counter
+ 1]) /* indefinite length method */
2455 if (asn1_get_tag_der
2456 (der
+ counter
, len
- counter
, &class, &len2
,
2457 &tag
) != ASN1_SUCCESS
)
2458 return ASN1_DER_ERROR
;
2459 if (counter
+ len2
> len
)
2460 return ASN1_DER_ERROR
;
2463 asn1_get_length_der (der
+ counter
+ len2
,
2464 len
- counter
- len2
, &len3
);
2466 return ASN1_DER_ERROR
;
2470 counter
+= len2
+ len4
+ len3
;
2473 { /* indefinite length */
2474 /* Check indefinite lenth method in an EXPLICIT TAG */
2475 if ((p
->type
& CONST_TAG
) && (der
[counter
- 1] == 0x80))
2480 len2
= len
- counter
;
2482 _asn1_get_indefinite_length_string (der
+ counter
, &len2
);
2483 if (ris
!= ASN1_SUCCESS
)
2487 /* Check if a couple of 0x00 are present due to an EXPLICIT TAG with
2488 an indefinite length method. */
2491 if (!der
[counter
] && !der
[counter
+ 1])
2494 return ASN1_DER_ERROR
;
2500 move
= (move
== UP
) ? RIGHT
: DOWN
;
2505 if ((p
== node_to_find
) && (move
== RIGHT
))
2508 return ASN1_SUCCESS
;
2511 if (p
== node
&& move
!= DOWN
)
2521 if ((move
== RIGHT
) && !(p
->type
& CONST_SET
))
2529 p
= _asn1_find_up (p
);
2532 return ASN1_ELEMENT_NOT_FOUND
;
2536 * asn1_expand_any_defined_by:
2537 * @definitions: ASN1 definitions
2538 * @element: pointer to an ASN1 structure
2540 * Expands every "ANY DEFINED BY" element of a structure created from
2541 * a DER decoding process (asn1_der_decoding function). The element
2542 * ANY must be defined by an OBJECT IDENTIFIER. The type used to
2543 * expand the element ANY is the first one following the definition of
2544 * the actual value of the OBJECT IDENTIFIER.
2546 * Returns: %ASN1_SUCCESS if Substitution OK, %ASN1_ERROR_TYPE_ANY if
2547 * some "ANY DEFINED BY" element couldn't be expanded due to a
2548 * problem in OBJECT_ID -> TYPE association, or other error codes
2549 * depending on DER decoding.
2552 asn1_expand_any_defined_by (ASN1_TYPE definitions
, ASN1_TYPE
* element
)
2554 char definitionsName
[ASN1_MAX_NAME_SIZE
], name
[2 * ASN1_MAX_NAME_SIZE
+ 1],
2555 value
[ASN1_MAX_NAME_SIZE
];
2556 asn1_retCode retCode
= ASN1_SUCCESS
, result
;
2557 int len
, len2
, len3
;
2558 ASN1_TYPE p
, p2
, p3
, aux
= ASN1_TYPE_EMPTY
;
2559 char errorDescription
[ASN1_MAX_ERROR_DESCRIPTION_SIZE
];
2561 if ((definitions
== ASN1_TYPE_EMPTY
) || (*element
== ASN1_TYPE_EMPTY
))
2562 return ASN1_ELEMENT_NOT_FOUND
;
2564 strcpy (definitionsName
, definitions
->name
);
2565 strcat (definitionsName
, ".");
2571 switch (type_field (p
->type
))
2574 if ((p
->type
& CONST_DEFINED_BY
) && (p
->value
))
2576 /* search the "DEF_BY" element */
2578 while ((p2
) && (type_field (p2
->type
) != TYPE_CONSTANT
))
2583 retCode
= ASN1_ERROR_TYPE_ANY
;
2587 p3
= _asn1_find_up (p
);
2591 retCode
= ASN1_ERROR_TYPE_ANY
;
2598 if ((p3
->name
) && !(strcmp (p3
->name
, p2
->name
)))
2603 if ((!p3
) || (type_field (p3
->type
) != TYPE_OBJECT_ID
) ||
2604 (p3
->value
== NULL
))
2607 p3
= _asn1_find_up (p
);
2608 p3
= _asn1_find_up (p3
);
2612 retCode
= ASN1_ERROR_TYPE_ANY
;
2620 if ((p3
->name
) && !(strcmp (p3
->name
, p2
->name
)))
2625 if ((!p3
) || (type_field (p3
->type
) != TYPE_OBJECT_ID
) ||
2626 (p3
->value
== NULL
))
2628 retCode
= ASN1_ERROR_TYPE_ANY
;
2633 /* search the OBJECT_ID into definitions */
2634 p2
= definitions
->down
;
2637 if ((type_field (p2
->type
) == TYPE_OBJECT_ID
) &&
2638 (p2
->type
& CONST_ASSIGN
))
2640 strcpy (name
, definitionsName
);
2641 strcat (name
, p2
->name
);
2643 len
= ASN1_MAX_NAME_SIZE
;
2645 asn1_read_value (definitions
, name
, value
, &len
);
2647 if ((result
== ASN1_SUCCESS
)
2648 && (!_asn1_strcmp (p3
->value
, value
)))
2650 p2
= p2
->right
; /* pointer to the structure to
2651 use for expansion */
2652 while ((p2
) && (p2
->type
& CONST_ASSIGN
))
2657 strcpy (name
, definitionsName
);
2658 strcat (name
, p2
->name
);
2661 asn1_create_element (definitions
, name
, &aux
);
2662 if (result
== ASN1_SUCCESS
)
2664 _asn1_set_name (aux
, p
->name
);
2666 asn1_get_length_der (p
->value
,
2667 p
->value_len
, &len3
);
2669 return ASN1_DER_ERROR
;
2672 asn1_der_decoding (&aux
, p
->value
+ len3
,
2675 if (result
== ASN1_SUCCESS
)
2678 _asn1_set_right (aux
, p
->right
);
2679 _asn1_set_right (p
, aux
);
2681 result
= asn1_delete_structure (&p
);
2682 if (result
== ASN1_SUCCESS
)
2685 aux
= ASN1_TYPE_EMPTY
;
2689 { /* error with asn1_delete_structure */
2690 asn1_delete_structure (&aux
);
2696 { /* error with asn1_der_decoding */
2702 { /* error with asn1_create_element */
2708 { /* error with the pointer to the structure to exapand */
2709 retCode
= ASN1_ERROR_TYPE_ANY
;
2719 retCode
= ASN1_ERROR_TYPE_ANY
;
2734 else if (p
== *element
)
2745 p
= _asn1_find_up (p
);
2764 * asn1_expand_octet_string:
2765 * @definitions: ASN1 definitions
2766 * @element: pointer to an ASN1 structure
2767 * @octetName: name of the OCTECT STRING field to expand.
2768 * @objectName: name of the OBJECT IDENTIFIER field to use to define
2769 * the type for expansion.
2771 * Expands an "OCTET STRING" element of a structure created from a DER
2772 * decoding process (the asn1_der_decoding() function). The type used
2773 * for expansion is the first one following the definition of the
2774 * actual value of the OBJECT IDENTIFIER indicated by OBJECTNAME.
2776 * Returns: %ASN1_SUCCESS if substitution OK, %ASN1_ELEMENT_NOT_FOUND
2777 * if @objectName or @octetName are not correct,
2778 * %ASN1_VALUE_NOT_VALID if it wasn't possible to find the type to
2779 * use for expansion, or other errors depending on DER decoding.
2782 asn1_expand_octet_string (ASN1_TYPE definitions
, ASN1_TYPE
* element
,
2783 const char *octetName
, const char *objectName
)
2785 char name
[2 * ASN1_MAX_NAME_SIZE
+ 1], value
[ASN1_MAX_NAME_SIZE
];
2786 asn1_retCode retCode
= ASN1_SUCCESS
, result
;
2787 int len
, len2
, len3
;
2788 ASN1_TYPE p2
, aux
= ASN1_TYPE_EMPTY
;
2789 ASN1_TYPE octetNode
= ASN1_TYPE_EMPTY
, objectNode
= ASN1_TYPE_EMPTY
;
2790 char errorDescription
[ASN1_MAX_ERROR_DESCRIPTION_SIZE
];
2792 if ((definitions
== ASN1_TYPE_EMPTY
) || (*element
== ASN1_TYPE_EMPTY
))
2793 return ASN1_ELEMENT_NOT_FOUND
;
2795 octetNode
= asn1_find_node (*element
, octetName
);
2796 if (octetNode
== ASN1_TYPE_EMPTY
)
2797 return ASN1_ELEMENT_NOT_FOUND
;
2798 if (type_field (octetNode
->type
) != TYPE_OCTET_STRING
)
2799 return ASN1_ELEMENT_NOT_FOUND
;
2800 if (octetNode
->value
== NULL
)
2801 return ASN1_VALUE_NOT_FOUND
;
2803 objectNode
= asn1_find_node (*element
, objectName
);
2804 if (objectNode
== ASN1_TYPE_EMPTY
)
2805 return ASN1_ELEMENT_NOT_FOUND
;
2807 if (type_field (objectNode
->type
) != TYPE_OBJECT_ID
)
2808 return ASN1_ELEMENT_NOT_FOUND
;
2810 if (objectNode
->value
== NULL
)
2811 return ASN1_VALUE_NOT_FOUND
;
2814 /* search the OBJECT_ID into definitions */
2815 p2
= definitions
->down
;
2818 if ((type_field (p2
->type
) == TYPE_OBJECT_ID
) &&
2819 (p2
->type
& CONST_ASSIGN
))
2821 strcpy (name
, definitions
->name
);
2823 strcat (name
, p2
->name
);
2825 len
= sizeof (value
);
2826 result
= asn1_read_value (definitions
, name
, value
, &len
);
2828 if ((result
== ASN1_SUCCESS
)
2829 && (!_asn1_strcmp (objectNode
->value
, value
)))
2832 p2
= p2
->right
; /* pointer to the structure to
2833 use for expansion */
2834 while ((p2
) && (p2
->type
& CONST_ASSIGN
))
2839 strcpy (name
, definitions
->name
);
2841 strcat (name
, p2
->name
);
2843 result
= asn1_create_element (definitions
, name
, &aux
);
2844 if (result
== ASN1_SUCCESS
)
2846 _asn1_set_name (aux
, octetNode
->name
);
2848 asn1_get_length_der (octetNode
->value
,
2849 octetNode
->value_len
, &len3
);
2851 return ASN1_DER_ERROR
;
2854 asn1_der_decoding (&aux
, octetNode
->value
+ len3
,
2855 len2
, errorDescription
);
2856 if (result
== ASN1_SUCCESS
)
2859 _asn1_set_right (aux
, octetNode
->right
);
2860 _asn1_set_right (octetNode
, aux
);
2862 result
= asn1_delete_structure (&octetNode
);
2863 if (result
== ASN1_SUCCESS
)
2865 aux
= ASN1_TYPE_EMPTY
;
2869 { /* error with asn1_delete_structure */
2870 asn1_delete_structure (&aux
);
2876 { /* error with asn1_der_decoding */
2882 { /* error with asn1_create_element */
2888 { /* error with the pointer to the structure to exapand */
2889 retCode
= ASN1_VALUE_NOT_VALID
;
2900 retCode
= ASN1_VALUE_NOT_VALID
;