xref: /openbsd-src/lib/libcrypto/ts/ts_asn1.c (revision f7b261b1f50c38773e4181cb3b993da49b7dc6b6)
1*f7b261b1Stb /* $OpenBSD: ts_asn1.c,v 1.15 2024/04/15 15:52:46 tb Exp $ */
2f1535dc8Sdjm /* Written by Nils Larsch for the OpenSSL project 2004.
3f1535dc8Sdjm  */
4f1535dc8Sdjm /* ====================================================================
5f1535dc8Sdjm  * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
6f1535dc8Sdjm  *
7f1535dc8Sdjm  * Redistribution and use in source and binary forms, with or without
8f1535dc8Sdjm  * modification, are permitted provided that the following conditions
9f1535dc8Sdjm  * are met:
10f1535dc8Sdjm  *
11f1535dc8Sdjm  * 1. Redistributions of source code must retain the above copyright
12f1535dc8Sdjm  *    notice, this list of conditions and the following disclaimer.
13f1535dc8Sdjm  *
14f1535dc8Sdjm  * 2. Redistributions in binary form must reproduce the above copyright
15f1535dc8Sdjm  *    notice, this list of conditions and the following disclaimer in
16f1535dc8Sdjm  *    the documentation and/or other materials provided with the
17f1535dc8Sdjm  *    distribution.
18f1535dc8Sdjm  *
19f1535dc8Sdjm  * 3. All advertising materials mentioning features or use of this
20f1535dc8Sdjm  *    software must display the following acknowledgment:
21f1535dc8Sdjm  *    "This product includes software developed by the OpenSSL Project
22f1535dc8Sdjm  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
23f1535dc8Sdjm  *
24f1535dc8Sdjm  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
25f1535dc8Sdjm  *    endorse or promote products derived from this software without
26f1535dc8Sdjm  *    prior written permission. For written permission, please contact
27f1535dc8Sdjm  *    licensing@OpenSSL.org.
28f1535dc8Sdjm  *
29f1535dc8Sdjm  * 5. Products derived from this software may not be called "OpenSSL"
30f1535dc8Sdjm  *    nor may "OpenSSL" appear in their names without prior written
31f1535dc8Sdjm  *    permission of the OpenSSL Project.
32f1535dc8Sdjm  *
33f1535dc8Sdjm  * 6. Redistributions of any form whatsoever must retain the following
34f1535dc8Sdjm  *    acknowledgment:
35f1535dc8Sdjm  *    "This product includes software developed by the OpenSSL Project
36f1535dc8Sdjm  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
37f1535dc8Sdjm  *
38f1535dc8Sdjm  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
39f1535dc8Sdjm  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40f1535dc8Sdjm  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
41f1535dc8Sdjm  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
42f1535dc8Sdjm  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43f1535dc8Sdjm  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44f1535dc8Sdjm  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45f1535dc8Sdjm  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46f1535dc8Sdjm  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
47f1535dc8Sdjm  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48f1535dc8Sdjm  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
49f1535dc8Sdjm  * OF THE POSSIBILITY OF SUCH DAMAGE.
50f1535dc8Sdjm  * ====================================================================
51f1535dc8Sdjm  *
52f1535dc8Sdjm  * This product includes cryptographic software written by Eric Young
53f1535dc8Sdjm  * (eay@cryptsoft.com).  This product includes software written by Tim
54f1535dc8Sdjm  * Hudson (tjh@cryptsoft.com).
55f1535dc8Sdjm  *
56f1535dc8Sdjm  */
57f1535dc8Sdjm 
588cf4d6a6Sjsing #include <openssl/opensslconf.h>
598cf4d6a6Sjsing 
60f1535dc8Sdjm #include <openssl/ts.h>
61f1535dc8Sdjm #include <openssl/err.h>
62f1535dc8Sdjm #include <openssl/asn1t.h>
63f1535dc8Sdjm 
640cea7bbeStb #include "ts_local.h"
650cea7bbeStb 
669ac7f938Sjsing static const ASN1_TEMPLATE TS_MSG_IMPRINT_seq_tt[] = {
679ac7f938Sjsing 	{
689ac7f938Sjsing 		.flags = 0,
699ac7f938Sjsing 		.tag = 0,
709ac7f938Sjsing 		.offset = offsetof(TS_MSG_IMPRINT, hash_algo),
719ac7f938Sjsing 		.field_name = "hash_algo",
729ac7f938Sjsing 		.item = &X509_ALGOR_it,
739ac7f938Sjsing 	},
749ac7f938Sjsing 	{
759ac7f938Sjsing 		.flags = 0,
769ac7f938Sjsing 		.tag = 0,
779ac7f938Sjsing 		.offset = offsetof(TS_MSG_IMPRINT, hashed_msg),
789ac7f938Sjsing 		.field_name = "hashed_msg",
799ac7f938Sjsing 		.item = &ASN1_OCTET_STRING_it,
809ac7f938Sjsing 	},
819ac7f938Sjsing };
829ac7f938Sjsing 
83*f7b261b1Stb static const ASN1_ITEM TS_MSG_IMPRINT_it = {
849ac7f938Sjsing 	.itype = ASN1_ITYPE_SEQUENCE,
859ac7f938Sjsing 	.utype = V_ASN1_SEQUENCE,
869ac7f938Sjsing 	.templates = TS_MSG_IMPRINT_seq_tt,
879ac7f938Sjsing 	.tcount = sizeof(TS_MSG_IMPRINT_seq_tt) / sizeof(ASN1_TEMPLATE),
889ac7f938Sjsing 	.funcs = NULL,
899ac7f938Sjsing 	.size = sizeof(TS_MSG_IMPRINT),
909ac7f938Sjsing 	.sname = "TS_MSG_IMPRINT",
919ac7f938Sjsing };
92f1535dc8Sdjm 
93fdb0ecdeSjsing 
94fdb0ecdeSjsing TS_MSG_IMPRINT *
d2i_TS_MSG_IMPRINT(TS_MSG_IMPRINT ** a,const unsigned char ** in,long len)95fdb0ecdeSjsing d2i_TS_MSG_IMPRINT(TS_MSG_IMPRINT **a, const unsigned char **in, long len)
96fdb0ecdeSjsing {
97fdb0ecdeSjsing 	return (TS_MSG_IMPRINT *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
98fdb0ecdeSjsing 	    &TS_MSG_IMPRINT_it);
99fdb0ecdeSjsing }
100bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_MSG_IMPRINT);
101fdb0ecdeSjsing 
102fdb0ecdeSjsing int
i2d_TS_MSG_IMPRINT(const TS_MSG_IMPRINT * a,unsigned char ** out)103fdb0ecdeSjsing i2d_TS_MSG_IMPRINT(const TS_MSG_IMPRINT *a, unsigned char **out)
104fdb0ecdeSjsing {
105fdb0ecdeSjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &TS_MSG_IMPRINT_it);
106fdb0ecdeSjsing }
107bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_MSG_IMPRINT);
108fdb0ecdeSjsing 
109fdb0ecdeSjsing TS_MSG_IMPRINT *
TS_MSG_IMPRINT_new(void)110fdb0ecdeSjsing TS_MSG_IMPRINT_new(void)
111fdb0ecdeSjsing {
112fdb0ecdeSjsing 	return (TS_MSG_IMPRINT *)ASN1_item_new(&TS_MSG_IMPRINT_it);
113fdb0ecdeSjsing }
114bb933e2fSbeck LCRYPTO_ALIAS(TS_MSG_IMPRINT_new);
115fdb0ecdeSjsing 
116fdb0ecdeSjsing void
TS_MSG_IMPRINT_free(TS_MSG_IMPRINT * a)117fdb0ecdeSjsing TS_MSG_IMPRINT_free(TS_MSG_IMPRINT *a)
118fdb0ecdeSjsing {
119fdb0ecdeSjsing 	ASN1_item_free((ASN1_VALUE *)a, &TS_MSG_IMPRINT_it);
120fdb0ecdeSjsing }
121bb933e2fSbeck LCRYPTO_ALIAS(TS_MSG_IMPRINT_free);
1225cfcf2a1Sjsing 
1235cfcf2a1Sjsing TS_MSG_IMPRINT *
TS_MSG_IMPRINT_dup(TS_MSG_IMPRINT * x)1245cfcf2a1Sjsing TS_MSG_IMPRINT_dup(TS_MSG_IMPRINT *x)
1255cfcf2a1Sjsing {
126589a2d47Sjsing 	return ASN1_item_dup(&TS_MSG_IMPRINT_it, x);
1275cfcf2a1Sjsing }
128bb933e2fSbeck LCRYPTO_ALIAS(TS_MSG_IMPRINT_dup);
129ec7cdc12Sjsing 
130f1535dc8Sdjm #ifndef OPENSSL_NO_BIO
131ec7cdc12Sjsing TS_MSG_IMPRINT *
d2i_TS_MSG_IMPRINT_bio(BIO * bp,TS_MSG_IMPRINT ** a)132ec7cdc12Sjsing d2i_TS_MSG_IMPRINT_bio(BIO *bp, TS_MSG_IMPRINT **a)
133f1535dc8Sdjm {
1342ca51753Sjsing 	return ASN1_item_d2i_bio(&TS_MSG_IMPRINT_it, bp, a);
135f1535dc8Sdjm }
136bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_MSG_IMPRINT_bio);
137f1535dc8Sdjm 
138ec7cdc12Sjsing int
i2d_TS_MSG_IMPRINT_bio(BIO * bp,TS_MSG_IMPRINT * a)139ec7cdc12Sjsing i2d_TS_MSG_IMPRINT_bio(BIO *bp, TS_MSG_IMPRINT *a)
140f1535dc8Sdjm {
1412ca51753Sjsing 	return ASN1_item_i2d_bio(&TS_MSG_IMPRINT_it, bp, a);
142f1535dc8Sdjm }
143bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_MSG_IMPRINT_bio);
144f1535dc8Sdjm #endif
145ec7cdc12Sjsing 
146ec7cdc12Sjsing TS_MSG_IMPRINT *
d2i_TS_MSG_IMPRINT_fp(FILE * fp,TS_MSG_IMPRINT ** a)147ec7cdc12Sjsing d2i_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT **a)
148f1535dc8Sdjm {
1492ca51753Sjsing 	return ASN1_item_d2i_fp(&TS_MSG_IMPRINT_it, fp, a);
150f1535dc8Sdjm }
151bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_MSG_IMPRINT_fp);
152f1535dc8Sdjm 
153ec7cdc12Sjsing int
i2d_TS_MSG_IMPRINT_fp(FILE * fp,TS_MSG_IMPRINT * a)154ec7cdc12Sjsing i2d_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT *a)
155f1535dc8Sdjm {
1562ca51753Sjsing 	return ASN1_item_i2d_fp(&TS_MSG_IMPRINT_it, fp, a);
157f1535dc8Sdjm }
158bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_MSG_IMPRINT_fp);
159f1535dc8Sdjm 
1609ac7f938Sjsing static const ASN1_TEMPLATE TS_REQ_seq_tt[] = {
1619ac7f938Sjsing 	{
1629ac7f938Sjsing 		.flags = 0,
1639ac7f938Sjsing 		.tag = 0,
1649ac7f938Sjsing 		.offset = offsetof(TS_REQ, version),
1659ac7f938Sjsing 		.field_name = "version",
1669ac7f938Sjsing 		.item = &ASN1_INTEGER_it,
1679ac7f938Sjsing 	},
1689ac7f938Sjsing 	{
1699ac7f938Sjsing 		.flags = 0,
1709ac7f938Sjsing 		.tag = 0,
1719ac7f938Sjsing 		.offset = offsetof(TS_REQ, msg_imprint),
1729ac7f938Sjsing 		.field_name = "msg_imprint",
1739ac7f938Sjsing 		.item = &TS_MSG_IMPRINT_it,
1749ac7f938Sjsing 	},
1759ac7f938Sjsing 	{
1769ac7f938Sjsing 		.flags = ASN1_TFLG_OPTIONAL,
1779ac7f938Sjsing 		.tag = 0,
1789ac7f938Sjsing 		.offset = offsetof(TS_REQ, policy_id),
1799ac7f938Sjsing 		.field_name = "policy_id",
1809ac7f938Sjsing 		.item = &ASN1_OBJECT_it,
1819ac7f938Sjsing 	},
1829ac7f938Sjsing 	{
1839ac7f938Sjsing 		.flags = ASN1_TFLG_OPTIONAL,
1849ac7f938Sjsing 		.tag = 0,
1859ac7f938Sjsing 		.offset = offsetof(TS_REQ, nonce),
1869ac7f938Sjsing 		.field_name = "nonce",
1879ac7f938Sjsing 		.item = &ASN1_INTEGER_it,
1889ac7f938Sjsing 	},
1899ac7f938Sjsing 	{
1909ac7f938Sjsing 		.flags = ASN1_TFLG_OPTIONAL,
1919ac7f938Sjsing 		.tag = 0,
1929ac7f938Sjsing 		.offset = offsetof(TS_REQ, cert_req),
1939ac7f938Sjsing 		.field_name = "cert_req",
1949ac7f938Sjsing 		.item = &ASN1_FBOOLEAN_it,
1959ac7f938Sjsing 	},
1969ac7f938Sjsing 	{
1979ac7f938Sjsing 		.flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
1989ac7f938Sjsing 		.tag = 0,
1999ac7f938Sjsing 		.offset = offsetof(TS_REQ, extensions),
2009ac7f938Sjsing 		.field_name = "extensions",
2019ac7f938Sjsing 		.item = &X509_EXTENSION_it,
2029ac7f938Sjsing 	},
2039ac7f938Sjsing };
2049ac7f938Sjsing 
205*f7b261b1Stb static const ASN1_ITEM TS_REQ_it = {
2069ac7f938Sjsing 	.itype = ASN1_ITYPE_SEQUENCE,
2079ac7f938Sjsing 	.utype = V_ASN1_SEQUENCE,
2089ac7f938Sjsing 	.templates = TS_REQ_seq_tt,
2099ac7f938Sjsing 	.tcount = sizeof(TS_REQ_seq_tt) / sizeof(ASN1_TEMPLATE),
2109ac7f938Sjsing 	.funcs = NULL,
2119ac7f938Sjsing 	.size = sizeof(TS_REQ),
2129ac7f938Sjsing 	.sname = "TS_REQ",
2139ac7f938Sjsing };
214f1535dc8Sdjm 
215fdb0ecdeSjsing 
216fdb0ecdeSjsing TS_REQ *
d2i_TS_REQ(TS_REQ ** a,const unsigned char ** in,long len)217fdb0ecdeSjsing d2i_TS_REQ(TS_REQ **a, const unsigned char **in, long len)
218fdb0ecdeSjsing {
219fdb0ecdeSjsing 	return (TS_REQ *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
220fdb0ecdeSjsing 	    &TS_REQ_it);
221fdb0ecdeSjsing }
222bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_REQ);
223fdb0ecdeSjsing 
224fdb0ecdeSjsing int
i2d_TS_REQ(const TS_REQ * a,unsigned char ** out)225fdb0ecdeSjsing i2d_TS_REQ(const TS_REQ *a, unsigned char **out)
226fdb0ecdeSjsing {
227fdb0ecdeSjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &TS_REQ_it);
228fdb0ecdeSjsing }
229bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_REQ);
230fdb0ecdeSjsing 
231fdb0ecdeSjsing TS_REQ *
TS_REQ_new(void)232fdb0ecdeSjsing TS_REQ_new(void)
233fdb0ecdeSjsing {
234fdb0ecdeSjsing 	return (TS_REQ *)ASN1_item_new(&TS_REQ_it);
235fdb0ecdeSjsing }
236bb933e2fSbeck LCRYPTO_ALIAS(TS_REQ_new);
237fdb0ecdeSjsing 
238fdb0ecdeSjsing void
TS_REQ_free(TS_REQ * a)239fdb0ecdeSjsing TS_REQ_free(TS_REQ *a)
240fdb0ecdeSjsing {
241fdb0ecdeSjsing 	ASN1_item_free((ASN1_VALUE *)a, &TS_REQ_it);
242fdb0ecdeSjsing }
243bb933e2fSbeck LCRYPTO_ALIAS(TS_REQ_free);
2445cfcf2a1Sjsing 
2455cfcf2a1Sjsing TS_REQ *
TS_REQ_dup(TS_REQ * x)2465cfcf2a1Sjsing TS_REQ_dup(TS_REQ *x)
2475cfcf2a1Sjsing {
248589a2d47Sjsing 	return ASN1_item_dup(&TS_REQ_it, x);
2495cfcf2a1Sjsing }
250bb933e2fSbeck LCRYPTO_ALIAS(TS_REQ_dup);
251ec7cdc12Sjsing 
252f1535dc8Sdjm #ifndef OPENSSL_NO_BIO
253ec7cdc12Sjsing TS_REQ *
d2i_TS_REQ_bio(BIO * bp,TS_REQ ** a)254ec7cdc12Sjsing d2i_TS_REQ_bio(BIO *bp, TS_REQ **a)
255f1535dc8Sdjm {
2562ca51753Sjsing 	return ASN1_item_d2i_bio(&TS_REQ_it, bp, a);
257f1535dc8Sdjm }
258bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_REQ_bio);
259f1535dc8Sdjm 
260ec7cdc12Sjsing int
i2d_TS_REQ_bio(BIO * bp,TS_REQ * a)261ec7cdc12Sjsing i2d_TS_REQ_bio(BIO *bp, TS_REQ *a)
262f1535dc8Sdjm {
2632ca51753Sjsing 	return ASN1_item_i2d_bio(&TS_REQ_it, bp, a);
264f1535dc8Sdjm }
265bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_REQ_bio);
266f1535dc8Sdjm #endif
267ec7cdc12Sjsing 
268ec7cdc12Sjsing TS_REQ *
d2i_TS_REQ_fp(FILE * fp,TS_REQ ** a)269ec7cdc12Sjsing d2i_TS_REQ_fp(FILE *fp, TS_REQ **a)
270f1535dc8Sdjm {
2712ca51753Sjsing 	return ASN1_item_d2i_fp(&TS_REQ_it, fp, a);
272f1535dc8Sdjm }
273bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_REQ_fp);
274f1535dc8Sdjm 
275ec7cdc12Sjsing int
i2d_TS_REQ_fp(FILE * fp,TS_REQ * a)276ec7cdc12Sjsing i2d_TS_REQ_fp(FILE *fp, TS_REQ *a)
277f1535dc8Sdjm {
2782ca51753Sjsing 	return ASN1_item_i2d_fp(&TS_REQ_it, fp, a);
279f1535dc8Sdjm }
280bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_REQ_fp);
281f1535dc8Sdjm 
2829ac7f938Sjsing static const ASN1_TEMPLATE TS_ACCURACY_seq_tt[] = {
2839ac7f938Sjsing 	{
2849ac7f938Sjsing 		.flags = ASN1_TFLG_OPTIONAL,
2859ac7f938Sjsing 		.tag = 0,
2869ac7f938Sjsing 		.offset = offsetof(TS_ACCURACY, seconds),
2879ac7f938Sjsing 		.field_name = "seconds",
2889ac7f938Sjsing 		.item = &ASN1_INTEGER_it,
2899ac7f938Sjsing 	},
2909ac7f938Sjsing 	{
2919ac7f938Sjsing 		.flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_OPTIONAL,
2929ac7f938Sjsing 		.tag = 0,
2939ac7f938Sjsing 		.offset = offsetof(TS_ACCURACY, millis),
2949ac7f938Sjsing 		.field_name = "millis",
2959ac7f938Sjsing 		.item = &ASN1_INTEGER_it,
2969ac7f938Sjsing 	},
2979ac7f938Sjsing 	{
2989ac7f938Sjsing 		.flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_OPTIONAL,
2999ac7f938Sjsing 		.tag = 1,
3009ac7f938Sjsing 		.offset = offsetof(TS_ACCURACY, micros),
3019ac7f938Sjsing 		.field_name = "micros",
3029ac7f938Sjsing 		.item = &ASN1_INTEGER_it,
3039ac7f938Sjsing 	},
3049ac7f938Sjsing };
3059ac7f938Sjsing 
306*f7b261b1Stb static const ASN1_ITEM TS_ACCURACY_it = {
3079ac7f938Sjsing 	.itype = ASN1_ITYPE_SEQUENCE,
3089ac7f938Sjsing 	.utype = V_ASN1_SEQUENCE,
3099ac7f938Sjsing 	.templates = TS_ACCURACY_seq_tt,
3109ac7f938Sjsing 	.tcount = sizeof(TS_ACCURACY_seq_tt) / sizeof(ASN1_TEMPLATE),
3119ac7f938Sjsing 	.funcs = NULL,
3129ac7f938Sjsing 	.size = sizeof(TS_ACCURACY),
3139ac7f938Sjsing 	.sname = "TS_ACCURACY",
3149ac7f938Sjsing };
315f1535dc8Sdjm 
316fdb0ecdeSjsing 
317fdb0ecdeSjsing TS_ACCURACY *
d2i_TS_ACCURACY(TS_ACCURACY ** a,const unsigned char ** in,long len)318fdb0ecdeSjsing d2i_TS_ACCURACY(TS_ACCURACY **a, const unsigned char **in, long len)
319fdb0ecdeSjsing {
320fdb0ecdeSjsing 	return (TS_ACCURACY *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
321fdb0ecdeSjsing 	    &TS_ACCURACY_it);
322fdb0ecdeSjsing }
323bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_ACCURACY);
324fdb0ecdeSjsing 
325fdb0ecdeSjsing int
i2d_TS_ACCURACY(const TS_ACCURACY * a,unsigned char ** out)326fdb0ecdeSjsing i2d_TS_ACCURACY(const TS_ACCURACY *a, unsigned char **out)
327fdb0ecdeSjsing {
328fdb0ecdeSjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &TS_ACCURACY_it);
329fdb0ecdeSjsing }
330bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_ACCURACY);
331fdb0ecdeSjsing 
332fdb0ecdeSjsing TS_ACCURACY *
TS_ACCURACY_new(void)333fdb0ecdeSjsing TS_ACCURACY_new(void)
334fdb0ecdeSjsing {
335fdb0ecdeSjsing 	return (TS_ACCURACY *)ASN1_item_new(&TS_ACCURACY_it);
336fdb0ecdeSjsing }
337bb933e2fSbeck LCRYPTO_ALIAS(TS_ACCURACY_new);
338fdb0ecdeSjsing 
339fdb0ecdeSjsing void
TS_ACCURACY_free(TS_ACCURACY * a)340fdb0ecdeSjsing TS_ACCURACY_free(TS_ACCURACY *a)
341fdb0ecdeSjsing {
342fdb0ecdeSjsing 	ASN1_item_free((ASN1_VALUE *)a, &TS_ACCURACY_it);
343fdb0ecdeSjsing }
344bb933e2fSbeck LCRYPTO_ALIAS(TS_ACCURACY_free);
3455cfcf2a1Sjsing 
3465cfcf2a1Sjsing TS_ACCURACY *
TS_ACCURACY_dup(TS_ACCURACY * x)3475cfcf2a1Sjsing TS_ACCURACY_dup(TS_ACCURACY *x)
3485cfcf2a1Sjsing {
349589a2d47Sjsing 	return ASN1_item_dup(&TS_ACCURACY_it, x);
3505cfcf2a1Sjsing }
351bb933e2fSbeck LCRYPTO_ALIAS(TS_ACCURACY_dup);
352f1535dc8Sdjm 
3539ac7f938Sjsing static const ASN1_TEMPLATE TS_TST_INFO_seq_tt[] = {
3549ac7f938Sjsing 	{
3559ac7f938Sjsing 		.flags = 0,
3569ac7f938Sjsing 		.tag = 0,
3579ac7f938Sjsing 		.offset = offsetof(TS_TST_INFO, version),
3589ac7f938Sjsing 		.field_name = "version",
3599ac7f938Sjsing 		.item = &ASN1_INTEGER_it,
3609ac7f938Sjsing 	},
3619ac7f938Sjsing 	{
3629ac7f938Sjsing 		.flags = 0,
3639ac7f938Sjsing 		.tag = 0,
3649ac7f938Sjsing 		.offset = offsetof(TS_TST_INFO, policy_id),
3659ac7f938Sjsing 		.field_name = "policy_id",
3669ac7f938Sjsing 		.item = &ASN1_OBJECT_it,
3679ac7f938Sjsing 	},
3689ac7f938Sjsing 	{
3699ac7f938Sjsing 		.flags = 0,
3709ac7f938Sjsing 		.tag = 0,
3719ac7f938Sjsing 		.offset = offsetof(TS_TST_INFO, msg_imprint),
3729ac7f938Sjsing 		.field_name = "msg_imprint",
3739ac7f938Sjsing 		.item = &TS_MSG_IMPRINT_it,
3749ac7f938Sjsing 	},
3759ac7f938Sjsing 	{
3769ac7f938Sjsing 		.flags = 0,
3779ac7f938Sjsing 		.tag = 0,
3789ac7f938Sjsing 		.offset = offsetof(TS_TST_INFO, serial),
3799ac7f938Sjsing 		.field_name = "serial",
3809ac7f938Sjsing 		.item = &ASN1_INTEGER_it,
3819ac7f938Sjsing 	},
3829ac7f938Sjsing 	{
3839ac7f938Sjsing 		.flags = 0,
3849ac7f938Sjsing 		.tag = 0,
3859ac7f938Sjsing 		.offset = offsetof(TS_TST_INFO, time),
3869ac7f938Sjsing 		.field_name = "time",
3879ac7f938Sjsing 		.item = &ASN1_GENERALIZEDTIME_it,
3889ac7f938Sjsing 	},
3899ac7f938Sjsing 	{
3909ac7f938Sjsing 		.flags = ASN1_TFLG_OPTIONAL,
3919ac7f938Sjsing 		.tag = 0,
3929ac7f938Sjsing 		.offset = offsetof(TS_TST_INFO, accuracy),
3939ac7f938Sjsing 		.field_name = "accuracy",
3949ac7f938Sjsing 		.item = &TS_ACCURACY_it,
3959ac7f938Sjsing 	},
3969ac7f938Sjsing 	{
3979ac7f938Sjsing 		.flags = ASN1_TFLG_OPTIONAL,
3989ac7f938Sjsing 		.tag = 0,
3999ac7f938Sjsing 		.offset = offsetof(TS_TST_INFO, ordering),
4009ac7f938Sjsing 		.field_name = "ordering",
4019ac7f938Sjsing 		.item = &ASN1_FBOOLEAN_it,
4029ac7f938Sjsing 	},
4039ac7f938Sjsing 	{
4049ac7f938Sjsing 		.flags = ASN1_TFLG_OPTIONAL,
4059ac7f938Sjsing 		.tag = 0,
4069ac7f938Sjsing 		.offset = offsetof(TS_TST_INFO, nonce),
4079ac7f938Sjsing 		.field_name = "nonce",
4089ac7f938Sjsing 		.item = &ASN1_INTEGER_it,
4099ac7f938Sjsing 	},
4109ac7f938Sjsing 	{
4119ac7f938Sjsing 		.flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
4129ac7f938Sjsing 		.tag = 0,
4139ac7f938Sjsing 		.offset = offsetof(TS_TST_INFO, tsa),
4149ac7f938Sjsing 		.field_name = "tsa",
4159ac7f938Sjsing 		.item = &GENERAL_NAME_it,
4169ac7f938Sjsing 	},
4179ac7f938Sjsing 	{
4189ac7f938Sjsing 		.flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
4199ac7f938Sjsing 		.tag = 1,
4209ac7f938Sjsing 		.offset = offsetof(TS_TST_INFO, extensions),
4219ac7f938Sjsing 		.field_name = "extensions",
4229ac7f938Sjsing 		.item = &X509_EXTENSION_it,
4239ac7f938Sjsing 	},
4249ac7f938Sjsing };
4259ac7f938Sjsing 
426*f7b261b1Stb static const ASN1_ITEM TS_TST_INFO_it = {
4279ac7f938Sjsing 	.itype = ASN1_ITYPE_SEQUENCE,
4289ac7f938Sjsing 	.utype = V_ASN1_SEQUENCE,
4299ac7f938Sjsing 	.templates = TS_TST_INFO_seq_tt,
4309ac7f938Sjsing 	.tcount = sizeof(TS_TST_INFO_seq_tt) / sizeof(ASN1_TEMPLATE),
4319ac7f938Sjsing 	.funcs = NULL,
4329ac7f938Sjsing 	.size = sizeof(TS_TST_INFO),
4339ac7f938Sjsing 	.sname = "TS_TST_INFO",
4349ac7f938Sjsing };
435f1535dc8Sdjm 
436fdb0ecdeSjsing 
437fdb0ecdeSjsing TS_TST_INFO *
d2i_TS_TST_INFO(TS_TST_INFO ** a,const unsigned char ** in,long len)438fdb0ecdeSjsing d2i_TS_TST_INFO(TS_TST_INFO **a, const unsigned char **in, long len)
439fdb0ecdeSjsing {
440fdb0ecdeSjsing 	return (TS_TST_INFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
441fdb0ecdeSjsing 	    &TS_TST_INFO_it);
442fdb0ecdeSjsing }
443bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_TST_INFO);
444fdb0ecdeSjsing 
445fdb0ecdeSjsing int
i2d_TS_TST_INFO(const TS_TST_INFO * a,unsigned char ** out)446fdb0ecdeSjsing i2d_TS_TST_INFO(const TS_TST_INFO *a, unsigned char **out)
447fdb0ecdeSjsing {
448fdb0ecdeSjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &TS_TST_INFO_it);
449fdb0ecdeSjsing }
450bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_TST_INFO);
451fdb0ecdeSjsing 
452fdb0ecdeSjsing TS_TST_INFO *
TS_TST_INFO_new(void)453fdb0ecdeSjsing TS_TST_INFO_new(void)
454fdb0ecdeSjsing {
455fdb0ecdeSjsing 	return (TS_TST_INFO *)ASN1_item_new(&TS_TST_INFO_it);
456fdb0ecdeSjsing }
457bb933e2fSbeck LCRYPTO_ALIAS(TS_TST_INFO_new);
458fdb0ecdeSjsing 
459fdb0ecdeSjsing void
TS_TST_INFO_free(TS_TST_INFO * a)460fdb0ecdeSjsing TS_TST_INFO_free(TS_TST_INFO *a)
461fdb0ecdeSjsing {
462fdb0ecdeSjsing 	ASN1_item_free((ASN1_VALUE *)a, &TS_TST_INFO_it);
463fdb0ecdeSjsing }
464bb933e2fSbeck LCRYPTO_ALIAS(TS_TST_INFO_free);
4655cfcf2a1Sjsing 
4665cfcf2a1Sjsing TS_TST_INFO *
TS_TST_INFO_dup(TS_TST_INFO * x)4675cfcf2a1Sjsing TS_TST_INFO_dup(TS_TST_INFO *x)
4685cfcf2a1Sjsing {
469589a2d47Sjsing 	return ASN1_item_dup(&TS_TST_INFO_it, x);
4705cfcf2a1Sjsing }
471bb933e2fSbeck LCRYPTO_ALIAS(TS_TST_INFO_dup);
472ec7cdc12Sjsing 
473f1535dc8Sdjm #ifndef OPENSSL_NO_BIO
474ec7cdc12Sjsing TS_TST_INFO *
d2i_TS_TST_INFO_bio(BIO * bp,TS_TST_INFO ** a)475ec7cdc12Sjsing d2i_TS_TST_INFO_bio(BIO *bp, TS_TST_INFO **a)
476f1535dc8Sdjm {
4772ca51753Sjsing 	return ASN1_item_d2i_bio(&TS_TST_INFO_it, bp, a);
478f1535dc8Sdjm }
479bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_TST_INFO_bio);
480f1535dc8Sdjm 
481ec7cdc12Sjsing int
i2d_TS_TST_INFO_bio(BIO * bp,TS_TST_INFO * a)482ec7cdc12Sjsing i2d_TS_TST_INFO_bio(BIO *bp, TS_TST_INFO *a)
483f1535dc8Sdjm {
4842ca51753Sjsing 	return ASN1_item_i2d_bio(&TS_TST_INFO_it, bp, a);
485f1535dc8Sdjm }
486bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_TST_INFO_bio);
487f1535dc8Sdjm #endif
488ec7cdc12Sjsing 
489ec7cdc12Sjsing TS_TST_INFO *
d2i_TS_TST_INFO_fp(FILE * fp,TS_TST_INFO ** a)490ec7cdc12Sjsing d2i_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO **a)
491f1535dc8Sdjm {
4922ca51753Sjsing 	return ASN1_item_d2i_fp(&TS_TST_INFO_it, fp, a);
493f1535dc8Sdjm }
494bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_TST_INFO_fp);
495f1535dc8Sdjm 
496ec7cdc12Sjsing int
i2d_TS_TST_INFO_fp(FILE * fp,TS_TST_INFO * a)497ec7cdc12Sjsing i2d_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO *a)
498f1535dc8Sdjm {
4992ca51753Sjsing 	return ASN1_item_i2d_fp(&TS_TST_INFO_it, fp, a);
500f1535dc8Sdjm }
501bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_TST_INFO_fp);
502f1535dc8Sdjm 
5039ac7f938Sjsing static const ASN1_TEMPLATE TS_STATUS_INFO_seq_tt[] = {
5049ac7f938Sjsing 	{
5059ac7f938Sjsing 		.flags = 0,
5069ac7f938Sjsing 		.tag = 0,
5079ac7f938Sjsing 		.offset = offsetof(TS_STATUS_INFO, status),
5089ac7f938Sjsing 		.field_name = "status",
5099ac7f938Sjsing 		.item = &ASN1_INTEGER_it,
5109ac7f938Sjsing 	},
5119ac7f938Sjsing 	{
5129ac7f938Sjsing 		.flags = ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
5139ac7f938Sjsing 		.tag = 0,
5149ac7f938Sjsing 		.offset = offsetof(TS_STATUS_INFO, text),
5159ac7f938Sjsing 		.field_name = "text",
5169ac7f938Sjsing 		.item = &ASN1_UTF8STRING_it,
5179ac7f938Sjsing 	},
5189ac7f938Sjsing 	{
5199ac7f938Sjsing 		.flags = ASN1_TFLG_OPTIONAL,
5209ac7f938Sjsing 		.tag = 0,
5219ac7f938Sjsing 		.offset = offsetof(TS_STATUS_INFO, failure_info),
5229ac7f938Sjsing 		.field_name = "failure_info",
5239ac7f938Sjsing 		.item = &ASN1_BIT_STRING_it,
5249ac7f938Sjsing 	},
5259ac7f938Sjsing };
5269ac7f938Sjsing 
527*f7b261b1Stb static const ASN1_ITEM TS_STATUS_INFO_it = {
5289ac7f938Sjsing 	.itype = ASN1_ITYPE_SEQUENCE,
5299ac7f938Sjsing 	.utype = V_ASN1_SEQUENCE,
5309ac7f938Sjsing 	.templates = TS_STATUS_INFO_seq_tt,
5319ac7f938Sjsing 	.tcount = sizeof(TS_STATUS_INFO_seq_tt) / sizeof(ASN1_TEMPLATE),
5329ac7f938Sjsing 	.funcs = NULL,
5339ac7f938Sjsing 	.size = sizeof(TS_STATUS_INFO),
5349ac7f938Sjsing 	.sname = "TS_STATUS_INFO",
5359ac7f938Sjsing };
536f1535dc8Sdjm 
537fdb0ecdeSjsing 
538fdb0ecdeSjsing TS_STATUS_INFO *
d2i_TS_STATUS_INFO(TS_STATUS_INFO ** a,const unsigned char ** in,long len)539fdb0ecdeSjsing d2i_TS_STATUS_INFO(TS_STATUS_INFO **a, const unsigned char **in, long len)
540fdb0ecdeSjsing {
541fdb0ecdeSjsing 	return (TS_STATUS_INFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
542fdb0ecdeSjsing 	    &TS_STATUS_INFO_it);
543fdb0ecdeSjsing }
544bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_STATUS_INFO);
545fdb0ecdeSjsing 
546fdb0ecdeSjsing int
i2d_TS_STATUS_INFO(const TS_STATUS_INFO * a,unsigned char ** out)547fdb0ecdeSjsing i2d_TS_STATUS_INFO(const TS_STATUS_INFO *a, unsigned char **out)
548fdb0ecdeSjsing {
549fdb0ecdeSjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &TS_STATUS_INFO_it);
550fdb0ecdeSjsing }
551bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_STATUS_INFO);
552fdb0ecdeSjsing 
553fdb0ecdeSjsing TS_STATUS_INFO *
TS_STATUS_INFO_new(void)554fdb0ecdeSjsing TS_STATUS_INFO_new(void)
555fdb0ecdeSjsing {
556fdb0ecdeSjsing 	return (TS_STATUS_INFO *)ASN1_item_new(&TS_STATUS_INFO_it);
557fdb0ecdeSjsing }
558bb933e2fSbeck LCRYPTO_ALIAS(TS_STATUS_INFO_new);
559fdb0ecdeSjsing 
560fdb0ecdeSjsing void
TS_STATUS_INFO_free(TS_STATUS_INFO * a)561fdb0ecdeSjsing TS_STATUS_INFO_free(TS_STATUS_INFO *a)
562fdb0ecdeSjsing {
563fdb0ecdeSjsing 	ASN1_item_free((ASN1_VALUE *)a, &TS_STATUS_INFO_it);
564fdb0ecdeSjsing }
565bb933e2fSbeck LCRYPTO_ALIAS(TS_STATUS_INFO_free);
5665cfcf2a1Sjsing 
5675cfcf2a1Sjsing TS_STATUS_INFO *
TS_STATUS_INFO_dup(TS_STATUS_INFO * x)5685cfcf2a1Sjsing TS_STATUS_INFO_dup(TS_STATUS_INFO *x)
5695cfcf2a1Sjsing {
570589a2d47Sjsing 	return ASN1_item_dup(&TS_STATUS_INFO_it, x);
5715cfcf2a1Sjsing }
572bb933e2fSbeck LCRYPTO_ALIAS(TS_STATUS_INFO_dup);
573f1535dc8Sdjm 
574ec7cdc12Sjsing static int
ts_resp_set_tst_info(TS_RESP * a)575ec7cdc12Sjsing ts_resp_set_tst_info(TS_RESP *a)
576f1535dc8Sdjm {
577f1535dc8Sdjm 	long    status;
578f1535dc8Sdjm 
579f1535dc8Sdjm 	status = ASN1_INTEGER_get(a->status_info->status);
580f1535dc8Sdjm 
581f1535dc8Sdjm 	if (a->token) {
582f1535dc8Sdjm 		if (status != 0 && status != 1) {
5835067ae9fSbeck 			TSerror(TS_R_TOKEN_PRESENT);
584f1535dc8Sdjm 			return 0;
585f1535dc8Sdjm 		}
586f1535dc8Sdjm 		if (a->tst_info != NULL)
587f1535dc8Sdjm 			TS_TST_INFO_free(a->tst_info);
588f1535dc8Sdjm 		a->tst_info = PKCS7_to_TS_TST_INFO(a->token);
589f1535dc8Sdjm 		if (!a->tst_info) {
5905067ae9fSbeck 			TSerror(TS_R_PKCS7_TO_TS_TST_INFO_FAILED);
591f1535dc8Sdjm 			return 0;
592f1535dc8Sdjm 		}
593f1535dc8Sdjm 	} else if (status == 0 || status == 1) {
5945067ae9fSbeck 		TSerror(TS_R_TOKEN_NOT_PRESENT);
595f1535dc8Sdjm 		return 0;
596f1535dc8Sdjm 	}
597f1535dc8Sdjm 
598f1535dc8Sdjm 	return 1;
599f1535dc8Sdjm }
600f1535dc8Sdjm 
601ec7cdc12Sjsing static int
ts_resp_cb(int op,ASN1_VALUE ** pval,const ASN1_ITEM * it,void * exarg)602ec7cdc12Sjsing ts_resp_cb(int op, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg)
603f1535dc8Sdjm {
604f1535dc8Sdjm 	TS_RESP *ts_resp = (TS_RESP *)*pval;
605ec7cdc12Sjsing 
606f1535dc8Sdjm 	if (op == ASN1_OP_NEW_POST) {
607f1535dc8Sdjm 		ts_resp->tst_info = NULL;
608f1535dc8Sdjm 	} else if (op == ASN1_OP_FREE_POST) {
609f1535dc8Sdjm 		if (ts_resp->tst_info != NULL)
610f1535dc8Sdjm 			TS_TST_INFO_free(ts_resp->tst_info);
611f1535dc8Sdjm 	} else if (op == ASN1_OP_D2I_POST) {
612f1535dc8Sdjm 		if (ts_resp_set_tst_info(ts_resp) == 0)
613f1535dc8Sdjm 			return 0;
614f1535dc8Sdjm 	}
615f1535dc8Sdjm 	return 1;
616f1535dc8Sdjm }
617f1535dc8Sdjm 
6189ac7f938Sjsing static const ASN1_AUX TS_RESP_aux = {
6199ac7f938Sjsing 	.app_data = NULL,
6209ac7f938Sjsing 	.flags = 0,
6219ac7f938Sjsing 	.ref_offset = 0,
6229ac7f938Sjsing 	.ref_lock = 0,
6239ac7f938Sjsing 	.asn1_cb = ts_resp_cb,
6249ac7f938Sjsing 	.enc_offset = 0,
6259ac7f938Sjsing };
6269ac7f938Sjsing static const ASN1_TEMPLATE TS_RESP_seq_tt[] = {
6279ac7f938Sjsing 	{
6289ac7f938Sjsing 		.flags = 0,
6299ac7f938Sjsing 		.tag = 0,
6309ac7f938Sjsing 		.offset = offsetof(TS_RESP, status_info),
6319ac7f938Sjsing 		.field_name = "status_info",
6329ac7f938Sjsing 		.item = &TS_STATUS_INFO_it,
6339ac7f938Sjsing 	},
6349ac7f938Sjsing 	{
6359ac7f938Sjsing 		.flags = ASN1_TFLG_OPTIONAL,
6369ac7f938Sjsing 		.tag = 0,
6379ac7f938Sjsing 		.offset = offsetof(TS_RESP, token),
6389ac7f938Sjsing 		.field_name = "token",
6399ac7f938Sjsing 		.item = &PKCS7_it,
6409ac7f938Sjsing 	},
6419ac7f938Sjsing };
6429ac7f938Sjsing 
643*f7b261b1Stb static const ASN1_ITEM TS_RESP_it = {
6449ac7f938Sjsing 	.itype = ASN1_ITYPE_SEQUENCE,
6459ac7f938Sjsing 	.utype = V_ASN1_SEQUENCE,
6469ac7f938Sjsing 	.templates = TS_RESP_seq_tt,
6479ac7f938Sjsing 	.tcount = sizeof(TS_RESP_seq_tt) / sizeof(ASN1_TEMPLATE),
6489ac7f938Sjsing 	.funcs = &TS_RESP_aux,
6499ac7f938Sjsing 	.size = sizeof(TS_RESP),
6509ac7f938Sjsing 	.sname = "TS_RESP",
6519ac7f938Sjsing };
652f1535dc8Sdjm 
653fdb0ecdeSjsing 
654fdb0ecdeSjsing TS_RESP *
d2i_TS_RESP(TS_RESP ** a,const unsigned char ** in,long len)655fdb0ecdeSjsing d2i_TS_RESP(TS_RESP **a, const unsigned char **in, long len)
656fdb0ecdeSjsing {
657fdb0ecdeSjsing 	return (TS_RESP *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
658fdb0ecdeSjsing 	    &TS_RESP_it);
659fdb0ecdeSjsing }
660bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_RESP);
661fdb0ecdeSjsing 
662fdb0ecdeSjsing int
i2d_TS_RESP(const TS_RESP * a,unsigned char ** out)663fdb0ecdeSjsing i2d_TS_RESP(const TS_RESP *a, unsigned char **out)
664fdb0ecdeSjsing {
665fdb0ecdeSjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &TS_RESP_it);
666fdb0ecdeSjsing }
667bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_RESP);
668fdb0ecdeSjsing 
669fdb0ecdeSjsing TS_RESP *
TS_RESP_new(void)670fdb0ecdeSjsing TS_RESP_new(void)
671fdb0ecdeSjsing {
672fdb0ecdeSjsing 	return (TS_RESP *)ASN1_item_new(&TS_RESP_it);
673fdb0ecdeSjsing }
674bb933e2fSbeck LCRYPTO_ALIAS(TS_RESP_new);
675fdb0ecdeSjsing 
676fdb0ecdeSjsing void
TS_RESP_free(TS_RESP * a)677fdb0ecdeSjsing TS_RESP_free(TS_RESP *a)
678fdb0ecdeSjsing {
679fdb0ecdeSjsing 	ASN1_item_free((ASN1_VALUE *)a, &TS_RESP_it);
680fdb0ecdeSjsing }
681bb933e2fSbeck LCRYPTO_ALIAS(TS_RESP_free);
6825cfcf2a1Sjsing 
6835cfcf2a1Sjsing TS_RESP *
TS_RESP_dup(TS_RESP * x)6845cfcf2a1Sjsing TS_RESP_dup(TS_RESP *x)
6855cfcf2a1Sjsing {
686589a2d47Sjsing 	return ASN1_item_dup(&TS_RESP_it, x);
6875cfcf2a1Sjsing }
688bb933e2fSbeck LCRYPTO_ALIAS(TS_RESP_dup);
689ec7cdc12Sjsing 
690f1535dc8Sdjm #ifndef OPENSSL_NO_BIO
691ec7cdc12Sjsing TS_RESP *
d2i_TS_RESP_bio(BIO * bp,TS_RESP ** a)692ec7cdc12Sjsing d2i_TS_RESP_bio(BIO *bp, TS_RESP **a)
693f1535dc8Sdjm {
6942ca51753Sjsing 	return ASN1_item_d2i_bio(&TS_RESP_it, bp, a);
695f1535dc8Sdjm }
696bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_RESP_bio);
697f1535dc8Sdjm 
698ec7cdc12Sjsing int
i2d_TS_RESP_bio(BIO * bp,TS_RESP * a)699ec7cdc12Sjsing i2d_TS_RESP_bio(BIO *bp, TS_RESP *a)
700f1535dc8Sdjm {
7012ca51753Sjsing 	return ASN1_item_i2d_bio(&TS_RESP_it, bp, a);
702f1535dc8Sdjm }
703bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_RESP_bio);
704f1535dc8Sdjm #endif
705ec7cdc12Sjsing 
706ec7cdc12Sjsing TS_RESP *
d2i_TS_RESP_fp(FILE * fp,TS_RESP ** a)707ec7cdc12Sjsing d2i_TS_RESP_fp(FILE *fp, TS_RESP **a)
708f1535dc8Sdjm {
7092ca51753Sjsing 	return ASN1_item_d2i_fp(&TS_RESP_it, fp, a);
710f1535dc8Sdjm }
711bb933e2fSbeck LCRYPTO_ALIAS(d2i_TS_RESP_fp);
712f1535dc8Sdjm 
713ec7cdc12Sjsing int
i2d_TS_RESP_fp(FILE * fp,TS_RESP * a)714ec7cdc12Sjsing i2d_TS_RESP_fp(FILE *fp, TS_RESP *a)
715f1535dc8Sdjm {
7162ca51753Sjsing 	return ASN1_item_i2d_fp(&TS_RESP_it, fp, a);
717f1535dc8Sdjm }
718bb933e2fSbeck LCRYPTO_ALIAS(i2d_TS_RESP_fp);
719f1535dc8Sdjm 
7209ac7f938Sjsing static const ASN1_TEMPLATE ESS_ISSUER_SERIAL_seq_tt[] = {
7219ac7f938Sjsing 	{
7229ac7f938Sjsing 		.flags = ASN1_TFLG_SEQUENCE_OF,
7239ac7f938Sjsing 		.tag = 0,
7249ac7f938Sjsing 		.offset = offsetof(ESS_ISSUER_SERIAL, issuer),
7259ac7f938Sjsing 		.field_name = "issuer",
7269ac7f938Sjsing 		.item = &GENERAL_NAME_it,
7279ac7f938Sjsing 	},
7289ac7f938Sjsing 	{
7299ac7f938Sjsing 		.flags = 0,
7309ac7f938Sjsing 		.tag = 0,
7319ac7f938Sjsing 		.offset = offsetof(ESS_ISSUER_SERIAL, serial),
7329ac7f938Sjsing 		.field_name = "serial",
7339ac7f938Sjsing 		.item = &ASN1_INTEGER_it,
7349ac7f938Sjsing 	},
7359ac7f938Sjsing };
7369ac7f938Sjsing 
737*f7b261b1Stb static const ASN1_ITEM ESS_ISSUER_SERIAL_it = {
7389ac7f938Sjsing 	.itype = ASN1_ITYPE_SEQUENCE,
7399ac7f938Sjsing 	.utype = V_ASN1_SEQUENCE,
7409ac7f938Sjsing 	.templates = ESS_ISSUER_SERIAL_seq_tt,
7419ac7f938Sjsing 	.tcount = sizeof(ESS_ISSUER_SERIAL_seq_tt) / sizeof(ASN1_TEMPLATE),
7429ac7f938Sjsing 	.funcs = NULL,
7439ac7f938Sjsing 	.size = sizeof(ESS_ISSUER_SERIAL),
7449ac7f938Sjsing 	.sname = "ESS_ISSUER_SERIAL",
7459ac7f938Sjsing };
746f1535dc8Sdjm 
747fdb0ecdeSjsing 
748fdb0ecdeSjsing ESS_ISSUER_SERIAL *
d2i_ESS_ISSUER_SERIAL(ESS_ISSUER_SERIAL ** a,const unsigned char ** in,long len)749fdb0ecdeSjsing d2i_ESS_ISSUER_SERIAL(ESS_ISSUER_SERIAL **a, const unsigned char **in, long len)
750fdb0ecdeSjsing {
751fdb0ecdeSjsing 	return (ESS_ISSUER_SERIAL *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
752fdb0ecdeSjsing 	    &ESS_ISSUER_SERIAL_it);
753fdb0ecdeSjsing }
754bb933e2fSbeck LCRYPTO_ALIAS(d2i_ESS_ISSUER_SERIAL);
755fdb0ecdeSjsing 
756fdb0ecdeSjsing int
i2d_ESS_ISSUER_SERIAL(const ESS_ISSUER_SERIAL * a,unsigned char ** out)757fdb0ecdeSjsing i2d_ESS_ISSUER_SERIAL(const ESS_ISSUER_SERIAL *a, unsigned char **out)
758fdb0ecdeSjsing {
759fdb0ecdeSjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ESS_ISSUER_SERIAL_it);
760fdb0ecdeSjsing }
761bb933e2fSbeck LCRYPTO_ALIAS(i2d_ESS_ISSUER_SERIAL);
762fdb0ecdeSjsing 
763fdb0ecdeSjsing ESS_ISSUER_SERIAL *
ESS_ISSUER_SERIAL_new(void)764fdb0ecdeSjsing ESS_ISSUER_SERIAL_new(void)
765fdb0ecdeSjsing {
766fdb0ecdeSjsing 	return (ESS_ISSUER_SERIAL *)ASN1_item_new(&ESS_ISSUER_SERIAL_it);
767fdb0ecdeSjsing }
768bb933e2fSbeck LCRYPTO_ALIAS(ESS_ISSUER_SERIAL_new);
769fdb0ecdeSjsing 
770fdb0ecdeSjsing void
ESS_ISSUER_SERIAL_free(ESS_ISSUER_SERIAL * a)771fdb0ecdeSjsing ESS_ISSUER_SERIAL_free(ESS_ISSUER_SERIAL *a)
772fdb0ecdeSjsing {
773fdb0ecdeSjsing 	ASN1_item_free((ASN1_VALUE *)a, &ESS_ISSUER_SERIAL_it);
774fdb0ecdeSjsing }
775bb933e2fSbeck LCRYPTO_ALIAS(ESS_ISSUER_SERIAL_free);
7765cfcf2a1Sjsing 
7775cfcf2a1Sjsing ESS_ISSUER_SERIAL *
ESS_ISSUER_SERIAL_dup(ESS_ISSUER_SERIAL * x)7785cfcf2a1Sjsing ESS_ISSUER_SERIAL_dup(ESS_ISSUER_SERIAL *x)
7795cfcf2a1Sjsing {
780589a2d47Sjsing 	return ASN1_item_dup(&ESS_ISSUER_SERIAL_it, x);
7815cfcf2a1Sjsing }
782bb933e2fSbeck LCRYPTO_ALIAS(ESS_ISSUER_SERIAL_dup);
783f1535dc8Sdjm 
7849ac7f938Sjsing static const ASN1_TEMPLATE ESS_CERT_ID_seq_tt[] = {
7859ac7f938Sjsing 	{
7869ac7f938Sjsing 		.flags = 0,
7879ac7f938Sjsing 		.tag = 0,
7889ac7f938Sjsing 		.offset = offsetof(ESS_CERT_ID, hash),
7899ac7f938Sjsing 		.field_name = "hash",
7909ac7f938Sjsing 		.item = &ASN1_OCTET_STRING_it,
7919ac7f938Sjsing 	},
7929ac7f938Sjsing 	{
7939ac7f938Sjsing 		.flags = ASN1_TFLG_OPTIONAL,
7949ac7f938Sjsing 		.tag = 0,
7959ac7f938Sjsing 		.offset = offsetof(ESS_CERT_ID, issuer_serial),
7969ac7f938Sjsing 		.field_name = "issuer_serial",
7979ac7f938Sjsing 		.item = &ESS_ISSUER_SERIAL_it,
7989ac7f938Sjsing 	},
7999ac7f938Sjsing };
8009ac7f938Sjsing 
801*f7b261b1Stb static const ASN1_ITEM ESS_CERT_ID_it = {
8029ac7f938Sjsing 	.itype = ASN1_ITYPE_SEQUENCE,
8039ac7f938Sjsing 	.utype = V_ASN1_SEQUENCE,
8049ac7f938Sjsing 	.templates = ESS_CERT_ID_seq_tt,
8059ac7f938Sjsing 	.tcount = sizeof(ESS_CERT_ID_seq_tt) / sizeof(ASN1_TEMPLATE),
8069ac7f938Sjsing 	.funcs = NULL,
8079ac7f938Sjsing 	.size = sizeof(ESS_CERT_ID),
8089ac7f938Sjsing 	.sname = "ESS_CERT_ID",
8099ac7f938Sjsing };
810f1535dc8Sdjm 
811fdb0ecdeSjsing 
812fdb0ecdeSjsing ESS_CERT_ID *
d2i_ESS_CERT_ID(ESS_CERT_ID ** a,const unsigned char ** in,long len)813fdb0ecdeSjsing d2i_ESS_CERT_ID(ESS_CERT_ID **a, const unsigned char **in, long len)
814fdb0ecdeSjsing {
815fdb0ecdeSjsing 	return (ESS_CERT_ID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
816fdb0ecdeSjsing 	    &ESS_CERT_ID_it);
817fdb0ecdeSjsing }
818bb933e2fSbeck LCRYPTO_ALIAS(d2i_ESS_CERT_ID);
819fdb0ecdeSjsing 
820fdb0ecdeSjsing int
i2d_ESS_CERT_ID(const ESS_CERT_ID * a,unsigned char ** out)821fdb0ecdeSjsing i2d_ESS_CERT_ID(const ESS_CERT_ID *a, unsigned char **out)
822fdb0ecdeSjsing {
823fdb0ecdeSjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ESS_CERT_ID_it);
824fdb0ecdeSjsing }
825bb933e2fSbeck LCRYPTO_ALIAS(i2d_ESS_CERT_ID);
826fdb0ecdeSjsing 
827fdb0ecdeSjsing ESS_CERT_ID *
ESS_CERT_ID_new(void)828fdb0ecdeSjsing ESS_CERT_ID_new(void)
829fdb0ecdeSjsing {
830fdb0ecdeSjsing 	return (ESS_CERT_ID *)ASN1_item_new(&ESS_CERT_ID_it);
831fdb0ecdeSjsing }
832bb933e2fSbeck LCRYPTO_ALIAS(ESS_CERT_ID_new);
833fdb0ecdeSjsing 
834fdb0ecdeSjsing void
ESS_CERT_ID_free(ESS_CERT_ID * a)835fdb0ecdeSjsing ESS_CERT_ID_free(ESS_CERT_ID *a)
836fdb0ecdeSjsing {
837fdb0ecdeSjsing 	ASN1_item_free((ASN1_VALUE *)a, &ESS_CERT_ID_it);
838fdb0ecdeSjsing }
839bb933e2fSbeck LCRYPTO_ALIAS(ESS_CERT_ID_free);
8405cfcf2a1Sjsing 
8415cfcf2a1Sjsing ESS_CERT_ID *
ESS_CERT_ID_dup(ESS_CERT_ID * x)8425cfcf2a1Sjsing ESS_CERT_ID_dup(ESS_CERT_ID *x)
8435cfcf2a1Sjsing {
844589a2d47Sjsing 	return ASN1_item_dup(&ESS_CERT_ID_it, x);
8455cfcf2a1Sjsing }
846bb933e2fSbeck LCRYPTO_ALIAS(ESS_CERT_ID_dup);
847f1535dc8Sdjm 
8489ac7f938Sjsing static const ASN1_TEMPLATE ESS_SIGNING_CERT_seq_tt[] = {
8499ac7f938Sjsing 	{
8509ac7f938Sjsing 		.flags = ASN1_TFLG_SEQUENCE_OF,
8519ac7f938Sjsing 		.tag = 0,
8529ac7f938Sjsing 		.offset = offsetof(ESS_SIGNING_CERT, cert_ids),
8539ac7f938Sjsing 		.field_name = "cert_ids",
8549ac7f938Sjsing 		.item = &ESS_CERT_ID_it,
8559ac7f938Sjsing 	},
8569ac7f938Sjsing 	{
8579ac7f938Sjsing 		.flags = ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
8589ac7f938Sjsing 		.tag = 0,
8599ac7f938Sjsing 		.offset = offsetof(ESS_SIGNING_CERT, policy_info),
8609ac7f938Sjsing 		.field_name = "policy_info",
8619ac7f938Sjsing 		.item = &POLICYINFO_it,
8629ac7f938Sjsing 	},
8639ac7f938Sjsing };
8649ac7f938Sjsing 
865*f7b261b1Stb static const ASN1_ITEM ESS_SIGNING_CERT_it = {
8669ac7f938Sjsing 	.itype = ASN1_ITYPE_SEQUENCE,
8679ac7f938Sjsing 	.utype = V_ASN1_SEQUENCE,
8689ac7f938Sjsing 	.templates = ESS_SIGNING_CERT_seq_tt,
8699ac7f938Sjsing 	.tcount = sizeof(ESS_SIGNING_CERT_seq_tt) / sizeof(ASN1_TEMPLATE),
8709ac7f938Sjsing 	.funcs = NULL,
8719ac7f938Sjsing 	.size = sizeof(ESS_SIGNING_CERT),
8729ac7f938Sjsing 	.sname = "ESS_SIGNING_CERT",
8739ac7f938Sjsing };
874f1535dc8Sdjm 
875fdb0ecdeSjsing 
876fdb0ecdeSjsing ESS_SIGNING_CERT *
d2i_ESS_SIGNING_CERT(ESS_SIGNING_CERT ** a,const unsigned char ** in,long len)877fdb0ecdeSjsing d2i_ESS_SIGNING_CERT(ESS_SIGNING_CERT **a, const unsigned char **in, long len)
878fdb0ecdeSjsing {
879fdb0ecdeSjsing 	return (ESS_SIGNING_CERT *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
880fdb0ecdeSjsing 	    &ESS_SIGNING_CERT_it);
881fdb0ecdeSjsing }
882bb933e2fSbeck LCRYPTO_ALIAS(d2i_ESS_SIGNING_CERT);
883fdb0ecdeSjsing 
884fdb0ecdeSjsing int
i2d_ESS_SIGNING_CERT(const ESS_SIGNING_CERT * a,unsigned char ** out)885fdb0ecdeSjsing i2d_ESS_SIGNING_CERT(const ESS_SIGNING_CERT *a, unsigned char **out)
886fdb0ecdeSjsing {
887fdb0ecdeSjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ESS_SIGNING_CERT_it);
888fdb0ecdeSjsing }
889bb933e2fSbeck LCRYPTO_ALIAS(i2d_ESS_SIGNING_CERT);
890fdb0ecdeSjsing 
891fdb0ecdeSjsing ESS_SIGNING_CERT *
ESS_SIGNING_CERT_new(void)892fdb0ecdeSjsing ESS_SIGNING_CERT_new(void)
893fdb0ecdeSjsing {
894fdb0ecdeSjsing 	return (ESS_SIGNING_CERT *)ASN1_item_new(&ESS_SIGNING_CERT_it);
895fdb0ecdeSjsing }
896bb933e2fSbeck LCRYPTO_ALIAS(ESS_SIGNING_CERT_new);
897fdb0ecdeSjsing 
898fdb0ecdeSjsing void
ESS_SIGNING_CERT_free(ESS_SIGNING_CERT * a)899fdb0ecdeSjsing ESS_SIGNING_CERT_free(ESS_SIGNING_CERT *a)
900fdb0ecdeSjsing {
901fdb0ecdeSjsing 	ASN1_item_free((ASN1_VALUE *)a, &ESS_SIGNING_CERT_it);
902fdb0ecdeSjsing }
903bb933e2fSbeck LCRYPTO_ALIAS(ESS_SIGNING_CERT_free);
9045cfcf2a1Sjsing 
9055cfcf2a1Sjsing ESS_SIGNING_CERT *
ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT * x)9065cfcf2a1Sjsing ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT *x)
9075cfcf2a1Sjsing {
908589a2d47Sjsing 	return ASN1_item_dup(&ESS_SIGNING_CERT_it, x);
9095cfcf2a1Sjsing }
910bb933e2fSbeck LCRYPTO_ALIAS(ESS_SIGNING_CERT_dup);
911f1535dc8Sdjm 
912ba539a43Skn static const ASN1_TEMPLATE ESS_CERT_ID_V2_seq_tt[] = {
913ba539a43Skn 	{
914ba539a43Skn 		.flags = ASN1_TFLG_OPTIONAL,
915ba539a43Skn 		.tag = 0,
916ba539a43Skn 		.offset = offsetof(ESS_CERT_ID_V2, hash_alg),
917ba539a43Skn 		.field_name = "hash_alg",
918ba539a43Skn 		.item = &X509_ALGOR_it,
919ba539a43Skn 	},
920ba539a43Skn 	{
921ba539a43Skn 		.flags = 0,
922ba539a43Skn 		.tag = 0,
923ba539a43Skn 		.offset = offsetof(ESS_CERT_ID_V2, hash),
924ba539a43Skn 		.field_name = "hash",
925ba539a43Skn 		.item = &ASN1_OCTET_STRING_it,
926ba539a43Skn 	},
927ba539a43Skn 	{
928ba539a43Skn 		.flags = ASN1_TFLG_OPTIONAL,
929ba539a43Skn 		.tag = 0,
930ba539a43Skn 		.offset = offsetof(ESS_CERT_ID_V2, issuer_serial),
931ba539a43Skn 		.field_name = "issuer_serial",
932ba539a43Skn 		.item = &ESS_ISSUER_SERIAL_it,
933ba539a43Skn 	},
934ba539a43Skn };
935ba539a43Skn 
936ba539a43Skn static const ASN1_ITEM ESS_CERT_ID_V2_it = {
937ba539a43Skn 	.itype = ASN1_ITYPE_SEQUENCE,
938ba539a43Skn 	.utype = V_ASN1_SEQUENCE,
939ba539a43Skn 	.templates = ESS_CERT_ID_V2_seq_tt,
940ba539a43Skn 	.tcount = sizeof(ESS_CERT_ID_V2_seq_tt) / sizeof(ASN1_TEMPLATE),
941ba539a43Skn 	.funcs = NULL,
942ba539a43Skn 	.size = sizeof(ESS_CERT_ID_V2),
943ba539a43Skn 	.sname = "ESS_CERT_ID_V2",
944ba539a43Skn };
945ba539a43Skn 
946ba539a43Skn ESS_CERT_ID_V2 *
d2i_ESS_CERT_ID_V2(ESS_CERT_ID_V2 ** a,const unsigned char ** in,long len)947ba539a43Skn d2i_ESS_CERT_ID_V2(ESS_CERT_ID_V2 **a, const unsigned char **in, long len)
948ba539a43Skn {
949ba539a43Skn 	return (ESS_CERT_ID_V2 *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
950ba539a43Skn 	    &ESS_CERT_ID_V2_it);
951ba539a43Skn }
952ba539a43Skn 
953ba539a43Skn int
i2d_ESS_CERT_ID_V2(const ESS_CERT_ID_V2 * a,unsigned char ** out)954ba539a43Skn i2d_ESS_CERT_ID_V2(const ESS_CERT_ID_V2 *a, unsigned char **out)
955ba539a43Skn {
956ba539a43Skn 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ESS_CERT_ID_V2_it);
957ba539a43Skn }
958ba539a43Skn 
959ba539a43Skn ESS_CERT_ID_V2 *
ESS_CERT_ID_V2_new(void)960ba539a43Skn ESS_CERT_ID_V2_new(void)
961ba539a43Skn {
962ba539a43Skn 	return (ESS_CERT_ID_V2 *)ASN1_item_new(&ESS_CERT_ID_V2_it);
963ba539a43Skn }
964ba539a43Skn 
965ba539a43Skn void
ESS_CERT_ID_V2_free(ESS_CERT_ID_V2 * a)966ba539a43Skn ESS_CERT_ID_V2_free(ESS_CERT_ID_V2 *a)
967ba539a43Skn {
968ba539a43Skn 	ASN1_item_free((ASN1_VALUE *)a, &ESS_CERT_ID_V2_it);
969ba539a43Skn }
970ba539a43Skn 
971ba539a43Skn ESS_CERT_ID_V2 *
ESS_CERT_ID_V2_dup(ESS_CERT_ID_V2 * x)972ba539a43Skn ESS_CERT_ID_V2_dup(ESS_CERT_ID_V2 *x)
973ba539a43Skn {
974ba539a43Skn 	return ASN1_item_dup(&ESS_CERT_ID_V2_it, x);
975ba539a43Skn }
976ba539a43Skn 
977ba539a43Skn static const ASN1_TEMPLATE ESS_SIGNING_CERT_V2_seq_tt[] = {
978ba539a43Skn 	{
979ba539a43Skn 		.flags = ASN1_TFLG_SEQUENCE_OF,
980ba539a43Skn 		.tag = 0,
981ba539a43Skn 		.offset = offsetof(ESS_SIGNING_CERT_V2, cert_ids),
982ba539a43Skn 		.field_name = "cert_ids",
983ba539a43Skn 		.item = &ESS_CERT_ID_V2_it,
984ba539a43Skn 	},
985ba539a43Skn 	{
986ba539a43Skn 		.flags = ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
987ba539a43Skn 		.tag = 0,
988ba539a43Skn 		.offset = offsetof(ESS_SIGNING_CERT_V2, policy_info),
989ba539a43Skn 		.field_name = "policy_info",
990ba539a43Skn 		.item = &POLICYINFO_it,
991ba539a43Skn 	},
992ba539a43Skn };
993ba539a43Skn 
994ba539a43Skn static const ASN1_ITEM ESS_SIGNING_CERT_V2_it = {
995ba539a43Skn 	.itype = ASN1_ITYPE_SEQUENCE,
996ba539a43Skn 	.utype = V_ASN1_SEQUENCE,
997ba539a43Skn 	.templates = ESS_SIGNING_CERT_V2_seq_tt,
998ba539a43Skn 	.tcount = sizeof(ESS_SIGNING_CERT_V2_seq_tt) / sizeof(ASN1_TEMPLATE),
999ba539a43Skn 	.funcs = NULL,
1000ba539a43Skn 	.size = sizeof(ESS_SIGNING_CERT_V2),
1001ba539a43Skn 	.sname = "ESS_SIGNING_CERT_V2",
1002ba539a43Skn };
1003ba539a43Skn 
1004ba539a43Skn ESS_SIGNING_CERT_V2 *
d2i_ESS_SIGNING_CERT_V2(ESS_SIGNING_CERT_V2 ** a,const unsigned char ** in,long len)1005ba539a43Skn d2i_ESS_SIGNING_CERT_V2(ESS_SIGNING_CERT_V2 **a, const unsigned char **in, long len)
1006ba539a43Skn {
1007ba539a43Skn 	return (ESS_SIGNING_CERT_V2 *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
1008ba539a43Skn 	    &ESS_SIGNING_CERT_V2_it);
1009ba539a43Skn }
1010ba539a43Skn 
1011ba539a43Skn int
i2d_ESS_SIGNING_CERT_V2(const ESS_SIGNING_CERT_V2 * a,unsigned char ** out)1012ba539a43Skn i2d_ESS_SIGNING_CERT_V2(const ESS_SIGNING_CERT_V2 *a, unsigned char **out)
1013ba539a43Skn {
1014ba539a43Skn 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &ESS_SIGNING_CERT_V2_it);
1015ba539a43Skn }
1016ba539a43Skn 
1017ba539a43Skn ESS_SIGNING_CERT_V2 *
ESS_SIGNING_CERT_V2_new(void)1018ba539a43Skn ESS_SIGNING_CERT_V2_new(void)
1019ba539a43Skn {
1020ba539a43Skn 	return (ESS_SIGNING_CERT_V2 *)ASN1_item_new(&ESS_SIGNING_CERT_V2_it);
1021ba539a43Skn }
1022ba539a43Skn 
1023ba539a43Skn void
ESS_SIGNING_CERT_V2_free(ESS_SIGNING_CERT_V2 * a)1024ba539a43Skn ESS_SIGNING_CERT_V2_free(ESS_SIGNING_CERT_V2 *a)
1025ba539a43Skn {
1026ba539a43Skn 	ASN1_item_free((ASN1_VALUE *)a, &ESS_SIGNING_CERT_V2_it);
1027ba539a43Skn }
1028ba539a43Skn 
1029ba539a43Skn ESS_SIGNING_CERT_V2 *
ESS_SIGNING_CERT_V2_dup(ESS_SIGNING_CERT_V2 * x)1030ba539a43Skn ESS_SIGNING_CERT_V2_dup(ESS_SIGNING_CERT_V2 *x)
1031ba539a43Skn {
1032ba539a43Skn 	return ASN1_item_dup(&ESS_SIGNING_CERT_V2_it, x);
1033ba539a43Skn }
1034ba539a43Skn 
1035f1535dc8Sdjm /* Getting encapsulated TS_TST_INFO object from PKCS7. */
1036ec7cdc12Sjsing TS_TST_INFO *
PKCS7_to_TS_TST_INFO(PKCS7 * token)1037ec7cdc12Sjsing PKCS7_to_TS_TST_INFO(PKCS7 *token)
1038f1535dc8Sdjm {
1039f1535dc8Sdjm 	PKCS7_SIGNED *pkcs7_signed;
1040f1535dc8Sdjm 	PKCS7 *enveloped;
1041f1535dc8Sdjm 	ASN1_TYPE *tst_info_wrapper;
1042f1535dc8Sdjm 	ASN1_OCTET_STRING *tst_info_der;
1043f1535dc8Sdjm 	const unsigned char *p;
1044f1535dc8Sdjm 
1045ec7cdc12Sjsing 	if (!PKCS7_type_is_signed(token)) {
10465067ae9fSbeck 		TSerror(TS_R_BAD_PKCS7_TYPE);
1047f1535dc8Sdjm 		return NULL;
1048f1535dc8Sdjm 	}
1049f1535dc8Sdjm 
1050f1535dc8Sdjm 	/* Content must be present. */
1051ec7cdc12Sjsing 	if (PKCS7_get_detached(token)) {
10525067ae9fSbeck 		TSerror(TS_R_DETACHED_CONTENT);
1053f1535dc8Sdjm 		return NULL;
1054f1535dc8Sdjm 	}
1055f1535dc8Sdjm 
1056f1535dc8Sdjm 	/* We have a signed data with content. */
1057f1535dc8Sdjm 	pkcs7_signed = token->d.sign;
1058f1535dc8Sdjm 	enveloped = pkcs7_signed->contents;
1059ec7cdc12Sjsing 	if (OBJ_obj2nid(enveloped->type) != NID_id_smime_ct_TSTInfo) {
10605067ae9fSbeck 		TSerror(TS_R_BAD_PKCS7_TYPE);
1061f1535dc8Sdjm 		return NULL;
1062f1535dc8Sdjm 	}
1063f1535dc8Sdjm 
1064f1535dc8Sdjm 	/* We have a DER encoded TST_INFO as the signed data. */
1065f1535dc8Sdjm 	tst_info_wrapper = enveloped->d.other;
1066ec7cdc12Sjsing 	if (tst_info_wrapper->type != V_ASN1_OCTET_STRING) {
10675067ae9fSbeck 		TSerror(TS_R_BAD_TYPE);
1068f1535dc8Sdjm 		return NULL;
1069f1535dc8Sdjm 	}
1070f1535dc8Sdjm 
1071f1535dc8Sdjm 	/* We have the correct ASN1_OCTET_STRING type. */
1072f1535dc8Sdjm 	tst_info_der = tst_info_wrapper->value.octet_string;
1073f1535dc8Sdjm 	/* At last, decode the TST_INFO. */
1074f1535dc8Sdjm 	p = tst_info_der->data;
1075f1535dc8Sdjm 	return d2i_TS_TST_INFO(NULL, &p, tst_info_der->length);
1076f1535dc8Sdjm }
1077bb933e2fSbeck LCRYPTO_ALIAS(PKCS7_to_TS_TST_INFO);
1078