1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* asn1t.h */
2e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project 2000.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Copyright (c) 2000-2005 The OpenSSL Project.  All rights reserved.
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the documentation and/or other materials provided with the
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    distribution.
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    software must display the following acknowledgment:
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    endorse or promote products derived from this software without
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prior written permission. For written permission, please contact
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    licensing@OpenSSL.org.
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL"
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    nor may "OpenSSL" appear in their names without prior written
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    permission of the OpenSSL Project.
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    acknowledgment:
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE.
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ====================================================================
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com).  This product includes software written by Tim
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com).
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef HEADER_ASN1T_H
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define HEADER_ASN1T_H
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stddef.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/e_os2.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/asn1.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_BUILD_SHLIBCRYPTO
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# undef OPENSSL_EXTERN
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define OPENSSL_EXTERN OPENSSL_EXPORT
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ASN1 template defines, structures and functions */
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef  __cplusplus
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectextern "C" {
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr))
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macros for start and end of ASN1_ITEM definition */
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITEM_start(itname) \
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_GLOBAL const ASN1_ITEM itname##_it = {
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITEM_end(itname) \
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		};
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr()))
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macros for start and end of ASN1_ITEM definition */
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITEM_start(itname) \
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const ASN1_ITEM * itname##_it(void) \
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{ \
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		static const ASN1_ITEM local_it = {
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITEM_end(itname) \
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}; \
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return &local_it; \
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macros to aid ASN1 template writing */
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITEM_TEMPLATE(tname) \
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_TEMPLATE tname##_item_tt
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITEM_TEMPLATE_END(tname) \
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	;\
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_start(tname) \
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_ITYPE_PRIMITIVE,\
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		-1,\
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&tname##_item_tt,\
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		0,\
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		NULL,\
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		0,\
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		#tname \
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_end(tname)
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This is a ASN1 type which just embeds a template */
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This pair helps declare a SEQUENCE. We can do:
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	ASN1_SEQUENCE(stname) = {
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 		... SEQUENCE components ...
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	} ASN1_SEQUENCE_END(stname)
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	This will produce an ASN1_ITEM called stname_it
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	for a structure called stname.
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	If you want the same structure but a different
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	name then use:
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	ASN1_SEQUENCE(itname) = {
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 		... SEQUENCE components ...
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	} ASN1_SEQUENCE_END_name(stname, itname)
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	This will create an item called itname_it using
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	a structure called stname.
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE(tname) \
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_TEMPLATE tname##_seq_tt[]
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname)
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE_END_name(stname, tname) \
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	;\
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_start(tname) \
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_ITYPE_SEQUENCE,\
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		V_ASN1_SEQUENCE,\
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tname##_seq_tt,\
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		NULL,\
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(stname),\
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		#stname \
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_end(tname)
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_NDEF_SEQUENCE(tname) \
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_SEQUENCE(tname)
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_NDEF_SEQUENCE_cb(tname, cb) \
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_SEQUENCE_cb(tname, cb)
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE_cb(tname, cb) \
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_SEQUENCE(tname)
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_BROKEN_SEQUENCE(tname) \
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_SEQUENCE(tname)
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE_ref(tname, cb, lck) \
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_SEQUENCE(tname)
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE_enc(tname, enc, cb) \
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_SEQUENCE(tname)
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_NDEF_SEQUENCE_END(tname) \
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	;\
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_start(tname) \
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_ITYPE_NDEF_SEQUENCE,\
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		V_ASN1_SEQUENCE,\
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tname##_seq_tt,\
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		NULL,\
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(tname),\
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		#tname \
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_end(tname)
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname)
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE_END_ref(stname, tname) \
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	;\
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_start(tname) \
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_ITYPE_SEQUENCE,\
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		V_ASN1_SEQUENCE,\
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tname##_seq_tt,\
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&tname##_aux,\
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(stname),\
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		#stname \
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_end(tname)
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \
222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	;\
223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ASN1_ITEM_start(tname) \
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ASN1_ITYPE_NDEF_SEQUENCE,\
225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		V_ASN1_SEQUENCE,\
226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		tname##_seq_tt,\
227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		&tname##_aux,\
229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		sizeof(stname),\
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		#stname \
231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ASN1_ITEM_end(tname)
232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This pair helps declare a CHOICE type. We can do:
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	ASN1_CHOICE(chname) = {
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 		... CHOICE options ...
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	ASN1_CHOICE_END(chname)
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	This will produce an ASN1_ITEM called chname_it
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	for a structure called chname. The structure
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	definition must look like this:
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	typedef struct {
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *		int type;
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *		union {
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *			ASN1_SOMETHING *opt1;
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *			ASN1_SOMEOTHER *opt2;
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *		} value;
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	} chname;
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	the name of the selector must be 'type'.
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	to use an alternative selector name use the
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *      ASN1_CHOICE_END_selector() version.
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_CHOICE(tname) \
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_TEMPLATE tname##_ch_tt[]
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_CHOICE_cb(tname, cb) \
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_CHOICE(tname)
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname)
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type)
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_CHOICE_END_selector(stname, tname, selname) \
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	;\
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_start(tname) \
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_ITYPE_CHOICE,\
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		offsetof(stname,selname) ,\
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tname##_ch_tt,\
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		NULL,\
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(stname),\
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		#stname \
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_end(tname)
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_CHOICE_END_cb(stname, tname, selname) \
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	;\
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_start(tname) \
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_ITYPE_CHOICE,\
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		offsetof(stname,selname) ,\
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tname##_ch_tt,\
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&tname##_aux,\
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(stname),\
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		#stname \
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_end(tname)
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This helps with the template wrapper form of ASN1_ITEM */
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	(flags), (tag), 0,\
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#name, ASN1_ITEM_ref(type) }
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* These help with SEQUENCE or CHOICE components */
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* used to declare other types */
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_EX_TYPE(flags, tag, stname, field, type) { \
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	(flags), (tag), offsetof(stname, field),\
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#field, ASN1_ITEM_ref(type) }
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* used when the structure is combined with the parent */
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_EX_COMBINE(flags, tag, type) { \
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	(flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) }
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* implicit and explicit helper macros */
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_IMP_EX(stname, field, type, tag, ex) \
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type)
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_EXP_EX(stname, field, type, tag, ex) \
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type)
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Any defined by macros: the field used is in the table itself */
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb }
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb }
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Plain simple type */
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type)
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* OPTIONAL simple type */
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type)
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* IMPLICIT tagged simple type */
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0)
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* IMPLICIT tagged OPTIONAL simple type */
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Same as above but EXPLICIT */
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0)
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* SEQUENCE OF type */
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE_OF(stname, field, type) \
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type)
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* OPTIONAL SEQUENCE OF */
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SEQUENCE_OF_OPT(stname, field, type) \
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Same as above but for SET OF */
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SET_OF(stname, field, type) \
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type)
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_SET_OF_OPT(stname, field, type) \
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_IMP_SET_OF(stname, field, type, tag) \
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_EXP_SET_OF(stname, field, type, tag) \
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* EXPLICIT using indefinite length constructed form */
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_NDEF_EXP(stname, field, type, tag) \
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF)
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* EXPLICIT OPTIONAL using indefinite length constructed form */
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF)
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macros for the ASN1_ADB structure */
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ADB(name) \
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_ADB_TABLE name##_adbtbl[]
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ADB_END(name, flags, field, app_table, def, none) \
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	;\
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_ADB name##_adb = {\
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		flags,\
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		offsetof(name, field),\
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		app_table,\
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		name##_adbtbl,\
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		def,\
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		none\
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ADB_END(name, flags, field, app_table, def, none) \
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	;\
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_ITEM *name##_adb(void) \
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{ \
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_ADB internal_adb = \
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{\
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		flags,\
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		offsetof(name, field),\
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		app_table,\
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		name##_adbtbl,\
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		def,\
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		none\
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}; \
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return (const ASN1_ITEM *) &internal_adb; \
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} \
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void dummy_function(void)
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ADB_ENTRY(val, template) {val, template}
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ADB_TEMPLATE(name) \
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_TEMPLATE name##_tt
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This is the ASN1 template structure that defines
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * a wrapper round the actual type. It determines the
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * actual position of the field in the value structure,
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * various flags such as OPTIONAL and the field name.
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct ASN1_TEMPLATE_st {
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned long flags;		/* Various flags */
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong tag;			/* tag, not used if no tagging */
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned long offset;		/* Offset of this field in structure */
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef NO_ASN1_FIELD_NAMES
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char *field_name;		/* Field name */
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_ITEM_EXP *item;		/* Relevant ASN1_ITEM or ASN1_ADB */
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TEMPLATE_item(t) (t->item_ptr)
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TEMPLATE_adb(t) (t->item_ptr)
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE;
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct ASN1_ADB_st ASN1_ADB;
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct ASN1_ADB_st {
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long flags;	/* Various flags */
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long offset;	/* Offset of selector field */
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const ASN1_ADB_TABLE *tbl;	/* Table of possible types */
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long tblcount;		/* Number of entries in tbl */
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const ASN1_TEMPLATE *default_tt;  /* Type to use if no match */
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const ASN1_TEMPLATE *null_tt;  /* Type to use if selector is NULL */
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct ASN1_ADB_TABLE_st {
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long value;		/* NID for an object or value for an int */
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const ASN1_TEMPLATE tt;		/* item for this value */
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* template flags */
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Field is optional */
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_OPTIONAL	(0x1)
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Field is a SET OF */
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_SET_OF	(0x1 << 1)
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Field is a SEQUENCE OF */
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_SEQUENCE_OF	(0x2 << 1)
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Special case: this refers to a SET OF that
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * will be sorted into DER order when encoded *and*
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the corresponding STACK will be modified to match
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the new order.
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_SET_ORDER	(0x3 << 1)
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Mask for SET OF or SEQUENCE OF */
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_SK_MASK	(0x3 << 1)
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* These flags mean the tag should be taken from the
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * tag field. If EXPLICIT then the underlying type
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * is used for the inner tag.
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* IMPLICIT tagging */
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_IMPTAG	(0x1 << 3)
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* EXPLICIT tagging, inner tag from underlying type */
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_EXPTAG	(0x2 << 3)
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_TAG_MASK	(0x3 << 3)
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* context specific IMPLICIT */
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_IMPLICIT	ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* context specific EXPLICIT */
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_EXPLICIT	ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* If tagging is in force these determine the
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * type of tag to use. Otherwise the tag is
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * determined by the underlying type. These
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * values reflect the actual octet format.
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Universal tag */
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_UNIVERSAL	(0x0<<6)
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Application tag */
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_APPLICATION	(0x1<<6)
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Context specific tag */
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_CONTEXT	(0x2<<6)
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Private tag */
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_PRIVATE	(0x3<<6)
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_TAG_CLASS	(0x3<<6)
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* These are for ANY DEFINED BY type. In this case
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the 'item' field points to an ASN1_ADB structure
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * which contains a table of values to decode the
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * relevant type
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_ADB_MASK	(0x3<<8)
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_ADB_OID	(0x1<<8)
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_ADB_INT	(0x1<<9)
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This flag means a parent structure is passed
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * instead of the field: this is useful is a
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SEQUENCE is being combined with a CHOICE for
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * example. Since this means the structure and
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * item name will differ we need to use the
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ASN1_CHOICE_END_name() macro for example.
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_COMBINE	(0x1<<10)
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This flag when present in a SEQUENCE OF, SET OF
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * or EXPLICIT causes indefinite length constructed
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * encoding to be used if required.
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_TFLG_NDEF		(0x1<<11)
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This is the actual ASN1 item itself */
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct ASN1_ITEM_st {
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar itype;			/* The item type, primitive, SEQUENCE, CHOICE or extern */
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong utype;			/* underlying type */
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst ASN1_TEMPLATE *templates;	/* If SEQUENCE or CHOICE this contains the contents */
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong tcount;			/* Number of templates if SEQUENCE or CHOICE */
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst void *funcs;		/* functions that handle this type */
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong size;			/* Structure size (usually)*/
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef NO_ASN1_FIELD_NAMES
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char *sname;		/* Structure name */
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* These are values for the itype field and
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * determine how the type is interpreted.
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * For PRIMITIVE types the underlying type
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * determines the behaviour if items is NULL.
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Otherwise templates must contain a single
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * template and the type is treated in the
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * same way as the type specified in the template.
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * For SEQUENCE types the templates field points
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * to the members, the size field is the
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * structure size.
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * For CHOICE types the templates field points
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * to each possible member (typically a union)
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * and the 'size' field is the offset of the
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * selector.
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The 'funcs' field is used for application
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * specific functions.
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * For COMPAT types the funcs field gives a
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * set of functions that handle this type, this
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * supports the old d2i, i2d convention.
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The EXTERN type uses a new style d2i/i2d.
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The new style should be used where possible
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * because it avoids things like the d2i IMPLICIT
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * hack.
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * MSTRING is a multiple string type, it is used
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for a CHOICE of character strings where the
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * actual strings all occupy an ASN1_STRING
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * structure. In this case the 'utype' field
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * has a special meaning, it is used as a mask
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * of acceptable types using the B_ASN1 constants.
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NDEF_SEQUENCE is the same as SEQUENCE except
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * that it will use indefinite length constructed
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * encoding if requested.
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITYPE_PRIMITIVE		0x0
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITYPE_SEQUENCE		0x1
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITYPE_CHOICE		0x2
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITYPE_COMPAT		0x3
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITYPE_EXTERN		0x4
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITYPE_MSTRING		0x5
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_ITYPE_NDEF_SEQUENCE	0x6
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Cache for ASN1 tag and length, so we
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * don't keep re-reading it for things
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * like CHOICE
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct ASN1_TLC_st{
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char valid;	/* Values below are valid */
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;	/* return value */
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long plen;	/* length */
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ptag;	/* class value */
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int pclass;	/* class value */
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int hdrlen;	/* header length */
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Typedefs for ASN1 function pointers */
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef ASN1_VALUE * ASN1_new_func(void);
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef void ASN1_free_func(ASN1_VALUE *a);
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef ASN1_VALUE * ASN1_d2i_func(ASN1_VALUE **a, const unsigned char ** in, long length);
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef int ASN1_i2d_func(ASN1_VALUE * a, unsigned char **in);
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it,
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					int tag, int aclass, char opt, ASN1_TLC *ctx);
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass);
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it);
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it);
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
666221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromtypedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval,
667221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom						int indent, const char *fname,
668221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom						const ASN1_PCTX *pctx);
669221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it);
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);
672221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromtypedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent, const ASN1_PCTX *pctx);
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct ASN1_COMPAT_FUNCS_st {
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_new_func *asn1_new;
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_free_func *asn1_free;
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_d2i_func *asn1_d2i;
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_i2d_func *asn1_i2d;
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} ASN1_COMPAT_FUNCS;
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct ASN1_EXTERN_FUNCS_st {
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *app_data;
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ex_new_func *asn1_ex_new;
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ex_free_func *asn1_ex_free;
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ex_free_func *asn1_ex_clear;
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ex_d2i *asn1_ex_d2i;
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ex_i2d *asn1_ex_i2d;
688221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ASN1_ex_print_func *asn1_ex_print;
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} ASN1_EXTERN_FUNCS;
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct ASN1_PRIMITIVE_FUNCS_st {
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *app_data;
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long flags;
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ex_new_func *prim_new;
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ex_free_func *prim_free;
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ex_free_func *prim_clear;
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_primitive_c2i *prim_c2i;
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_primitive_i2c *prim_i2c;
699221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ASN1_primitive_print *prim_print;
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} ASN1_PRIMITIVE_FUNCS;
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This is the ASN1_AUX structure: it handles various
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * miscellaneous requirements. For example the use of
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * reference counts and an informational callback.
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The "informational callback" is called at various
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * points during the ASN1 encoding and decoding. It can
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * be used to provide minor customisation of the structures
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * used. This is most useful where the supplied routines
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * *almost* do the right thing but need some extra help
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * at a few points. If the callback returns zero then
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * it is assumed a fatal error has occurred and the
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * main operation should be abandoned.
714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If major changes in the default behaviour are required
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * then an external type is more appropriate.
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
719221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromtypedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it,
720221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				void *exarg);
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct ASN1_AUX_st {
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *app_data;
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int flags;
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ref_offset;		/* Offset of reference value */
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ref_lock;		/* Lock type to use */
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_aux_cb *asn1_cb;
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int enc_offset;		/* Offset of ASN1_ENCODING structure */
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} ASN1_AUX;
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
731221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* For print related callbacks exarg points to this structure */
732221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromtypedef struct ASN1_PRINT_ARG_st {
733221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	BIO *out;
734221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int indent;
735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const ASN1_PCTX *pctx;
736221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} ASN1_PRINT_ARG;
737221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
738221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* For streaming related callbacks exarg points to this structure */
739221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromtypedef struct ASN1_STREAM_ARG_st {
740221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* BIO to stream through */
741221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	BIO *out;
742221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* BIO with filters appended */
743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	BIO *ndef_bio;
744221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* Streaming I/O boundary */
745221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	unsigned char **boundary;
746221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} ASN1_STREAM_ARG;
747221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Flags in ASN1_AUX */
749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Use a reference count */
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_AFLG_REFCOUNT	1
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Save the encoding of structure (useful for signatures) */
753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_AFLG_ENCODING	2
754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The Sequence length is invalid */
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_AFLG_BROKEN	4
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* operation values for asn1_cb */
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_OP_NEW_PRE		0
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_OP_NEW_POST	1
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_OP_FREE_PRE	2
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_OP_FREE_POST	3
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_OP_D2I_PRE		4
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_OP_D2I_POST	5
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_OP_I2D_PRE		6
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ASN1_OP_I2D_POST	7
767221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define ASN1_OP_PRINT_PRE	8
768221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define ASN1_OP_PRINT_POST	9
769221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define ASN1_OP_STREAM_PRE	10
770221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define ASN1_OP_STREAM_POST	11
771221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define ASN1_OP_DETACHED_PRE	12
772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define ASN1_OP_DETACHED_POST	13
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macro to implement a primitive type */
775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0)
776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \
777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ASN1_ITEM_start(itname) \
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ASN1_ITEM_end(itname)
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macro to implement a multi string type */
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_MSTRING(itname, mask) \
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ASN1_ITEM_start(itname) \
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ASN1_ITEM_end(itname)
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macro to implement an ASN1_ITEM in terms of old style funcs */
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE)
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const ASN1_COMPAT_FUNCS sname##_ff = { \
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(ASN1_new_func *)sname##_new, \
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(ASN1_free_func *)sname##_free, \
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(ASN1_d2i_func *)d2i_##sname, \
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(ASN1_i2d_func *)i2d_##sname, \
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}; \
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_start(sname) \
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_ITYPE_COMPAT, \
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tag, \
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		NULL, \
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		0, \
803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&sname##_ff, \
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		0, \
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		#sname \
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_end(sname)
807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_start(sname) \
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_ITYPE_EXTERN, \
811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tag, \
812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		NULL, \
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		0, \
814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&fptrs, \
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		0, \
816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		#sname \
817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ASN1_ITEM_end(sname)
818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Macro to implement standard functions in terms of ASN1_ITEM structures */
820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname)
822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname)
824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \
826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname)
827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
828221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \
829221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname)
830221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname)
833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
834221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \
835221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pre stname *fname##_new(void) \
836221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{ \
837221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \
838221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	} \
839221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pre void fname##_free(stname *a) \
840221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{ \
841221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \
842221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
843221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \
845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	stname *fname##_new(void) \
846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{ \
847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \
848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} \
849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void fname##_free(stname *a) \
850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{ \
851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \
852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \
855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \
856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)
857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \
859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	stname *d2i_##fname(stname **a, const unsigned char **in, long len) \
860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{ \
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\
862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} \
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i2d_##fname(stname *a, unsigned char **out) \
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{ \
865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \
869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i2d_##stname##_NDEF(stname *a, unsigned char **out) \
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{ \
871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\
872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This includes evil casts to remove const: they will go away when full
875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ASN1 constification is done.
876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \
878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	stname *d2i_##fname(stname **a, const unsigned char **in, long len) \
879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{ \
880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\
881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} \
882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i2d_##fname(const stname *a, unsigned char **out) \
883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{ \
884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\
885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \
888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	stname * stname##_dup(stname *x) \
889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        { \
890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \
891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
893221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \
894221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname)
895221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
896221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \
897221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int fname##_print_ctx(BIO *out, stname *x, int indent, \
898221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom						const ASN1_PCTX *pctx) \
899221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{ \
900221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \
901221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ASN1_ITEM_rptr(itname), pctx); \
902221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
903221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_FUNCTIONS_const(name) \
905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name)
906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \
908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \
909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)
910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* external definitions for primitive types */
912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDECLARE_ASN1_ITEM(ASN1_BOOLEAN)
914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDECLARE_ASN1_ITEM(ASN1_TBOOLEAN)
915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDECLARE_ASN1_ITEM(ASN1_FBOOLEAN)
916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDECLARE_ASN1_ITEM(ASN1_SEQUENCE)
917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDECLARE_ASN1_ITEM(CBIGNUM)
918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDECLARE_ASN1_ITEM(BIGNUM)
919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDECLARE_ASN1_ITEM(LONG)
920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDECLARE_ASN1_ITEM(ZLONG)
921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDECLARE_STACK_OF(ASN1_VALUE)
923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Functions used internally by the ASN1 code */
925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_TEMPLATE *tt);
933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it,
934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				int tag, int aclass, char opt, ASN1_TLC *ctx);
935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass);
937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_TEMPLATE *tt);
938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it);
941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);
942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it);
944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint asn1_set_choice_selector(ASN1_VALUE **pval, int value, const ASN1_ITEM *it);
945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_VALUE ** asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, int nullerr);
949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it);
951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it);
953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, const ASN1_ITEM *it);
955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, const ASN1_ITEM *it);
956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef  __cplusplus
958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
961