1 /* 2 * A collection of data members of unspecified types. 3 */ 4 #ifndef ASN1_PARSER_EXPR_H 5 #define ASN1_PARSER_EXPR_H 6 7 /* 8 * Meta type of the ASN expression. 9 */ 10 typedef enum asn1p_expr_meta { 11 AMT_INVALID, 12 AMT_TYPE, /* Type1 ::= INTEGER */ 13 AMT_TYPEREF, /* Type2 ::= Type1 */ 14 AMT_VALUE, /* value1 Type1 ::= 1 */ 15 AMT_VALUESET, /* ValueSet Type1 ::= { value1 } */ 16 AMT_OBJECT, /* object CLASS ::= {...} */ 17 AMT_OBJECTCLASS, /* FUNCTION ::= CLASS {...} */ 18 AMT_OBJECTFIELD, /* ... */ 19 AMT_EXPR_META_MAX 20 } asn1p_expr_meta_e; 21 22 /* 23 * ASN type of the expression. 24 */ 25 typedef enum asn1p_expr_type { 26 /* 27 * Internal types. 28 */ 29 A1TC_INVALID, /* Invalid type */ 30 A1TC_REFERENCE, /* Reference to the type defined elsewhere */ 31 A1TC_EXPORTVAR, /* We're exporting this definition */ 32 A1TC_UNIVERVAL, /* A value of an ENUMERATED, INTEGER or BS */ 33 A1TC_BITVECTOR, /* A plain collection of bits */ 34 A1TC_OPAQUE, /* Opaque data encoded as a bitvector */ 35 A1TC_EXTENSIBLE, /* An extension marker "..." */ 36 A1TC_COMPONENTS_OF, /* COMPONENTS OF clause */ 37 A1TC_VALUESET, /* Value set definition */ 38 A1TC_CLASSDEF, /* Information Object Class */ 39 A1TC_INSTANCE, /* Instance of Object Class */ 40 41 /* 42 * ASN.1 Class field types 43 */ 44 #define ASN_CLASSFIELD_MASK 0x10 /* Every class field type */ 45 A1TC_CLASSFIELD_TFS = ASN_CLASSFIELD_MASK, /* TypeFieldSpec */ 46 A1TC_CLASSFIELD_FTVFS, /* FixedTypeValueFieldSpec */ 47 A1TC_CLASSFIELD_VTVFS, /* VariableTypeValueFieldSpec */ 48 A1TC_CLASSFIELD_FTVSFS, /* FixedTypeValueSetFieldSpec */ 49 A1TC_CLASSFIELD_VTVSFS, /* VariableTypeValueSetFieldSpec */ 50 A1TC_CLASSFIELD_OFS, /* ObjectFieldSpec */ 51 A1TC_CLASSFIELD_OSFS, /* ObjectSetFieldSpec */ 52 53 /* 54 * ASN.1 Constructed types 55 */ 56 #define ASN_CONSTR_MASK 0x20 /* Every constructed type */ 57 ASN_CONSTR_SEQUENCE = ASN_CONSTR_MASK, /* SEQUENCE */ 58 ASN_CONSTR_CHOICE, /* CHOICE */ 59 ASN_CONSTR_SET, /* SET */ 60 ASN_CONSTR_SEQUENCE_OF, /* SEQUENCE OF */ 61 ASN_CONSTR_SET_OF, /* SET OF */ 62 63 /* 64 * ASN.1 Basic types 65 */ 66 #define ASN_BASIC_MASK 0x40 /* Every basic type */ 67 ASN_TYPE_ANY = ASN_BASIC_MASK, /* ANY (deprecated) */ 68 ASN_BASIC_BOOLEAN, 69 ASN_BASIC_NULL, 70 ASN_BASIC_INTEGER, 71 ASN_BASIC_REAL, 72 ASN_BASIC_ENUMERATED, 73 ASN_BASIC_BIT_STRING, 74 ASN_BASIC_OCTET_STRING, 75 ASN_BASIC_OBJECT_IDENTIFIER, 76 ASN_BASIC_RELATIVE_OID, 77 ASN_BASIC_EXTERNAL, 78 ASN_BASIC_EMBEDDED_PDV, 79 ASN_BASIC_CHARACTER_STRING, 80 ASN_BASIC_UTCTime, 81 ASN_BASIC_GeneralizedTime, 82 83 /* 84 * ASN.1 String types 85 */ 86 #define ASN_STRING_KM_MASK 0x100 /* Known multiplier */ 87 #define ASN_STRING_NKM_MASK 0x200 /* Not a known multiplier */ 88 #define ASN_STRING_MASK 0x300 /* Every restricted string type */ 89 ASN_STRING_IA5String = ASN_STRING_KM_MASK, 90 ASN_STRING_PrintableString, 91 ASN_STRING_VisibleString, 92 ASN_STRING_ISO646String, /* aka VisibleString */ 93 ASN_STRING_NumericString, 94 ASN_STRING_UniversalString, 95 ASN_STRING_BMPString, 96 ASN_STRING_UTF8String = ASN_STRING_NKM_MASK, 97 ASN_STRING_GeneralString, 98 ASN_STRING_GraphicString, 99 ASN_STRING_TeletexString, 100 ASN_STRING_T61String, 101 ASN_STRING_VideotexString, 102 ASN_STRING_ObjectDescriptor, 103 ASN_EXPR_TYPE_MAX 104 } asn1p_expr_type_e; 105 106 #include "asn1p_expr_str.h" 107 #include "asn1p_expr2uclass.h" 108 109 struct asn1p_module_s; /* Forward declaration */ 110 111 /* 112 * A named collection of types. 113 */ 114 typedef struct asn1p_expr_s { 115 116 /* 117 * Human readable name. 118 */ 119 char *Identifier; 120 121 /* 122 * Meta type of the expression (type, value, value set, etc). 123 */ 124 asn1p_expr_meta_e meta_type; 125 126 /* 127 * ASN type of the expression. 128 */ 129 asn1p_expr_type_e expr_type; 130 131 /* 132 * Referenced type, defined elsewhere. 133 * (If expr_type == A1TC_REFERENCE) 134 */ 135 asn1p_ref_t *reference; 136 137 /* 138 * Constraints for the type. 139 */ 140 asn1p_constraint_t *constraints; 141 142 /* 143 * This field is holding the transformed constraints, with all the 144 * parent constraints taken into account. 145 */ 146 asn1p_constraint_t *combined_constraints; 147 148 /* 149 * Left hand side parameters for parametrized type declaration 150 * Type{Param1, Param2} ::= SEQUENCE { a Param1, b Param2 } 151 */ 152 asn1p_paramlist_t *lhs_params; 153 /* 154 * Right hand type specialization. 155 * Type2 ::= Type{Param1} 156 */ 157 struct asn1p_expr_s *rhs_pspecs; /* ->members */ 158 /* 159 * If lhs_params is defined, this structure represents all possible 160 * specializations of the parent expression. 161 */ 162 struct { 163 struct asn1p_pspec_s { 164 struct asn1p_expr_s *rhs_pspecs; 165 struct asn1p_expr_s *my_clone; 166 } *pspec; 167 int pspecs_count; /* Number of specializations */ 168 } specializations; 169 int spec_index; /* -1, or 0-based specialization index in the parent */ 170 171 /* 172 * The actual value (DefinedValue or inlined value). 173 */ 174 asn1p_value_t *value; 175 176 /* 177 * The WITH SYNTAX clause. 178 */ 179 asn1p_wsyntx_t *with_syntax; 180 181 /* Information Object Class matrix, specific for this class */ 182 struct asn1p_ioc_matrix_s { 183 asn1p_ioc_row_t **row; 184 int rows; 185 int max_identifier_length; 186 } object_class_matrix; 187 188 /* 189 * A tag. 190 */ 191 struct asn1p_type_tag_s { 192 enum { 193 TC_NOCLASS, 194 TC_UNIVERSAL, 195 TC_APPLICATION, 196 TC_CONTEXT_SPECIFIC, 197 TC_PRIVATE, 198 } tag_class; 199 enum { 200 TM_DEFAULT, 201 TM_IMPLICIT, 202 TM_EXPLICIT, 203 } tag_mode; 204 asn1c_integer_t tag_value; 205 } tag; 206 207 struct asn1p_expr_marker_s { 208 enum asn1p_expr_marker_e { 209 EM_NOMARK, 210 EM_INDIRECT = 0x01, /* 00001 Represent as pointer */ 211 EM_OMITABLE = 0x02, /* 00010 May be absent in encoding */ 212 EM_OPTIONAL = 0x07, /* 00111 Optional member */ 213 EM_DEFAULT = 0x0F, /* 01111 default_value */ 214 EM_UNRECURSE = 0x10, /* 10000 Use safe naming */ 215 } flags; 216 asn1p_value_t *default_value; /* For EM_DEFAULT case */ 217 } marker; 218 int unique; /* UNIQUE */ 219 220 /* 221 * Whether automatic tagging may be applied for subtypes. 222 */ 223 int auto_tags_OK; 224 225 /* 226 * Members of the constructed type. 227 */ 228 TQ_HEAD(struct asn1p_expr_s) members; 229 230 /* 231 * Next expression in the list. 232 */ 233 TQ_ENTRY(struct asn1p_expr_s) next; 234 235 struct asn1p_expr_s *parent_expr; /* optional */ 236 237 struct asn1p_module_s *module; /* Defined in module */ 238 239 /* 240 * Line number where this structure is defined in the original 241 * grammar source. 242 */ 243 int _lineno; 244 245 /* 246 * Marks are used for various purposes. 247 * Here are some predefined ones. 248 */ 249 enum { 250 TM_NOMARK = 0, 251 TM_RECURSION = (1<<0), /* Used to break recursion */ 252 TM_BROKEN = (1<<1), /* A warning was already issued */ 253 TM_PERFROMCT = (1<<2), /* PER FROM() constraint tables emitted */ 254 } _mark; 255 256 /* 257 * Some tags used by the compiler. 258 */ 259 int _anonymous_type; /* This type is unnamed */ 260 int _type_unique_index; /* A per top-level-type unique index */ 261 int _type_referenced; /* This type is referenced from another place */ 262 263 /* 264 * Opaque data may be attached to this structure, 265 * probably by compiler. 266 */ 267 void *data; 268 void (*data_free)(void *data); 269 } asn1p_expr_t; 270 271 272 /* 273 * Constructor and destructor. 274 */ 275 asn1p_expr_t *asn1p_expr_new(int _lineno, struct asn1p_module_s *); 276 asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *, int skip_extensions); 277 asn1p_expr_t *asn1p_expr_clone_with_resolver(asn1p_expr_t *, 278 asn1p_expr_t *(*resolver)(asn1p_expr_t *to_resolve, void *resolver_arg), 279 void *resolver_arg); 280 void asn1p_expr_add(asn1p_expr_t *to, asn1p_expr_t *what); 281 void asn1p_expr_add_many(asn1p_expr_t *to, asn1p_expr_t *from_what); 282 void asn1p_expr_free(asn1p_expr_t *expr); 283 284 #define TAG2STRING_BUFFER_SIZE 64 /* buf should be at least this big */ 285 char *asn1p_tag2string(struct asn1p_type_tag_s *tag, char *opt_buf); 286 287 #endif /* ASN1_PARSER_EXPR_H */ 288