xref: /aosp_15_r20/external/boringssl/src/include/openssl/asn1t.h (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker /* Written by Dr Stephen N Henson ([email protected]) for the OpenSSL
2*8fb009dcSAndroid Build Coastguard Worker  * project 2000.
3*8fb009dcSAndroid Build Coastguard Worker  */
4*8fb009dcSAndroid Build Coastguard Worker /* ====================================================================
5*8fb009dcSAndroid Build Coastguard Worker  * Copyright (c) 2000-2005 The OpenSSL Project.  All rights reserved.
6*8fb009dcSAndroid Build Coastguard Worker  *
7*8fb009dcSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
8*8fb009dcSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
9*8fb009dcSAndroid Build Coastguard Worker  * are met:
10*8fb009dcSAndroid Build Coastguard Worker  *
11*8fb009dcSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
12*8fb009dcSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
13*8fb009dcSAndroid Build Coastguard Worker  *
14*8fb009dcSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
15*8fb009dcSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
16*8fb009dcSAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
17*8fb009dcSAndroid Build Coastguard Worker  *    distribution.
18*8fb009dcSAndroid Build Coastguard Worker  *
19*8fb009dcSAndroid Build Coastguard Worker  * 3. All advertising materials mentioning features or use of this
20*8fb009dcSAndroid Build Coastguard Worker  *    software must display the following acknowledgment:
21*8fb009dcSAndroid Build Coastguard Worker  *    "This product includes software developed by the OpenSSL Project
22*8fb009dcSAndroid Build Coastguard Worker  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
23*8fb009dcSAndroid Build Coastguard Worker  *
24*8fb009dcSAndroid Build Coastguard Worker  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
25*8fb009dcSAndroid Build Coastguard Worker  *    endorse or promote products derived from this software without
26*8fb009dcSAndroid Build Coastguard Worker  *    prior written permission. For written permission, please contact
27*8fb009dcSAndroid Build Coastguard Worker  *    [email protected].
28*8fb009dcSAndroid Build Coastguard Worker  *
29*8fb009dcSAndroid Build Coastguard Worker  * 5. Products derived from this software may not be called "OpenSSL"
30*8fb009dcSAndroid Build Coastguard Worker  *    nor may "OpenSSL" appear in their names without prior written
31*8fb009dcSAndroid Build Coastguard Worker  *    permission of the OpenSSL Project.
32*8fb009dcSAndroid Build Coastguard Worker  *
33*8fb009dcSAndroid Build Coastguard Worker  * 6. Redistributions of any form whatsoever must retain the following
34*8fb009dcSAndroid Build Coastguard Worker  *    acknowledgment:
35*8fb009dcSAndroid Build Coastguard Worker  *    "This product includes software developed by the OpenSSL Project
36*8fb009dcSAndroid Build Coastguard Worker  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
37*8fb009dcSAndroid Build Coastguard Worker  *
38*8fb009dcSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
39*8fb009dcSAndroid Build Coastguard Worker  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40*8fb009dcSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
41*8fb009dcSAndroid Build Coastguard Worker  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
42*8fb009dcSAndroid Build Coastguard Worker  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43*8fb009dcSAndroid Build Coastguard Worker  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44*8fb009dcSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45*8fb009dcSAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46*8fb009dcSAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
47*8fb009dcSAndroid Build Coastguard Worker  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48*8fb009dcSAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
49*8fb009dcSAndroid Build Coastguard Worker  * OF THE POSSIBILITY OF SUCH DAMAGE.
50*8fb009dcSAndroid Build Coastguard Worker  * ====================================================================
51*8fb009dcSAndroid Build Coastguard Worker  *
52*8fb009dcSAndroid Build Coastguard Worker  * This product includes cryptographic software written by Eric Young
53*8fb009dcSAndroid Build Coastguard Worker  * ([email protected]).  This product includes software written by Tim
54*8fb009dcSAndroid Build Coastguard Worker  * Hudson ([email protected]).
55*8fb009dcSAndroid Build Coastguard Worker  *
56*8fb009dcSAndroid Build Coastguard Worker  */
57*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_ASN1T_H
58*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_ASN1T_H
59*8fb009dcSAndroid Build Coastguard Worker 
60*8fb009dcSAndroid Build Coastguard Worker #include <openssl/base.h>
61*8fb009dcSAndroid Build Coastguard Worker #include <openssl/asn1.h>
62*8fb009dcSAndroid Build Coastguard Worker 
63*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus)
64*8fb009dcSAndroid Build Coastguard Worker extern "C" {
65*8fb009dcSAndroid Build Coastguard Worker #endif
66*8fb009dcSAndroid Build Coastguard Worker 
67*8fb009dcSAndroid Build Coastguard Worker 
68*8fb009dcSAndroid Build Coastguard Worker /* Legacy ASN.1 library template definitions.
69*8fb009dcSAndroid Build Coastguard Worker  *
70*8fb009dcSAndroid Build Coastguard Worker  * This header is used to define new types in OpenSSL's ASN.1 implementation. It
71*8fb009dcSAndroid Build Coastguard Worker  * is deprecated and will be unexported from the library. Use the new |CBS| and
72*8fb009dcSAndroid Build Coastguard Worker  * |CBB| library in <openssl/bytestring.h> instead. */
73*8fb009dcSAndroid Build Coastguard Worker 
74*8fb009dcSAndroid Build Coastguard Worker 
75*8fb009dcSAndroid Build Coastguard Worker typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE;
76*8fb009dcSAndroid Build Coastguard Worker typedef struct ASN1_TLC_st ASN1_TLC;
77*8fb009dcSAndroid Build Coastguard Worker 
78*8fb009dcSAndroid Build Coastguard Worker /* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
79*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr))
80*8fb009dcSAndroid Build Coastguard Worker 
81*8fb009dcSAndroid Build Coastguard Worker 
82*8fb009dcSAndroid Build Coastguard Worker /* Macros for start and end of ASN1_ITEM definition */
83*8fb009dcSAndroid Build Coastguard Worker 
84*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ITEM_start(itname) \
85*8fb009dcSAndroid Build Coastguard Worker 	const ASN1_ITEM itname##_it = {
86*8fb009dcSAndroid Build Coastguard Worker 
87*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ITEM_end(itname) \
88*8fb009dcSAndroid Build Coastguard Worker 		};
89*8fb009dcSAndroid Build Coastguard Worker 
90*8fb009dcSAndroid Build Coastguard Worker /* Macros to aid ASN1 template writing */
91*8fb009dcSAndroid Build Coastguard Worker 
92*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ITEM_TEMPLATE(tname) \
93*8fb009dcSAndroid Build Coastguard Worker 	static const ASN1_TEMPLATE tname##_item_tt
94*8fb009dcSAndroid Build Coastguard Worker 
95*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ITEM_TEMPLATE_END(tname) \
96*8fb009dcSAndroid Build Coastguard Worker 	;\
97*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_start(tname) \
98*8fb009dcSAndroid Build Coastguard Worker 		ASN1_ITYPE_PRIMITIVE,\
99*8fb009dcSAndroid Build Coastguard Worker 		-1,\
100*8fb009dcSAndroid Build Coastguard Worker 		&tname##_item_tt,\
101*8fb009dcSAndroid Build Coastguard Worker 		0,\
102*8fb009dcSAndroid Build Coastguard Worker 		NULL,\
103*8fb009dcSAndroid Build Coastguard Worker 		0,\
104*8fb009dcSAndroid Build Coastguard Worker 		#tname \
105*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_end(tname)
106*8fb009dcSAndroid Build Coastguard Worker 
107*8fb009dcSAndroid Build Coastguard Worker 
108*8fb009dcSAndroid Build Coastguard Worker /* This is a ASN1 type which just embeds a template */
109*8fb009dcSAndroid Build Coastguard Worker 
110*8fb009dcSAndroid Build Coastguard Worker /* This pair helps declare a SEQUENCE. We can do:
111*8fb009dcSAndroid Build Coastguard Worker  *
112*8fb009dcSAndroid Build Coastguard Worker  * 	ASN1_SEQUENCE(stname) = {
113*8fb009dcSAndroid Build Coastguard Worker  * 		... SEQUENCE components ...
114*8fb009dcSAndroid Build Coastguard Worker  * 	} ASN1_SEQUENCE_END(stname)
115*8fb009dcSAndroid Build Coastguard Worker  *
116*8fb009dcSAndroid Build Coastguard Worker  * 	This will produce an ASN1_ITEM called stname_it
117*8fb009dcSAndroid Build Coastguard Worker  *	for a structure called stname.
118*8fb009dcSAndroid Build Coastguard Worker  *
119*8fb009dcSAndroid Build Coastguard Worker  * 	If you want the same structure but a different
120*8fb009dcSAndroid Build Coastguard Worker  *	name then use:
121*8fb009dcSAndroid Build Coastguard Worker  *
122*8fb009dcSAndroid Build Coastguard Worker  * 	ASN1_SEQUENCE(itname) = {
123*8fb009dcSAndroid Build Coastguard Worker  * 		... SEQUENCE components ...
124*8fb009dcSAndroid Build Coastguard Worker  * 	} ASN1_SEQUENCE_END_name(stname, itname)
125*8fb009dcSAndroid Build Coastguard Worker  *
126*8fb009dcSAndroid Build Coastguard Worker  *	This will create an item called itname_it using
127*8fb009dcSAndroid Build Coastguard Worker  *	a structure called stname.
128*8fb009dcSAndroid Build Coastguard Worker  */
129*8fb009dcSAndroid Build Coastguard Worker 
130*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE(tname) \
131*8fb009dcSAndroid Build Coastguard Worker 	static const ASN1_TEMPLATE tname##_seq_tt[]
132*8fb009dcSAndroid Build Coastguard Worker 
133*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname)
134*8fb009dcSAndroid Build Coastguard Worker 
135*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE_END_name(stname, tname) \
136*8fb009dcSAndroid Build Coastguard Worker 	;\
137*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_start(tname) \
138*8fb009dcSAndroid Build Coastguard Worker 		ASN1_ITYPE_SEQUENCE,\
139*8fb009dcSAndroid Build Coastguard Worker 		V_ASN1_SEQUENCE,\
140*8fb009dcSAndroid Build Coastguard Worker 		tname##_seq_tt,\
141*8fb009dcSAndroid Build Coastguard Worker 		sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
142*8fb009dcSAndroid Build Coastguard Worker 		NULL,\
143*8fb009dcSAndroid Build Coastguard Worker 		sizeof(stname),\
144*8fb009dcSAndroid Build Coastguard Worker 		#stname \
145*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_end(tname)
146*8fb009dcSAndroid Build Coastguard Worker 
147*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE_cb(tname, cb) \
148*8fb009dcSAndroid Build Coastguard Worker 	static const ASN1_AUX tname##_aux = {NULL, 0, 0, cb, 0}; \
149*8fb009dcSAndroid Build Coastguard Worker 	ASN1_SEQUENCE(tname)
150*8fb009dcSAndroid Build Coastguard Worker 
151*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE_ref(tname, cb) \
152*8fb009dcSAndroid Build Coastguard Worker 	static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), cb, 0}; \
153*8fb009dcSAndroid Build Coastguard Worker 	ASN1_SEQUENCE(tname)
154*8fb009dcSAndroid Build Coastguard Worker 
155*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE_enc(tname, enc, cb) \
156*8fb009dcSAndroid Build Coastguard Worker 	static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, cb, offsetof(tname, enc)}; \
157*8fb009dcSAndroid Build Coastguard Worker 	ASN1_SEQUENCE(tname)
158*8fb009dcSAndroid Build Coastguard Worker 
159*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)
160*8fb009dcSAndroid Build Coastguard Worker 
161*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)
162*8fb009dcSAndroid Build Coastguard Worker 
163*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE_END_ref(stname, tname) \
164*8fb009dcSAndroid Build Coastguard Worker 	;\
165*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_start(tname) \
166*8fb009dcSAndroid Build Coastguard Worker 		ASN1_ITYPE_SEQUENCE,\
167*8fb009dcSAndroid Build Coastguard Worker 		V_ASN1_SEQUENCE,\
168*8fb009dcSAndroid Build Coastguard Worker 		tname##_seq_tt,\
169*8fb009dcSAndroid Build Coastguard Worker 		sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
170*8fb009dcSAndroid Build Coastguard Worker 		&tname##_aux,\
171*8fb009dcSAndroid Build Coastguard Worker 		sizeof(stname),\
172*8fb009dcSAndroid Build Coastguard Worker 		#stname \
173*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_end(tname)
174*8fb009dcSAndroid Build Coastguard Worker 
175*8fb009dcSAndroid Build Coastguard Worker 
176*8fb009dcSAndroid Build Coastguard Worker /* This pair helps declare a CHOICE type. We can do:
177*8fb009dcSAndroid Build Coastguard Worker  *
178*8fb009dcSAndroid Build Coastguard Worker  * 	ASN1_CHOICE(chname) = {
179*8fb009dcSAndroid Build Coastguard Worker  * 		... CHOICE options ...
180*8fb009dcSAndroid Build Coastguard Worker  * 	ASN1_CHOICE_END(chname)
181*8fb009dcSAndroid Build Coastguard Worker  *
182*8fb009dcSAndroid Build Coastguard Worker  * 	This will produce an ASN1_ITEM called chname_it
183*8fb009dcSAndroid Build Coastguard Worker  *	for a structure called chname. The structure
184*8fb009dcSAndroid Build Coastguard Worker  *	definition must look like this:
185*8fb009dcSAndroid Build Coastguard Worker  *	typedef struct {
186*8fb009dcSAndroid Build Coastguard Worker  *		int type;
187*8fb009dcSAndroid Build Coastguard Worker  *		union {
188*8fb009dcSAndroid Build Coastguard Worker  *			ASN1_SOMETHING *opt1;
189*8fb009dcSAndroid Build Coastguard Worker  *			ASN1_SOMEOTHER *opt2;
190*8fb009dcSAndroid Build Coastguard Worker  *		} value;
191*8fb009dcSAndroid Build Coastguard Worker  *	} chname;
192*8fb009dcSAndroid Build Coastguard Worker  *
193*8fb009dcSAndroid Build Coastguard Worker  *	the name of the selector must be 'type'.
194*8fb009dcSAndroid Build Coastguard Worker  * 	to use an alternative selector name use the
195*8fb009dcSAndroid Build Coastguard Worker  *      ASN1_CHOICE_END_selector() version.
196*8fb009dcSAndroid Build Coastguard Worker  */
197*8fb009dcSAndroid Build Coastguard Worker 
198*8fb009dcSAndroid Build Coastguard Worker #define ASN1_CHOICE(tname) \
199*8fb009dcSAndroid Build Coastguard Worker 	static const ASN1_TEMPLATE tname##_ch_tt[]
200*8fb009dcSAndroid Build Coastguard Worker 
201*8fb009dcSAndroid Build Coastguard Worker #define ASN1_CHOICE_cb(tname, cb) \
202*8fb009dcSAndroid Build Coastguard Worker 	static const ASN1_AUX tname##_aux = {NULL, 0, 0, cb, 0}; \
203*8fb009dcSAndroid Build Coastguard Worker 	ASN1_CHOICE(tname)
204*8fb009dcSAndroid Build Coastguard Worker 
205*8fb009dcSAndroid Build Coastguard Worker #define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname)
206*8fb009dcSAndroid Build Coastguard Worker 
207*8fb009dcSAndroid Build Coastguard Worker #define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type)
208*8fb009dcSAndroid Build Coastguard Worker 
209*8fb009dcSAndroid Build Coastguard Worker #define ASN1_CHOICE_END_selector(stname, tname, selname) \
210*8fb009dcSAndroid Build Coastguard Worker 	;\
211*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_start(tname) \
212*8fb009dcSAndroid Build Coastguard Worker 		ASN1_ITYPE_CHOICE,\
213*8fb009dcSAndroid Build Coastguard Worker 		offsetof(stname,selname) ,\
214*8fb009dcSAndroid Build Coastguard Worker 		tname##_ch_tt,\
215*8fb009dcSAndroid Build Coastguard Worker 		sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\
216*8fb009dcSAndroid Build Coastguard Worker 		NULL,\
217*8fb009dcSAndroid Build Coastguard Worker 		sizeof(stname),\
218*8fb009dcSAndroid Build Coastguard Worker 		#stname \
219*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_end(tname)
220*8fb009dcSAndroid Build Coastguard Worker 
221*8fb009dcSAndroid Build Coastguard Worker #define ASN1_CHOICE_END_cb(stname, tname, selname) \
222*8fb009dcSAndroid Build Coastguard Worker 	;\
223*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_start(tname) \
224*8fb009dcSAndroid Build Coastguard Worker 		ASN1_ITYPE_CHOICE,\
225*8fb009dcSAndroid Build Coastguard Worker 		offsetof(stname,selname) ,\
226*8fb009dcSAndroid Build Coastguard Worker 		tname##_ch_tt,\
227*8fb009dcSAndroid Build Coastguard Worker 		sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\
228*8fb009dcSAndroid Build Coastguard Worker 		&tname##_aux,\
229*8fb009dcSAndroid Build Coastguard Worker 		sizeof(stname),\
230*8fb009dcSAndroid Build Coastguard Worker 		#stname \
231*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_end(tname)
232*8fb009dcSAndroid Build Coastguard Worker 
233*8fb009dcSAndroid Build Coastguard Worker /* This helps with the template wrapper form of ASN1_ITEM */
234*8fb009dcSAndroid Build Coastguard Worker 
235*8fb009dcSAndroid Build Coastguard Worker #define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \
236*8fb009dcSAndroid Build Coastguard Worker 	(flags), (tag), 0,\
237*8fb009dcSAndroid Build Coastguard Worker 	#name, ASN1_ITEM_ref(type) }
238*8fb009dcSAndroid Build Coastguard Worker 
239*8fb009dcSAndroid Build Coastguard Worker /* These help with SEQUENCE or CHOICE components */
240*8fb009dcSAndroid Build Coastguard Worker 
241*8fb009dcSAndroid Build Coastguard Worker /* used to declare other types */
242*8fb009dcSAndroid Build Coastguard Worker 
243*8fb009dcSAndroid Build Coastguard Worker #define ASN1_EX_TYPE(flags, tag, stname, field, type) { \
244*8fb009dcSAndroid Build Coastguard Worker 	(flags), (tag), offsetof(stname, field),\
245*8fb009dcSAndroid Build Coastguard Worker 	#field, ASN1_ITEM_ref(type) }
246*8fb009dcSAndroid Build Coastguard Worker 
247*8fb009dcSAndroid Build Coastguard Worker /* implicit and explicit helper macros */
248*8fb009dcSAndroid Build Coastguard Worker 
249*8fb009dcSAndroid Build Coastguard Worker #define ASN1_IMP_EX(stname, field, type, tag, ex) \
250*8fb009dcSAndroid Build Coastguard Worker 		ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type)
251*8fb009dcSAndroid Build Coastguard Worker 
252*8fb009dcSAndroid Build Coastguard Worker #define ASN1_EXP_EX(stname, field, type, tag, ex) \
253*8fb009dcSAndroid Build Coastguard Worker 		ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type)
254*8fb009dcSAndroid Build Coastguard Worker 
255*8fb009dcSAndroid Build Coastguard Worker /* Any defined by macros: the field used is in the table itself */
256*8fb009dcSAndroid Build Coastguard Worker 
257*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
258*8fb009dcSAndroid Build Coastguard Worker /* Plain simple type */
259*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type)
260*8fb009dcSAndroid Build Coastguard Worker 
261*8fb009dcSAndroid Build Coastguard Worker /* OPTIONAL simple type */
262*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type)
263*8fb009dcSAndroid Build Coastguard Worker 
264*8fb009dcSAndroid Build Coastguard Worker /* IMPLICIT tagged simple type */
265*8fb009dcSAndroid Build Coastguard Worker #define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0)
266*8fb009dcSAndroid Build Coastguard Worker 
267*8fb009dcSAndroid Build Coastguard Worker /* IMPLICIT tagged OPTIONAL simple type */
268*8fb009dcSAndroid Build Coastguard Worker #define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
269*8fb009dcSAndroid Build Coastguard Worker 
270*8fb009dcSAndroid Build Coastguard Worker /* Same as above but EXPLICIT */
271*8fb009dcSAndroid Build Coastguard Worker 
272*8fb009dcSAndroid Build Coastguard Worker #define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0)
273*8fb009dcSAndroid Build Coastguard Worker #define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
274*8fb009dcSAndroid Build Coastguard Worker 
275*8fb009dcSAndroid Build Coastguard Worker /* SEQUENCE OF type */
276*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE_OF(stname, field, type) \
277*8fb009dcSAndroid Build Coastguard Worker 		ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type)
278*8fb009dcSAndroid Build Coastguard Worker 
279*8fb009dcSAndroid Build Coastguard Worker /* OPTIONAL SEQUENCE OF */
280*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SEQUENCE_OF_OPT(stname, field, type) \
281*8fb009dcSAndroid Build Coastguard Worker 		ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)
282*8fb009dcSAndroid Build Coastguard Worker 
283*8fb009dcSAndroid Build Coastguard Worker /* Same as above but for SET OF */
284*8fb009dcSAndroid Build Coastguard Worker 
285*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SET_OF(stname, field, type) \
286*8fb009dcSAndroid Build Coastguard Worker 		ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type)
287*8fb009dcSAndroid Build Coastguard Worker 
288*8fb009dcSAndroid Build Coastguard Worker #define ASN1_SET_OF_OPT(stname, field, type) \
289*8fb009dcSAndroid Build Coastguard Worker 		ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)
290*8fb009dcSAndroid Build Coastguard Worker 
291*8fb009dcSAndroid Build Coastguard Worker /* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */
292*8fb009dcSAndroid Build Coastguard Worker 
293*8fb009dcSAndroid Build Coastguard Worker #define ASN1_IMP_SET_OF(stname, field, type, tag) \
294*8fb009dcSAndroid Build Coastguard Worker 			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)
295*8fb009dcSAndroid Build Coastguard Worker 
296*8fb009dcSAndroid Build Coastguard Worker #define ASN1_EXP_SET_OF(stname, field, type, tag) \
297*8fb009dcSAndroid Build Coastguard Worker 			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)
298*8fb009dcSAndroid Build Coastguard Worker 
299*8fb009dcSAndroid Build Coastguard Worker #define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \
300*8fb009dcSAndroid Build Coastguard Worker 			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)
301*8fb009dcSAndroid Build Coastguard Worker 
302*8fb009dcSAndroid Build Coastguard Worker #define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \
303*8fb009dcSAndroid Build Coastguard Worker 			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)
304*8fb009dcSAndroid Build Coastguard Worker 
305*8fb009dcSAndroid Build Coastguard Worker #define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \
306*8fb009dcSAndroid Build Coastguard Worker 			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)
307*8fb009dcSAndroid Build Coastguard Worker 
308*8fb009dcSAndroid Build Coastguard Worker #define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \
309*8fb009dcSAndroid Build Coastguard Worker 			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)
310*8fb009dcSAndroid Build Coastguard Worker 
311*8fb009dcSAndroid Build Coastguard Worker #define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \
312*8fb009dcSAndroid Build Coastguard Worker 			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)
313*8fb009dcSAndroid Build Coastguard Worker 
314*8fb009dcSAndroid Build Coastguard Worker #define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \
315*8fb009dcSAndroid Build Coastguard Worker 			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)
316*8fb009dcSAndroid Build Coastguard Worker 
317*8fb009dcSAndroid Build Coastguard Worker /* Macros for the ASN1_ADB structure */
318*8fb009dcSAndroid Build Coastguard Worker 
319*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ADB(name) \
320*8fb009dcSAndroid Build Coastguard Worker 	static const ASN1_ADB_TABLE name##_adbtbl[]
321*8fb009dcSAndroid Build Coastguard Worker 
322*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ADB_END(name, flags, field, app_table, def, none) \
323*8fb009dcSAndroid Build Coastguard Worker 	;\
324*8fb009dcSAndroid Build Coastguard Worker 	static const ASN1_ADB name##_adb = {\
325*8fb009dcSAndroid Build Coastguard Worker 		flags,\
326*8fb009dcSAndroid Build Coastguard Worker 		offsetof(name, field),\
327*8fb009dcSAndroid Build Coastguard Worker 		app_table,\
328*8fb009dcSAndroid Build Coastguard Worker 		name##_adbtbl,\
329*8fb009dcSAndroid Build Coastguard Worker 		sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\
330*8fb009dcSAndroid Build Coastguard Worker 		def,\
331*8fb009dcSAndroid Build Coastguard Worker 		none\
332*8fb009dcSAndroid Build Coastguard Worker 	}
333*8fb009dcSAndroid Build Coastguard Worker 
334*8fb009dcSAndroid Build Coastguard Worker #define ADB_ENTRY(val, template) {val, template}
335*8fb009dcSAndroid Build Coastguard Worker 
336*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ADB_TEMPLATE(name) \
337*8fb009dcSAndroid Build Coastguard Worker 	static const ASN1_TEMPLATE name##_tt
338*8fb009dcSAndroid Build Coastguard Worker 
339*8fb009dcSAndroid Build Coastguard Worker /* This is the ASN1 template structure that defines
340*8fb009dcSAndroid Build Coastguard Worker  * a wrapper round the actual type. It determines the
341*8fb009dcSAndroid Build Coastguard Worker  * actual position of the field in the value structure,
342*8fb009dcSAndroid Build Coastguard Worker  * various flags such as OPTIONAL and the field name.
343*8fb009dcSAndroid Build Coastguard Worker  */
344*8fb009dcSAndroid Build Coastguard Worker 
345*8fb009dcSAndroid Build Coastguard Worker struct ASN1_TEMPLATE_st {
346*8fb009dcSAndroid Build Coastguard Worker uint32_t flags;		/* Various flags */
347*8fb009dcSAndroid Build Coastguard Worker int tag;			/* tag, not used if no tagging */
348*8fb009dcSAndroid Build Coastguard Worker unsigned long offset;		/* Offset of this field in structure */
349*8fb009dcSAndroid Build Coastguard Worker const char *field_name;		/* Field name */
350*8fb009dcSAndroid Build Coastguard Worker ASN1_ITEM_EXP *item;		/* Relevant ASN1_ITEM or ASN1_ADB */
351*8fb009dcSAndroid Build Coastguard Worker };
352*8fb009dcSAndroid Build Coastguard Worker 
353*8fb009dcSAndroid Build Coastguard Worker /* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */
354*8fb009dcSAndroid Build Coastguard Worker 
355*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TEMPLATE_item(t) (t->item_ptr)
356*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TEMPLATE_adb(t) (t->item_ptr)
357*8fb009dcSAndroid Build Coastguard Worker 
358*8fb009dcSAndroid Build Coastguard Worker typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE;
359*8fb009dcSAndroid Build Coastguard Worker typedef struct ASN1_ADB_st ASN1_ADB;
360*8fb009dcSAndroid Build Coastguard Worker 
361*8fb009dcSAndroid Build Coastguard Worker typedef struct asn1_must_be_null_st ASN1_MUST_BE_NULL;
362*8fb009dcSAndroid Build Coastguard Worker 
363*8fb009dcSAndroid Build Coastguard Worker struct ASN1_ADB_st {
364*8fb009dcSAndroid Build Coastguard Worker 	uint32_t flags;	/* Various flags */
365*8fb009dcSAndroid Build Coastguard Worker 	unsigned long offset;	/* Offset of selector field */
366*8fb009dcSAndroid Build Coastguard Worker 	ASN1_MUST_BE_NULL *unused;
367*8fb009dcSAndroid Build Coastguard Worker 	const ASN1_ADB_TABLE *tbl;	/* Table of possible types */
368*8fb009dcSAndroid Build Coastguard Worker 	long tblcount;		/* Number of entries in tbl */
369*8fb009dcSAndroid Build Coastguard Worker 	const ASN1_TEMPLATE *default_tt;  /* Type to use if no match */
370*8fb009dcSAndroid Build Coastguard Worker 	const ASN1_TEMPLATE *null_tt;  /* Type to use if selector is NULL */
371*8fb009dcSAndroid Build Coastguard Worker };
372*8fb009dcSAndroid Build Coastguard Worker 
373*8fb009dcSAndroid Build Coastguard Worker struct ASN1_ADB_TABLE_st {
374*8fb009dcSAndroid Build Coastguard Worker 	int value;		/* NID for an object */
375*8fb009dcSAndroid Build Coastguard Worker 	const ASN1_TEMPLATE tt;		/* item for this value */
376*8fb009dcSAndroid Build Coastguard Worker };
377*8fb009dcSAndroid Build Coastguard Worker 
378*8fb009dcSAndroid Build Coastguard Worker /* template flags */
379*8fb009dcSAndroid Build Coastguard Worker 
380*8fb009dcSAndroid Build Coastguard Worker /* Field is optional */
381*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_OPTIONAL	(0x1)
382*8fb009dcSAndroid Build Coastguard Worker 
383*8fb009dcSAndroid Build Coastguard Worker /* Field is a SET OF */
384*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_SET_OF	(0x1 << 1)
385*8fb009dcSAndroid Build Coastguard Worker 
386*8fb009dcSAndroid Build Coastguard Worker /* Field is a SEQUENCE OF */
387*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_SEQUENCE_OF	(0x2 << 1)
388*8fb009dcSAndroid Build Coastguard Worker 
389*8fb009dcSAndroid Build Coastguard Worker /* Mask for SET OF or SEQUENCE OF */
390*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_SK_MASK	(0x3 << 1)
391*8fb009dcSAndroid Build Coastguard Worker 
392*8fb009dcSAndroid Build Coastguard Worker /* These flags mean the tag should be taken from the
393*8fb009dcSAndroid Build Coastguard Worker  * tag field. If EXPLICIT then the underlying type
394*8fb009dcSAndroid Build Coastguard Worker  * is used for the inner tag.
395*8fb009dcSAndroid Build Coastguard Worker  */
396*8fb009dcSAndroid Build Coastguard Worker 
397*8fb009dcSAndroid Build Coastguard Worker /* IMPLICIT tagging */
398*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_IMPTAG	(0x1 << 3)
399*8fb009dcSAndroid Build Coastguard Worker 
400*8fb009dcSAndroid Build Coastguard Worker 
401*8fb009dcSAndroid Build Coastguard Worker /* EXPLICIT tagging, inner tag from underlying type */
402*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_EXPTAG	(0x2 << 3)
403*8fb009dcSAndroid Build Coastguard Worker 
404*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_TAG_MASK	(0x3 << 3)
405*8fb009dcSAndroid Build Coastguard Worker 
406*8fb009dcSAndroid Build Coastguard Worker /* context specific IMPLICIT */
407*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_IMPLICIT	ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT
408*8fb009dcSAndroid Build Coastguard Worker 
409*8fb009dcSAndroid Build Coastguard Worker /* context specific EXPLICIT */
410*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_EXPLICIT	ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT
411*8fb009dcSAndroid Build Coastguard Worker 
412*8fb009dcSAndroid Build Coastguard Worker /* If tagging is in force these determine the
413*8fb009dcSAndroid Build Coastguard Worker  * type of tag to use. Otherwise the tag is
414*8fb009dcSAndroid Build Coastguard Worker  * determined by the underlying type. These
415*8fb009dcSAndroid Build Coastguard Worker  * values reflect the actual octet format.
416*8fb009dcSAndroid Build Coastguard Worker  */
417*8fb009dcSAndroid Build Coastguard Worker 
418*8fb009dcSAndroid Build Coastguard Worker /* Universal tag */
419*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_UNIVERSAL	(0x0<<6)
420*8fb009dcSAndroid Build Coastguard Worker /* Application tag */
421*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_APPLICATION	(0x1<<6)
422*8fb009dcSAndroid Build Coastguard Worker /* Context specific tag */
423*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_CONTEXT	(0x2<<6)
424*8fb009dcSAndroid Build Coastguard Worker /* Private tag */
425*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_PRIVATE	(0x3<<6)
426*8fb009dcSAndroid Build Coastguard Worker 
427*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_TAG_CLASS	(0x3<<6)
428*8fb009dcSAndroid Build Coastguard Worker 
429*8fb009dcSAndroid Build Coastguard Worker /* These are for ANY DEFINED BY type. In this case
430*8fb009dcSAndroid Build Coastguard Worker  * the 'item' field points to an ASN1_ADB structure
431*8fb009dcSAndroid Build Coastguard Worker  * which contains a table of values to decode the
432*8fb009dcSAndroid Build Coastguard Worker  * relevant type
433*8fb009dcSAndroid Build Coastguard Worker  */
434*8fb009dcSAndroid Build Coastguard Worker 
435*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_ADB_MASK	(0x3<<8)
436*8fb009dcSAndroid Build Coastguard Worker 
437*8fb009dcSAndroid Build Coastguard Worker #define ASN1_TFLG_ADB_OID	(0x1<<8)
438*8fb009dcSAndroid Build Coastguard Worker 
439*8fb009dcSAndroid Build Coastguard Worker /* This is the actual ASN1 item itself */
440*8fb009dcSAndroid Build Coastguard Worker 
441*8fb009dcSAndroid Build Coastguard Worker struct ASN1_ITEM_st {
442*8fb009dcSAndroid Build Coastguard Worker char itype;			/* The item type, primitive, SEQUENCE, CHOICE or extern */
443*8fb009dcSAndroid Build Coastguard Worker int utype;			/* underlying type */
444*8fb009dcSAndroid Build Coastguard Worker const ASN1_TEMPLATE *templates;	/* If SEQUENCE or CHOICE this contains the contents */
445*8fb009dcSAndroid Build Coastguard Worker long tcount;			/* Number of templates if SEQUENCE or CHOICE */
446*8fb009dcSAndroid Build Coastguard Worker const void *funcs;		/* functions that handle this type */
447*8fb009dcSAndroid Build Coastguard Worker long size;			/* Structure size (usually)*/
448*8fb009dcSAndroid Build Coastguard Worker const char *sname;		/* Structure name */
449*8fb009dcSAndroid Build Coastguard Worker };
450*8fb009dcSAndroid Build Coastguard Worker 
451*8fb009dcSAndroid Build Coastguard Worker /* These are values for the itype field and
452*8fb009dcSAndroid Build Coastguard Worker  * determine how the type is interpreted.
453*8fb009dcSAndroid Build Coastguard Worker  *
454*8fb009dcSAndroid Build Coastguard Worker  * For PRIMITIVE types the underlying type
455*8fb009dcSAndroid Build Coastguard Worker  * determines the behaviour if items is NULL.
456*8fb009dcSAndroid Build Coastguard Worker  *
457*8fb009dcSAndroid Build Coastguard Worker  * Otherwise templates must contain a single
458*8fb009dcSAndroid Build Coastguard Worker  * template and the type is treated in the
459*8fb009dcSAndroid Build Coastguard Worker  * same way as the type specified in the template.
460*8fb009dcSAndroid Build Coastguard Worker  *
461*8fb009dcSAndroid Build Coastguard Worker  * For SEQUENCE types the templates field points
462*8fb009dcSAndroid Build Coastguard Worker  * to the members, the size field is the
463*8fb009dcSAndroid Build Coastguard Worker  * structure size.
464*8fb009dcSAndroid Build Coastguard Worker  *
465*8fb009dcSAndroid Build Coastguard Worker  * For CHOICE types the templates field points
466*8fb009dcSAndroid Build Coastguard Worker  * to each possible member (typically a union)
467*8fb009dcSAndroid Build Coastguard Worker  * and the 'size' field is the offset of the
468*8fb009dcSAndroid Build Coastguard Worker  * selector.
469*8fb009dcSAndroid Build Coastguard Worker  *
470*8fb009dcSAndroid Build Coastguard Worker  * The 'funcs' field is used for application
471*8fb009dcSAndroid Build Coastguard Worker  * specific functions.
472*8fb009dcSAndroid Build Coastguard Worker  *
473*8fb009dcSAndroid Build Coastguard Worker  * The EXTERN type uses a new style d2i/i2d.
474*8fb009dcSAndroid Build Coastguard Worker  * The new style should be used where possible
475*8fb009dcSAndroid Build Coastguard Worker  * because it avoids things like the d2i IMPLICIT
476*8fb009dcSAndroid Build Coastguard Worker  * hack.
477*8fb009dcSAndroid Build Coastguard Worker  *
478*8fb009dcSAndroid Build Coastguard Worker  * MSTRING is a multiple string type, it is used
479*8fb009dcSAndroid Build Coastguard Worker  * for a CHOICE of character strings where the
480*8fb009dcSAndroid Build Coastguard Worker  * actual strings all occupy an ASN1_STRING
481*8fb009dcSAndroid Build Coastguard Worker  * structure. In this case the 'utype' field
482*8fb009dcSAndroid Build Coastguard Worker  * has a special meaning, it is used as a mask
483*8fb009dcSAndroid Build Coastguard Worker  * of acceptable types using the B_ASN1 constants.
484*8fb009dcSAndroid Build Coastguard Worker  *
485*8fb009dcSAndroid Build Coastguard Worker  */
486*8fb009dcSAndroid Build Coastguard Worker 
487*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ITYPE_PRIMITIVE		0x0
488*8fb009dcSAndroid Build Coastguard Worker 
489*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ITYPE_SEQUENCE		0x1
490*8fb009dcSAndroid Build Coastguard Worker 
491*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ITYPE_CHOICE		0x2
492*8fb009dcSAndroid Build Coastguard Worker 
493*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ITYPE_EXTERN		0x4
494*8fb009dcSAndroid Build Coastguard Worker 
495*8fb009dcSAndroid Build Coastguard Worker #define ASN1_ITYPE_MSTRING		0x5
496*8fb009dcSAndroid Build Coastguard Worker 
497*8fb009dcSAndroid Build Coastguard Worker /* Deprecated tag and length cache */
498*8fb009dcSAndroid Build Coastguard Worker struct ASN1_TLC_st;
499*8fb009dcSAndroid Build Coastguard Worker 
500*8fb009dcSAndroid Build Coastguard Worker /* This is the ASN1_AUX structure: it handles various
501*8fb009dcSAndroid Build Coastguard Worker  * miscellaneous requirements. For example the use of
502*8fb009dcSAndroid Build Coastguard Worker  * reference counts and an informational callback.
503*8fb009dcSAndroid Build Coastguard Worker  *
504*8fb009dcSAndroid Build Coastguard Worker  * The "informational callback" is called at various
505*8fb009dcSAndroid Build Coastguard Worker  * points during the ASN1 encoding and decoding. It can
506*8fb009dcSAndroid Build Coastguard Worker  * be used to provide minor customisation of the structures
507*8fb009dcSAndroid Build Coastguard Worker  * used. This is most useful where the supplied routines
508*8fb009dcSAndroid Build Coastguard Worker  * *almost* do the right thing but need some extra help
509*8fb009dcSAndroid Build Coastguard Worker  * at a few points. If the callback returns zero then
510*8fb009dcSAndroid Build Coastguard Worker  * it is assumed a fatal error has occurred and the
511*8fb009dcSAndroid Build Coastguard Worker  * main operation should be abandoned.
512*8fb009dcSAndroid Build Coastguard Worker  *
513*8fb009dcSAndroid Build Coastguard Worker  * If major changes in the default behaviour are required
514*8fb009dcSAndroid Build Coastguard Worker  * then an external type is more appropriate.
515*8fb009dcSAndroid Build Coastguard Worker  */
516*8fb009dcSAndroid Build Coastguard Worker 
517*8fb009dcSAndroid Build Coastguard Worker typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it,
518*8fb009dcSAndroid Build Coastguard Worker 				void *exarg);
519*8fb009dcSAndroid Build Coastguard Worker 
520*8fb009dcSAndroid Build Coastguard Worker typedef struct ASN1_AUX_st {
521*8fb009dcSAndroid Build Coastguard Worker 	void *app_data;
522*8fb009dcSAndroid Build Coastguard Worker 	uint32_t flags;
523*8fb009dcSAndroid Build Coastguard Worker 	int ref_offset;		/* Offset of reference value */
524*8fb009dcSAndroid Build Coastguard Worker 	ASN1_aux_cb *asn1_cb;
525*8fb009dcSAndroid Build Coastguard Worker 	int enc_offset;		/* Offset of ASN1_ENCODING structure */
526*8fb009dcSAndroid Build Coastguard Worker } ASN1_AUX;
527*8fb009dcSAndroid Build Coastguard Worker 
528*8fb009dcSAndroid Build Coastguard Worker /* Flags in ASN1_AUX */
529*8fb009dcSAndroid Build Coastguard Worker 
530*8fb009dcSAndroid Build Coastguard Worker /* Use a reference count */
531*8fb009dcSAndroid Build Coastguard Worker #define ASN1_AFLG_REFCOUNT	1
532*8fb009dcSAndroid Build Coastguard Worker /* Save the encoding of structure (useful for signatures) */
533*8fb009dcSAndroid Build Coastguard Worker #define ASN1_AFLG_ENCODING	2
534*8fb009dcSAndroid Build Coastguard Worker 
535*8fb009dcSAndroid Build Coastguard Worker /* operation values for asn1_cb */
536*8fb009dcSAndroid Build Coastguard Worker 
537*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_NEW_PRE		0
538*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_NEW_POST	1
539*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_FREE_PRE	2
540*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_FREE_POST	3
541*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_D2I_PRE		4
542*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_D2I_POST	5
543*8fb009dcSAndroid Build Coastguard Worker /* ASN1_OP_I2D_PRE and ASN1_OP_I2D_POST are not supported. We leave the
544*8fb009dcSAndroid Build Coastguard Worker  * constants undefined so code relying on them does not accidentally compile. */
545*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_PRINT_PRE	8
546*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_PRINT_POST	9
547*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_STREAM_PRE	10
548*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_STREAM_POST	11
549*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_DETACHED_PRE	12
550*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OP_DETACHED_POST	13
551*8fb009dcSAndroid Build Coastguard Worker 
552*8fb009dcSAndroid Build Coastguard Worker /* Macro to implement a primitive type */
553*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0)
554*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \
555*8fb009dcSAndroid Build Coastguard Worker 				ASN1_ITEM_start(itname) \
556*8fb009dcSAndroid Build Coastguard Worker 					ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \
557*8fb009dcSAndroid Build Coastguard Worker 				ASN1_ITEM_end(itname)
558*8fb009dcSAndroid Build Coastguard Worker 
559*8fb009dcSAndroid Build Coastguard Worker /* Macro to implement a multi string type */
560*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_MSTRING(itname, mask) \
561*8fb009dcSAndroid Build Coastguard Worker 				ASN1_ITEM_start(itname) \
562*8fb009dcSAndroid Build Coastguard Worker 					ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \
563*8fb009dcSAndroid Build Coastguard Worker 				ASN1_ITEM_end(itname)
564*8fb009dcSAndroid Build Coastguard Worker 
565*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \
566*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_start(sname) \
567*8fb009dcSAndroid Build Coastguard Worker 		ASN1_ITYPE_EXTERN, \
568*8fb009dcSAndroid Build Coastguard Worker 		tag, \
569*8fb009dcSAndroid Build Coastguard Worker 		NULL, \
570*8fb009dcSAndroid Build Coastguard Worker 		0, \
571*8fb009dcSAndroid Build Coastguard Worker 		&fptrs, \
572*8fb009dcSAndroid Build Coastguard Worker 		0, \
573*8fb009dcSAndroid Build Coastguard Worker 		#sname \
574*8fb009dcSAndroid Build Coastguard Worker 	ASN1_ITEM_end(sname)
575*8fb009dcSAndroid Build Coastguard Worker 
576*8fb009dcSAndroid Build Coastguard Worker /* Macro to implement standard functions in terms of ASN1_ITEM structures */
577*8fb009dcSAndroid Build Coastguard Worker 
578*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname)
579*8fb009dcSAndroid Build Coastguard Worker 
580*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname)
581*8fb009dcSAndroid Build Coastguard Worker 
582*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \
583*8fb009dcSAndroid Build Coastguard Worker 			IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname)
584*8fb009dcSAndroid Build Coastguard Worker 
585*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \
586*8fb009dcSAndroid Build Coastguard Worker 		IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname)
587*8fb009dcSAndroid Build Coastguard Worker 
588*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \
589*8fb009dcSAndroid Build Coastguard Worker 		IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname)
590*8fb009dcSAndroid Build Coastguard Worker 
591*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \
592*8fb009dcSAndroid Build Coastguard Worker 	pre stname *fname##_new(void) \
593*8fb009dcSAndroid Build Coastguard Worker 	{ \
594*8fb009dcSAndroid Build Coastguard Worker 		return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \
595*8fb009dcSAndroid Build Coastguard Worker 	} \
596*8fb009dcSAndroid Build Coastguard Worker 	pre void fname##_free(stname *a) \
597*8fb009dcSAndroid Build Coastguard Worker 	{ \
598*8fb009dcSAndroid Build Coastguard Worker 		ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \
599*8fb009dcSAndroid Build Coastguard Worker 	}
600*8fb009dcSAndroid Build Coastguard Worker 
601*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \
602*8fb009dcSAndroid Build Coastguard Worker 	stname *fname##_new(void) \
603*8fb009dcSAndroid Build Coastguard Worker 	{ \
604*8fb009dcSAndroid Build Coastguard Worker 		return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \
605*8fb009dcSAndroid Build Coastguard Worker 	} \
606*8fb009dcSAndroid Build Coastguard Worker 	void fname##_free(stname *a) \
607*8fb009dcSAndroid Build Coastguard Worker 	{ \
608*8fb009dcSAndroid Build Coastguard Worker 		ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \
609*8fb009dcSAndroid Build Coastguard Worker 	}
610*8fb009dcSAndroid Build Coastguard Worker 
611*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \
612*8fb009dcSAndroid Build Coastguard Worker 	IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \
613*8fb009dcSAndroid Build Coastguard Worker 	IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)
614*8fb009dcSAndroid Build Coastguard Worker 
615*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \
616*8fb009dcSAndroid Build Coastguard Worker 	stname *d2i_##fname(stname **a, const unsigned char **in, long len) \
617*8fb009dcSAndroid Build Coastguard Worker 	{ \
618*8fb009dcSAndroid Build Coastguard Worker 		return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\
619*8fb009dcSAndroid Build Coastguard Worker 	} \
620*8fb009dcSAndroid Build Coastguard Worker 	int i2d_##fname(stname *a, unsigned char **out) \
621*8fb009dcSAndroid Build Coastguard Worker 	{ \
622*8fb009dcSAndroid Build Coastguard Worker 		return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\
623*8fb009dcSAndroid Build Coastguard Worker 	}
624*8fb009dcSAndroid Build Coastguard Worker 
625*8fb009dcSAndroid Build Coastguard Worker /* This includes evil casts to remove const: they will go away when full
626*8fb009dcSAndroid Build Coastguard Worker  * ASN1 constification is done.
627*8fb009dcSAndroid Build Coastguard Worker  */
628*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \
629*8fb009dcSAndroid Build Coastguard Worker 	stname *d2i_##fname(stname **a, const unsigned char **in, long len) \
630*8fb009dcSAndroid Build Coastguard Worker 	{ \
631*8fb009dcSAndroid Build Coastguard Worker 		return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\
632*8fb009dcSAndroid Build Coastguard Worker 	} \
633*8fb009dcSAndroid Build Coastguard Worker 	int i2d_##fname(const stname *a, unsigned char **out) \
634*8fb009dcSAndroid Build Coastguard Worker 	{ \
635*8fb009dcSAndroid Build Coastguard Worker 		return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\
636*8fb009dcSAndroid Build Coastguard Worker 	}
637*8fb009dcSAndroid Build Coastguard Worker 
638*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_DUP_FUNCTION(stname)          \
639*8fb009dcSAndroid Build Coastguard Worker   stname *stname##_dup(stname *x) {                  \
640*8fb009dcSAndroid Build Coastguard Worker     return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \
641*8fb009dcSAndroid Build Coastguard Worker   }
642*8fb009dcSAndroid Build Coastguard Worker 
643*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_DUP_FUNCTION_const(stname)            \
644*8fb009dcSAndroid Build Coastguard Worker   stname *stname##_dup(const stname *x) {                    \
645*8fb009dcSAndroid Build Coastguard Worker     return ASN1_item_dup(ASN1_ITEM_rptr(stname), (void *)x); \
646*8fb009dcSAndroid Build Coastguard Worker   }
647*8fb009dcSAndroid Build Coastguard Worker 
648*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_FUNCTIONS_const(name) \
649*8fb009dcSAndroid Build Coastguard Worker 		IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name)
650*8fb009dcSAndroid Build Coastguard Worker 
651*8fb009dcSAndroid Build Coastguard Worker #define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \
652*8fb009dcSAndroid Build Coastguard Worker 	IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \
653*8fb009dcSAndroid Build Coastguard Worker 	IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)
654*8fb009dcSAndroid Build Coastguard Worker 
655*8fb009dcSAndroid Build Coastguard Worker /* external definitions for primitive types */
656*8fb009dcSAndroid Build Coastguard Worker 
657*8fb009dcSAndroid Build Coastguard Worker DECLARE_ASN1_ITEM(ASN1_SEQUENCE)
658*8fb009dcSAndroid Build Coastguard Worker 
659*8fb009dcSAndroid Build Coastguard Worker DEFINE_STACK_OF(ASN1_VALUE)
660*8fb009dcSAndroid Build Coastguard Worker 
661*8fb009dcSAndroid Build Coastguard Worker 
662*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus)
663*8fb009dcSAndroid Build Coastguard Worker }  // extern "C"
664*8fb009dcSAndroid Build Coastguard Worker #endif
665*8fb009dcSAndroid Build Coastguard Worker 
666*8fb009dcSAndroid Build Coastguard Worker #endif  // OPENSSL_HEADER_ASN1T_H
667