1/*
2 * Copyright (C) 2002-2014 Free Software Foundation, Inc.
3 *
4 * This file is part of LIBTASN1.
5 *
6 * LIBTASN1 is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as
8 * published by the Free Software Foundation; either version 2.1 of
9 * the License, or (at your option) any later version.
10 *
11 * LIBTASN1 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 LIBTASN1; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 * 02110-1301, USA
20 *
21 */
22
23#ifndef LIBTASN1_H
24#define LIBTASN1_H
25
26#ifndef ASN1_API
27#if defined ASN1_BUILDING && defined HAVE_VISIBILITY && HAVE_VISIBILITY
28#define ASN1_API __attribute__((__visibility__("default")))
29#elif defined ASN1_BUILDING && defined _MSC_VER && ! defined ASN1_STATIC
30#define ASN1_API __declspec(dllexport)
31#elif defined _MSC_VER && ! defined ASN1_STATIC
32#define ASN1_API __declspec(dllimport)
33#else
34#define ASN1_API
35#endif
36#endif
37
38#include <sys/types.h>
39#include <time.h>
40#include <stdio.h> /* for FILE* */
41
42#ifdef __cplusplus
43extern "C"
44{
45#endif
46
47#define ASN1_VERSION "4.13"
48
49#if defined(__GNUC__) && !defined(ASN1_INTERNAL_BUILD)
50# define _ASN1_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
51# if _ASN1_GCC_VERSION >= 30100
52# define _ASN1_GCC_ATTR_DEPRECATED __attribute__ ((__deprecated__))
53# endif
54#endif
55
56#ifndef _ASN1_GCC_ATTR_DEPRECATED
57#define _ASN1_GCC_ATTR_DEPRECATED
58#endif
59
60 /*****************************************/
61 /* Errors returned by libtasn1 functions */
62 /*****************************************/
63#define ASN1_SUCCESS 0
64#define ASN1_FILE_NOT_FOUND 1
65#define ASN1_ELEMENT_NOT_FOUND 2
66#define ASN1_IDENTIFIER_NOT_FOUND 3
67#define ASN1_DER_ERROR 4
68#define ASN1_VALUE_NOT_FOUND 5
69#define ASN1_GENERIC_ERROR 6
70#define ASN1_VALUE_NOT_VALID 7
71#define ASN1_TAG_ERROR 8
72#define ASN1_TAG_IMPLICIT 9
73#define ASN1_ERROR_TYPE_ANY 10
74#define ASN1_SYNTAX_ERROR 11
75#define ASN1_MEM_ERROR 12
76#define ASN1_MEM_ALLOC_ERROR 13
77#define ASN1_DER_OVERFLOW 14
78#define ASN1_NAME_TOO_LONG 15
79#define ASN1_ARRAY_ERROR 16
80#define ASN1_ELEMENT_NOT_EMPTY 17
81#define ASN1_TIME_ENCODING_ERROR 18
82
83 /*************************************/
84 /* Constants used in asn1_visit_tree */
85 /*************************************/
86#define ASN1_PRINT_NAME 1
87#define ASN1_PRINT_NAME_TYPE 2
88#define ASN1_PRINT_NAME_TYPE_VALUE 3
89#define ASN1_PRINT_ALL 4
90
91 /*****************************************/
92 /* Constants returned by asn1_read_tag */
93 /*****************************************/
94#define ASN1_CLASS_UNIVERSAL 0x00 /* old: 1 */
95#define ASN1_CLASS_APPLICATION 0x40 /* old: 2 */
96#define ASN1_CLASS_CONTEXT_SPECIFIC 0x80 /* old: 3 */
97#define ASN1_CLASS_PRIVATE 0xC0 /* old: 4 */
98#define ASN1_CLASS_STRUCTURED 0x20
99
100 /*****************************************/
101 /* Constants returned by asn1_read_tag */
102 /*****************************************/
103#define ASN1_TAG_BOOLEAN 0x01
104#define ASN1_TAG_INTEGER 0x02
105#define ASN1_TAG_SEQUENCE 0x10
106#define ASN1_TAG_SET 0x11
107#define ASN1_TAG_OCTET_STRING 0x04
108#define ASN1_TAG_BIT_STRING 0x03
109#define ASN1_TAG_UTCTime 0x17
110#define ASN1_TAG_GENERALIZEDTime 0x18
111#define ASN1_TAG_OBJECT_ID 0x06
112#define ASN1_TAG_ENUMERATED 0x0A
113#define ASN1_TAG_NULL 0x05
114#define ASN1_TAG_GENERALSTRING 0x1B
115#define ASN1_TAG_NUMERIC_STRING 0x12
116#define ASN1_TAG_IA5_STRING 0x16
117#define ASN1_TAG_TELETEX_STRING 0x14
118#define ASN1_TAG_PRINTABLE_STRING 0x13
119#define ASN1_TAG_UNIVERSAL_STRING 0x1C
120#define ASN1_TAG_BMP_STRING 0x1E
121#define ASN1_TAG_UTF8_STRING 0x0C
122#define ASN1_TAG_VISIBLE_STRING 0x1A
123
124 /******************************************************/
125 /* Structure definition used for the node of the tree */
126 /* that represent an ASN.1 DEFINITION. */
127 /******************************************************/
128
129 typedef struct asn1_node_st asn1_node_st;
130
131 typedef asn1_node_st *asn1_node;
132
133 /* maximum number of characters of a name */
134 /* inside a file with ASN1 definitons */
135#define ASN1_MAX_NAME_SIZE 64
136
137
138 /*****************************************/
139 /* For the on-disk format of ASN.1 trees */
140 /*****************************************/
141 struct asn1_static_node_st
142 {
143 const char *name; /* Node name */
144 unsigned int type; /* Node type */
145 const void *value; /* Node value */
146 };
147 typedef struct asn1_static_node_st asn1_static_node;
148
149/* List of constants for field type of node_asn */
150#define ASN1_ETYPE_INVALID 0
151#define ASN1_ETYPE_CONSTANT 1
152#define ASN1_ETYPE_IDENTIFIER 2
153#define ASN1_ETYPE_INTEGER 3
154#define ASN1_ETYPE_BOOLEAN 4
155#define ASN1_ETYPE_SEQUENCE 5
156#define ASN1_ETYPE_BIT_STRING 6
157#define ASN1_ETYPE_OCTET_STRING 7
158#define ASN1_ETYPE_TAG 8
159#define ASN1_ETYPE_DEFAULT 9
160#define ASN1_ETYPE_SIZE 10
161#define ASN1_ETYPE_SEQUENCE_OF 11
162#define ASN1_ETYPE_OBJECT_ID 12
163#define ASN1_ETYPE_ANY 13
164#define ASN1_ETYPE_SET 14
165#define ASN1_ETYPE_SET_OF 15
166#define ASN1_ETYPE_DEFINITIONS 16
167#define ASN1_ETYPE_CHOICE 18
168#define ASN1_ETYPE_IMPORTS 19
169#define ASN1_ETYPE_NULL 20
170#define ASN1_ETYPE_ENUMERATED 21
171#define ASN1_ETYPE_GENERALSTRING 27
172#define ASN1_ETYPE_NUMERIC_STRING 28
173#define ASN1_ETYPE_IA5_STRING 29
174#define ASN1_ETYPE_TELETEX_STRING 30
175#define ASN1_ETYPE_PRINTABLE_STRING 31
176#define ASN1_ETYPE_UNIVERSAL_STRING 32
177#define ASN1_ETYPE_BMP_STRING 33
178#define ASN1_ETYPE_UTF8_STRING 34
179#define ASN1_ETYPE_VISIBLE_STRING 35
180#define ASN1_ETYPE_UTC_TIME 36
181#define ASN1_ETYPE_GENERALIZED_TIME 37
182
183/* Flags used by asn1_delete_structure2() */
184
185/* makes sure the values are zeroized prior to deinitialization */
186#define ASN1_DELETE_FLAG_ZEROIZE 1
187
188/* Flags used by asn1_der_decoding2(). */
189
190/* This flag would allow arbitrary data past the DER data */
191#define ASN1_DECODE_FLAG_ALLOW_PADDING 1
192/* This flag would ensure that no BER decoding takes place */
193#define ASN1_DECODE_FLAG_STRICT_DER (1<<1)
194/* This flag will tolerate Time encoding errors when in strict DER */
195#define ASN1_DECODE_FLAG_ALLOW_INCORRECT_TIME (1<<2)
196
197
198 struct asn1_data_node_st
199 {
200 const char *name; /* Node name */
201 const void *value; /* Node value */
202 unsigned int value_len; /* Node value size */
203 unsigned int type; /* Node value type (ASN1_ETYPE_*) */
204 };
205 typedef struct asn1_data_node_st asn1_data_node_st;
206
207 /***********************************/
208 /* Fixed constants */
209 /***********************************/
210
211
212 /* maximum number of characters */
213 /* of a description message */
214 /* (null character included) */
215#define ASN1_MAX_ERROR_DESCRIPTION_SIZE 128
216
217 /***********************************/
218 /* Functions definitions */
219 /***********************************/
220
221 extern ASN1_API int
222 asn1_parser2tree (const char *file,
223 asn1_node * definitions, char *error_desc);
224
225 extern ASN1_API int
226 asn1_parser2array (const char *inputFileName,
227 const char *outputFileName,
228 const char *vectorName, char *error_desc);
229
230 extern ASN1_API int
231 asn1_array2tree (const asn1_static_node * array,
232 asn1_node * definitions, char *errorDescription);
233
234 extern ASN1_API void
235 asn1_print_structure (FILE * out, asn1_node structure,
236 const char *name, int mode);
237
238 extern ASN1_API int
239 asn1_create_element (asn1_node definitions,
240 const char *source_name, asn1_node * element);
241
242 extern ASN1_API int asn1_delete_structure (asn1_node * structure);
243
244 extern ASN1_API int asn1_delete_structure2 (asn1_node * structure, unsigned int flags);
245
246 extern ASN1_API int
247 asn1_delete_element (asn1_node structure, const char *element_name);
248
249 extern ASN1_API int
250 asn1_write_value (asn1_node node_root, const char *name,
251 const void *ivalue, int len);
252
253 extern ASN1_API int
254 asn1_read_value (asn1_node root, const char *name,
255 void *ivalue, int *len);
256
257 extern ASN1_API int
258 asn1_read_value_type (asn1_node root, const char *name,
259 void *ivalue, int *len, unsigned int *etype);
260
261 extern ASN1_API int
262 asn1_read_node_value (asn1_node node, asn1_data_node_st * data);
263
264 extern ASN1_API int
265 asn1_number_of_elements (asn1_node element, const char *name, int *num);
266
267 extern ASN1_API int
268 asn1_der_coding (asn1_node element, const char *name,
269 void *ider, int *len, char *ErrorDescription);
270
271 extern ASN1_API int
272 asn1_der_decoding2 (asn1_node *element, const void *ider,
273 int *max_ider_len, unsigned int flags,
274 char *errorDescription);
275
276 extern ASN1_API int
277 asn1_der_decoding (asn1_node * element, const void *ider,
278 int len, char *errorDescription);
279
280 /* Do not use. Use asn1_der_decoding() instead. */
281 extern ASN1_API int
282 asn1_der_decoding_element (asn1_node * structure,
283 const char *elementName,
284 const void *ider, int len,
285 char *errorDescription) _ASN1_GCC_ATTR_DEPRECATED;
286
287 extern ASN1_API int
288 asn1_der_decoding_startEnd (asn1_node element,
289 const void *ider, int len,
290 const char *name_element,
291 int *start, int *end);
292
293 extern ASN1_API int
294 asn1_expand_any_defined_by (asn1_node definitions, asn1_node * element);
295
296 extern ASN1_API int
297 asn1_expand_octet_string (asn1_node definitions,
298 asn1_node * element,
299 const char *octetName, const char *objectName);
300
301 extern ASN1_API int
302 asn1_read_tag (asn1_node root, const char *name,
303 int *tagValue, int *classValue);
304
305 extern ASN1_API const char *asn1_find_structure_from_oid (asn1_node
306 definitions,
307 const char
308 *oidValue);
309
310 extern ASN1_API const char *asn1_check_version (const char *req_version);
311
312 extern ASN1_API const char *asn1_strerror (int error);
313
314 extern ASN1_API void asn1_perror (int error);
315
316#define ASN1_MAX_TAG_SIZE 4
317#define ASN1_MAX_LENGTH_SIZE 9
318#define ASN1_MAX_TL_SIZE (ASN1_MAX_TAG_SIZE+ASN1_MAX_LENGTH_SIZE)
319 extern ASN1_API long
320 asn1_get_length_der (const unsigned char *der, int der_len, int *len);
321
322 extern ASN1_API long
323 asn1_get_length_ber (const unsigned char *ber, int ber_len, int *len);
324
325 extern ASN1_API void
326 asn1_length_der (unsigned long int len, unsigned char *der, int *der_len);
327
328 /* Other utility functions. */
329
330 extern ASN1_API
331 int asn1_decode_simple_der (unsigned int etype, const unsigned char *der,
332 unsigned int der_len,
333 const unsigned char **str,
334 unsigned int *str_len);
335
336 extern ASN1_API
337 int asn1_decode_simple_ber (unsigned int etype, const unsigned char *der,
338 unsigned int der_len,
339 unsigned char **str,
340 unsigned int *str_len,
341 unsigned int *ber_len);
342
343 extern ASN1_API int
344 asn1_encode_simple_der (unsigned int etype, const unsigned char *str,
345 unsigned int str_len, unsigned char *tl,
346 unsigned int *tl_len);
347
348 extern ASN1_API asn1_node
349 asn1_find_node (asn1_node pointer, const char *name);
350
351 extern ASN1_API int
352 asn1_copy_node (asn1_node dst, const char *dst_name,
353 asn1_node src, const char *src_name);
354 extern ASN1_API asn1_node
355 asn1_dup_node (asn1_node src, const char *src_name);
356
357 /* Internal and low-level DER utility functions. */
358
359 extern ASN1_API int
360 asn1_get_tag_der (const unsigned char *der, int der_len,
361 unsigned char *cls, int *len, unsigned long *tag);
362
363 extern ASN1_API void
364 asn1_octet_der (const unsigned char *str, int str_len,
365 unsigned char *der, int *der_len);
366
367 extern ASN1_API int
368 asn1_get_octet_der (const unsigned char *der, int der_len,
369 int *ret_len, unsigned char *str,
370 int str_size, int *str_len);
371
372 extern ASN1_API void asn1_bit_der (const unsigned char *str, int bit_len,
373 unsigned char *der, int *der_len);
374
375 extern ASN1_API int
376 asn1_get_bit_der (const unsigned char *der, int der_len,
377 int *ret_len, unsigned char *str,
378 int str_size, int *bit_len);
379
380 extern ASN1_API int
381 asn1_get_object_id_der (const unsigned char *der,
382 int der_len, int *ret_len,
383 char *str, int str_size);
384
385/* Compatibility types */
386
387 typedef int asn1_retCode; /* type returned by libtasn1 functions */
388
389#define node_asn_struct asn1_node_st
390#define node_asn asn1_node_st
391#define ASN1_TYPE asn1_node
392#define ASN1_TYPE_EMPTY NULL
393
394#define static_struct_asn asn1_static_node_st
395#define ASN1_ARRAY_TYPE asn1_static_node
396#define asn1_static_node_t asn1_static_node
397
398#define node_data_struct asn1_data_node_st
399#define ASN1_DATA_NODE asn1_data_node_st
400
401#ifdef __cplusplus
402}
403#endif
404
405#endif /* LIBTASN1_H */
406