2 * Copyright (C) 2004, 2005, 2006, 2008 Free Software Foundation
3 * Copyright (C) 2002 Fabio Fiorina
5 * This file is part of LIBTASN1.
7 * LIBTASN1 is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU Lesser General Public License as
9 * published by the Free Software Foundation; either version 2.1 of
10 * the License, or (at your option) any later version.
12 * LIBTASN1 is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with LIBTASN1; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
27 #include <stdio.h> /* for FILE* */
34 #define LIBTASN1_VERSION "1.4"
36 #include <sys/types.h>
39 #define MAX_NAME_SIZE 128 /* maximum number of characters of a name */
40 /* inside a file with ASN1 definitons */
41 #define MAX_ERROR_DESCRIPTION_SIZE 128 /* maximum number of characters */
42 /* of a description message */
43 /* (null character included) */
46 typedef int asn1_retCode
; /* type returned by libtasn1 functions */
48 /*****************************************/
49 /* Errors returned by libtasn1 functions */
50 /*****************************************/
51 #define ASN1_SUCCESS 0
52 #define ASN1_FILE_NOT_FOUND 1
53 #define ASN1_ELEMENT_NOT_FOUND 2
54 #define ASN1_IDENTIFIER_NOT_FOUND 3
55 #define ASN1_DER_ERROR 4
56 #define ASN1_VALUE_NOT_FOUND 5
57 #define ASN1_GENERIC_ERROR 6
58 #define ASN1_VALUE_NOT_VALID 7
59 #define ASN1_TAG_ERROR 8
60 #define ASN1_TAG_IMPLICIT 9
61 #define ASN1_ERROR_TYPE_ANY 10
62 #define ASN1_SYNTAX_ERROR 11
63 #define ASN1_MEM_ERROR 12
64 #define ASN1_MEM_ALLOC_ERROR 13
65 #define ASN1_DER_OVERFLOW 14
66 #define ASN1_NAME_TOO_LONG 15
67 #define ASN1_ARRAY_ERROR 16
68 #define ASN1_ELEMENT_NOT_EMPTY 17
70 /*************************************/
71 /* Constants used in asn1_visit_tree */
72 /*************************************/
73 #define ASN1_PRINT_NAME 1
74 #define ASN1_PRINT_NAME_TYPE 2
75 #define ASN1_PRINT_NAME_TYPE_VALUE 3
76 #define ASN1_PRINT_ALL 4
78 /*****************************************/
79 /* Constants returned by asn1_read_tag */
80 /*****************************************/
81 #define ASN1_CLASS_UNIVERSAL 0x00 /* old: 1 */
82 #define ASN1_CLASS_APPLICATION 0x40 /* old: 2 */
83 #define ASN1_CLASS_CONTEXT_SPECIFIC 0x80 /* old: 3 */
84 #define ASN1_CLASS_PRIVATE 0xC0 /* old: 4 */
85 #define ASN1_CLASS_STRUCTURED 0x20
87 /*****************************************/
88 /* Constants returned by asn1_read_tag */
89 /*****************************************/
90 #define ASN1_TAG_BOOLEAN 0x01
91 #define ASN1_TAG_INTEGER 0x02
92 #define ASN1_TAG_SEQUENCE 0x10
93 #define ASN1_TAG_SET 0x11
94 #define ASN1_TAG_OCTET_STRING 0x04
95 #define ASN1_TAG_BIT_STRING 0x03
96 #define ASN1_TAG_UTCTime 0x17
97 #define ASN1_TAG_GENERALIZEDTime 0x18
98 #define ASN1_TAG_OBJECT_ID 0x06
99 #define ASN1_TAG_ENUMERATED 0x0A
100 #define ASN1_TAG_NULL 0x05
101 #define ASN1_TAG_GENERALSTRING 0x1B
103 /******************************************************/
104 /* Structure definition used for the node of the tree */
105 /* that represent an ASN.1 DEFINITION. */
106 /******************************************************/
108 struct node_asn_struct
110 char *name
; /* Node name */
111 unsigned int type
; /* Node type */
112 unsigned char *value
; /* Node value */
114 struct node_asn_struct
*down
; /* Pointer to the son node */
115 struct node_asn_struct
*right
; /* Pointer to the brother node */
116 struct node_asn_struct
*left
; /* Pointer to the next list element */
119 typedef struct node_asn_struct node_asn
;
121 typedef node_asn
*ASN1_TYPE
;
123 #define ASN1_TYPE_EMPTY NULL
125 struct static_struct_asn
127 const char *name
; /* Node name */
128 unsigned int type
; /* Node type */
129 const void *value
; /* Node value */
132 typedef struct static_struct_asn ASN1_ARRAY_TYPE
;
136 /***********************************/
137 /* Functions definitions */
138 /***********************************/
140 asn1_retCode
asn1_parser2tree (const char *file_name
,
141 ASN1_TYPE
* definitions
,
142 char *errorDescription
);
144 asn1_retCode
asn1_parser2array (const char *inputFileName
,
145 const char *outputFileName
,
146 const char *vectorName
,
147 char *errorDescription
);
149 asn1_retCode
asn1_array2tree (const ASN1_ARRAY_TYPE
* array
,
150 ASN1_TYPE
* definitions
,
151 char *errorDescription
);
153 void asn1_print_structure (FILE *out
, ASN1_TYPE structure
, const char *name
,
156 asn1_retCode
asn1_create_element (ASN1_TYPE definitions
,
157 const char *source_name
,
158 ASN1_TYPE
* element
);
160 asn1_retCode
asn1_delete_structure (ASN1_TYPE
* structure
);
162 asn1_retCode
asn1_delete_element (ASN1_TYPE structure
,
163 const char *element_name
);
165 asn1_retCode
asn1_write_value (ASN1_TYPE node_root
, const char *name
,
166 const void *ivalue
, int len
);
168 asn1_retCode
asn1_read_value (ASN1_TYPE root
, const char *name
,
169 void *ivalue
, int *len
);
171 asn1_retCode
asn1_number_of_elements (ASN1_TYPE element
, const char *name
,
174 asn1_retCode
asn1_der_coding (ASN1_TYPE element
, const char *name
,
175 void *ider
, int *len
, char *ErrorDescription
);
177 asn1_retCode
asn1_der_decoding (ASN1_TYPE
* element
, const void *ider
,
178 int len
, char *errorDescription
);
180 asn1_retCode
asn1_der_decoding_element (ASN1_TYPE
* structure
,
181 const char *elementName
,
182 const void *ider
, int len
,
183 char *errorDescription
);
185 asn1_retCode
asn1_der_decoding_startEnd (ASN1_TYPE element
,
186 const void *ider
, int len
,
187 const char *name_element
,
188 int *start
, int *end
);
190 asn1_retCode
asn1_expand_any_defined_by (ASN1_TYPE definitions
,
191 ASN1_TYPE
* element
);
193 asn1_retCode
asn1_expand_octet_string (ASN1_TYPE definitions
,
195 const char *octetName
,
196 const char *objectName
);
198 asn1_retCode
asn1_read_tag (node_asn
* root
, const char *name
,
199 int *tagValue
, int *classValue
);
201 const char *asn1_find_structure_from_oid (ASN1_TYPE definitions
,
202 const char *oidValue
);
204 const char *asn1_check_version (const char *req_version
);
206 const char *libtasn1_strerror (asn1_retCode error
);
208 void libtasn1_perror (asn1_retCode error
);
210 /* DER utility functions. */
212 int asn1_get_tag_der (const unsigned char *der
, int der_len
,
213 unsigned char *cls
, int *len
, unsigned long *tag
);
215 void asn1_octet_der (const unsigned char *str
, int str_len
,
216 unsigned char *der
, int *der_len
);
218 asn1_retCode
asn1_get_octet_der (const unsigned char *der
, int der_len
,
219 int *ret_len
, unsigned char *str
,
220 int str_size
, int *str_len
);
222 void asn1_bit_der (const unsigned char *str
, int bit_len
,
223 unsigned char *der
, int *der_len
);
225 asn1_retCode
asn1_get_bit_der (const unsigned char *der
, int der_len
,
226 int *ret_len
, unsigned char *str
,
227 int str_size
, int *bit_len
);
229 signed long asn1_get_length_der (const unsigned char *der
, int der_len
,
232 void asn1_length_der (unsigned long int len
, unsigned char *ans
,
235 /* Other utility functions. */
237 ASN1_TYPE
asn1_find_node (ASN1_TYPE pointer
, const char *name
);
239 asn1_retCode
asn1_copy_node (ASN1_TYPE dst
, const char *dst_name
,
240 ASN1_TYPE src
, const char *src_name
);
246 #endif /* LIBTASN1_H */