1 /*
2  * Copyright (C) 2002-2014 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, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19  * 02110-1301, USA
20  */
21 
22 #ifndef INT_H
23 #define INT_H
24 
25 #ifdef HAVE_CONFIG_H
26 #include <config.h>
27 #endif
28 
29 #include <string.h>
30 #include <stdlib.h>
31 #include <stdio.h>
32 #include <stdint.h>
33 
34 #ifdef HAVE_SYS_TYPES_H
35 #include <sys/types.h>
36 #endif
37 
38 #include <libtasn1.h>
39 
40 #define ASN1_SMALL_VALUE_SIZE 16
41 
42 /* This structure is also in libtasn1.h, but then contains less
43    fields.  You cannot make any modifications to these first fields
44    without breaking ABI.  */
45 struct asn1_node_st
46 {
47   /* public fields: */
48   char name[ASN1_MAX_NAME_SIZE + 1];	/* Node name */
49   unsigned int name_hash;
50   unsigned int type;		/* Node type */
51   unsigned char *value;		/* Node value */
52   int value_len;
53   asn1_node down;		/* Pointer to the son node */
54   asn1_node right;		/* Pointer to the brother node */
55   asn1_node left;		/* Pointer to the next list element */
56   /* private fields: */
57   unsigned char small_value[ASN1_SMALL_VALUE_SIZE];	/* For small values */
58 
59   /* values used during decoding/coding */
60   int tmp_ival;
61   unsigned start; /* the start of the DER sequence - if decoded */
62   unsigned end; /* the end of the DER sequence - if decoded */
63 };
64 
65 typedef struct tag_and_class_st
66 {
67   unsigned tag;
68   unsigned class;
69   const char *desc;
70 } tag_and_class_st;
71 
72 /* the types that are handled in _asn1_tags */
73 #define CASE_HANDLED_ETYPES \
74 	case ASN1_ETYPE_NULL: \
75 	case ASN1_ETYPE_BOOLEAN: \
76 	case ASN1_ETYPE_INTEGER: \
77 	case ASN1_ETYPE_ENUMERATED: \
78 	case ASN1_ETYPE_OBJECT_ID: \
79 	case ASN1_ETYPE_OCTET_STRING: \
80 	case ASN1_ETYPE_GENERALSTRING: \
81         case ASN1_ETYPE_NUMERIC_STRING: \
82         case ASN1_ETYPE_IA5_STRING: \
83         case ASN1_ETYPE_TELETEX_STRING: \
84         case ASN1_ETYPE_PRINTABLE_STRING: \
85         case ASN1_ETYPE_UNIVERSAL_STRING: \
86         case ASN1_ETYPE_BMP_STRING: \
87         case ASN1_ETYPE_UTF8_STRING: \
88         case ASN1_ETYPE_VISIBLE_STRING: \
89 	case ASN1_ETYPE_BIT_STRING: \
90 	case ASN1_ETYPE_SEQUENCE: \
91 	case ASN1_ETYPE_SEQUENCE_OF: \
92 	case ASN1_ETYPE_SET: \
93 	case ASN1_ETYPE_UTC_TIME: \
94 	case ASN1_ETYPE_GENERALIZED_TIME: \
95 	case ASN1_ETYPE_SET_OF
96 
97 #define ETYPE_TAG(etype) (_asn1_tags[etype].tag)
98 #define ETYPE_CLASS(etype) (_asn1_tags[etype].class)
99 #define ETYPE_OK(etype) (((etype) != ASN1_ETYPE_INVALID && \
100                           (etype) <= _asn1_tags_size && \
101                           _asn1_tags[(etype)].desc != NULL)?1:0)
102 
103 #define ETYPE_IS_STRING(etype) ((etype == ASN1_ETYPE_GENERALSTRING || \
104 	etype == ASN1_ETYPE_NUMERIC_STRING || etype == ASN1_ETYPE_IA5_STRING || \
105 	etype == ASN1_ETYPE_TELETEX_STRING || etype == ASN1_ETYPE_PRINTABLE_STRING || \
106 	etype == ASN1_ETYPE_UNIVERSAL_STRING || etype == ASN1_ETYPE_BMP_STRING || \
107 	etype == ASN1_ETYPE_UTF8_STRING || etype == ASN1_ETYPE_VISIBLE_STRING || \
108 	etype == ASN1_ETYPE_OCTET_STRING)?1:0)
109 
110 extern unsigned int _asn1_tags_size;
111 extern const tag_and_class_st _asn1_tags[];
112 
113 #define _asn1_strlen(s) strlen((const char *) s)
114 #define _asn1_strtol(n,e,b) strtol((const char *) n, e, b)
115 #define _asn1_strtoul(n,e,b) strtoul((const char *) n, e, b)
116 #define _asn1_strcmp(a,b) strcmp((const char *)a, (const char *)b)
117 #define _asn1_strcpy(a,b) strcpy((char *)a, (const char *)b)
118 #define _asn1_strcat(a,b) strcat((char *)a, (const char *)b)
119 
120 #if SIZEOF_UNSIGNED_LONG_INT == 8
121 # define _asn1_strtou64(n,e,b) strtoul((const char *) n, e, b)
122 #else
123 # define _asn1_strtou64(n,e,b) strtoull((const char *) n, e, b)
124 #endif
125 
126 #define MAX_LOG_SIZE 1024	/* maximum number of characters of a log message */
127 
128 /* Define used for visiting trees. */
129 #define UP     1
130 #define RIGHT  2
131 #define DOWN   3
132 
133 /***********************************************************************/
134 /* List of constants to better specify the type of typedef asn1_node_st.   */
135 /***********************************************************************/
136 /*  Used with TYPE_TAG  */
137 #define CONST_UNIVERSAL   (1U<<8)
138 #define CONST_PRIVATE     (1U<<9)
139 #define CONST_APPLICATION (1U<<10)
140 #define CONST_EXPLICIT    (1U<<11)
141 #define CONST_IMPLICIT    (1U<<12)
142 
143 #define CONST_TAG         (1U<<13)	/*  Used in ASN.1 assignement  */
144 #define CONST_OPTION      (1U<<14)
145 #define CONST_DEFAULT     (1U<<15)
146 #define CONST_TRUE        (1U<<16)
147 #define CONST_FALSE       (1U<<17)
148 
149 #define CONST_LIST        (1U<<18)	/*  Used with TYPE_INTEGER and TYPE_BIT_STRING  */
150 #define CONST_MIN_MAX     (1U<<19)
151 
152 #define CONST_1_PARAM     (1U<<20)
153 
154 #define CONST_SIZE        (1U<<21)
155 
156 #define CONST_DEFINED_BY  (1U<<22)
157 
158 /* Those two are deprecated and used for backwards compatibility */
159 #define CONST_GENERALIZED (1U<<23)
160 #define CONST_UTC         (1U<<24)
161 
162 /* #define CONST_IMPORTS     (1U<<25) */
163 
164 #define CONST_NOT_USED    (1U<<26)
165 #define CONST_SET         (1U<<27)
166 #define CONST_ASSIGN      (1U<<28)
167 
168 #define CONST_DOWN        (1U<<29)
169 #define CONST_RIGHT       (1U<<30)
170 
171 
172 #define ASN1_ETYPE_TIME 17
173 /****************************************/
174 /* Returns the first 8 bits.            */
175 /* Used with the field type of asn1_node_st */
176 /****************************************/
177 inline static unsigned int
type_field(unsigned int ntype)178 type_field (unsigned int ntype)
179 {
180   return (ntype & 0xff);
181 }
182 
183 /* To convert old types from a static structure */
184 inline static unsigned int
convert_old_type(unsigned int ntype)185 convert_old_type (unsigned int ntype)
186 {
187   unsigned int type = ntype & 0xff;
188   if (type == ASN1_ETYPE_TIME)
189     {
190       if (ntype & CONST_UTC)
191 	type = ASN1_ETYPE_UTC_TIME;
192       else
193 	type = ASN1_ETYPE_GENERALIZED_TIME;
194 
195       ntype &= ~(CONST_UTC | CONST_GENERALIZED);
196       ntype &= 0xffffff00;
197       ntype |= type;
198 
199       return ntype;
200     }
201   else
202     return ntype;
203 }
204 
205 static inline
_asn1_realloc(void * ptr,size_t size)206 void *_asn1_realloc(void *ptr, size_t size)
207 {
208   void *ret;
209 
210   if (size == 0)
211     return ptr;
212 
213   ret = realloc(ptr, size);
214   if (ret == NULL)
215     {
216       free(ptr);
217     }
218   return ret;
219 }
220 
221 #endif /* INT_H */
222