2 * Copyright (C) 2002-2014 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
35 #ifdef HAVE_SYS_TYPES_H
36 #include <sys/types.h>
41 #define ASN1_SMALL_VALUE_SIZE 16
43 /* This structure is also in libtasn1.h, but then contains less
44 fields. You cannot make any modifications to these first fields
45 without breaking ABI. */
49 char name[ASN1_MAX_NAME_SIZE + 1]; /* Node name */
50 unsigned int name_hash;
51 unsigned int type; /* Node type */
52 unsigned char *value; /* Node value */
54 asn1_node up; /* Pointer to the parent node */
55 asn1_node down; /* Pointer to the son node */
56 asn1_node right; /* Pointer to the brother node */
57 asn1_node left; /* Pointer to the next list element */
59 unsigned char small_value[ASN1_SMALL_VALUE_SIZE]; /* For small values */
61 /* values used during decoding/coding */
63 unsigned start; /* the start of the DER sequence - if decoded */
64 unsigned end; /* the end of the DER sequence - if decoded */
67 typedef struct tag_and_class_st
74 /* the types that are handled in _asn1_tags */
75 #define CASE_HANDLED_ETYPES \
76 case ASN1_ETYPE_NULL: \
77 case ASN1_ETYPE_BOOLEAN: \
78 case ASN1_ETYPE_INTEGER: \
79 case ASN1_ETYPE_ENUMERATED: \
80 case ASN1_ETYPE_OBJECT_ID: \
81 case ASN1_ETYPE_OCTET_STRING: \
82 case ASN1_ETYPE_GENERALSTRING: \
83 case ASN1_ETYPE_NUMERIC_STRING: \
84 case ASN1_ETYPE_IA5_STRING: \
85 case ASN1_ETYPE_TELETEX_STRING: \
86 case ASN1_ETYPE_PRINTABLE_STRING: \
87 case ASN1_ETYPE_UNIVERSAL_STRING: \
88 case ASN1_ETYPE_BMP_STRING: \
89 case ASN1_ETYPE_UTF8_STRING: \
90 case ASN1_ETYPE_VISIBLE_STRING: \
91 case ASN1_ETYPE_BIT_STRING: \
92 case ASN1_ETYPE_SEQUENCE: \
93 case ASN1_ETYPE_SEQUENCE_OF: \
94 case ASN1_ETYPE_SET: \
95 case ASN1_ETYPE_UTC_TIME: \
96 case ASN1_ETYPE_GENERALIZED_TIME: \
97 case ASN1_ETYPE_SET_OF
99 #define ETYPE_TAG(etype) (_asn1_tags[etype].tag)
100 #define ETYPE_CLASS(etype) (_asn1_tags[etype].class)
101 #define ETYPE_OK(etype) ((etype != ASN1_ETYPE_INVALID && \
102 etype <= _asn1_tags_size && \
103 _asn1_tags[etype].desc != NULL)?1:0)
105 extern unsigned int _asn1_tags_size;
106 extern const tag_and_class_st _asn1_tags[];
108 #define _asn1_strlen(s) strlen((const char *) s)
109 #define _asn1_strtol(n,e,b) strtol((const char *) n, e, b)
110 #define _asn1_strtoul(n,e,b) strtoul((const char *) n, e, b)
111 #define _asn1_strcmp(a,b) strcmp((const char *)a, (const char *)b)
112 #define _asn1_strcpy(a,b) strcpy((char *)a, (const char *)b)
113 #define _asn1_strcat(a,b) strcat((char *)a, (const char *)b)
115 #define MAX_LOG_SIZE 1024 /* maximum number of characters of a log message */
117 /* Define used for visiting trees. */
122 /***********************************************************************/
123 /* List of constants to better specify the type of typedef asn1_node_st. */
124 /***********************************************************************/
125 /* Used with TYPE_TAG */
126 #define CONST_UNIVERSAL (1<<8)
127 #define CONST_PRIVATE (1<<9)
128 #define CONST_APPLICATION (1<<10)
129 #define CONST_EXPLICIT (1<<11)
130 #define CONST_IMPLICIT (1<<12)
132 #define CONST_TAG (1<<13) /* Used in ASN.1 assignement */
133 #define CONST_OPTION (1<<14)
134 #define CONST_DEFAULT (1<<15)
135 #define CONST_TRUE (1<<16)
136 #define CONST_FALSE (1<<17)
138 #define CONST_LIST (1<<18) /* Used with TYPE_INTEGER and TYPE_BIT_STRING */
139 #define CONST_MIN_MAX (1<<19)
141 #define CONST_1_PARAM (1<<20)
143 #define CONST_SIZE (1<<21)
145 #define CONST_DEFINED_BY (1<<22)
147 /* Those two are deprecated and used for backwards compatibility */
148 #define CONST_GENERALIZED (1<<23)
149 #define CONST_UTC (1<<24)
151 /* #define CONST_IMPORTS (1<<25) */
153 #define CONST_NOT_USED (1<<26)
154 #define CONST_SET (1<<27)
155 #define CONST_ASSIGN (1<<28)
157 #define CONST_DOWN (1<<29)
158 #define CONST_RIGHT (1<<30)
161 #define ASN1_ETYPE_TIME 17
162 /****************************************/
163 /* Returns the first 8 bits. */
164 /* Used with the field type of asn1_node_st */
165 /****************************************/
166 inline static unsigned int
167 type_field (unsigned int ntype)
169 return (ntype & 0xff);
172 /* To convert old types from a static structure */
173 inline static unsigned int
174 convert_old_type (unsigned int ntype)
176 unsigned int type = ntype & 0xff;
177 if (type == ASN1_ETYPE_TIME)
179 if (ntype & CONST_UTC)
180 type = ASN1_ETYPE_UTC_TIME;
182 type = ASN1_ETYPE_GENERALIZED_TIME;
184 ntype &= ~(CONST_UTC | CONST_GENERALIZED);