1/*
2 * Copyright (c) 2003-2004,2008,2010 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 *
23 * SecAsn1Templates.c - Common ASN1 templates for use with libsecurity_asn1.
24 */
25
26#include "secasn1t.h"
27#include "seccomon.h"
28#include <stddef.h>
29
30/*
31 * Generic templates for individual/simple items and pointers to
32 * and sets of same.
33 *
34 * If you need to add a new one, please note the following:
35 *	 - For each new basic type you should add *four* templates:
36 *	one plain, one PointerTo, one SequenceOf and one SetOf.
37 *	 - If the new type can be constructed (meaning, it is a
38 *	*string* type according to BER/DER rules), then you should
39 *	or-in SEC_ASN1_MAY_STREAM to the type in the basic template.
40 *	See the definition of the OctetString template for an example.
41 *	 - It may not be obvious, but these are in *alphabetical*
42 *	order based on the SEC_ASN1_XXX name; so put new ones in
43 *	the appropriate place.
44 */
45
46const SecAsn1Template kSecAsn1AnyTemplate[] = {
47    { SEC_ASN1_ANY | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) }
48};
49
50const SecAsn1Template kSecAsn1PointerToAnyTemplate[] = {
51    { SEC_ASN1_POINTER, 0, kSecAsn1AnyTemplate }
52};
53
54const SecAsn1Template kSecAsn1SequenceOfAnyTemplate[] = {
55    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1AnyTemplate }
56};
57
58const SecAsn1Template kSecAsn1SetOfAnyTemplate[] = {
59    { SEC_ASN1_SET_OF, 0, kSecAsn1AnyTemplate }
60};
61
62const SecAsn1Template kSecAsn1BitStringTemplate[] = {
63    { SEC_ASN1_BIT_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) }
64};
65
66const SecAsn1Template kSecAsn1PointerToBitStringTemplate[] = {
67    { SEC_ASN1_POINTER, 0, kSecAsn1BitStringTemplate }
68};
69
70const SecAsn1Template kSecAsn1SequenceOfBitStringTemplate[] = {
71    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1BitStringTemplate }
72};
73
74const SecAsn1Template kSecAsn1SetOfBitStringTemplate[] = {
75    { SEC_ASN1_SET_OF, 0, kSecAsn1BitStringTemplate }
76};
77
78const SecAsn1Template kSecAsn1BMPStringTemplate[] = {
79    { SEC_ASN1_BMP_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) }
80};
81
82const SecAsn1Template kSecAsn1PointerToBMPStringTemplate[] = {
83    { SEC_ASN1_POINTER, 0, kSecAsn1BMPStringTemplate }
84};
85
86const SecAsn1Template kSecAsn1SequenceOfBMPStringTemplate[] = {
87    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1BMPStringTemplate }
88};
89
90const SecAsn1Template kSecAsn1SetOfBMPStringTemplate[] = {
91    { SEC_ASN1_SET_OF, 0, kSecAsn1BMPStringTemplate }
92};
93
94const SecAsn1Template kSecAsn1BooleanTemplate[] = {
95    { SEC_ASN1_BOOLEAN, 0, NULL, sizeof(SecAsn1Item) }
96};
97
98const SecAsn1Template kSecAsn1PointerToBooleanTemplate[] = {
99    { SEC_ASN1_POINTER, 0, kSecAsn1BooleanTemplate }
100};
101
102const SecAsn1Template kSecAsn1SequenceOfBooleanTemplate[] = {
103    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1BooleanTemplate }
104};
105
106const SecAsn1Template kSecAsn1SetOfBooleanTemplate[] = {
107    { SEC_ASN1_SET_OF, 0, kSecAsn1BooleanTemplate }
108};
109
110const SecAsn1Template kSecAsn1EnumeratedTemplate[] = {
111    { SEC_ASN1_ENUMERATED, 0, NULL, sizeof(SecAsn1Item) }
112};
113
114const SecAsn1Template kSecAsn1PointerToEnumeratedTemplate[] = {
115    { SEC_ASN1_POINTER, 0, kSecAsn1EnumeratedTemplate }
116};
117
118const SecAsn1Template kSecAsn1SequenceOfEnumeratedTemplate[] = {
119    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1EnumeratedTemplate }
120};
121
122const SecAsn1Template kSecAsn1SetOfEnumeratedTemplate[] = {
123    { SEC_ASN1_SET_OF, 0, kSecAsn1EnumeratedTemplate }
124};
125
126const SecAsn1Template kSecAsn1GeneralizedTimeTemplate[] = {
127    { SEC_ASN1_GENERALIZED_TIME | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item)}
128};
129
130const SecAsn1Template kSecAsn1PointerToGeneralizedTimeTemplate[] = {
131    { SEC_ASN1_POINTER, 0, kSecAsn1GeneralizedTimeTemplate }
132};
133
134const SecAsn1Template kSecAsn1SequenceOfGeneralizedTimeTemplate[] = {
135    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1GeneralizedTimeTemplate }
136};
137
138const SecAsn1Template kSecAsn1SetOfGeneralizedTimeTemplate[] = {
139    { SEC_ASN1_SET_OF, 0, kSecAsn1GeneralizedTimeTemplate }
140};
141
142const SecAsn1Template kSecAsn1IA5StringTemplate[] = {
143    { SEC_ASN1_IA5_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) }
144};
145
146const SecAsn1Template kSecAsn1PointerToIA5StringTemplate[] = {
147    { SEC_ASN1_POINTER, 0, kSecAsn1IA5StringTemplate }
148};
149
150const SecAsn1Template kSecAsn1SequenceOfIA5StringTemplate[] = {
151    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1IA5StringTemplate }
152};
153
154const SecAsn1Template kSecAsn1SetOfIA5StringTemplate[] = {
155    { SEC_ASN1_SET_OF, 0, kSecAsn1IA5StringTemplate }
156};
157
158const SecAsn1Template kSecAsn1IntegerTemplate[] = {
159    { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT, 0, NULL, sizeof(SecAsn1Item) }
160};
161
162const SecAsn1Template kSecAsn1UnsignedIntegerTemplate[] = {
163    { SEC_ASN1_INTEGER, 0, NULL, sizeof(SecAsn1Item) }
164};
165
166const SecAsn1Template kSecAsn1PointerToIntegerTemplate[] = {
167    { SEC_ASN1_POINTER, 0, kSecAsn1IntegerTemplate }
168};
169
170const SecAsn1Template kSecAsn1SequenceOfIntegerTemplate[] = {
171    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1IntegerTemplate }
172};
173
174const SecAsn1Template kSecAsn1SetOfIntegerTemplate[] = {
175    { SEC_ASN1_SET_OF, 0, kSecAsn1IntegerTemplate }
176};
177
178const SecAsn1Template kSecAsn1NullTemplate[] = {
179    { SEC_ASN1_NULL, 0, NULL, sizeof(SecAsn1Item) }
180};
181
182const SecAsn1Template kSecAsn1PointerToNullTemplate[] = {
183    { SEC_ASN1_POINTER, 0, kSecAsn1NullTemplate }
184};
185
186const SecAsn1Template kSecAsn1SequenceOfNullTemplate[] = {
187    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1NullTemplate }
188};
189
190const SecAsn1Template kSecAsn1SetOfNullTemplate[] = {
191    { SEC_ASN1_SET_OF, 0, kSecAsn1NullTemplate }
192};
193
194const SecAsn1Template kSecAsn1ObjectIDTemplate[] = {
195    { SEC_ASN1_OBJECT_ID, 0, NULL, sizeof(SecAsn1Item) }
196};
197
198const SecAsn1Template kSecAsn1PointerToObjectIDTemplate[] = {
199    { SEC_ASN1_POINTER, 0, kSecAsn1ObjectIDTemplate }
200};
201
202const SecAsn1Template kSecAsn1SequenceOfObjectIDTemplate[] = {
203    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1ObjectIDTemplate }
204};
205
206const SecAsn1Template kSecAsn1SetOfObjectIDTemplate[] = {
207    { SEC_ASN1_SET_OF, 0, kSecAsn1ObjectIDTemplate }
208};
209
210const SecAsn1Template kSecAsn1OctetStringTemplate[] = {
211    { SEC_ASN1_OCTET_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) }
212};
213
214const SecAsn1Template kSecAsn1PointerToOctetStringTemplate[] = {
215    { SEC_ASN1_POINTER | SEC_ASN1_MAY_STREAM, 0, kSecAsn1OctetStringTemplate }
216};
217
218const SecAsn1Template kSecAsn1SequenceOfOctetStringTemplate[] = {
219    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1OctetStringTemplate }
220};
221
222const SecAsn1Template kSecAsn1SetOfOctetStringTemplate[] = {
223    { SEC_ASN1_SET_OF, 0, kSecAsn1OctetStringTemplate }
224};
225
226const SecAsn1Template kSecAsn1PrintableStringTemplate[] = {
227    { SEC_ASN1_PRINTABLE_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item)}
228};
229
230const SecAsn1Template kSecAsn1PointerToPrintableStringTemplate[] = {
231    { SEC_ASN1_POINTER, 0, kSecAsn1PrintableStringTemplate }
232};
233
234const SecAsn1Template kSecAsn1SequenceOfPrintableStringTemplate[] = {
235    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1PrintableStringTemplate }
236};
237
238const SecAsn1Template kSecAsn1SetOfPrintableStringTemplate[] = {
239    { SEC_ASN1_SET_OF, 0, kSecAsn1PrintableStringTemplate }
240};
241
242#ifdef	__APPLE__
243const SecAsn1Template kSecAsn1TeletexStringTemplate[] = {
244    { SEC_ASN1_TELETEX_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item)}
245};
246
247const SecAsn1Template kSecAsn1PointerToTeletexStringTemplate[] = {
248    { SEC_ASN1_POINTER, 0, kSecAsn1TeletexStringTemplate }
249};
250
251const SecAsn1Template kSecAsn1SequenceOfTeletexStringTemplate[] = {
252    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1TeletexStringTemplate }
253};
254
255const SecAsn1Template kSecAsn1SetOfTeletexStringTemplate[] = {
256    { SEC_ASN1_SET_OF, 0, kSecAsn1TeletexStringTemplate }
257};
258#endif	/* __APPLE__ */
259
260const SecAsn1Template kSecAsn1T61StringTemplate[] = {
261    { SEC_ASN1_T61_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) }
262};
263
264const SecAsn1Template kSecAsn1PointerToT61StringTemplate[] = {
265    { SEC_ASN1_POINTER, 0, kSecAsn1T61StringTemplate }
266};
267
268const SecAsn1Template kSecAsn1SequenceOfT61StringTemplate[] = {
269    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1T61StringTemplate }
270};
271
272const SecAsn1Template kSecAsn1SetOfT61StringTemplate[] = {
273    { SEC_ASN1_SET_OF, 0, kSecAsn1T61StringTemplate }
274};
275
276const SecAsn1Template kSecAsn1UniversalStringTemplate[] = {
277    { SEC_ASN1_UNIVERSAL_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item)}
278};
279
280const SecAsn1Template kSecAsn1PointerToUniversalStringTemplate[] = {
281    { SEC_ASN1_POINTER, 0, kSecAsn1UniversalStringTemplate }
282};
283
284const SecAsn1Template kSecAsn1SequenceOfUniversalStringTemplate[] = {
285    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1UniversalStringTemplate }
286};
287
288const SecAsn1Template kSecAsn1SetOfUniversalStringTemplate[] = {
289    { SEC_ASN1_SET_OF, 0, kSecAsn1UniversalStringTemplate }
290};
291
292const SecAsn1Template kSecAsn1UTCTimeTemplate[] = {
293    { SEC_ASN1_UTC_TIME | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) }
294};
295
296const SecAsn1Template kSecAsn1PointerToUTCTimeTemplate[] = {
297    { SEC_ASN1_POINTER, 0, kSecAsn1UTCTimeTemplate }
298};
299
300const SecAsn1Template kSecAsn1SequenceOfUTCTimeTemplate[] = {
301    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1UTCTimeTemplate }
302};
303
304const SecAsn1Template kSecAsn1SetOfUTCTimeTemplate[] = {
305    { SEC_ASN1_SET_OF, 0, kSecAsn1UTCTimeTemplate }
306};
307
308const SecAsn1Template kSecAsn1UTF8StringTemplate[] = {
309    { SEC_ASN1_UTF8_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item)}
310};
311
312const SecAsn1Template kSecAsn1PointerToUTF8StringTemplate[] = {
313    { SEC_ASN1_POINTER, 0, kSecAsn1UTF8StringTemplate }
314};
315
316const SecAsn1Template kSecAsn1SequenceOfUTF8StringTemplate[] = {
317    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1UTF8StringTemplate }
318};
319
320const SecAsn1Template kSecAsn1SetOfUTF8StringTemplate[] = {
321    { SEC_ASN1_SET_OF, 0, kSecAsn1UTF8StringTemplate }
322};
323
324const SecAsn1Template kSecAsn1VisibleStringTemplate[] = {
325    { SEC_ASN1_VISIBLE_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) }
326};
327
328const SecAsn1Template kSecAsn1PointerToVisibleStringTemplate[] = {
329    { SEC_ASN1_POINTER, 0, kSecAsn1VisibleStringTemplate }
330};
331
332const SecAsn1Template kSecAsn1SequenceOfVisibleStringTemplate[] = {
333    { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1VisibleStringTemplate }
334};
335
336const SecAsn1Template kSecAsn1SetOfVisibleStringTemplate[] = {
337    { SEC_ASN1_SET_OF, 0, kSecAsn1VisibleStringTemplate }
338};
339
340
341/*
342 * Template for skipping a subitem.
343 *
344 * Note that it only makes sense to use this for decoding (when you want
345 * to decode something where you are only interested in one or two of
346 * the fields); you cannot encode a SKIP!
347 */
348const SecAsn1Template kSecAsn1SkipTemplate[] = {
349    { SEC_ASN1_SKIP }
350};
351
352#ifndef __APPLE__
353
354/* These functions simply return the address of the above-declared templates.
355** This is necessary for Windows DLLs.  Sigh.
356*/
357SEC_ASN1_CHOOSER_IMPLEMENT(SEC_AnyTemplate)
358SEC_ASN1_CHOOSER_IMPLEMENT(SEC_BMPStringTemplate)
359SEC_ASN1_CHOOSER_IMPLEMENT(SEC_BooleanTemplate)
360SEC_ASN1_CHOOSER_IMPLEMENT(SEC_BitStringTemplate)
361SEC_ASN1_CHOOSER_IMPLEMENT(SEC_IA5StringTemplate)
362SEC_ASN1_CHOOSER_IMPLEMENT(SEC_GeneralizedTimeTemplate)
363SEC_ASN1_CHOOSER_IMPLEMENT(SEC_IntegerTemplate)
364SEC_ASN1_CHOOSER_IMPLEMENT(SEC_NullTemplate)
365SEC_ASN1_CHOOSER_IMPLEMENT(SEC_ObjectIDTemplate)
366SEC_ASN1_CHOOSER_IMPLEMENT(SEC_OctetStringTemplate)
367SEC_ASN1_CHOOSER_IMPLEMENT(SEC_PointerToAnyTemplate)
368SEC_ASN1_CHOOSER_IMPLEMENT(SEC_PointerToOctetStringTemplate)
369SEC_ASN1_CHOOSER_IMPLEMENT(SEC_SetOfAnyTemplate)
370SEC_ASN1_CHOOSER_IMPLEMENT(SEC_UTCTimeTemplate)
371SEC_ASN1_CHOOSER_IMPLEMENT(SEC_UTF8StringTemplate)
372
373#endif  /* __APPLE__ */
374