/******************************************************************************/ /* asn1def.h */ /* */ /* Definition of ASN.1 data types. */ /* Abstract Syntax Notation One data types */ /* */ /* Copyright: Talura 2002, All rights reserved */ /* */ /******************************************************************************/ /* prevent multiple definition */ #ifndef _ASN1DEF_H #define _ASN1DEF_H /* Requires ISO/IEC 9899:1999 (E) */ #ifndef __STDC_VERSION__ #error "__STDC_VERSION__ not defined" #else /* Version defined, but is it ISO/IEC 9899:1999 */ #if __STDC_VERSION__ < 199901L #error "__STDC_VERSION__ is before ISO/IEC 9899:1999" #endif #endif /* standard header files */ #include #include #include #include #include #include #include /* proprietary header files */ /* (none) */ /* constant definitions */ /* Universal class tag assignments, see X.680 (1997 E) clause 8.2: Table 1, 36.1: Table 3, 39.2, 41.3, 42.3 */ #define BOOLEAN_TYPE_TAG (1) #define INTEGER_TYPE_TAG (2) #define BIT_STRING_TYPE_TAG (3) #define OCTET_STRING_TYPE_TAG (4) #define NULL_TYPE_TAG (5) #define OBJECT_IDENTIFIER_TYPE_TAG (6) #define OBJECT_DESCRIPTOR_TYPE_TAG (7) #define EXTERNAL_TYPE_TAG (8) #define INSTANCE_OF_TYPE_TAG (8) #define REAL_TYPE_TAG (9) #define ENUMERATED_TYPE_TAG (10) #define EMBEDDED_PDV_TYPE_TAG (11) #define UTF8_STRING_TYPE_TAG (12) #define RELATIVE_OID_TYPE_TAG (13) #define SEQUENCE_TYPE_TAG (16) #define SEQUENCE_OF_TYPE_TAG (16) #define SET_TYPE_TAG (17) #define SET_OF_TYPE_TAG (17) #define NUMERIC_STRING_TYPE_TAG (18) #define PRINTABLE_STRING_TYPE_TAG (19) #define TELETEX_STRING_TYPE_TAG (20) #define T61_STRING_TYPE_TAG (20) #define VIDEOTEX_STRING_TYPE_TAG (21) #define IA5_STRING_TYPE_TAG (22) #define GRAPHIC_STRING_TYPE_TAG (25) #define VISIBLE_STRING_TYPE_TAG (26) #define ISO646_STRING_TYPE_TAG (26) #define GENERAL_STRING_TYPE_TAG (27) #define UNIVERSAL_STRING_TYPE_TAG (28) #define CHARACTER_STRING_TYPE_TAG (29) #define BMP_STRING_TYPE_TAG (30) #define GENERALIZED_TIME_TYPE_TAG (24) #define UTC_TIME_TYPE_TAG (23) /* Other constants */ #ifndef INFINITY #define INFINITY (1.0/0.0) #endif #define ASN1_PLUS_INFINITY (INFINITY) #define ASN1_MINUS_INFINITY (-INFINITY) /* macro definitions */ #define Instances(set) (* (size_t*)(void*)(set)) #define Alternative(choicevalue) ((choicevalue).ChoiceValue.id) /* typedef */ typedef unsigned char ASN1_Octet_t; /* enumerator definitions */ /* (none) */ /* structure definitions */ typedef struct { int protocol; int reference; char * NonParameterizedTypeName; } ASN1_Type_t; typedef ASN1_Type_t ASN1_ValueSet_t; /* ASN.1 builtin-types */ typedef struct ASN1_BitString_o ASN1_BitString_t; struct ASN1_BitString_o { unsigned char * value; size_t length; /* In bits */ ASN1_BitString_t * segment; }; typedef _Bool ASN1_Boolean_t; typedef struct ASN1_CharacterString_o ASN1_CharacterString_t; struct ASN1_CharacterString_o { unsigned char * value; size_t characters; ASN1_CharacterString_t * segment; }; typedef struct ASN1_Choice_o ASN1_Choice_t; struct ASN1_Choice_o { void * ref; /* [ISO-C 6.2.5-26 and ISO-C 6.3.2.3 1)& 6)] */ size_t id; }; typedef struct ASN1_EmbeddedPDV_o ASN1_EmbeddedPDV_t; typedef int ASN1_Enumerated_t; typedef struct ASN1_External_o ASN1_External_t; typedef struct ASN1_InstanceOf_o ASN1_InstanceOf_t; /* Definition of ASN1_Integer_t */ #ifdef INT64_MAX /* int64_t */ typedef int64_t ASN1_Integer_t; #define ASN1_INTEGER_MAX INT64_MAX #define ASN1_INTEGER_MIN INT64_MIN #define ASN1_INTEGER_C(c) INT64_C(c) #elif defined INT32_MAX /* int32_t */ typedef int32_t ASN1_Integer_t; #define ASN1_INTEGER_MAX INT32_MAX #define ASN1_INTEGER_MIN INT32_MIN #define ASN1_INTEGER_C(c) INT32_C(c) #elif defined INT16_MAX /* int16_t */ typedef int16_t ASN1_Integer_t; #define ASN1_INTEGER_MAX INT16_MAX #define ASN1_INTEGER_MIN INT16_MIN #define ASN1_INTEGER_C(c) INT16_C(c) #else #error "No exact-width integer types seems to be specified" #endif typedef void * ASN1_Null_t; struct ASN1_Null_o { unsigned char * value; }; typedef struct ASN1_ObjectClassField_o ASN1_ObjectClassField_t; struct ASN1_ObjectClassField_o { void * start; size_t length; ASN1_Type_t typereference; void * value; }; typedef struct ASN1_ObjectIdentifier_o ASN1_ObjectIdentifier_t; struct ASN1_ObjectIdentifier_o { unsigned int * ObjIdComponentsList; size_t NumberOfObjIdComponents; unsigned int regno; }; struct ASN1_InstanceOf_o { ASN1_ObjectIdentifier_t type_id; ASN1_ObjectClassField_t value; }; typedef struct ASN1_OctetString_o ASN1_OctetString_t; struct ASN1_OctetString_o { ASN1_Octet_t * value; size_t length; /* if value == NULL, length is accumulated length of sub-segments, */ /* if value != NULL, length is octets in segment starting at value */ ASN1_OctetString_t * segment; /* next segment, NULL if no more segments */ }; #ifdef __WIN32__ typedef long double double_t; #endif typedef double_t ASN1_Real_t; #if (FLT_EVAL_METHOD < 2) #define ASN1_REAL_C(c) ((ASN1_Real_t)c) #elif (FLT_EVAL_METHOD == 2) #define ASN1_REAL_C(c) ((ASN1_Real_t)c ## L) #else #error "FLT_EVAL_METHOD not supported" #endif typedef struct ASN1_RelativeOID_o ASN1_RelativeOID_t; struct ASN1_RelativeOID_o { unsigned int * RelativeOIDComponentsList; size_t NumberOfRelativeOIDComponents; unsigned int regno; }; /* RestrictedCharacterString */ typedef uint16_t ASN1_BMP_t; typedef struct ASN1_BMPString_o ASN1_BMPString_t; struct ASN1_BMPString_o { ASN1_BMP_t * value; size_t characters; ASN1_BMPString_t * segment; }; typedef struct ASN1_GeneralString_o ASN1_GeneralString_t; struct ASN1_GeneralString_o { char * value; size_t characters; ASN1_GeneralString_t * segment; }; typedef struct ASN1_GraphicString_o ASN1_GraphicString_t; struct ASN1_GraphicString_o { char * value; size_t characters; ASN1_GraphicString_t * segment; }; typedef char ASN1_Tuple_t; typedef struct ASN1_IA5String_o ASN1_IA5String_t; struct ASN1_IA5String_o { ASN1_Tuple_t * value; size_t characters; ASN1_IA5String_t * segment; }; typedef struct ASN1_ISO646String_o ASN1_ISO646String_t; struct ASN1_ISO646String_o { char * value; size_t characters; ASN1_ISO646String_t * segment; }; typedef struct ASN1_NumericString_o ASN1_NumericString_t; struct ASN1_NumericString_o { char * value; size_t characters; ASN1_NumericString_t * segment; }; typedef struct ASN1_PrintableString_o ASN1_PrintableString_t; struct ASN1_PrintableString_o { char * value; size_t characters; ASN1_PrintableString_t * segment; }; typedef struct ASN1_TeletexString_o ASN1_TeletexString_t; struct ASN1_TeletexString_o { char * value; size_t characters; ASN1_TeletexString_t * segment; }; typedef struct ASN1_T61String_o ASN1_T61String_t; struct ASN1_T61String_o { char * value; size_t characters; ASN1_T61String_t * segment; }; /* Check that wchar_t is according to ISO-10646 [ISO/IEC 9899:1999 (E) chapter 6.10.8] */ #ifndef __STDC_ISO_10646__ #ifdef __WIN32__ #warning "Stringtypes using ISO-10646 may not be supported correctly." #else #error "values of wchar_t must be the coded representation of the characters defined by ISO/IEC 10646" #endif #endif typedef wchar_t ASN1_Quadruple_t; typedef struct ASN1_UniversalString_o ASN1_UniversalString_t; struct ASN1_UniversalString_o { ASN1_Quadruple_t * value; size_t characters; ASN1_UniversalString_t * segment; }; typedef struct ASN1_UTF8String_o ASN1_UTF8String_t; struct ASN1_UTF8String_o { char * value; size_t octets; ASN1_UTF8String_t * segment; }; typedef struct ASN1_VideotexString_o ASN1_VideotexString_t; struct ASN1_VideotexString_o { char * value; size_t characters; ASN1_VideotexString_t * segment; }; typedef struct ASN1_VisibleString_o ASN1_VisibleString_t; struct ASN1_VisibleString_o { char * value; size_t characters; ASN1_VisibleString_t * segment; }; /* UsefulType */ typedef ASN1_VisibleString_t ASN1_GeneralizedTime_t; typedef ASN1_VisibleString_t ASN1_UTCTime_t; typedef ASN1_GraphicString_t ASN1_ObjectDescriptor_t; /* Unrestricted CharacterString */ typedef struct ASN1_UnrestrictedCharacterString_o ASN1_UnrestrictedCharacterString_t; struct ASN1_UnrestrictedCharacterString_o { union { ASN1_Choice_t ChoiceValue; /* 1 */ struct ASN1_UnrestrictedCharacterString__syntaxes_o { ASN1_ObjectIdentifier_t abstract; ASN1_ObjectIdentifier_t transfer; } * syntaxes; /* 2 */ ASN1_ObjectIdentifier_t * syntax; /* 3 */ ASN1_Integer_t * presentation_context_id; /* 4 */ struct ASN1_UnrestrictedCharacterString__context_negotiation_o { ASN1_Integer_t presentation_context_id; ASN1_ObjectIdentifier_t transfer_syntax; } * context_negotiation; /* 5 */ ASN1_ObjectIdentifier_t * transfer_syntax; /* 6 */ ASN1_Null_t * fixed; } identification; ASN1_ObjectDescriptor_t * data_value_descriptor; ASN1_OctetString_t string_value; }; /* EmbeddedPDV */ struct ASN1_EmbeddedPDV_o { union { ASN1_Choice_t ChoiceValue; /* 1 */ struct ASN1_EmbeddedPDV__syntaxes_o { ASN1_ObjectIdentifier_t abstract; ASN1_ObjectIdentifier_t transfer; } * syntaxes; /* 2 */ ASN1_ObjectIdentifier_t * syntax; /* 3 */ ASN1_Integer_t * presentation_context_id; /* 4 */ struct ASN1_EmbeddedPDV__context_negotiation_o { ASN1_Integer_t presentation_context_id; ASN1_ObjectIdentifier_t transfer_syntax; } * context_negotiation; /* 5 */ ASN1_ObjectIdentifier_t * transfer_syntax; /* 6 */ ASN1_Null_t * fixed; } identification; ASN1_ObjectDescriptor_t * data_value_descriptor; ASN1_OctetString_t data_value; }; /* External */ struct ASN1_External_o { union { ASN1_Choice_t ChoiceValue; /* 1 */ struct ASN1_External__syntaxes_o { ASN1_ObjectIdentifier_t abstract; ASN1_ObjectIdentifier_t transfer; } * syntaxes; /* 2 */ ASN1_ObjectIdentifier_t * syntax; /* 3 */ ASN1_Integer_t * presentation_context_id; /* 4 */ struct ASN1_External__context_negotiation_o { ASN1_Integer_t presentation_context_id; ASN1_ObjectIdentifier_t transfer_syntax; } * context_negotiation; /* 5 */ ASN1_ObjectIdentifier_t * transfer_syntax; /* 6 */ ASN1_Null_t * fixed; } identification; ASN1_ObjectDescriptor_t * data_value_descriptor; ASN1_OctetString_t data_value; }; typedef struct { uint32_t Identifier; unsigned char * start; size_t length; } ASN1_ExtensionAddition_t; typedef struct { ASN1_ObjectIdentifier_t id; ASN1_Type_t Type; } ASN1_TYPE_IDENTIFIER__t; typedef struct { ASN1_ObjectIdentifier_t id; ASN1_Type_t Type; ASN1_BitString_t property; } ASN1_ABSTRACT_SYNTAX__t; /* BuiltinTypes */ extern ASN1_Type_t ASN1_BooleanType; extern ASN1_Type_t ASN1_IntegerType; extern ASN1_Type_t ASN1_BitStringType; extern ASN1_Type_t ASN1_OctetStringType; extern ASN1_Type_t ASN1_NullType; extern ASN1_Type_t ASN1_ObjectIdentifierType; extern ASN1_Type_t ASN1_ObjectDescriptorType; extern ASN1_Type_t ASN1_ExternalType; extern ASN1_Type_t ASN1_InstanceOfType; extern ASN1_Type_t ASN1_RealType; extern ASN1_Type_t ASN1_EnumeratedType; extern ASN1_Type_t ASN1_EmbeddedPDVType; extern ASN1_Type_t ASN1_UTF8StringType; extern ASN1_Type_t ASN1_RelativeOIDType; extern ASN1_Type_t ASN1_NumericStringType; extern ASN1_Type_t ASN1_PrintableStringType; extern ASN1_Type_t ASN1_TeletexStringType; extern ASN1_Type_t ASN1_T61StringType; extern ASN1_Type_t ASN1_VideotexStringType; extern ASN1_Type_t ASN1_IA5StringType; extern ASN1_Type_t ASN1_GraphicStringType; extern ASN1_Type_t ASN1_VisibleStringType; extern ASN1_Type_t ASN1_ISO646StringType; extern ASN1_Type_t ASN1_GeneralStringType; extern ASN1_Type_t ASN1_UniversalStringType; extern ASN1_Type_t ASN1_CharacterStringType; extern ASN1_Type_t ASN1_BMPStringType; extern ASN1_Type_t ASN1_GeneralizedTimeType; extern ASN1_Type_t ASN1_UTCTimeType; #endif /* _ASN1DEF_H */