2 * Copyright (C) 2002 Fabio Fiorina
3 * Copyright (C) 2004 Simon Josefsson
5 * This file is part of LIBTASN1.
7 * The LIBTASN1 library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but 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 this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include <stdio.h> /* for FILE* */
32 #define LIBTASN1_VERSION "0.2.11"
34 #include <sys/types.h>
37 #define MAX_NAME_SIZE 128 /* maximum number of characters of a name */
38 /* inside a file with ASN1 definitons */
39 #define MAX_ERROR_DESCRIPTION_SIZE 128 /* maximum number of characters */
40 /* of a description message */
41 /* (null character included) */
44 typedef int asn1_retCode
; /* type returned by libasn1 functions */
46 /*****************************************/
47 /* Errors returned by libasn1 functions */
48 /*****************************************/
49 #define ASN1_SUCCESS 0
50 #define ASN1_FILE_NOT_FOUND 1
51 #define ASN1_ELEMENT_NOT_FOUND 2
52 #define ASN1_IDENTIFIER_NOT_FOUND 3
53 #define ASN1_DER_ERROR 4
54 #define ASN1_VALUE_NOT_FOUND 5
55 #define ASN1_GENERIC_ERROR 6
56 #define ASN1_VALUE_NOT_VALID 7
57 #define ASN1_TAG_ERROR 8
58 #define ASN1_TAG_IMPLICIT 9
59 #define ASN1_ERROR_TYPE_ANY 10
60 #define ASN1_SYNTAX_ERROR 11
61 #define ASN1_MEM_ERROR 12
62 #define ASN1_MEM_ALLOC_ERROR 13
63 #define ASN1_DER_OVERFLOW 14
64 #define ASN1_NAME_TOO_LONG 15
65 #define ASN1_ARRAY_ERROR 16
66 #define ASN1_ELEMENT_NOT_EMPTY 17
68 /*************************************/
69 /* Constants used in asn1_visit_tree */
70 /*************************************/
71 #define ASN1_PRINT_NAME 1
72 #define ASN1_PRINT_NAME_TYPE 2
73 #define ASN1_PRINT_NAME_TYPE_VALUE 3
74 #define ASN1_PRINT_ALL 4
76 /*****************************************/
77 /* Constants returned by asn1_read_tag */
78 /*****************************************/
79 #define ASN1_CLASS_UNIVERSAL 1
80 #define ASN1_CLASS_APPLICATION 2
81 #define ASN1_CLASS_CONTEXT_SPECIFIC 3
82 #define ASN1_CLASS_PRIVATE 4
85 /*****************************************/
86 /* Constants returned by asn1_read_tag */
87 /*****************************************/
88 #define ASN1_TAG_BOOLEAN 0x01
89 #define ASN1_TAG_INTEGER 0x02
90 #define ASN1_TAG_SEQUENCE 0x10
91 #define ASN1_TAG_SET 0x11
92 #define ASN1_TAG_OCTET_STRING 0x04
93 #define ASN1_TAG_BIT_STRING 0x03
94 #define ASN1_TAG_UTCTime 0x17
95 #define ASN1_TAG_GENERALIZEDTime 0x18
96 #define ASN1_TAG_OBJECT_ID 0x06
97 #define ASN1_TAG_ENUMERATED 0x0A
98 #define ASN1_TAG_NULL 0x05
99 #define ASN1_TAG_GENERALSTRING 0x1B
102 /******************************************************/
103 /* Structure definition used for the node of the tree */
104 /* that represent an ASN.1 DEFINITION. */
105 /******************************************************/
106 typedef struct node_asn_struct
{
107 char *name
; /* Node name */
108 unsigned int type
; /* Node type */
109 unsigned char *value
; /* Node value */
110 struct node_asn_struct
*down
; /* Pointer to the son node */
111 struct node_asn_struct
*right
; /* Pointer to the brother node */
112 struct node_asn_struct
*left
; /* Pointer to the next list element */
115 typedef node_asn
* ASN1_TYPE
;
117 #define ASN1_TYPE_EMPTY NULL
119 struct static_struct_asn
{
120 char *name
; /* Node name */
121 unsigned int type
; /* Node type */
122 unsigned char *value
; /* Node value */
125 typedef struct static_struct_asn ASN1_ARRAY_TYPE
;
129 /***********************************/
130 /* Functions definitions */
131 /***********************************/
133 asn1_retCode
asn1_parser2tree(const char *file_name
,ASN1_TYPE
*definitions
,
134 char *errorDescription
);
136 asn1_retCode
asn1_parser2array(const char *inputFileName
,const char *outputFileName
,
137 const char *vectorName
,char *errorDescription
);
139 asn1_retCode
asn1_array2tree(const ASN1_ARRAY_TYPE
*array
,
140 ASN1_TYPE
*definitions
,char *errorDescription
);
142 void asn1_print_structure(FILE *out
,ASN1_TYPE structure
,const char *name
,int mode
);
144 asn1_retCode
asn1_create_element(ASN1_TYPE definitions
,const char *source_name
,
147 asn1_retCode
asn1_delete_structure(ASN1_TYPE
*structure
);
149 asn1_retCode
asn1_delete_element(ASN1_TYPE structure
,const char *element_name
);
151 asn1_retCode
asn1_write_value(ASN1_TYPE node_root
,const char *name
,
152 const void *ivalue
,int len
);
154 asn1_retCode
asn1_read_value(ASN1_TYPE root
,const char *name
,
155 void* ivalue
,int *len
);
157 asn1_retCode
asn1_number_of_elements(ASN1_TYPE element
,const char *name
,int *num
);
159 asn1_retCode
asn1_der_coding(ASN1_TYPE element
,const char *name
,
161 char *ErrorDescription
);
163 asn1_retCode
asn1_der_decoding(ASN1_TYPE
*element
,const void *ider
,int len
,
164 char *errorDescription
);
166 asn1_retCode
asn1_der_decoding_element(ASN1_TYPE
*structure
,
167 const char *elementName
,
168 const void *ider
,int len
,
169 char *errorDescription
);
171 asn1_retCode
asn1_der_decoding_startEnd(ASN1_TYPE element
,
172 const void *ider
,int len
,
173 const char *name_element
,
174 int *start
,int *end
);
176 asn1_retCode
asn1_expand_any_defined_by(ASN1_TYPE definitions
,
179 asn1_retCode
asn1_expand_octet_string(ASN1_TYPE definitions
,ASN1_TYPE
*element
,
180 const char *octetName
,const char *objectName
);
182 asn1_retCode
asn1_read_tag(node_asn
*root
,const char *name
,int *tagValue
,
185 const char* asn1_find_structure_from_oid(ASN1_TYPE definitions
,
186 const char *oidValue
);
188 const char *asn1_check_version( const char *req_version
);
190 const char* libtasn1_strerror(asn1_retCode error
);
192 void libtasn1_perror(asn1_retCode error
);
198 #endif /* LIBASN1_H */