2 * Copyright (C) 2004, 2005, 2006 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* */
33 #define LIBTASN1_VERSION "0.2.18"
35 #include <sys/types.h>
38 #define MAX_NAME_SIZE 128 /* maximum number of characters of a name */
39 /* inside a file with ASN1 definitons */
40 #define MAX_ERROR_DESCRIPTION_SIZE 128 /* maximum number of characters */
41 /* of a description message */
42 /* (null character included) */
45 typedef int asn1_retCode; /* type returned by libtasn1 functions */
47 /*****************************************/
48 /* Errors returned by libtasn1 functions */
49 /*****************************************/
50 #define ASN1_SUCCESS 0
51 #define ASN1_FILE_NOT_FOUND 1
52 #define ASN1_ELEMENT_NOT_FOUND 2
53 #define ASN1_IDENTIFIER_NOT_FOUND 3
54 #define ASN1_DER_ERROR 4
55 #define ASN1_VALUE_NOT_FOUND 5
56 #define ASN1_GENERIC_ERROR 6
57 #define ASN1_VALUE_NOT_VALID 7
58 #define ASN1_TAG_ERROR 8
59 #define ASN1_TAG_IMPLICIT 9
60 #define ASN1_ERROR_TYPE_ANY 10
61 #define ASN1_SYNTAX_ERROR 11
62 #define ASN1_MEM_ERROR 12
63 #define ASN1_MEM_ALLOC_ERROR 13
64 #define ASN1_DER_OVERFLOW 14
65 #define ASN1_NAME_TOO_LONG 15
66 #define ASN1_ARRAY_ERROR 16
67 #define ASN1_ELEMENT_NOT_EMPTY 17
69 /*************************************/
70 /* Constants used in asn1_visit_tree */
71 /*************************************/
72 #define ASN1_PRINT_NAME 1
73 #define ASN1_PRINT_NAME_TYPE 2
74 #define ASN1_PRINT_NAME_TYPE_VALUE 3
75 #define ASN1_PRINT_ALL 4
77 /*****************************************/
78 /* Constants returned by asn1_read_tag */
79 /*****************************************/
80 #define ASN1_CLASS_UNIVERSAL 1
81 #define ASN1_CLASS_APPLICATION 2
82 #define ASN1_CLASS_CONTEXT_SPECIFIC 3
83 #define ASN1_CLASS_PRIVATE 4
86 /*****************************************/
87 /* Constants returned by asn1_read_tag */
88 /*****************************************/
89 #define ASN1_TAG_BOOLEAN 0x01
90 #define ASN1_TAG_INTEGER 0x02
91 #define ASN1_TAG_SEQUENCE 0x10
92 #define ASN1_TAG_SET 0x11
93 #define ASN1_TAG_OCTET_STRING 0x04
94 #define ASN1_TAG_BIT_STRING 0x03
95 #define ASN1_TAG_UTCTime 0x17
96 #define ASN1_TAG_GENERALIZEDTime 0x18
97 #define ASN1_TAG_OBJECT_ID 0x06
98 #define ASN1_TAG_ENUMERATED 0x0A
99 #define ASN1_TAG_NULL 0x05
100 #define ASN1_TAG_GENERALSTRING 0x1B
103 /******************************************************/
104 /* Structure definition used for the node of the tree */
105 /* that represent an ASN.1 DEFINITION. */
106 /******************************************************/
107 typedef struct node_asn_struct{
108 char *name; /* Node name */
109 unsigned int type; /* Node type */
110 unsigned char *value; /* Node value */
112 struct node_asn_struct *down; /* Pointer to the son node */
113 struct node_asn_struct *right; /* Pointer to the brother node */
114 struct node_asn_struct *left; /* Pointer to the next list element */
117 typedef node_asn* ASN1_TYPE;
119 #define ASN1_TYPE_EMPTY NULL
121 struct static_struct_asn{
122 char *name; /* Node name */
123 unsigned int type; /* Node type */
124 unsigned char *value; /* Node value */
127 typedef struct static_struct_asn ASN1_ARRAY_TYPE;
131 /***********************************/
132 /* Functions definitions */
133 /***********************************/
135 asn1_retCode asn1_parser2tree(const char *file_name,ASN1_TYPE *definitions,
136 char *errorDescription);
138 asn1_retCode asn1_parser2array(const char *inputFileName,const char *outputFileName,
139 const char *vectorName,char *errorDescription);
141 asn1_retCode asn1_array2tree(const ASN1_ARRAY_TYPE *array,
142 ASN1_TYPE *definitions,char *errorDescription);
144 void asn1_print_structure(FILE *out,ASN1_TYPE structure,const char *name,int mode);
146 asn1_retCode asn1_create_element(ASN1_TYPE definitions,const char *source_name,
149 asn1_retCode asn1_delete_structure(ASN1_TYPE *structure);
151 asn1_retCode asn1_delete_element(ASN1_TYPE structure,const char *element_name);
153 asn1_retCode asn1_write_value(ASN1_TYPE node_root,const char *name,
154 const void *ivalue,int len);
156 asn1_retCode asn1_read_value(ASN1_TYPE root,const char *name,
157 void* ivalue,int *len);
159 asn1_retCode asn1_number_of_elements(ASN1_TYPE element,const char *name,int *num);
161 asn1_retCode asn1_der_coding(ASN1_TYPE element,const char *name,
163 char *ErrorDescription);
165 asn1_retCode asn1_der_decoding(ASN1_TYPE *element,const void *ider,int len,
166 char *errorDescription);
168 asn1_retCode asn1_der_decoding_element(ASN1_TYPE *structure,
169 const char *elementName,
170 const void *ider,int len,
171 char *errorDescription);
173 asn1_retCode asn1_der_decoding_startEnd(ASN1_TYPE element,
174 const void *ider,int len,
175 const char *name_element,
176 int *start,int *end);
178 asn1_retCode asn1_expand_any_defined_by(ASN1_TYPE definitions,
181 asn1_retCode asn1_expand_octet_string(ASN1_TYPE definitions,ASN1_TYPE *element,
182 const char *octetName,const char *objectName);
184 asn1_retCode asn1_read_tag(node_asn *root,const char *name,int *tagValue,
187 const char* asn1_find_structure_from_oid(ASN1_TYPE definitions,
188 const char *oidValue);
190 const char *asn1_check_version( const char *req_version );
192 const char* libtasn1_strerror(asn1_retCode error);
194 void libtasn1_perror(asn1_retCode error);
200 #endif /* LIBTASN1_H */