2 * Copyright (C) 2000-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
22 /*****************************************************/
24 /* Description: Functions with the read and write */
26 /*****************************************************/
30 #include "parser_aux.h"
32 #include "structure.h"
37 _asn1_hierarchical_name (asn1_node node, char *name, int name_size)
50 _asn1_str_cpy (tmp_name, sizeof (tmp_name), name),
51 _asn1_str_cpy (name, name_size, p->name);
52 _asn1_str_cat (name, name_size, ".");
53 _asn1_str_cat (name, name_size, tmp_name);
55 p = _asn1_find_up (p);
59 _asn1_str_cpy (name, name_size, "ROOT");
63 /******************************************************************/
64 /* Function : _asn1_convert_integer */
65 /* Description: converts an integer from a null terminated string */
66 /* to der decoding. The convertion from a null */
67 /* terminated string to an integer is made with */
68 /* the 'strtol' function. */
70 /* value: null terminated string to convert. */
71 /* value_out: convertion result (memory must be already */
73 /* value_out_size: number of bytes of value_out. */
74 /* len: number of significant byte of value_out. */
75 /* Return: ASN1_MEM_ERROR or ASN1_SUCCESS */
76 /******************************************************************/
78 _asn1_convert_integer (const unsigned char *value, unsigned char *value_out,
79 int value_out_size, int *len)
82 unsigned char val[SIZEOF_UNSIGNED_LONG_INT];
86 valtmp = _asn1_strtol (value, NULL, 10);
88 for (k = 0; k < SIZEOF_UNSIGNED_LONG_INT; k++)
90 val[SIZEOF_UNSIGNED_LONG_INT - k - 1] = (valtmp >> (8 * k)) & 0xFF;
98 for (k = 0; k < SIZEOF_UNSIGNED_LONG_INT - 1; k++)
100 if (negative && (val[k] != 0xFF))
102 else if (!negative && val[k])
106 if ((negative && !(val[k] & 0x80)) || (!negative && (val[k] & 0x80)))
109 *len = SIZEOF_UNSIGNED_LONG_INT - k;
111 if (SIZEOF_UNSIGNED_LONG_INT - k > value_out_size)
112 /* VALUE_OUT is too short to contain the value conversion */
113 return ASN1_MEM_ERROR;
115 for (k2 = k; k2 < SIZEOF_UNSIGNED_LONG_INT; k2++)
116 value_out[k2 - k] = val[k2];
119 printf ("_asn1_convert_integer: valueIn=%s, lenOut=%d", value, *len);
120 for (k = 0; k < SIZEOF_UNSIGNED_LONG_INT; k++)
121 printf (", vOut[%d]=%d", k, value_out[k]);
130 _asn1_append_sequence_set (asn1_node node)
136 if (!node || !(node->down))
137 return ASN1_GENERIC_ERROR;
140 while ((type_field (p->type) == ASN1_ETYPE_TAG)
141 || (type_field (p->type) == ASN1_ETYPE_SIZE))
143 p2 = _asn1_copy_structure3 (p);
146 _asn1_set_right (p, p2);
149 _asn1_str_cpy (temp, sizeof (temp), "?1");
152 n = strtol (p->name + 1, NULL, 0);
155 _asn1_ltostr (n, temp + 1);
157 _asn1_set_name (p2, temp);
158 /* p2->type |= CONST_OPTION; */
166 * @node_root: pointer to a structure
167 * @name: the name of the element inside the structure that you want to set.
168 * @ivalue: vector used to specify the value to set. If len is >0,
169 * VALUE must be a two's complement form integer. if len=0 *VALUE
170 * must be a null terminated string with an integer value.
171 * @len: number of bytes of *value to use to set the value:
172 * value[0]..value[len-1] or 0 if value is a null terminated string
174 * Set the value of one element inside a structure.
176 * If an element is OPTIONAL and you want to delete it, you must use
177 * the value=NULL and len=0. Using "pkix.asn":
179 * result=asn1_write_value(cert, "tbsCertificate.issuerUniqueID",
182 * Description for each type:
184 * INTEGER: VALUE must contain a two's complement form integer.
186 * value[0]=0xFF , len=1 -> integer=-1.
187 * value[0]=0xFF value[1]=0xFF , len=2 -> integer=-1.
188 * value[0]=0x01 , len=1 -> integer= 1.
189 * value[0]=0x00 value[1]=0x01 , len=2 -> integer= 1.
190 * value="123" , len=0 -> integer= 123.
192 * ENUMERATED: As INTEGER (but only with not negative numbers).
194 * BOOLEAN: VALUE must be the null terminated string "TRUE" or
195 * "FALSE" and LEN != 0.
197 * value="TRUE" , len=1 -> boolean=TRUE.
198 * value="FALSE" , len=1 -> boolean=FALSE.
200 * OBJECT IDENTIFIER: VALUE must be a null terminated string with
201 * each number separated by a dot (e.g. "1.2.3.543.1"). LEN != 0.
203 * value="1 2 840 10040 4 3" , len=1 -> OID=dsa-with-sha.
205 * UTCTime: VALUE must be a null terminated string in one of these
206 * formats: "YYMMDDhhmmssZ", "YYMMDDhhmmssZ",
207 * "YYMMDDhhmmss+hh'mm'", "YYMMDDhhmmss-hh'mm'",
208 * "YYMMDDhhmm+hh'mm'", or "YYMMDDhhmm-hh'mm'". LEN != 0.
210 * value="9801011200Z" , len=1 -> time=Jannuary 1st, 1998
211 * at 12h 00m Greenwich Mean Time
213 * GeneralizedTime: VALUE must be in one of this format:
214 * "YYYYMMDDhhmmss.sZ", "YYYYMMDDhhmmss.sZ",
215 * "YYYYMMDDhhmmss.s+hh'mm'", "YYYYMMDDhhmmss.s-hh'mm'",
216 * "YYYYMMDDhhmm+hh'mm'", or "YYYYMMDDhhmm-hh'mm'" where ss.s
217 * indicates the seconds with any precision like "10.1" or "01.02".
220 * value="2001010112001.12-0700" , len=1 -> time=Jannuary
221 * 1st, 2001 at 12h 00m 01.12s Pacific Daylight Time
223 * OCTET STRING: VALUE contains the octet string and LEN is the
226 * value="$\backslash$x01$\backslash$x02$\backslash$x03" ,
227 * len=3 -> three bytes octet string
229 * GeneralString: VALUE contains the generalstring and LEN is the
232 * value="$\backslash$x01$\backslash$x02$\backslash$x03" ,
233 * len=3 -> three bytes generalstring
235 * BIT STRING: VALUE contains the bit string organized by bytes and
236 * LEN is the number of bits.
238 * value="$\backslash$xCF" , len=6 -> bit string="110011" (six
241 * CHOICE: if NAME indicates a choice type, VALUE must specify one of
242 * the alternatives with a null terminated string. LEN != 0. Using
245 * result=asn1_write_value(cert,
246 * "certificate1.tbsCertificate.subject", "rdnSequence",
249 * ANY: VALUE indicates the der encoding of a structure. LEN != 0.
251 * SEQUENCE OF: VALUE must be the null terminated string "NEW" and
252 * LEN != 0. With this instruction another element is appended in
253 * the sequence. The name of this element will be "?1" if it's the
254 * first one, "?2" for the second and so on.
258 * result=asn1_write_value(cert,
259 * "certificate1.tbsCertificate.subject.rdnSequence", "NEW", 1);
261 * SET OF: the same as SEQUENCE OF. Using "pkix.asn":
263 * result=asn1_write_value(cert,
264 * "tbsCertificate.subject.rdnSequence.?LAST", "NEW", 1);
266 * Returns: %ASN1_SUCCESS if the value was set,
267 * %ASN1_ELEMENT_NOT_FOUND if @name is not a valid element, and
268 * %ASN1_VALUE_NOT_VALID if @ivalue has a wrong format.
271 asn1_write_value (asn1_node node_root, const char *name,
272 const void *ivalue, int len)
274 asn1_node node, p, p2;
275 unsigned char *temp, *value_temp = NULL, *default_temp = NULL;
276 int len2, k, k2, negative;
278 const unsigned char *value = ivalue;
281 node = asn1_find_node (node_root, name);
283 return ASN1_ELEMENT_NOT_FOUND;
285 if ((node->type & CONST_OPTION) && (value == NULL) && (len == 0))
287 asn1_delete_structure (&node);
291 type = type_field(node->type);
293 if ((type == ASN1_ETYPE_SEQUENCE_OF) && (value == NULL)
297 while ((type_field (p->type) == ASN1_ETYPE_TAG)
298 || (type_field (p->type) == ASN1_ETYPE_SIZE))
302 asn1_delete_structure (&p->right);
309 case ASN1_ETYPE_BOOLEAN:
310 if (!_asn1_strcmp (value, "TRUE"))
312 if (node->type & CONST_DEFAULT)
315 while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
317 if (p->type & CONST_TRUE)
318 _asn1_set_value (node, NULL, 0);
320 _asn1_set_value (node, "T", 1);
323 _asn1_set_value (node, "T", 1);
325 else if (!_asn1_strcmp (value, "FALSE"))
327 if (node->type & CONST_DEFAULT)
330 while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
332 if (p->type & CONST_FALSE)
333 _asn1_set_value (node, NULL, 0);
335 _asn1_set_value (node, "F", 1);
338 _asn1_set_value (node, "F", 1);
341 return ASN1_VALUE_NOT_VALID;
343 case ASN1_ETYPE_INTEGER:
344 case ASN1_ETYPE_ENUMERATED:
347 if ((isdigit (value[0])) || (value[0] == '-'))
349 value_temp = malloc (SIZEOF_UNSIGNED_LONG_INT);
350 if (value_temp == NULL)
351 return ASN1_MEM_ALLOC_ERROR;
353 _asn1_convert_integer (value, value_temp,
354 SIZEOF_UNSIGNED_LONG_INT, &len);
357 { /* is an identifier like v1 */
358 if (!(node->type & CONST_LIST))
359 return ASN1_VALUE_NOT_VALID;
363 if (type_field (p->type) == ASN1_ETYPE_CONSTANT)
365 if (!_asn1_strcmp (p->name, value))
367 value_temp = malloc (SIZEOF_UNSIGNED_LONG_INT);
368 if (value_temp == NULL)
369 return ASN1_MEM_ALLOC_ERROR;
371 _asn1_convert_integer (p->value,
373 SIZEOF_UNSIGNED_LONG_INT,
381 return ASN1_VALUE_NOT_VALID;
386 value_temp = malloc (len);
387 if (value_temp == NULL)
388 return ASN1_MEM_ALLOC_ERROR;
389 memcpy (value_temp, value, len);
393 if (value_temp[0] & 0x80)
398 if (negative && (type_field (node->type) == ASN1_ETYPE_ENUMERATED))
401 return ASN1_VALUE_NOT_VALID;
404 for (k = 0; k < len - 1; k++)
405 if (negative && (value_temp[k] != 0xFF))
407 else if (!negative && value_temp[k])
410 if ((negative && !(value_temp[k] & 0x80)) ||
411 (!negative && (value_temp[k] & 0x80)))
414 _asn1_set_value_lv (node, value_temp + k, len - k);
416 if (node->type & CONST_DEFAULT)
419 while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
421 if ((isdigit (p->value[0])) || (p->value[0] == '-'))
423 default_temp = malloc (SIZEOF_UNSIGNED_LONG_INT);
424 if (default_temp == NULL)
427 return ASN1_MEM_ALLOC_ERROR;
430 _asn1_convert_integer (p->value, default_temp,
431 SIZEOF_UNSIGNED_LONG_INT, &len2);
434 { /* is an identifier like v1 */
435 if (!(node->type & CONST_LIST))
438 return ASN1_VALUE_NOT_VALID;
443 if (type_field (p2->type) == ASN1_ETYPE_CONSTANT)
445 if (!_asn1_strcmp (p2->name, p->value))
447 default_temp = malloc (SIZEOF_UNSIGNED_LONG_INT);
448 if (default_temp == NULL)
451 return ASN1_MEM_ALLOC_ERROR;
454 _asn1_convert_integer (p2->value,
456 SIZEOF_UNSIGNED_LONG_INT,
466 return ASN1_VALUE_NOT_VALID;
471 if ((len - k) == len2)
473 for (k2 = 0; k2 < len2; k2++)
474 if (value_temp[k + k2] != default_temp[k2])
479 _asn1_set_value (node, NULL, 0);
485 case ASN1_ETYPE_OBJECT_ID:
486 for (i = 0; i < _asn1_strlen (value); i++)
487 if ((!isdigit (value[i])) && (value[i] != '.') && (value[i] != '+'))
488 return ASN1_VALUE_NOT_VALID;
489 if (node->type & CONST_DEFAULT)
492 while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
494 if (!_asn1_strcmp (value, p->value))
496 _asn1_set_value (node, NULL, 0);
500 _asn1_set_value (node, value, _asn1_strlen (value) + 1);
502 case ASN1_ETYPE_UTC_TIME:
504 if (_asn1_strlen (value) < 11)
505 return ASN1_VALUE_NOT_VALID;
506 for (k = 0; k < 10; k++)
507 if (!isdigit (value[k]))
508 return ASN1_VALUE_NOT_VALID;
509 switch (_asn1_strlen (value))
512 if (value[10] != 'Z')
513 return ASN1_VALUE_NOT_VALID;
516 if ((!isdigit (value[10])) || (!isdigit (value[11])) ||
518 return ASN1_VALUE_NOT_VALID;
521 if ((value[10] != '+') && (value[10] != '-'))
522 return ASN1_VALUE_NOT_VALID;
523 for (k = 11; k < 15; k++)
524 if (!isdigit (value[k]))
525 return ASN1_VALUE_NOT_VALID;
528 if ((!isdigit (value[10])) || (!isdigit (value[11])))
529 return ASN1_VALUE_NOT_VALID;
530 if ((value[12] != '+') && (value[12] != '-'))
531 return ASN1_VALUE_NOT_VALID;
532 for (k = 13; k < 17; k++)
533 if (!isdigit (value[k]))
534 return ASN1_VALUE_NOT_VALID;
537 return ASN1_VALUE_NOT_FOUND;
539 _asn1_set_value (node, value, _asn1_strlen (value) + 1);
542 case ASN1_ETYPE_GENERALIZED_TIME:
544 _asn1_set_value (node, value, _asn1_strlen (value) + 1);
546 case ASN1_ETYPE_OCTET_STRING:
547 case ASN1_ETYPE_GENERALSTRING:
548 case ASN1_ETYPE_NUMERIC_STRING:
549 case ASN1_ETYPE_IA5_STRING:
550 case ASN1_ETYPE_TELETEX_STRING:
551 case ASN1_ETYPE_PRINTABLE_STRING:
552 case ASN1_ETYPE_UNIVERSAL_STRING:
553 case ASN1_ETYPE_BMP_STRING:
554 case ASN1_ETYPE_UTF8_STRING:
555 case ASN1_ETYPE_VISIBLE_STRING:
557 len = _asn1_strlen (value);
558 _asn1_set_value_lv (node, value, len);
560 case ASN1_ETYPE_BIT_STRING:
562 len = _asn1_strlen (value);
563 asn1_length_der ((len >> 3) + 2, NULL, &len2);
564 temp = malloc ((len >> 3) + 2 + len2);
566 return ASN1_MEM_ALLOC_ERROR;
568 asn1_bit_der (value, len, temp, &len2);
569 _asn1_set_value_m (node, temp, len2);
572 case ASN1_ETYPE_CHOICE:
576 if (!_asn1_strcmp (p->name, value))
583 asn1_delete_structure (&p2);
594 return ASN1_ELEMENT_NOT_FOUND;
597 _asn1_set_value_lv (node, value, len);
599 case ASN1_ETYPE_SEQUENCE_OF:
600 case ASN1_ETYPE_SET_OF:
601 if (_asn1_strcmp (value, "NEW"))
602 return ASN1_VALUE_NOT_VALID;
603 _asn1_append_sequence_set (node);
606 return ASN1_ELEMENT_NOT_FOUND;
614 #define PUT_VALUE( ptr, ptr_size, data, data_size) \
616 if (ptr_size < data_size) { \
617 return ASN1_MEM_ERROR; \
619 memcpy( ptr, data, data_size); \
622 #define PUT_STR_VALUE( ptr, ptr_size, data) \
623 *len = _asn1_strlen(data) + 1; \
624 if (ptr_size < *len) { \
625 return ASN1_MEM_ERROR; \
627 /* this strcpy is checked */ \
628 _asn1_strcpy(ptr, data); \
631 #define ADD_STR_VALUE( ptr, ptr_size, data) \
632 *len = (int) _asn1_strlen(data) + 1; \
633 if (ptr_size < (int) _asn1_strlen(ptr)+(*len)) { \
634 return ASN1_MEM_ERROR; \
636 /* this strcat is checked */ \
637 _asn1_strcat(ptr, data); \
642 * @root: pointer to a structure.
643 * @name: the name of the element inside a structure that you want to read.
644 * @ivalue: vector that will contain the element's content, must be a
645 * pointer to memory cells already allocated.
646 * @len: number of bytes of *value: value[0]..value[len-1]. Initialy
647 * holds the sizeof value.
649 * Returns the value of one element inside a structure.
651 * If an element is OPTIONAL and the function "read_value" returns
652 * %ASN1_ELEMENT_NOT_FOUND, it means that this element wasn't present
653 * in the der encoding that created the structure. The first element
654 * of a SEQUENCE_OF or SET_OF is named "?1". The second one "?2" and
657 * INTEGER: VALUE will contain a two's complement form integer.
659 * integer=-1 -> value[0]=0xFF , len=1.
660 * integer=1 -> value[0]=0x01 , len=1.
662 * ENUMERATED: As INTEGER (but only with not negative numbers).
664 * BOOLEAN: VALUE will be the null terminated string "TRUE" or
665 * "FALSE" and LEN=5 or LEN=6.
667 * OBJECT IDENTIFIER: VALUE will be a null terminated string with
668 * each number separated by a dot (i.e. "1.2.3.543.1").
670 * LEN = strlen(VALUE)+1
672 * UTCTime: VALUE will be a null terminated string in one of these
673 * formats: "YYMMDDhhmmss+hh'mm'" or "YYMMDDhhmmss-hh'mm'".
674 * LEN=strlen(VALUE)+1.
676 * GeneralizedTime: VALUE will be a null terminated string in the
677 * same format used to set the value.
679 * OCTET STRING: VALUE will contain the octet string and LEN will be
680 * the number of octets.
682 * GeneralString: VALUE will contain the generalstring and LEN will
683 * be the number of octets.
685 * BIT STRING: VALUE will contain the bit string organized by bytes
686 * and LEN will be the number of bits.
688 * CHOICE: If NAME indicates a choice type, VALUE will specify the
689 * alternative selected.
691 * ANY: If NAME indicates an any type, VALUE will indicate the DER
692 * encoding of the structure actually used.
694 * Returns: %ASN1_SUCCESS if value is returned,
695 * %ASN1_ELEMENT_NOT_FOUND if @name is not a valid element,
696 * %ASN1_VALUE_NOT_FOUND if there isn't any value for the element
697 * selected, and %ASN1_MEM_ERROR if The value vector isn't big enough
698 * to store the result, and in this case @len will contain the number of
702 asn1_read_value (asn1_node root, const char *name, void *ivalue, int *len)
704 return asn1_read_value_type( root, name, ivalue, len, NULL);
708 * asn1_read_value_type:
709 * @root: pointer to a structure.
710 * @name: the name of the element inside a structure that you want to read.
711 * @ivalue: vector that will contain the element's content, must be a
712 * pointer to memory cells already allocated.
713 * @len: number of bytes of *value: value[0]..value[len-1]. Initialy
714 * holds the sizeof value.
715 * @etype: The type of the value read (ASN1_ETYPE)
717 * Returns the value of one element inside a structure.
719 * If an element is OPTIONAL and the function "read_value" returns
720 * %ASN1_ELEMENT_NOT_FOUND, it means that this element wasn't present
721 * in the der encoding that created the structure. The first element
722 * of a SEQUENCE_OF or SET_OF is named "?1". The second one "?2" and
725 * INTEGER: VALUE will contain a two's complement form integer.
727 * integer=-1 -> value[0]=0xFF , len=1.
728 * integer=1 -> value[0]=0x01 , len=1.
730 * ENUMERATED: As INTEGER (but only with not negative numbers).
732 * BOOLEAN: VALUE will be the null terminated string "TRUE" or
733 * "FALSE" and LEN=5 or LEN=6.
735 * OBJECT IDENTIFIER: VALUE will be a null terminated string with
736 * each number separated by a dot (i.e. "1.2.3.543.1").
738 * LEN = strlen(VALUE)+1
740 * UTCTime: VALUE will be a null terminated string in one of these
741 * formats: "YYMMDDhhmmss+hh'mm'" or "YYMMDDhhmmss-hh'mm'".
742 * LEN=strlen(VALUE)+1.
744 * GeneralizedTime: VALUE will be a null terminated string in the
745 * same format used to set the value.
747 * OCTET STRING: VALUE will contain the octet string and LEN will be
748 * the number of octets.
750 * GeneralString: VALUE will contain the generalstring and LEN will
751 * be the number of octets.
753 * BIT STRING: VALUE will contain the bit string organized by bytes
754 * and LEN will be the number of bits.
756 * CHOICE: If NAME indicates a choice type, VALUE will specify the
757 * alternative selected.
759 * ANY: If NAME indicates an any type, VALUE will indicate the DER
760 * encoding of the structure actually used.
762 * Returns: %ASN1_SUCCESS if value is returned,
763 * %ASN1_ELEMENT_NOT_FOUND if @name is not a valid element,
764 * %ASN1_VALUE_NOT_FOUND if there isn't any value for the element
765 * selected, and %ASN1_MEM_ERROR if The value vector isn't big enough
766 * to store the result, and in this case @len will contain the number of
770 asn1_read_value_type (asn1_node root, const char *name, void *ivalue, int *len,
773 asn1_node node, p, p2;
775 int value_size = *len;
776 unsigned char *value = ivalue;
779 node = asn1_find_node (root, name);
781 return ASN1_ELEMENT_NOT_FOUND;
783 type = type_field (node->type);
785 if ((type != ASN1_ETYPE_NULL) &&
786 (type != ASN1_ETYPE_CHOICE) &&
787 !(node->type & CONST_DEFAULT) && !(node->type & CONST_ASSIGN) &&
788 (node->value == NULL))
789 return ASN1_VALUE_NOT_FOUND;
795 case ASN1_ETYPE_NULL:
796 PUT_STR_VALUE (value, value_size, "NULL");
798 case ASN1_ETYPE_BOOLEAN:
799 if ((node->type & CONST_DEFAULT) && (node->value == NULL))
802 while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
804 if (p->type & CONST_TRUE)
806 PUT_STR_VALUE (value, value_size, "TRUE");
810 PUT_STR_VALUE (value, value_size, "FALSE");
813 else if (node->value[0] == 'T')
815 PUT_STR_VALUE (value, value_size, "TRUE");
819 PUT_STR_VALUE (value, value_size, "FALSE");
822 case ASN1_ETYPE_INTEGER:
823 case ASN1_ETYPE_ENUMERATED:
824 if ((node->type & CONST_DEFAULT) && (node->value == NULL))
827 while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
829 if ((isdigit (p->value[0])) || (p->value[0] == '-')
830 || (p->value[0] == '+'))
832 if (_asn1_convert_integer
833 (p->value, value, value_size, len) != ASN1_SUCCESS)
834 return ASN1_MEM_ERROR;
837 { /* is an identifier like v1 */
841 if (type_field (p2->type) == ASN1_ETYPE_CONSTANT)
843 if (!_asn1_strcmp (p2->name, p->value))
845 if (_asn1_convert_integer
846 (p2->value, value, value_size,
847 len) != ASN1_SUCCESS)
848 return ASN1_MEM_ERROR;
859 if (asn1_get_octet_der
860 (node->value, node->value_len, &len2, value, value_size,
861 len) != ASN1_SUCCESS)
862 return ASN1_MEM_ERROR;
865 case ASN1_ETYPE_OBJECT_ID:
866 if (node->type & CONST_ASSIGN)
872 if (type_field (p->type) == ASN1_ETYPE_CONSTANT)
874 ADD_STR_VALUE (value, value_size, p->value);
877 ADD_STR_VALUE (value, value_size, ".");
882 *len = _asn1_strlen (value) + 1;
884 else if ((node->type & CONST_DEFAULT) && (node->value == NULL))
887 while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
889 PUT_STR_VALUE (value, value_size, p->value);
893 PUT_STR_VALUE (value, value_size, node->value);
896 case ASN1_ETYPE_GENERALIZED_TIME:
897 case ASN1_ETYPE_UTC_TIME:
898 PUT_STR_VALUE (value, value_size, node->value);
900 case ASN1_ETYPE_OCTET_STRING:
901 case ASN1_ETYPE_GENERALSTRING:
902 case ASN1_ETYPE_NUMERIC_STRING:
903 case ASN1_ETYPE_IA5_STRING:
904 case ASN1_ETYPE_TELETEX_STRING:
905 case ASN1_ETYPE_PRINTABLE_STRING:
906 case ASN1_ETYPE_UNIVERSAL_STRING:
907 case ASN1_ETYPE_BMP_STRING:
908 case ASN1_ETYPE_UTF8_STRING:
909 case ASN1_ETYPE_VISIBLE_STRING:
911 if (asn1_get_octet_der
912 (node->value, node->value_len, &len2, value, value_size,
913 len) != ASN1_SUCCESS)
914 return ASN1_MEM_ERROR;
916 case ASN1_ETYPE_BIT_STRING:
919 (node->value, node->value_len, &len2, value, value_size,
920 len) != ASN1_SUCCESS)
921 return ASN1_MEM_ERROR;
923 case ASN1_ETYPE_CHOICE:
924 PUT_STR_VALUE (value, value_size, node->down->name);
928 len2 = asn1_get_length_der (node->value, node->value_len, &len3);
930 return ASN1_DER_ERROR;
931 PUT_VALUE (value, value_size, node->value + len3, len2);
934 return ASN1_ELEMENT_NOT_FOUND;
943 * @root: pointer to a structure
944 * @name: the name of the element inside a structure.
945 * @tagValue: variable that will contain the TAG value.
946 * @classValue: variable that will specify the TAG type.
948 * Returns the TAG and the CLASS of one element inside a structure.
949 * CLASS can have one of these constants: %ASN1_CLASS_APPLICATION,
950 * %ASN1_CLASS_UNIVERSAL, %ASN1_CLASS_PRIVATE or
951 * %ASN1_CLASS_CONTEXT_SPECIFIC.
953 * Returns: %ASN1_SUCCESS if successful, %ASN1_ELEMENT_NOT_FOUND if
954 * @name is not a valid element.
957 asn1_read_tag (asn1_node root, const char *name, int *tagValue,
960 asn1_node node, p, pTag;
962 node = asn1_find_node (root, name);
964 return ASN1_ELEMENT_NOT_FOUND;
968 /* pTag will points to the IMPLICIT TAG */
970 if (node->type & CONST_TAG)
974 if (type_field (p->type) == ASN1_ETYPE_TAG)
976 if ((p->type & CONST_IMPLICIT) && (pTag == NULL))
978 else if (p->type & CONST_EXPLICIT)
987 *tagValue = _asn1_strtoul (pTag->value, NULL, 10);
989 if (pTag->type & CONST_APPLICATION)
990 *classValue = ASN1_CLASS_APPLICATION;
991 else if (pTag->type & CONST_UNIVERSAL)
992 *classValue = ASN1_CLASS_UNIVERSAL;
993 else if (pTag->type & CONST_PRIVATE)
994 *classValue = ASN1_CLASS_PRIVATE;
996 *classValue = ASN1_CLASS_CONTEXT_SPECIFIC;
1000 unsigned type = type_field (node->type);
1001 *classValue = ASN1_CLASS_UNIVERSAL;
1005 CASE_HANDLED_ETYPES:
1006 *tagValue = _asn1_tags[type].tag;
1008 case ASN1_ETYPE_TAG:
1009 case ASN1_ETYPE_CHOICE:
1010 case ASN1_ETYPE_ANY:
1018 return ASN1_SUCCESS;
1022 * asn1_read_node_value:
1023 * @node: pointer to a node.
1024 * @data: a point to a asn1_data_node_st
1026 * Returns the value a data node inside a asn1_node structure.
1027 * The data returned should be handled as constant values.
1029 * Returns: %ASN1_SUCCESS if the node exists.
1031 int asn1_read_node_value (asn1_node node, asn1_data_node_st* data)
1033 data->name = node->name;
1034 data->value = node->value;
1035 data->value_len = node->value_len;
1036 data->type = type_field(node->type);
1038 return ASN1_SUCCESS;