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