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