1/* $OpenBSD: tasn_typ.c,v 1.18 2023/07/05 21:23:37 beck Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2000.
4 */
5/* ====================================================================
6 * Copyright (c) 2000 The OpenSSL Project.  All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in
17 *    the documentation and/or other materials provided with the
18 *    distribution.
19 *
20 * 3. All advertising materials mentioning features or use of this
21 *    software must display the following acknowledgment:
22 *    "This product includes software developed by the OpenSSL Project
23 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 *
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 *    endorse or promote products derived from this software without
27 *    prior written permission. For written permission, please contact
28 *    licensing@OpenSSL.org.
29 *
30 * 5. Products derived from this software may not be called "OpenSSL"
31 *    nor may "OpenSSL" appear in their names without prior written
32 *    permission of the OpenSSL Project.
33 *
34 * 6. Redistributions of any form whatsoever must retain the following
35 *    acknowledgment:
36 *    "This product includes software developed by the OpenSSL Project
37 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
52 *
53 * This product includes cryptographic software written by Eric Young
54 * (eay@cryptsoft.com).  This product includes software written by Tim
55 * Hudson (tjh@cryptsoft.com).
56 *
57 */
58#include <stdio.h>
59#include <openssl/asn1.h>
60#include <openssl/asn1t.h>
61
62/* Declarations for string types */
63
64const ASN1_ITEM ASN1_NULL_it = {
65	.itype = ASN1_ITYPE_PRIMITIVE,
66	.utype = V_ASN1_NULL,
67	.sname = "ASN1_NULL",
68};
69
70ASN1_NULL *
71d2i_ASN1_NULL(ASN1_NULL **a, const unsigned char **in, long len)
72{
73	return (ASN1_NULL *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
74	    &ASN1_NULL_it);
75}
76LCRYPTO_ALIAS(d2i_ASN1_NULL);
77
78int
79i2d_ASN1_NULL(ASN1_NULL *a, unsigned char **out)
80{
81	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_NULL_it);
82}
83LCRYPTO_ALIAS(i2d_ASN1_NULL);
84
85ASN1_NULL *
86ASN1_NULL_new(void)
87{
88	return (ASN1_NULL *)ASN1_item_new(&ASN1_NULL_it);
89}
90LCRYPTO_ALIAS(ASN1_NULL_new);
91
92void
93ASN1_NULL_free(ASN1_NULL *a)
94{
95	ASN1_item_free((ASN1_VALUE *)a, &ASN1_NULL_it);
96}
97LCRYPTO_ALIAS(ASN1_NULL_free);
98
99
100const ASN1_ITEM ASN1_UTF8STRING_it = {
101	.itype = ASN1_ITYPE_PRIMITIVE,
102	.utype = V_ASN1_UTF8STRING,
103	.sname = "ASN1_UTF8STRING",
104};
105
106ASN1_UTF8STRING *
107d2i_ASN1_UTF8STRING(ASN1_UTF8STRING **a, const unsigned char **in, long len)
108{
109	return (ASN1_UTF8STRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
110	    &ASN1_UTF8STRING_it);
111}
112LCRYPTO_ALIAS(d2i_ASN1_UTF8STRING);
113
114int
115i2d_ASN1_UTF8STRING(ASN1_UTF8STRING *a, unsigned char **out)
116{
117	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_UTF8STRING_it);
118}
119LCRYPTO_ALIAS(i2d_ASN1_UTF8STRING);
120
121ASN1_UTF8STRING *
122ASN1_UTF8STRING_new(void)
123{
124	return (ASN1_UTF8STRING *)ASN1_item_new(&ASN1_UTF8STRING_it);
125}
126LCRYPTO_ALIAS(ASN1_UTF8STRING_new);
127
128void
129ASN1_UTF8STRING_free(ASN1_UTF8STRING *a)
130{
131	ASN1_item_free((ASN1_VALUE *)a, &ASN1_UTF8STRING_it);
132}
133LCRYPTO_ALIAS(ASN1_UTF8STRING_free);
134
135
136const ASN1_ITEM ASN1_PRINTABLESTRING_it = {
137	.itype = ASN1_ITYPE_PRIMITIVE,
138	.utype = V_ASN1_PRINTABLESTRING,
139	.sname = "ASN1_PRINTABLESTRING",
140};
141
142ASN1_PRINTABLESTRING *
143d2i_ASN1_PRINTABLESTRING(ASN1_PRINTABLESTRING **a, const unsigned char **in,
144    long len)
145{
146	return (ASN1_PRINTABLESTRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
147	    &ASN1_PRINTABLESTRING_it);
148}
149LCRYPTO_ALIAS(d2i_ASN1_PRINTABLESTRING);
150
151int
152i2d_ASN1_PRINTABLESTRING(ASN1_PRINTABLESTRING *a, unsigned char **out)
153{
154	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_PRINTABLESTRING_it);
155}
156LCRYPTO_ALIAS(i2d_ASN1_PRINTABLESTRING);
157
158ASN1_PRINTABLESTRING *
159ASN1_PRINTABLESTRING_new(void)
160{
161	return (ASN1_PRINTABLESTRING *)ASN1_item_new(&ASN1_PRINTABLESTRING_it);
162}
163LCRYPTO_ALIAS(ASN1_PRINTABLESTRING_new);
164
165void
166ASN1_PRINTABLESTRING_free(ASN1_PRINTABLESTRING *a)
167{
168	ASN1_item_free((ASN1_VALUE *)a, &ASN1_PRINTABLESTRING_it);
169}
170LCRYPTO_ALIAS(ASN1_PRINTABLESTRING_free);
171
172
173const ASN1_ITEM ASN1_T61STRING_it = {
174	.itype = ASN1_ITYPE_PRIMITIVE,
175	.utype = V_ASN1_T61STRING,
176	.sname = "ASN1_T61STRING",
177};
178
179ASN1_T61STRING *
180d2i_ASN1_T61STRING(ASN1_T61STRING **a, const unsigned char **in, long len)
181{
182	return (ASN1_T61STRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
183	    &ASN1_T61STRING_it);
184}
185LCRYPTO_ALIAS(d2i_ASN1_T61STRING);
186
187int
188i2d_ASN1_T61STRING(ASN1_T61STRING *a, unsigned char **out)
189{
190	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_T61STRING_it);
191}
192LCRYPTO_ALIAS(i2d_ASN1_T61STRING);
193
194ASN1_T61STRING *
195ASN1_T61STRING_new(void)
196{
197	return (ASN1_T61STRING *)ASN1_item_new(&ASN1_T61STRING_it);
198}
199LCRYPTO_ALIAS(ASN1_T61STRING_new);
200
201void
202ASN1_T61STRING_free(ASN1_T61STRING *a)
203{
204	ASN1_item_free((ASN1_VALUE *)a, &ASN1_T61STRING_it);
205}
206LCRYPTO_ALIAS(ASN1_T61STRING_free);
207
208
209const ASN1_ITEM ASN1_IA5STRING_it = {
210	.itype = ASN1_ITYPE_PRIMITIVE,
211	.utype = V_ASN1_IA5STRING,
212	.sname = "ASN1_IA5STRING",
213};
214
215ASN1_IA5STRING *
216d2i_ASN1_IA5STRING(ASN1_IA5STRING **a, const unsigned char **in, long len)
217{
218	return (ASN1_IA5STRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
219	    &ASN1_IA5STRING_it);
220}
221LCRYPTO_ALIAS(d2i_ASN1_IA5STRING);
222
223int
224i2d_ASN1_IA5STRING(ASN1_IA5STRING *a, unsigned char **out)
225{
226	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_IA5STRING_it);
227}
228LCRYPTO_ALIAS(i2d_ASN1_IA5STRING);
229
230ASN1_IA5STRING *
231ASN1_IA5STRING_new(void)
232{
233	return (ASN1_IA5STRING *)ASN1_item_new(&ASN1_IA5STRING_it);
234}
235LCRYPTO_ALIAS(ASN1_IA5STRING_new);
236
237void
238ASN1_IA5STRING_free(ASN1_IA5STRING *a)
239{
240	ASN1_item_free((ASN1_VALUE *)a, &ASN1_IA5STRING_it);
241}
242LCRYPTO_ALIAS(ASN1_IA5STRING_free);
243
244
245const ASN1_ITEM ASN1_GENERALSTRING_it = {
246	.itype = ASN1_ITYPE_PRIMITIVE,
247	.utype = V_ASN1_GENERALSTRING,
248	.sname = "ASN1_GENERALSTRING",
249};
250
251ASN1_GENERALSTRING *
252d2i_ASN1_GENERALSTRING(ASN1_GENERALSTRING **a, const unsigned char **in,
253    long len)
254{
255	return (ASN1_GENERALSTRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
256	    &ASN1_GENERALSTRING_it);
257}
258LCRYPTO_ALIAS(d2i_ASN1_GENERALSTRING);
259
260int
261i2d_ASN1_GENERALSTRING(ASN1_GENERALSTRING *a, unsigned char **out)
262{
263	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_GENERALSTRING_it);
264}
265LCRYPTO_ALIAS(i2d_ASN1_GENERALSTRING);
266
267ASN1_GENERALSTRING *
268ASN1_GENERALSTRING_new(void)
269{
270	return (ASN1_GENERALSTRING *)ASN1_item_new(&ASN1_GENERALSTRING_it);
271}
272LCRYPTO_ALIAS(ASN1_GENERALSTRING_new);
273
274void
275ASN1_GENERALSTRING_free(ASN1_GENERALSTRING *a)
276{
277	ASN1_item_free((ASN1_VALUE *)a, &ASN1_GENERALSTRING_it);
278}
279LCRYPTO_ALIAS(ASN1_GENERALSTRING_free);
280
281
282const ASN1_ITEM ASN1_UTCTIME_it = {
283	.itype = ASN1_ITYPE_PRIMITIVE,
284	.utype = V_ASN1_UTCTIME,
285	.sname = "ASN1_UTCTIME",
286};
287
288ASN1_UTCTIME *
289d2i_ASN1_UTCTIME(ASN1_UTCTIME **a, const unsigned char **in, long len)
290{
291	return (ASN1_UTCTIME *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
292	    &ASN1_UTCTIME_it);
293}
294LCRYPTO_ALIAS(d2i_ASN1_UTCTIME);
295
296int
297i2d_ASN1_UTCTIME(ASN1_UTCTIME *a, unsigned char **out)
298{
299	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_UTCTIME_it);
300}
301LCRYPTO_ALIAS(i2d_ASN1_UTCTIME);
302
303ASN1_UTCTIME *
304ASN1_UTCTIME_new(void)
305{
306	return (ASN1_UTCTIME *)ASN1_item_new(&ASN1_UTCTIME_it);
307}
308LCRYPTO_ALIAS(ASN1_UTCTIME_new);
309
310void
311ASN1_UTCTIME_free(ASN1_UTCTIME *a)
312{
313	ASN1_item_free((ASN1_VALUE *)a, &ASN1_UTCTIME_it);
314}
315LCRYPTO_ALIAS(ASN1_UTCTIME_free);
316
317
318const ASN1_ITEM ASN1_GENERALIZEDTIME_it = {
319	.itype = ASN1_ITYPE_PRIMITIVE,
320	.utype = V_ASN1_GENERALIZEDTIME,
321	.sname = "ASN1_GENERALIZEDTIME",
322};
323
324ASN1_GENERALIZEDTIME *
325d2i_ASN1_GENERALIZEDTIME(ASN1_GENERALIZEDTIME **a, const unsigned char **in,
326    long len)
327{
328	return (ASN1_GENERALIZEDTIME *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
329	    &ASN1_GENERALIZEDTIME_it);
330}
331LCRYPTO_ALIAS(d2i_ASN1_GENERALIZEDTIME);
332
333int
334i2d_ASN1_GENERALIZEDTIME(ASN1_GENERALIZEDTIME *a, unsigned char **out)
335{
336	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_GENERALIZEDTIME_it);
337}
338LCRYPTO_ALIAS(i2d_ASN1_GENERALIZEDTIME);
339
340ASN1_GENERALIZEDTIME *
341ASN1_GENERALIZEDTIME_new(void)
342{
343	return (ASN1_GENERALIZEDTIME *)ASN1_item_new(&ASN1_GENERALIZEDTIME_it);
344}
345LCRYPTO_ALIAS(ASN1_GENERALIZEDTIME_new);
346
347void
348ASN1_GENERALIZEDTIME_free(ASN1_GENERALIZEDTIME *a)
349{
350	ASN1_item_free((ASN1_VALUE *)a, &ASN1_GENERALIZEDTIME_it);
351}
352LCRYPTO_ALIAS(ASN1_GENERALIZEDTIME_free);
353
354
355const ASN1_ITEM ASN1_VISIBLESTRING_it = {
356	.itype = ASN1_ITYPE_PRIMITIVE,
357	.utype = V_ASN1_VISIBLESTRING,
358	.sname = "ASN1_VISIBLESTRING",
359};
360
361ASN1_VISIBLESTRING *
362d2i_ASN1_VISIBLESTRING(ASN1_VISIBLESTRING **a, const unsigned char **in,
363    long len)
364{
365	return (ASN1_VISIBLESTRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
366	    &ASN1_VISIBLESTRING_it);
367}
368LCRYPTO_ALIAS(d2i_ASN1_VISIBLESTRING);
369
370int
371i2d_ASN1_VISIBLESTRING(ASN1_VISIBLESTRING *a, unsigned char **out)
372{
373	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_VISIBLESTRING_it);
374}
375LCRYPTO_ALIAS(i2d_ASN1_VISIBLESTRING);
376
377ASN1_VISIBLESTRING *
378ASN1_VISIBLESTRING_new(void)
379{
380	return (ASN1_VISIBLESTRING *)ASN1_item_new(&ASN1_VISIBLESTRING_it);
381}
382LCRYPTO_ALIAS(ASN1_VISIBLESTRING_new);
383
384void
385ASN1_VISIBLESTRING_free(ASN1_VISIBLESTRING *a)
386{
387	ASN1_item_free((ASN1_VALUE *)a, &ASN1_VISIBLESTRING_it);
388}
389LCRYPTO_ALIAS(ASN1_VISIBLESTRING_free);
390
391
392const ASN1_ITEM ASN1_UNIVERSALSTRING_it = {
393	.itype = ASN1_ITYPE_PRIMITIVE,
394	.utype = V_ASN1_UNIVERSALSTRING,
395	.sname = "ASN1_UNIVERSALSTRING",
396};
397
398ASN1_UNIVERSALSTRING *
399d2i_ASN1_UNIVERSALSTRING(ASN1_UNIVERSALSTRING **a, const unsigned char **in,
400    long len)
401{
402	return (ASN1_UNIVERSALSTRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
403	    &ASN1_UNIVERSALSTRING_it);
404}
405LCRYPTO_ALIAS(d2i_ASN1_UNIVERSALSTRING);
406
407int
408i2d_ASN1_UNIVERSALSTRING(ASN1_UNIVERSALSTRING *a, unsigned char **out)
409{
410	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_UNIVERSALSTRING_it);
411}
412LCRYPTO_ALIAS(i2d_ASN1_UNIVERSALSTRING);
413
414ASN1_UNIVERSALSTRING *
415ASN1_UNIVERSALSTRING_new(void)
416{
417	return (ASN1_UNIVERSALSTRING *)ASN1_item_new(&ASN1_UNIVERSALSTRING_it);
418}
419LCRYPTO_ALIAS(ASN1_UNIVERSALSTRING_new);
420
421void
422ASN1_UNIVERSALSTRING_free(ASN1_UNIVERSALSTRING *a)
423{
424	ASN1_item_free((ASN1_VALUE *)a, &ASN1_UNIVERSALSTRING_it);
425}
426LCRYPTO_ALIAS(ASN1_UNIVERSALSTRING_free);
427
428
429const ASN1_ITEM ASN1_BMPSTRING_it = {
430	.itype = ASN1_ITYPE_PRIMITIVE,
431	.utype = V_ASN1_BMPSTRING,
432	.sname = "ASN1_BMPSTRING",
433};
434
435ASN1_BMPSTRING *
436d2i_ASN1_BMPSTRING(ASN1_BMPSTRING **a, const unsigned char **in, long len)
437{
438	return (ASN1_BMPSTRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
439	    &ASN1_BMPSTRING_it);
440}
441LCRYPTO_ALIAS(d2i_ASN1_BMPSTRING);
442
443int
444i2d_ASN1_BMPSTRING(ASN1_BMPSTRING *a, unsigned char **out)
445{
446	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_BMPSTRING_it);
447}
448LCRYPTO_ALIAS(i2d_ASN1_BMPSTRING);
449
450ASN1_BMPSTRING *
451ASN1_BMPSTRING_new(void)
452{
453	return (ASN1_BMPSTRING *)ASN1_item_new(&ASN1_BMPSTRING_it);
454}
455LCRYPTO_ALIAS(ASN1_BMPSTRING_new);
456
457void
458ASN1_BMPSTRING_free(ASN1_BMPSTRING *a)
459{
460	ASN1_item_free((ASN1_VALUE *)a, &ASN1_BMPSTRING_it);
461}
462LCRYPTO_ALIAS(ASN1_BMPSTRING_free);
463
464const ASN1_ITEM ASN1_ANY_it = {
465	.itype = ASN1_ITYPE_PRIMITIVE,
466	.utype = V_ASN1_ANY,
467	.sname = "ASN1_ANY",
468};
469
470
471/* Just swallow an ASN1_SEQUENCE in an ASN1_STRING */
472
473const ASN1_ITEM ASN1_SEQUENCE_it = {
474	.itype = ASN1_ITYPE_PRIMITIVE,
475	.utype = V_ASN1_SEQUENCE,
476	.sname = "ASN1_SEQUENCE",
477};
478
479
480/* Multistring types */
481
482
483const ASN1_ITEM ASN1_PRINTABLE_it = {
484	.itype = ASN1_ITYPE_MSTRING,
485	.utype = B_ASN1_PRINTABLE,
486	.templates = NULL,
487	.tcount = 0,
488	.funcs = NULL,
489	.size = sizeof(ASN1_STRING),
490	.sname = "ASN1_PRINTABLE",
491};
492
493ASN1_STRING *
494d2i_ASN1_PRINTABLE(ASN1_STRING **a, const unsigned char **in, long len)
495{
496	return (ASN1_STRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
497	    &ASN1_PRINTABLE_it);
498}
499LCRYPTO_ALIAS(d2i_ASN1_PRINTABLE);
500
501int
502i2d_ASN1_PRINTABLE(ASN1_STRING *a, unsigned char **out)
503{
504	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_PRINTABLE_it);
505}
506LCRYPTO_ALIAS(i2d_ASN1_PRINTABLE);
507
508ASN1_STRING *
509ASN1_PRINTABLE_new(void)
510{
511	return (ASN1_STRING *)ASN1_item_new(&ASN1_PRINTABLE_it);
512}
513LCRYPTO_ALIAS(ASN1_PRINTABLE_new);
514
515void
516ASN1_PRINTABLE_free(ASN1_STRING *a)
517{
518	ASN1_item_free((ASN1_VALUE *)a, &ASN1_PRINTABLE_it);
519}
520LCRYPTO_ALIAS(ASN1_PRINTABLE_free);
521
522
523const ASN1_ITEM DISPLAYTEXT_it = {
524	.itype = ASN1_ITYPE_MSTRING,
525	.utype = B_ASN1_DISPLAYTEXT,
526	.templates = NULL,
527	.tcount = 0,
528	.funcs = NULL,
529	.size = sizeof(ASN1_STRING),
530	.sname = "DISPLAYTEXT",
531};
532
533ASN1_STRING *
534d2i_DISPLAYTEXT(ASN1_STRING **a, const unsigned char **in, long len)
535{
536	return (ASN1_STRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
537	    &DISPLAYTEXT_it);
538}
539LCRYPTO_ALIAS(d2i_DISPLAYTEXT);
540
541int
542i2d_DISPLAYTEXT(ASN1_STRING *a, unsigned char **out)
543{
544	return ASN1_item_i2d((ASN1_VALUE *)a, out, &DISPLAYTEXT_it);
545}
546LCRYPTO_ALIAS(i2d_DISPLAYTEXT);
547
548ASN1_STRING *
549DISPLAYTEXT_new(void)
550{
551	return (ASN1_STRING *)ASN1_item_new(&DISPLAYTEXT_it);
552}
553LCRYPTO_ALIAS(DISPLAYTEXT_new);
554
555void
556DISPLAYTEXT_free(ASN1_STRING *a)
557{
558	ASN1_item_free((ASN1_VALUE *)a, &DISPLAYTEXT_it);
559}
560LCRYPTO_ALIAS(DISPLAYTEXT_free);
561
562
563const ASN1_ITEM DIRECTORYSTRING_it = {
564	.itype = ASN1_ITYPE_MSTRING,
565	.utype = B_ASN1_DIRECTORYSTRING,
566	.templates = NULL,
567	.tcount = 0,
568	.funcs = NULL,
569	.size = sizeof(ASN1_STRING),
570	.sname = "DIRECTORYSTRING",
571};
572
573ASN1_STRING *
574d2i_DIRECTORYSTRING(ASN1_STRING **a, const unsigned char **in, long len)
575{
576	return (ASN1_STRING *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
577	    &DIRECTORYSTRING_it);
578}
579LCRYPTO_ALIAS(d2i_DIRECTORYSTRING);
580
581int
582i2d_DIRECTORYSTRING(ASN1_STRING *a, unsigned char **out)
583{
584	return ASN1_item_i2d((ASN1_VALUE *)a, out, &DIRECTORYSTRING_it);
585}
586LCRYPTO_ALIAS(i2d_DIRECTORYSTRING);
587
588ASN1_STRING *
589DIRECTORYSTRING_new(void)
590{
591	return (ASN1_STRING *)ASN1_item_new(&DIRECTORYSTRING_it);
592}
593LCRYPTO_ALIAS(DIRECTORYSTRING_new);
594
595void
596DIRECTORYSTRING_free(ASN1_STRING *a)
597{
598	ASN1_item_free((ASN1_VALUE *)a, &DIRECTORYSTRING_it);
599}
600LCRYPTO_ALIAS(DIRECTORYSTRING_free);
601
602/* Three separate BOOLEAN type: normal, DEFAULT TRUE and DEFAULT FALSE */
603
604const ASN1_ITEM ASN1_BOOLEAN_it = {
605	.itype = ASN1_ITYPE_PRIMITIVE,
606	.utype = V_ASN1_BOOLEAN,
607	.size = -1,
608	.sname = "ASN1_BOOLEAN",
609};
610
611int
612i2d_ASN1_BOOLEAN(int a, unsigned char **out)
613{
614	return ASN1_item_ex_i2d((ASN1_VALUE **)&a, out,
615	    &ASN1_BOOLEAN_it, -1, 0);
616}
617
618int
619d2i_ASN1_BOOLEAN(int *a, const unsigned char **in, long len)
620{
621	ASN1_BOOLEAN abool;
622
623	if (ASN1_item_ex_d2i((ASN1_VALUE **)&abool, in, len, &ASN1_BOOLEAN_it,
624	    -1, 0, 0, NULL) <= 0)
625		return -1;
626
627	if (a != NULL)
628		*a = abool;
629
630	return abool;
631}
632
633const ASN1_ITEM ASN1_TBOOLEAN_it = {
634	.itype = ASN1_ITYPE_PRIMITIVE,
635	.utype = V_ASN1_BOOLEAN,
636	.size = 1,
637	.sname = "ASN1_TBOOLEAN",
638};
639
640const ASN1_ITEM ASN1_FBOOLEAN_it = {
641	.itype = ASN1_ITYPE_PRIMITIVE,
642	.utype = V_ASN1_BOOLEAN,
643	.size = 0,
644	.sname = "ASN1_FBOOLEAN",
645};
646
647/* Special, OCTET STRING with indefinite length constructed support */
648
649const ASN1_ITEM ASN1_OCTET_STRING_NDEF_it = {
650	.itype = ASN1_ITYPE_PRIMITIVE,
651	.utype = V_ASN1_OCTET_STRING,
652	.size = ASN1_TFLG_NDEF,
653	.sname = "ASN1_OCTET_STRING_NDEF",
654};
655
656static const ASN1_TEMPLATE ASN1_SEQUENCE_ANY_item_tt = {
657	.flags = ASN1_TFLG_SEQUENCE_OF,
658	.tag = 0,
659	.offset = 0,
660	.field_name = "ASN1_SEQUENCE_ANY",
661	.item = &ASN1_ANY_it,
662};
663
664const ASN1_ITEM ASN1_SEQUENCE_ANY_it = {
665	.itype = ASN1_ITYPE_PRIMITIVE,
666	.utype = -1,
667	.templates = &ASN1_SEQUENCE_ANY_item_tt,
668	.tcount = 0,
669	.funcs = NULL,
670	.size = 0,
671	.sname = "ASN1_SEQUENCE_ANY",
672};
673
674static const ASN1_TEMPLATE ASN1_SET_ANY_item_tt = {
675	.flags = ASN1_TFLG_SET_OF,
676	.tag = 0,
677	.offset = 0,
678	.field_name = "ASN1_SET_ANY",
679	.item = &ASN1_ANY_it,
680};
681
682const ASN1_ITEM ASN1_SET_ANY_it = {
683	.itype = ASN1_ITYPE_PRIMITIVE,
684	.utype = -1,
685	.templates = &ASN1_SET_ANY_item_tt,
686	.tcount = 0,
687	.funcs = NULL,
688	.size = 0,
689	.sname = "ASN1_SET_ANY",
690};
691
692
693ASN1_SEQUENCE_ANY *
694d2i_ASN1_SEQUENCE_ANY(ASN1_SEQUENCE_ANY **a, const unsigned char **in, long len)
695{
696	return (ASN1_SEQUENCE_ANY *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
697	    &ASN1_SEQUENCE_ANY_it);
698}
699LCRYPTO_ALIAS(d2i_ASN1_SEQUENCE_ANY);
700
701int
702i2d_ASN1_SEQUENCE_ANY(const ASN1_SEQUENCE_ANY *a, unsigned char **out)
703{
704	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_SEQUENCE_ANY_it);
705}
706LCRYPTO_ALIAS(i2d_ASN1_SEQUENCE_ANY);
707
708ASN1_SEQUENCE_ANY *
709d2i_ASN1_SET_ANY(ASN1_SEQUENCE_ANY **a, const unsigned char **in, long len)
710{
711	return (ASN1_SEQUENCE_ANY *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
712	    &ASN1_SET_ANY_it);
713}
714LCRYPTO_ALIAS(d2i_ASN1_SET_ANY);
715
716int
717i2d_ASN1_SET_ANY(const ASN1_SEQUENCE_ANY *a, unsigned char **out)
718{
719	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ASN1_SET_ANY_it);
720}
721LCRYPTO_ALIAS(i2d_ASN1_SET_ANY);
722