#ifndef LIBASN1_H
# define LIBASN1_H
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
#define LIBTASN1_VERSION "0.2.10"
#include <sys/types.h>
#include <time.h>
#define MAX_NAME_SIZE 128
#define MAX_ERROR_DESCRIPTION_SIZE 128
typedef int asn1_retCode;
#define ASN1_SUCCESS 0
#define ASN1_FILE_NOT_FOUND 1
#define ASN1_ELEMENT_NOT_FOUND 2
#define ASN1_IDENTIFIER_NOT_FOUND 3
#define ASN1_DER_ERROR 4
#define ASN1_VALUE_NOT_FOUND 5
#define ASN1_GENERIC_ERROR 6
#define ASN1_VALUE_NOT_VALID 7
#define ASN1_TAG_ERROR 8
#define ASN1_TAG_IMPLICIT 9
#define ASN1_ERROR_TYPE_ANY 10
#define ASN1_SYNTAX_ERROR 11
#define ASN1_MEM_ERROR 12
#define ASN1_MEM_ALLOC_ERROR 13
#define ASN1_DER_OVERFLOW 14
#define ASN1_NAME_TOO_LONG 15
#define ASN1_ARRAY_ERROR 16
#define ASN1_ELEMENT_NOT_EMPTY 17
#define ASN1_PRINT_NAME 1
#define ASN1_PRINT_NAME_TYPE 2
#define ASN1_PRINT_NAME_TYPE_VALUE 3
#define ASN1_PRINT_ALL 4
#define ASN1_CLASS_UNIVERSAL 1
#define ASN1_CLASS_APPLICATION 2
#define ASN1_CLASS_CONTEXT_SPECIFIC 3
#define ASN1_CLASS_PRIVATE 4
#define ASN1_TAG_BOOLEAN 0x01
#define ASN1_TAG_INTEGER 0x02
#define ASN1_TAG_SEQUENCE 0x10
#define ASN1_TAG_SET 0x11
#define ASN1_TAG_OCTET_STRING 0x04
#define ASN1_TAG_BIT_STRING 0x03
#define ASN1_TAG_UTCTime 0x17
#define ASN1_TAG_GENERALIZEDTime 0x18
#define ASN1_TAG_OBJECT_ID 0x06
#define ASN1_TAG_ENUMERATED 0x0A
#define ASN1_TAG_NULL 0x05
#define ASN1_TAG_GENERALSTRING 0x1B
typedef struct node_asn_struct{
char *name;
unsigned int type;
unsigned char *value;
int value_len;
struct node_asn_struct *down;
struct node_asn_struct *right;
struct node_asn_struct *left;
} node_asn;
typedef node_asn* ASN1_TYPE;
#define ASN1_TYPE_EMPTY NULL
struct static_struct_asn{
char *name;
unsigned int type;
unsigned char *value;
};
typedef struct static_struct_asn ASN1_ARRAY_TYPE;
asn1_retCode asn1_parser2tree(const char *file_name,ASN1_TYPE *definitions,
char *errorDescription);
asn1_retCode asn1_parser2array(const char *inputFileName,const char *outputFileName,
const char *vectorName,char *errorDescription);
asn1_retCode asn1_array2tree(const ASN1_ARRAY_TYPE *array,
ASN1_TYPE *definitions,char *errorDescription);
void asn1_print_structure(FILE *out,ASN1_TYPE structure,const char *name,int mode);
asn1_retCode asn1_create_element(ASN1_TYPE definitions,const char *source_name,
ASN1_TYPE *element);
asn1_retCode asn1_delete_structure(ASN1_TYPE *structure);
asn1_retCode asn1_delete_element(ASN1_TYPE structure,const char *element_name);
asn1_retCode asn1_write_value(ASN1_TYPE element,const char *name,
const void *value,int len);
asn1_retCode asn1_read_value(ASN1_TYPE element,const char *name,void *value,
int *len);
asn1_retCode asn1_number_of_elements(ASN1_TYPE element,const char *name,int *num);
asn1_retCode asn1_der_coding(ASN1_TYPE element,const char *name,
void *der,int *len,char *ErrorDescription);
asn1_retCode asn1_der_decoding(ASN1_TYPE *element,const void *der,int len,
char *errorDescription);
asn1_retCode asn1_der_decoding_element(ASN1_TYPE *structure,const char *elementName,
const void *der,int len,char *errorDescription);
asn1_retCode asn1_der_decoding_startEnd(ASN1_TYPE element,const void *der,
int len,const char *name,int *start, int *end);
asn1_retCode asn1_expand_any_defined_by(ASN1_TYPE definitions,
ASN1_TYPE *element);
asn1_retCode asn1_expand_octet_string(ASN1_TYPE definitions,ASN1_TYPE *element,
const char *octetName,const char *objectName);
asn1_retCode asn1_read_tag(node_asn *root,const char *name,int *tagValue,
int *classValue);
const char* asn1_find_structure_from_oid(ASN1_TYPE definitions,
const char *oidValue);
const char *asn1_check_version( const char *req_version );
const char* libtasn1_strerror(asn1_retCode error);
void libtasn1_perror(asn1_retCode error);
#ifdef __cplusplus
}
#endif
#endif