1*589ce5b7Sbeck /* $OpenBSD: pk7_asn1.c,v 1.18 2024/07/08 16:23:27 beck Exp $ */
2e6841c1dSdjm /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3da347917Sbeck * project 2000.
4da347917Sbeck */
5da347917Sbeck /* ====================================================================
6da347917Sbeck * Copyright (c) 2000 The OpenSSL Project. All rights reserved.
7da347917Sbeck *
8da347917Sbeck * Redistribution and use in source and binary forms, with or without
9da347917Sbeck * modification, are permitted provided that the following conditions
10da347917Sbeck * are met:
11da347917Sbeck *
12da347917Sbeck * 1. Redistributions of source code must retain the above copyright
13da347917Sbeck * notice, this list of conditions and the following disclaimer.
14da347917Sbeck *
15da347917Sbeck * 2. Redistributions in binary form must reproduce the above copyright
16da347917Sbeck * notice, this list of conditions and the following disclaimer in
17da347917Sbeck * the documentation and/or other materials provided with the
18da347917Sbeck * distribution.
19da347917Sbeck *
20da347917Sbeck * 3. All advertising materials mentioning features or use of this
21da347917Sbeck * software must display the following acknowledgment:
22da347917Sbeck * "This product includes software developed by the OpenSSL Project
23da347917Sbeck * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24da347917Sbeck *
25da347917Sbeck * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26da347917Sbeck * endorse or promote products derived from this software without
27da347917Sbeck * prior written permission. For written permission, please contact
28da347917Sbeck * licensing@OpenSSL.org.
29da347917Sbeck *
30da347917Sbeck * 5. Products derived from this software may not be called "OpenSSL"
31da347917Sbeck * nor may "OpenSSL" appear in their names without prior written
32da347917Sbeck * permission of the OpenSSL Project.
33da347917Sbeck *
34da347917Sbeck * 6. Redistributions of any form whatsoever must retain the following
35da347917Sbeck * acknowledgment:
36da347917Sbeck * "This product includes software developed by the OpenSSL Project
37da347917Sbeck * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38da347917Sbeck *
39da347917Sbeck * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40da347917Sbeck * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41da347917Sbeck * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42da347917Sbeck * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43da347917Sbeck * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44da347917Sbeck * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45da347917Sbeck * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46da347917Sbeck * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47da347917Sbeck * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48da347917Sbeck * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49da347917Sbeck * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50da347917Sbeck * OF THE POSSIBILITY OF SUCH DAMAGE.
51da347917Sbeck * ====================================================================
52da347917Sbeck *
53da347917Sbeck * This product includes cryptographic software written by Eric Young
54da347917Sbeck * (eay@cryptsoft.com). This product includes software written by Tim
55da347917Sbeck * Hudson (tjh@cryptsoft.com).
56da347917Sbeck *
57da347917Sbeck */
58da347917Sbeck
59da347917Sbeck #include <stdio.h>
60b6ab114eSjsing
61da347917Sbeck #include <openssl/asn1t.h>
62da347917Sbeck #include <openssl/pkcs7.h>
63da347917Sbeck #include <openssl/x509.h>
64da347917Sbeck
65da347917Sbeck /* PKCS#7 ASN1 module */
66da347917Sbeck
67da347917Sbeck /* This is the ANY DEFINED BY table for the top level PKCS#7 structure */
68da347917Sbeck
69cf6930feSjsing static const ASN1_TEMPLATE p7default_tt = {
70cf6930feSjsing .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
71cf6930feSjsing .tag = 0,
72cf6930feSjsing .offset = offsetof(PKCS7, d.other),
73cf6930feSjsing .field_name = "d.other",
74cf6930feSjsing .item = &ASN1_ANY_it,
75cf6930feSjsing };
76da347917Sbeck
77cf6930feSjsing static const ASN1_ADB_TABLE PKCS7_adbtbl[] = {
78cf6930feSjsing {
79cf6930feSjsing .value = NID_pkcs7_data,
80cf6930feSjsing .tt = {
81cf6930feSjsing .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL | ASN1_TFLG_NDEF,
82cf6930feSjsing .tag = 0,
83cf6930feSjsing .offset = offsetof(PKCS7, d.data),
84cf6930feSjsing .field_name = "d.data",
85cf6930feSjsing .item = &ASN1_OCTET_STRING_NDEF_it,
86cf6930feSjsing },
87cf6930feSjsing
88cf6930feSjsing },
89cf6930feSjsing {
90cf6930feSjsing .value = NID_pkcs7_signed,
91cf6930feSjsing .tt = {
92cf6930feSjsing .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL | ASN1_TFLG_NDEF,
93cf6930feSjsing .tag = 0,
94cf6930feSjsing .offset = offsetof(PKCS7, d.sign),
95cf6930feSjsing .field_name = "d.sign",
96cf6930feSjsing .item = &PKCS7_SIGNED_it,
97cf6930feSjsing },
98cf6930feSjsing
99cf6930feSjsing },
100cf6930feSjsing {
101cf6930feSjsing .value = NID_pkcs7_enveloped,
102cf6930feSjsing .tt = {
103cf6930feSjsing .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL | ASN1_TFLG_NDEF,
104cf6930feSjsing .tag = 0,
105cf6930feSjsing .offset = offsetof(PKCS7, d.enveloped),
106cf6930feSjsing .field_name = "d.enveloped",
107cf6930feSjsing .item = &PKCS7_ENVELOPE_it,
108cf6930feSjsing },
109cf6930feSjsing
110cf6930feSjsing },
111cf6930feSjsing {
112cf6930feSjsing .value = NID_pkcs7_signedAndEnveloped,
113cf6930feSjsing .tt = {
114cf6930feSjsing .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL | ASN1_TFLG_NDEF,
115cf6930feSjsing .tag = 0,
116cf6930feSjsing .offset = offsetof(PKCS7, d.signed_and_enveloped),
117cf6930feSjsing .field_name = "d.signed_and_enveloped",
118cf6930feSjsing .item = &PKCS7_SIGN_ENVELOPE_it,
119cf6930feSjsing },
120cf6930feSjsing
121cf6930feSjsing },
122cf6930feSjsing {
123cf6930feSjsing .value = NID_pkcs7_digest,
124cf6930feSjsing .tt = {
125cf6930feSjsing .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL | ASN1_TFLG_NDEF,
126cf6930feSjsing .tag = 0,
127cf6930feSjsing .offset = offsetof(PKCS7, d.digest),
128cf6930feSjsing .field_name = "d.digest",
129cf6930feSjsing .item = &PKCS7_DIGEST_it,
130cf6930feSjsing },
131cf6930feSjsing
132cf6930feSjsing },
133cf6930feSjsing {
134cf6930feSjsing .value = NID_pkcs7_encrypted,
135cf6930feSjsing .tt = {
136cf6930feSjsing .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL | ASN1_TFLG_NDEF,
137cf6930feSjsing .tag = 0,
138cf6930feSjsing .offset = offsetof(PKCS7, d.encrypted),
139cf6930feSjsing .field_name = "d.encrypted",
140cf6930feSjsing .item = &PKCS7_ENCRYPT_it,
141cf6930feSjsing },
142cf6930feSjsing
143cf6930feSjsing },
144cf6930feSjsing };
145cf6930feSjsing
146cf6930feSjsing static const ASN1_ADB PKCS7_adb = {
147cf6930feSjsing .flags = 0,
148cf6930feSjsing .offset = offsetof(PKCS7, type),
149cf6930feSjsing .tbl = PKCS7_adbtbl,
150cf6930feSjsing .tblcount = sizeof(PKCS7_adbtbl) / sizeof(ASN1_ADB_TABLE),
151cf6930feSjsing .default_tt = &p7default_tt,
152cf6930feSjsing .null_tt = NULL,
153cf6930feSjsing };
154da347917Sbeck
1550a5d6edeSdjm /* PKCS#7 streaming support */
156cace2641Sjsing static int
pk7_cb(int operation,ASN1_VALUE ** pval,const ASN1_ITEM * it,void * exarg)157cace2641Sjsing pk7_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg)
1580a5d6edeSdjm {
1590a5d6edeSdjm ASN1_STREAM_ARG *sarg = exarg;
1600a5d6edeSdjm PKCS7 **pp7 = (PKCS7 **)pval;
1610a5d6edeSdjm
162cace2641Sjsing switch (operation) {
1630a5d6edeSdjm case ASN1_OP_STREAM_PRE:
1640a5d6edeSdjm if (PKCS7_stream(&sarg->boundary, *pp7) <= 0)
1650a5d6edeSdjm return 0;
166a92a32d2Stb /* FALLTHROUGH */
167cace2641Sjsing
1680a5d6edeSdjm case ASN1_OP_DETACHED_PRE:
1690a5d6edeSdjm sarg->ndef_bio = PKCS7_dataInit(*pp7, sarg->out);
1700a5d6edeSdjm if (!sarg->ndef_bio)
1710a5d6edeSdjm return 0;
1720a5d6edeSdjm break;
1730a5d6edeSdjm
1740a5d6edeSdjm case ASN1_OP_STREAM_POST:
1750a5d6edeSdjm case ASN1_OP_DETACHED_POST:
1760a5d6edeSdjm if (PKCS7_dataFinal(*pp7, sarg->ndef_bio) <= 0)
1770a5d6edeSdjm return 0;
1780a5d6edeSdjm break;
1790a5d6edeSdjm }
1800a5d6edeSdjm return 1;
1810a5d6edeSdjm }
1820a5d6edeSdjm
183cf6930feSjsing static const ASN1_AUX PKCS7_aux = {
184cf6930feSjsing .app_data = NULL,
185cf6930feSjsing .flags = 0,
186cf6930feSjsing .ref_offset = 0,
187cf6930feSjsing .ref_lock = 0,
188cf6930feSjsing .asn1_cb = pk7_cb,
189cf6930feSjsing .enc_offset = 0,
190cf6930feSjsing };
191cf6930feSjsing static const ASN1_TEMPLATE PKCS7_seq_tt[] = {
192cf6930feSjsing {
193cf6930feSjsing .flags = 0,
194cf6930feSjsing .tag = 0,
195cf6930feSjsing .offset = offsetof(PKCS7, type),
196cf6930feSjsing .field_name = "type",
197cf6930feSjsing .item = &ASN1_OBJECT_it,
198cf6930feSjsing },
199cf6930feSjsing {
200cf6930feSjsing .flags = ASN1_TFLG_ADB_OID,
201cf6930feSjsing .tag = -1,
202cf6930feSjsing .offset = 0,
203cf6930feSjsing .field_name = "PKCS7",
204cf6930feSjsing .item = (const ASN1_ITEM *)&PKCS7_adb,
205cf6930feSjsing },
206cf6930feSjsing };
207cf6930feSjsing
208cf6930feSjsing const ASN1_ITEM PKCS7_it = {
209cf6930feSjsing .itype = ASN1_ITYPE_NDEF_SEQUENCE,
210cf6930feSjsing .utype = V_ASN1_SEQUENCE,
211cf6930feSjsing .templates = PKCS7_seq_tt,
212cf6930feSjsing .tcount = sizeof(PKCS7_seq_tt) / sizeof(ASN1_TEMPLATE),
213cf6930feSjsing .funcs = &PKCS7_aux,
214cf6930feSjsing .size = sizeof(PKCS7),
215cf6930feSjsing .sname = "PKCS7",
216cf6930feSjsing };
217*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_it);
218da347917Sbeck
219dc83dab0Sjsing
220dc83dab0Sjsing PKCS7 *
d2i_PKCS7(PKCS7 ** a,const unsigned char ** in,long len)221dc83dab0Sjsing d2i_PKCS7(PKCS7 **a, const unsigned char **in, long len)
222dc83dab0Sjsing {
223dc83dab0Sjsing return (PKCS7 *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
224dc83dab0Sjsing &PKCS7_it);
225dc83dab0Sjsing }
226cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7);
227dc83dab0Sjsing
228dc83dab0Sjsing int
i2d_PKCS7(PKCS7 * a,unsigned char ** out)229dc83dab0Sjsing i2d_PKCS7(PKCS7 *a, unsigned char **out)
230dc83dab0Sjsing {
231dc83dab0Sjsing return ASN1_item_i2d((ASN1_VALUE *)a, out, &PKCS7_it);
232dc83dab0Sjsing }
233cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7);
234dc83dab0Sjsing
235dc83dab0Sjsing PKCS7 *
PKCS7_new(void)236dc83dab0Sjsing PKCS7_new(void)
237dc83dab0Sjsing {
238dc83dab0Sjsing return (PKCS7 *)ASN1_item_new(&PKCS7_it);
239dc83dab0Sjsing }
240cedac418Stb LCRYPTO_ALIAS(PKCS7_new);
241dc83dab0Sjsing
242dc83dab0Sjsing void
PKCS7_free(PKCS7 * a)243dc83dab0Sjsing PKCS7_free(PKCS7 *a)
244dc83dab0Sjsing {
245dc83dab0Sjsing ASN1_item_free((ASN1_VALUE *)a, &PKCS7_it);
246dc83dab0Sjsing }
247cedac418Stb LCRYPTO_ALIAS(PKCS7_free);
248402dcee2Sjsing
2495cfcf2a1Sjsing PKCS7 *
PKCS7_dup(PKCS7 * x)2505cfcf2a1Sjsing PKCS7_dup(PKCS7 *x)
2515cfcf2a1Sjsing {
252589a2d47Sjsing return ASN1_item_dup(&PKCS7_it, x);
2535cfcf2a1Sjsing }
254cedac418Stb LCRYPTO_ALIAS(PKCS7_dup);
255da347917Sbeck
256cf6930feSjsing static const ASN1_TEMPLATE PKCS7_SIGNED_seq_tt[] = {
257cf6930feSjsing {
258cf6930feSjsing .flags = 0,
259cf6930feSjsing .tag = 0,
260cf6930feSjsing .offset = offsetof(PKCS7_SIGNED, version),
261cf6930feSjsing .field_name = "version",
262cf6930feSjsing .item = &ASN1_INTEGER_it,
263cf6930feSjsing },
264cf6930feSjsing {
265cf6930feSjsing .flags = ASN1_TFLG_SET_OF,
266cf6930feSjsing .tag = 0,
267cf6930feSjsing .offset = offsetof(PKCS7_SIGNED, md_algs),
268cf6930feSjsing .field_name = "md_algs",
269cf6930feSjsing .item = &X509_ALGOR_it,
270cf6930feSjsing },
271cf6930feSjsing {
272cf6930feSjsing .flags = 0,
273cf6930feSjsing .tag = 0,
274cf6930feSjsing .offset = offsetof(PKCS7_SIGNED, contents),
275cf6930feSjsing .field_name = "contents",
276cf6930feSjsing .item = &PKCS7_it,
277cf6930feSjsing },
278cf6930feSjsing {
279cf6930feSjsing .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
280cf6930feSjsing .tag = 0,
281cf6930feSjsing .offset = offsetof(PKCS7_SIGNED, cert),
282cf6930feSjsing .field_name = "cert",
283cf6930feSjsing .item = &X509_it,
284cf6930feSjsing },
285cf6930feSjsing {
286cf6930feSjsing .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL,
287cf6930feSjsing .tag = 1,
288cf6930feSjsing .offset = offsetof(PKCS7_SIGNED, crl),
289cf6930feSjsing .field_name = "crl",
290cf6930feSjsing .item = &X509_CRL_it,
291cf6930feSjsing },
292cf6930feSjsing {
293cf6930feSjsing .flags = ASN1_TFLG_SET_OF,
294cf6930feSjsing .tag = 0,
295cf6930feSjsing .offset = offsetof(PKCS7_SIGNED, signer_info),
296cf6930feSjsing .field_name = "signer_info",
297cf6930feSjsing .item = &PKCS7_SIGNER_INFO_it,
298cf6930feSjsing },
299cf6930feSjsing };
300cf6930feSjsing
301cf6930feSjsing const ASN1_ITEM PKCS7_SIGNED_it = {
302cf6930feSjsing .itype = ASN1_ITYPE_NDEF_SEQUENCE,
303cf6930feSjsing .utype = V_ASN1_SEQUENCE,
304cf6930feSjsing .templates = PKCS7_SIGNED_seq_tt,
305cf6930feSjsing .tcount = sizeof(PKCS7_SIGNED_seq_tt) / sizeof(ASN1_TEMPLATE),
306cf6930feSjsing .funcs = NULL,
307cf6930feSjsing .size = sizeof(PKCS7_SIGNED),
308cf6930feSjsing .sname = "PKCS7_SIGNED",
309cf6930feSjsing };
310*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_SIGNED_it);
311da347917Sbeck
312dc83dab0Sjsing
313dc83dab0Sjsing PKCS7_SIGNED *
d2i_PKCS7_SIGNED(PKCS7_SIGNED ** a,const unsigned char ** in,long len)314dc83dab0Sjsing d2i_PKCS7_SIGNED(PKCS7_SIGNED **a, const unsigned char **in, long len)
315dc83dab0Sjsing {
316dc83dab0Sjsing return (PKCS7_SIGNED *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
317dc83dab0Sjsing &PKCS7_SIGNED_it);
318dc83dab0Sjsing }
319cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_SIGNED);
320dc83dab0Sjsing
321dc83dab0Sjsing int
i2d_PKCS7_SIGNED(PKCS7_SIGNED * a,unsigned char ** out)322dc83dab0Sjsing i2d_PKCS7_SIGNED(PKCS7_SIGNED *a, unsigned char **out)
323dc83dab0Sjsing {
324dc83dab0Sjsing return ASN1_item_i2d((ASN1_VALUE *)a, out, &PKCS7_SIGNED_it);
325dc83dab0Sjsing }
326cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_SIGNED);
327dc83dab0Sjsing
328dc83dab0Sjsing PKCS7_SIGNED *
PKCS7_SIGNED_new(void)329dc83dab0Sjsing PKCS7_SIGNED_new(void)
330dc83dab0Sjsing {
331dc83dab0Sjsing return (PKCS7_SIGNED *)ASN1_item_new(&PKCS7_SIGNED_it);
332dc83dab0Sjsing }
333cedac418Stb LCRYPTO_ALIAS(PKCS7_SIGNED_new);
334dc83dab0Sjsing
335dc83dab0Sjsing void
PKCS7_SIGNED_free(PKCS7_SIGNED * a)336dc83dab0Sjsing PKCS7_SIGNED_free(PKCS7_SIGNED *a)
337dc83dab0Sjsing {
338dc83dab0Sjsing ASN1_item_free((ASN1_VALUE *)a, &PKCS7_SIGNED_it);
339dc83dab0Sjsing }
340cedac418Stb LCRYPTO_ALIAS(PKCS7_SIGNED_free);
341da347917Sbeck
342da347917Sbeck /* Minor tweak to operation: free up EVP_PKEY */
343cace2641Sjsing static int
si_cb(int operation,ASN1_VALUE ** pval,const ASN1_ITEM * it,void * exarg)344cace2641Sjsing si_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg)
345da347917Sbeck {
346da347917Sbeck if (operation == ASN1_OP_FREE_POST) {
347da347917Sbeck PKCS7_SIGNER_INFO *si = (PKCS7_SIGNER_INFO *)*pval;
348da347917Sbeck EVP_PKEY_free(si->pkey);
349da347917Sbeck }
350da347917Sbeck return 1;
351da347917Sbeck }
352da347917Sbeck
353cf6930feSjsing static const ASN1_AUX PKCS7_SIGNER_INFO_aux = {
354cf6930feSjsing .app_data = NULL,
355cf6930feSjsing .flags = 0,
356cf6930feSjsing .ref_offset = 0,
357cf6930feSjsing .ref_lock = 0,
358cf6930feSjsing .asn1_cb = si_cb,
359cf6930feSjsing .enc_offset = 0,
360cf6930feSjsing };
361cf6930feSjsing static const ASN1_TEMPLATE PKCS7_SIGNER_INFO_seq_tt[] = {
362cf6930feSjsing {
363cf6930feSjsing .flags = 0,
364cf6930feSjsing .tag = 0,
365cf6930feSjsing .offset = offsetof(PKCS7_SIGNER_INFO, version),
366cf6930feSjsing .field_name = "version",
367cf6930feSjsing .item = &ASN1_INTEGER_it,
368cf6930feSjsing },
369cf6930feSjsing {
370cf6930feSjsing .flags = 0,
371cf6930feSjsing .tag = 0,
372cf6930feSjsing .offset = offsetof(PKCS7_SIGNER_INFO, issuer_and_serial),
373cf6930feSjsing .field_name = "issuer_and_serial",
374cf6930feSjsing .item = &PKCS7_ISSUER_AND_SERIAL_it,
375cf6930feSjsing },
376cf6930feSjsing {
377cf6930feSjsing .flags = 0,
378cf6930feSjsing .tag = 0,
379cf6930feSjsing .offset = offsetof(PKCS7_SIGNER_INFO, digest_alg),
380cf6930feSjsing .field_name = "digest_alg",
381cf6930feSjsing .item = &X509_ALGOR_it,
382cf6930feSjsing },
383da347917Sbeck /* NB this should be a SET OF but we use a SEQUENCE OF so the
384da347917Sbeck * original order * is retained when the structure is reencoded.
385da347917Sbeck * Since the attributes are implicitly tagged this will not affect
386da347917Sbeck * the encoding.
387da347917Sbeck */
388cf6930feSjsing {
389cf6930feSjsing .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
390cf6930feSjsing .tag = 0,
391cf6930feSjsing .offset = offsetof(PKCS7_SIGNER_INFO, auth_attr),
392cf6930feSjsing .field_name = "auth_attr",
393cf6930feSjsing .item = &X509_ATTRIBUTE_it,
394cf6930feSjsing },
395cf6930feSjsing {
396cf6930feSjsing .flags = 0,
397cf6930feSjsing .tag = 0,
398cf6930feSjsing .offset = offsetof(PKCS7_SIGNER_INFO, digest_enc_alg),
399cf6930feSjsing .field_name = "digest_enc_alg",
400cf6930feSjsing .item = &X509_ALGOR_it,
401cf6930feSjsing },
402cf6930feSjsing {
403cf6930feSjsing .flags = 0,
404cf6930feSjsing .tag = 0,
405cf6930feSjsing .offset = offsetof(PKCS7_SIGNER_INFO, enc_digest),
406cf6930feSjsing .field_name = "enc_digest",
407cf6930feSjsing .item = &ASN1_OCTET_STRING_it,
408cf6930feSjsing },
409cf6930feSjsing {
410cf6930feSjsing .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL,
411cf6930feSjsing .tag = 1,
412cf6930feSjsing .offset = offsetof(PKCS7_SIGNER_INFO, unauth_attr),
413cf6930feSjsing .field_name = "unauth_attr",
414cf6930feSjsing .item = &X509_ATTRIBUTE_it,
415cf6930feSjsing },
416cf6930feSjsing };
417cf6930feSjsing
418cf6930feSjsing const ASN1_ITEM PKCS7_SIGNER_INFO_it = {
419cf6930feSjsing .itype = ASN1_ITYPE_SEQUENCE,
420cf6930feSjsing .utype = V_ASN1_SEQUENCE,
421cf6930feSjsing .templates = PKCS7_SIGNER_INFO_seq_tt,
422cf6930feSjsing .tcount = sizeof(PKCS7_SIGNER_INFO_seq_tt) / sizeof(ASN1_TEMPLATE),
423cf6930feSjsing .funcs = &PKCS7_SIGNER_INFO_aux,
424cf6930feSjsing .size = sizeof(PKCS7_SIGNER_INFO),
425cf6930feSjsing .sname = "PKCS7_SIGNER_INFO",
426cf6930feSjsing };
427*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_SIGNER_INFO_it);
428da347917Sbeck
429dc83dab0Sjsing
430dc83dab0Sjsing PKCS7_SIGNER_INFO *
d2i_PKCS7_SIGNER_INFO(PKCS7_SIGNER_INFO ** a,const unsigned char ** in,long len)431dc83dab0Sjsing d2i_PKCS7_SIGNER_INFO(PKCS7_SIGNER_INFO **a, const unsigned char **in, long len)
432dc83dab0Sjsing {
433dc83dab0Sjsing return (PKCS7_SIGNER_INFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
434dc83dab0Sjsing &PKCS7_SIGNER_INFO_it);
435dc83dab0Sjsing }
436cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_SIGNER_INFO);
437dc83dab0Sjsing
438dc83dab0Sjsing int
i2d_PKCS7_SIGNER_INFO(PKCS7_SIGNER_INFO * a,unsigned char ** out)439dc83dab0Sjsing i2d_PKCS7_SIGNER_INFO(PKCS7_SIGNER_INFO *a, unsigned char **out)
440dc83dab0Sjsing {
441dc83dab0Sjsing return ASN1_item_i2d((ASN1_VALUE *)a, out, &PKCS7_SIGNER_INFO_it);
442dc83dab0Sjsing }
443cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_SIGNER_INFO);
444dc83dab0Sjsing
445dc83dab0Sjsing PKCS7_SIGNER_INFO *
PKCS7_SIGNER_INFO_new(void)446dc83dab0Sjsing PKCS7_SIGNER_INFO_new(void)
447dc83dab0Sjsing {
448dc83dab0Sjsing return (PKCS7_SIGNER_INFO *)ASN1_item_new(&PKCS7_SIGNER_INFO_it);
449dc83dab0Sjsing }
450cedac418Stb LCRYPTO_ALIAS(PKCS7_SIGNER_INFO_new);
451dc83dab0Sjsing
452dc83dab0Sjsing void
PKCS7_SIGNER_INFO_free(PKCS7_SIGNER_INFO * a)453dc83dab0Sjsing PKCS7_SIGNER_INFO_free(PKCS7_SIGNER_INFO *a)
454dc83dab0Sjsing {
455dc83dab0Sjsing ASN1_item_free((ASN1_VALUE *)a, &PKCS7_SIGNER_INFO_it);
456dc83dab0Sjsing }
457cedac418Stb LCRYPTO_ALIAS(PKCS7_SIGNER_INFO_free);
458da347917Sbeck
459cf6930feSjsing static const ASN1_TEMPLATE PKCS7_ISSUER_AND_SERIAL_seq_tt[] = {
460cf6930feSjsing {
461cf6930feSjsing .flags = 0,
462cf6930feSjsing .tag = 0,
463cf6930feSjsing .offset = offsetof(PKCS7_ISSUER_AND_SERIAL, issuer),
464cf6930feSjsing .field_name = "issuer",
465cf6930feSjsing .item = &X509_NAME_it,
466cf6930feSjsing },
467cf6930feSjsing {
468cf6930feSjsing .flags = 0,
469cf6930feSjsing .tag = 0,
470cf6930feSjsing .offset = offsetof(PKCS7_ISSUER_AND_SERIAL, serial),
471cf6930feSjsing .field_name = "serial",
472cf6930feSjsing .item = &ASN1_INTEGER_it,
473cf6930feSjsing },
474cf6930feSjsing };
475cf6930feSjsing
476cf6930feSjsing const ASN1_ITEM PKCS7_ISSUER_AND_SERIAL_it = {
477cf6930feSjsing .itype = ASN1_ITYPE_SEQUENCE,
478cf6930feSjsing .utype = V_ASN1_SEQUENCE,
479cf6930feSjsing .templates = PKCS7_ISSUER_AND_SERIAL_seq_tt,
480cf6930feSjsing .tcount = sizeof(PKCS7_ISSUER_AND_SERIAL_seq_tt) / sizeof(ASN1_TEMPLATE),
481cf6930feSjsing .funcs = NULL,
482cf6930feSjsing .size = sizeof(PKCS7_ISSUER_AND_SERIAL),
483cf6930feSjsing .sname = "PKCS7_ISSUER_AND_SERIAL",
484cf6930feSjsing };
485*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_ISSUER_AND_SERIAL_it);
486da347917Sbeck
487dc83dab0Sjsing
488dc83dab0Sjsing PKCS7_ISSUER_AND_SERIAL *
d2i_PKCS7_ISSUER_AND_SERIAL(PKCS7_ISSUER_AND_SERIAL ** a,const unsigned char ** in,long len)489dc83dab0Sjsing d2i_PKCS7_ISSUER_AND_SERIAL(PKCS7_ISSUER_AND_SERIAL **a, const unsigned char **in, long len)
490dc83dab0Sjsing {
491dc83dab0Sjsing return (PKCS7_ISSUER_AND_SERIAL *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
492dc83dab0Sjsing &PKCS7_ISSUER_AND_SERIAL_it);
493dc83dab0Sjsing }
494cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_ISSUER_AND_SERIAL);
495dc83dab0Sjsing
496dc83dab0Sjsing int
i2d_PKCS7_ISSUER_AND_SERIAL(PKCS7_ISSUER_AND_SERIAL * a,unsigned char ** out)497dc83dab0Sjsing i2d_PKCS7_ISSUER_AND_SERIAL(PKCS7_ISSUER_AND_SERIAL *a, unsigned char **out)
498dc83dab0Sjsing {
499dc83dab0Sjsing return ASN1_item_i2d((ASN1_VALUE *)a, out, &PKCS7_ISSUER_AND_SERIAL_it);
500dc83dab0Sjsing }
501cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_ISSUER_AND_SERIAL);
502dc83dab0Sjsing
503dc83dab0Sjsing PKCS7_ISSUER_AND_SERIAL *
PKCS7_ISSUER_AND_SERIAL_new(void)504dc83dab0Sjsing PKCS7_ISSUER_AND_SERIAL_new(void)
505dc83dab0Sjsing {
506dc83dab0Sjsing return (PKCS7_ISSUER_AND_SERIAL *)ASN1_item_new(&PKCS7_ISSUER_AND_SERIAL_it);
507dc83dab0Sjsing }
508cedac418Stb LCRYPTO_ALIAS(PKCS7_ISSUER_AND_SERIAL_new);
509dc83dab0Sjsing
510dc83dab0Sjsing void
PKCS7_ISSUER_AND_SERIAL_free(PKCS7_ISSUER_AND_SERIAL * a)511dc83dab0Sjsing PKCS7_ISSUER_AND_SERIAL_free(PKCS7_ISSUER_AND_SERIAL *a)
512dc83dab0Sjsing {
513dc83dab0Sjsing ASN1_item_free((ASN1_VALUE *)a, &PKCS7_ISSUER_AND_SERIAL_it);
514dc83dab0Sjsing }
515cedac418Stb LCRYPTO_ALIAS(PKCS7_ISSUER_AND_SERIAL_free);
516da347917Sbeck
517cf6930feSjsing static const ASN1_TEMPLATE PKCS7_ENVELOPE_seq_tt[] = {
518cf6930feSjsing {
519cf6930feSjsing .flags = 0,
520cf6930feSjsing .tag = 0,
521cf6930feSjsing .offset = offsetof(PKCS7_ENVELOPE, version),
522cf6930feSjsing .field_name = "version",
523cf6930feSjsing .item = &ASN1_INTEGER_it,
524cf6930feSjsing },
525cf6930feSjsing {
526cf6930feSjsing .flags = ASN1_TFLG_SET_OF,
527cf6930feSjsing .tag = 0,
528cf6930feSjsing .offset = offsetof(PKCS7_ENVELOPE, recipientinfo),
529cf6930feSjsing .field_name = "recipientinfo",
530cf6930feSjsing .item = &PKCS7_RECIP_INFO_it,
531cf6930feSjsing },
532cf6930feSjsing {
533cf6930feSjsing .flags = 0,
534cf6930feSjsing .tag = 0,
535cf6930feSjsing .offset = offsetof(PKCS7_ENVELOPE, enc_data),
536cf6930feSjsing .field_name = "enc_data",
537cf6930feSjsing .item = &PKCS7_ENC_CONTENT_it,
538cf6930feSjsing },
539cf6930feSjsing };
540cf6930feSjsing
541cf6930feSjsing const ASN1_ITEM PKCS7_ENVELOPE_it = {
542cf6930feSjsing .itype = ASN1_ITYPE_NDEF_SEQUENCE,
543cf6930feSjsing .utype = V_ASN1_SEQUENCE,
544cf6930feSjsing .templates = PKCS7_ENVELOPE_seq_tt,
545cf6930feSjsing .tcount = sizeof(PKCS7_ENVELOPE_seq_tt) / sizeof(ASN1_TEMPLATE),
546cf6930feSjsing .funcs = NULL,
547cf6930feSjsing .size = sizeof(PKCS7_ENVELOPE),
548cf6930feSjsing .sname = "PKCS7_ENVELOPE",
549cf6930feSjsing };
550*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_ENVELOPE_it);
551da347917Sbeck
552dc83dab0Sjsing
553dc83dab0Sjsing PKCS7_ENVELOPE *
d2i_PKCS7_ENVELOPE(PKCS7_ENVELOPE ** a,const unsigned char ** in,long len)554dc83dab0Sjsing d2i_PKCS7_ENVELOPE(PKCS7_ENVELOPE **a, const unsigned char **in, long len)
555dc83dab0Sjsing {
556dc83dab0Sjsing return (PKCS7_ENVELOPE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
557dc83dab0Sjsing &PKCS7_ENVELOPE_it);
558dc83dab0Sjsing }
559cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_ENVELOPE);
560dc83dab0Sjsing
561dc83dab0Sjsing int
i2d_PKCS7_ENVELOPE(PKCS7_ENVELOPE * a,unsigned char ** out)562dc83dab0Sjsing i2d_PKCS7_ENVELOPE(PKCS7_ENVELOPE *a, unsigned char **out)
563dc83dab0Sjsing {
564dc83dab0Sjsing return ASN1_item_i2d((ASN1_VALUE *)a, out, &PKCS7_ENVELOPE_it);
565dc83dab0Sjsing }
566cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_ENVELOPE);
567dc83dab0Sjsing
568dc83dab0Sjsing PKCS7_ENVELOPE *
PKCS7_ENVELOPE_new(void)569dc83dab0Sjsing PKCS7_ENVELOPE_new(void)
570dc83dab0Sjsing {
571dc83dab0Sjsing return (PKCS7_ENVELOPE *)ASN1_item_new(&PKCS7_ENVELOPE_it);
572dc83dab0Sjsing }
573cedac418Stb LCRYPTO_ALIAS(PKCS7_ENVELOPE_new);
574dc83dab0Sjsing
575dc83dab0Sjsing void
PKCS7_ENVELOPE_free(PKCS7_ENVELOPE * a)576dc83dab0Sjsing PKCS7_ENVELOPE_free(PKCS7_ENVELOPE *a)
577dc83dab0Sjsing {
578dc83dab0Sjsing ASN1_item_free((ASN1_VALUE *)a, &PKCS7_ENVELOPE_it);
579dc83dab0Sjsing }
580cedac418Stb LCRYPTO_ALIAS(PKCS7_ENVELOPE_free);
581da347917Sbeck
582da347917Sbeck /* Minor tweak to operation: free up X509 */
583cace2641Sjsing static int
ri_cb(int operation,ASN1_VALUE ** pval,const ASN1_ITEM * it,void * exarg)584cace2641Sjsing ri_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg)
585da347917Sbeck {
586da347917Sbeck if (operation == ASN1_OP_FREE_POST) {
587da347917Sbeck PKCS7_RECIP_INFO *ri = (PKCS7_RECIP_INFO *)*pval;
588da347917Sbeck X509_free(ri->cert);
589da347917Sbeck }
590da347917Sbeck return 1;
591da347917Sbeck }
592da347917Sbeck
593cf6930feSjsing static const ASN1_AUX PKCS7_RECIP_INFO_aux = {
594cf6930feSjsing .app_data = NULL,
595cf6930feSjsing .flags = 0,
596cf6930feSjsing .ref_offset = 0,
597cf6930feSjsing .ref_lock = 0,
598cf6930feSjsing .asn1_cb = ri_cb,
599cf6930feSjsing .enc_offset = 0,
600cf6930feSjsing };
601cf6930feSjsing static const ASN1_TEMPLATE PKCS7_RECIP_INFO_seq_tt[] = {
602cf6930feSjsing {
603cf6930feSjsing .flags = 0,
604cf6930feSjsing .tag = 0,
605cf6930feSjsing .offset = offsetof(PKCS7_RECIP_INFO, version),
606cf6930feSjsing .field_name = "version",
607cf6930feSjsing .item = &ASN1_INTEGER_it,
608cf6930feSjsing },
609cf6930feSjsing {
610cf6930feSjsing .flags = 0,
611cf6930feSjsing .tag = 0,
612cf6930feSjsing .offset = offsetof(PKCS7_RECIP_INFO, issuer_and_serial),
613cf6930feSjsing .field_name = "issuer_and_serial",
614cf6930feSjsing .item = &PKCS7_ISSUER_AND_SERIAL_it,
615cf6930feSjsing },
616cf6930feSjsing {
617cf6930feSjsing .flags = 0,
618cf6930feSjsing .tag = 0,
619cf6930feSjsing .offset = offsetof(PKCS7_RECIP_INFO, key_enc_algor),
620cf6930feSjsing .field_name = "key_enc_algor",
621cf6930feSjsing .item = &X509_ALGOR_it,
622cf6930feSjsing },
623cf6930feSjsing {
624cf6930feSjsing .flags = 0,
625cf6930feSjsing .tag = 0,
626cf6930feSjsing .offset = offsetof(PKCS7_RECIP_INFO, enc_key),
627cf6930feSjsing .field_name = "enc_key",
628cf6930feSjsing .item = &ASN1_OCTET_STRING_it,
629cf6930feSjsing },
630cf6930feSjsing };
631cf6930feSjsing
632cf6930feSjsing const ASN1_ITEM PKCS7_RECIP_INFO_it = {
633cf6930feSjsing .itype = ASN1_ITYPE_SEQUENCE,
634cf6930feSjsing .utype = V_ASN1_SEQUENCE,
635cf6930feSjsing .templates = PKCS7_RECIP_INFO_seq_tt,
636cf6930feSjsing .tcount = sizeof(PKCS7_RECIP_INFO_seq_tt) / sizeof(ASN1_TEMPLATE),
637cf6930feSjsing .funcs = &PKCS7_RECIP_INFO_aux,
638cf6930feSjsing .size = sizeof(PKCS7_RECIP_INFO),
639cf6930feSjsing .sname = "PKCS7_RECIP_INFO",
640cf6930feSjsing };
641*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_RECIP_INFO_it);
642da347917Sbeck
643dc83dab0Sjsing
644dc83dab0Sjsing PKCS7_RECIP_INFO *
d2i_PKCS7_RECIP_INFO(PKCS7_RECIP_INFO ** a,const unsigned char ** in,long len)645dc83dab0Sjsing d2i_PKCS7_RECIP_INFO(PKCS7_RECIP_INFO **a, const unsigned char **in, long len)
646dc83dab0Sjsing {
647dc83dab0Sjsing return (PKCS7_RECIP_INFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
648dc83dab0Sjsing &PKCS7_RECIP_INFO_it);
649dc83dab0Sjsing }
650cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_RECIP_INFO);
651dc83dab0Sjsing
652dc83dab0Sjsing int
i2d_PKCS7_RECIP_INFO(PKCS7_RECIP_INFO * a,unsigned char ** out)653dc83dab0Sjsing i2d_PKCS7_RECIP_INFO(PKCS7_RECIP_INFO *a, unsigned char **out)
654dc83dab0Sjsing {
655dc83dab0Sjsing return ASN1_item_i2d((ASN1_VALUE *)a, out, &PKCS7_RECIP_INFO_it);
656dc83dab0Sjsing }
657cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_RECIP_INFO);
658dc83dab0Sjsing
659dc83dab0Sjsing PKCS7_RECIP_INFO *
PKCS7_RECIP_INFO_new(void)660dc83dab0Sjsing PKCS7_RECIP_INFO_new(void)
661dc83dab0Sjsing {
662dc83dab0Sjsing return (PKCS7_RECIP_INFO *)ASN1_item_new(&PKCS7_RECIP_INFO_it);
663dc83dab0Sjsing }
664cedac418Stb LCRYPTO_ALIAS(PKCS7_RECIP_INFO_new);
665dc83dab0Sjsing
666dc83dab0Sjsing void
PKCS7_RECIP_INFO_free(PKCS7_RECIP_INFO * a)667dc83dab0Sjsing PKCS7_RECIP_INFO_free(PKCS7_RECIP_INFO *a)
668dc83dab0Sjsing {
669dc83dab0Sjsing ASN1_item_free((ASN1_VALUE *)a, &PKCS7_RECIP_INFO_it);
670dc83dab0Sjsing }
671cedac418Stb LCRYPTO_ALIAS(PKCS7_RECIP_INFO_free);
672da347917Sbeck
673cf6930feSjsing static const ASN1_TEMPLATE PKCS7_ENC_CONTENT_seq_tt[] = {
674cf6930feSjsing {
675cf6930feSjsing .flags = 0,
676cf6930feSjsing .tag = 0,
677cf6930feSjsing .offset = offsetof(PKCS7_ENC_CONTENT, content_type),
678cf6930feSjsing .field_name = "content_type",
679cf6930feSjsing .item = &ASN1_OBJECT_it,
680cf6930feSjsing },
681cf6930feSjsing {
682cf6930feSjsing .flags = 0,
683cf6930feSjsing .tag = 0,
684cf6930feSjsing .offset = offsetof(PKCS7_ENC_CONTENT, algorithm),
685cf6930feSjsing .field_name = "algorithm",
686cf6930feSjsing .item = &X509_ALGOR_it,
687cf6930feSjsing },
688cf6930feSjsing {
689cf6930feSjsing .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_OPTIONAL,
690cf6930feSjsing .tag = 0,
691cf6930feSjsing .offset = offsetof(PKCS7_ENC_CONTENT, enc_data),
692cf6930feSjsing .field_name = "enc_data",
693cf6930feSjsing .item = &ASN1_OCTET_STRING_NDEF_it,
694cf6930feSjsing },
695cf6930feSjsing };
696cf6930feSjsing
697cf6930feSjsing const ASN1_ITEM PKCS7_ENC_CONTENT_it = {
698cf6930feSjsing .itype = ASN1_ITYPE_NDEF_SEQUENCE,
699cf6930feSjsing .utype = V_ASN1_SEQUENCE,
700cf6930feSjsing .templates = PKCS7_ENC_CONTENT_seq_tt,
701cf6930feSjsing .tcount = sizeof(PKCS7_ENC_CONTENT_seq_tt) / sizeof(ASN1_TEMPLATE),
702cf6930feSjsing .funcs = NULL,
703cf6930feSjsing .size = sizeof(PKCS7_ENC_CONTENT),
704cf6930feSjsing .sname = "PKCS7_ENC_CONTENT",
705cf6930feSjsing };
706*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_ENC_CONTENT_it);
707da347917Sbeck
708dc83dab0Sjsing
709dc83dab0Sjsing PKCS7_ENC_CONTENT *
d2i_PKCS7_ENC_CONTENT(PKCS7_ENC_CONTENT ** a,const unsigned char ** in,long len)710dc83dab0Sjsing d2i_PKCS7_ENC_CONTENT(PKCS7_ENC_CONTENT **a, const unsigned char **in, long len)
711dc83dab0Sjsing {
712dc83dab0Sjsing return (PKCS7_ENC_CONTENT *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
713dc83dab0Sjsing &PKCS7_ENC_CONTENT_it);
714dc83dab0Sjsing }
715cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_ENC_CONTENT);
716dc83dab0Sjsing
717dc83dab0Sjsing int
i2d_PKCS7_ENC_CONTENT(PKCS7_ENC_CONTENT * a,unsigned char ** out)718dc83dab0Sjsing i2d_PKCS7_ENC_CONTENT(PKCS7_ENC_CONTENT *a, unsigned char **out)
719dc83dab0Sjsing {
720dc83dab0Sjsing return ASN1_item_i2d((ASN1_VALUE *)a, out, &PKCS7_ENC_CONTENT_it);
721dc83dab0Sjsing }
722cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_ENC_CONTENT);
723dc83dab0Sjsing
724dc83dab0Sjsing PKCS7_ENC_CONTENT *
PKCS7_ENC_CONTENT_new(void)725dc83dab0Sjsing PKCS7_ENC_CONTENT_new(void)
726dc83dab0Sjsing {
727dc83dab0Sjsing return (PKCS7_ENC_CONTENT *)ASN1_item_new(&PKCS7_ENC_CONTENT_it);
728dc83dab0Sjsing }
729cedac418Stb LCRYPTO_ALIAS(PKCS7_ENC_CONTENT_new);
730dc83dab0Sjsing
731dc83dab0Sjsing void
PKCS7_ENC_CONTENT_free(PKCS7_ENC_CONTENT * a)732dc83dab0Sjsing PKCS7_ENC_CONTENT_free(PKCS7_ENC_CONTENT *a)
733dc83dab0Sjsing {
734dc83dab0Sjsing ASN1_item_free((ASN1_VALUE *)a, &PKCS7_ENC_CONTENT_it);
735dc83dab0Sjsing }
736cedac418Stb LCRYPTO_ALIAS(PKCS7_ENC_CONTENT_free);
737da347917Sbeck
738cf6930feSjsing static const ASN1_TEMPLATE PKCS7_SIGN_ENVELOPE_seq_tt[] = {
739cf6930feSjsing {
740cf6930feSjsing .flags = 0,
741cf6930feSjsing .tag = 0,
742cf6930feSjsing .offset = offsetof(PKCS7_SIGN_ENVELOPE, version),
743cf6930feSjsing .field_name = "version",
744cf6930feSjsing .item = &ASN1_INTEGER_it,
745cf6930feSjsing },
746cf6930feSjsing {
747cf6930feSjsing .flags = ASN1_TFLG_SET_OF,
748cf6930feSjsing .tag = 0,
749cf6930feSjsing .offset = offsetof(PKCS7_SIGN_ENVELOPE, recipientinfo),
750cf6930feSjsing .field_name = "recipientinfo",
751cf6930feSjsing .item = &PKCS7_RECIP_INFO_it,
752cf6930feSjsing },
753cf6930feSjsing {
754cf6930feSjsing .flags = ASN1_TFLG_SET_OF,
755cf6930feSjsing .tag = 0,
756cf6930feSjsing .offset = offsetof(PKCS7_SIGN_ENVELOPE, md_algs),
757cf6930feSjsing .field_name = "md_algs",
758cf6930feSjsing .item = &X509_ALGOR_it,
759cf6930feSjsing },
760cf6930feSjsing {
761cf6930feSjsing .flags = 0,
762cf6930feSjsing .tag = 0,
763cf6930feSjsing .offset = offsetof(PKCS7_SIGN_ENVELOPE, enc_data),
764cf6930feSjsing .field_name = "enc_data",
765cf6930feSjsing .item = &PKCS7_ENC_CONTENT_it,
766cf6930feSjsing },
767cf6930feSjsing {
768cf6930feSjsing .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL,
769cf6930feSjsing .tag = 0,
770cf6930feSjsing .offset = offsetof(PKCS7_SIGN_ENVELOPE, cert),
771cf6930feSjsing .field_name = "cert",
772cf6930feSjsing .item = &X509_it,
773cf6930feSjsing },
774cf6930feSjsing {
775cf6930feSjsing .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL,
776cf6930feSjsing .tag = 1,
777cf6930feSjsing .offset = offsetof(PKCS7_SIGN_ENVELOPE, crl),
778cf6930feSjsing .field_name = "crl",
779cf6930feSjsing .item = &X509_CRL_it,
780cf6930feSjsing },
781cf6930feSjsing {
782cf6930feSjsing .flags = ASN1_TFLG_SET_OF,
783cf6930feSjsing .tag = 0,
784cf6930feSjsing .offset = offsetof(PKCS7_SIGN_ENVELOPE, signer_info),
785cf6930feSjsing .field_name = "signer_info",
786cf6930feSjsing .item = &PKCS7_SIGNER_INFO_it,
787cf6930feSjsing },
788cf6930feSjsing };
789cf6930feSjsing
790cf6930feSjsing const ASN1_ITEM PKCS7_SIGN_ENVELOPE_it = {
791cf6930feSjsing .itype = ASN1_ITYPE_NDEF_SEQUENCE,
792cf6930feSjsing .utype = V_ASN1_SEQUENCE,
793cf6930feSjsing .templates = PKCS7_SIGN_ENVELOPE_seq_tt,
794cf6930feSjsing .tcount = sizeof(PKCS7_SIGN_ENVELOPE_seq_tt) / sizeof(ASN1_TEMPLATE),
795cf6930feSjsing .funcs = NULL,
796cf6930feSjsing .size = sizeof(PKCS7_SIGN_ENVELOPE),
797cf6930feSjsing .sname = "PKCS7_SIGN_ENVELOPE",
798cf6930feSjsing };
799*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_SIGN_ENVELOPE_it);
800da347917Sbeck
801dc83dab0Sjsing
802dc83dab0Sjsing PKCS7_SIGN_ENVELOPE *
d2i_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE ** a,const unsigned char ** in,long len)803dc83dab0Sjsing d2i_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE **a, const unsigned char **in, long len)
804dc83dab0Sjsing {
805dc83dab0Sjsing return (PKCS7_SIGN_ENVELOPE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
806dc83dab0Sjsing &PKCS7_SIGN_ENVELOPE_it);
807dc83dab0Sjsing }
808cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_SIGN_ENVELOPE);
809dc83dab0Sjsing
810dc83dab0Sjsing int
i2d_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE * a,unsigned char ** out)811dc83dab0Sjsing i2d_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE *a, unsigned char **out)
812dc83dab0Sjsing {
813dc83dab0Sjsing return ASN1_item_i2d((ASN1_VALUE *)a, out, &PKCS7_SIGN_ENVELOPE_it);
814dc83dab0Sjsing }
815cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_SIGN_ENVELOPE);
816dc83dab0Sjsing
817dc83dab0Sjsing PKCS7_SIGN_ENVELOPE *
PKCS7_SIGN_ENVELOPE_new(void)818dc83dab0Sjsing PKCS7_SIGN_ENVELOPE_new(void)
819dc83dab0Sjsing {
820dc83dab0Sjsing return (PKCS7_SIGN_ENVELOPE *)ASN1_item_new(&PKCS7_SIGN_ENVELOPE_it);
821dc83dab0Sjsing }
822cedac418Stb LCRYPTO_ALIAS(PKCS7_SIGN_ENVELOPE_new);
823dc83dab0Sjsing
824dc83dab0Sjsing void
PKCS7_SIGN_ENVELOPE_free(PKCS7_SIGN_ENVELOPE * a)825dc83dab0Sjsing PKCS7_SIGN_ENVELOPE_free(PKCS7_SIGN_ENVELOPE *a)
826dc83dab0Sjsing {
827dc83dab0Sjsing ASN1_item_free((ASN1_VALUE *)a, &PKCS7_SIGN_ENVELOPE_it);
828dc83dab0Sjsing }
829cedac418Stb LCRYPTO_ALIAS(PKCS7_SIGN_ENVELOPE_free);
830da347917Sbeck
831cf6930feSjsing static const ASN1_TEMPLATE PKCS7_ENCRYPT_seq_tt[] = {
832cf6930feSjsing {
833cf6930feSjsing .flags = 0,
834cf6930feSjsing .tag = 0,
835cf6930feSjsing .offset = offsetof(PKCS7_ENCRYPT, version),
836cf6930feSjsing .field_name = "version",
837cf6930feSjsing .item = &ASN1_INTEGER_it,
838cf6930feSjsing },
839cf6930feSjsing {
840cf6930feSjsing .flags = 0,
841cf6930feSjsing .tag = 0,
842cf6930feSjsing .offset = offsetof(PKCS7_ENCRYPT, enc_data),
843cf6930feSjsing .field_name = "enc_data",
844cf6930feSjsing .item = &PKCS7_ENC_CONTENT_it,
845cf6930feSjsing },
846cf6930feSjsing };
847cf6930feSjsing
848cf6930feSjsing const ASN1_ITEM PKCS7_ENCRYPT_it = {
849cf6930feSjsing .itype = ASN1_ITYPE_NDEF_SEQUENCE,
850cf6930feSjsing .utype = V_ASN1_SEQUENCE,
851cf6930feSjsing .templates = PKCS7_ENCRYPT_seq_tt,
852cf6930feSjsing .tcount = sizeof(PKCS7_ENCRYPT_seq_tt) / sizeof(ASN1_TEMPLATE),
853cf6930feSjsing .funcs = NULL,
854cf6930feSjsing .size = sizeof(PKCS7_ENCRYPT),
855cf6930feSjsing .sname = "PKCS7_ENCRYPT",
856cf6930feSjsing };
857*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_ENCRYPT_it);
858da347917Sbeck
859dc83dab0Sjsing
860dc83dab0Sjsing PKCS7_ENCRYPT *
d2i_PKCS7_ENCRYPT(PKCS7_ENCRYPT ** a,const unsigned char ** in,long len)861dc83dab0Sjsing d2i_PKCS7_ENCRYPT(PKCS7_ENCRYPT **a, const unsigned char **in, long len)
862dc83dab0Sjsing {
863dc83dab0Sjsing return (PKCS7_ENCRYPT *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
864dc83dab0Sjsing &PKCS7_ENCRYPT_it);
865dc83dab0Sjsing }
866cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_ENCRYPT);
867dc83dab0Sjsing
868dc83dab0Sjsing int
i2d_PKCS7_ENCRYPT(PKCS7_ENCRYPT * a,unsigned char ** out)869dc83dab0Sjsing i2d_PKCS7_ENCRYPT(PKCS7_ENCRYPT *a, unsigned char **out)
870dc83dab0Sjsing {
871dc83dab0Sjsing return ASN1_item_i2d((ASN1_VALUE *)a, out, &PKCS7_ENCRYPT_it);
872dc83dab0Sjsing }
873cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_ENCRYPT);
874dc83dab0Sjsing
875dc83dab0Sjsing PKCS7_ENCRYPT *
PKCS7_ENCRYPT_new(void)876dc83dab0Sjsing PKCS7_ENCRYPT_new(void)
877dc83dab0Sjsing {
878dc83dab0Sjsing return (PKCS7_ENCRYPT *)ASN1_item_new(&PKCS7_ENCRYPT_it);
879dc83dab0Sjsing }
880cedac418Stb LCRYPTO_ALIAS(PKCS7_ENCRYPT_new);
881dc83dab0Sjsing
882dc83dab0Sjsing void
PKCS7_ENCRYPT_free(PKCS7_ENCRYPT * a)883dc83dab0Sjsing PKCS7_ENCRYPT_free(PKCS7_ENCRYPT *a)
884dc83dab0Sjsing {
885dc83dab0Sjsing ASN1_item_free((ASN1_VALUE *)a, &PKCS7_ENCRYPT_it);
886dc83dab0Sjsing }
887cedac418Stb LCRYPTO_ALIAS(PKCS7_ENCRYPT_free);
888da347917Sbeck
889cf6930feSjsing static const ASN1_TEMPLATE PKCS7_DIGEST_seq_tt[] = {
890cf6930feSjsing {
891cf6930feSjsing .flags = 0,
892cf6930feSjsing .tag = 0,
893cf6930feSjsing .offset = offsetof(PKCS7_DIGEST, version),
894cf6930feSjsing .field_name = "version",
895cf6930feSjsing .item = &ASN1_INTEGER_it,
896cf6930feSjsing },
897cf6930feSjsing {
898cf6930feSjsing .flags = 0,
899cf6930feSjsing .tag = 0,
900cf6930feSjsing .offset = offsetof(PKCS7_DIGEST, md),
901cf6930feSjsing .field_name = "md",
902cf6930feSjsing .item = &X509_ALGOR_it,
903cf6930feSjsing },
904cf6930feSjsing {
905cf6930feSjsing .flags = 0,
906cf6930feSjsing .tag = 0,
907cf6930feSjsing .offset = offsetof(PKCS7_DIGEST, contents),
908cf6930feSjsing .field_name = "contents",
909cf6930feSjsing .item = &PKCS7_it,
910cf6930feSjsing },
911cf6930feSjsing {
912cf6930feSjsing .flags = 0,
913cf6930feSjsing .tag = 0,
914cf6930feSjsing .offset = offsetof(PKCS7_DIGEST, digest),
915cf6930feSjsing .field_name = "digest",
916cf6930feSjsing .item = &ASN1_OCTET_STRING_it,
917cf6930feSjsing },
918cf6930feSjsing };
919cf6930feSjsing
920cf6930feSjsing const ASN1_ITEM PKCS7_DIGEST_it = {
921cf6930feSjsing .itype = ASN1_ITYPE_NDEF_SEQUENCE,
922cf6930feSjsing .utype = V_ASN1_SEQUENCE,
923cf6930feSjsing .templates = PKCS7_DIGEST_seq_tt,
924cf6930feSjsing .tcount = sizeof(PKCS7_DIGEST_seq_tt) / sizeof(ASN1_TEMPLATE),
925cf6930feSjsing .funcs = NULL,
926cf6930feSjsing .size = sizeof(PKCS7_DIGEST),
927cf6930feSjsing .sname = "PKCS7_DIGEST",
928cf6930feSjsing };
929*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_DIGEST_it);
930da347917Sbeck
931dc83dab0Sjsing
932dc83dab0Sjsing PKCS7_DIGEST *
d2i_PKCS7_DIGEST(PKCS7_DIGEST ** a,const unsigned char ** in,long len)933dc83dab0Sjsing d2i_PKCS7_DIGEST(PKCS7_DIGEST **a, const unsigned char **in, long len)
934dc83dab0Sjsing {
935dc83dab0Sjsing return (PKCS7_DIGEST *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
936dc83dab0Sjsing &PKCS7_DIGEST_it);
937dc83dab0Sjsing }
938cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_DIGEST);
939dc83dab0Sjsing
940dc83dab0Sjsing int
i2d_PKCS7_DIGEST(PKCS7_DIGEST * a,unsigned char ** out)941dc83dab0Sjsing i2d_PKCS7_DIGEST(PKCS7_DIGEST *a, unsigned char **out)
942dc83dab0Sjsing {
943dc83dab0Sjsing return ASN1_item_i2d((ASN1_VALUE *)a, out, &PKCS7_DIGEST_it);
944dc83dab0Sjsing }
945cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_DIGEST);
946dc83dab0Sjsing
947dc83dab0Sjsing PKCS7_DIGEST *
PKCS7_DIGEST_new(void)948dc83dab0Sjsing PKCS7_DIGEST_new(void)
949dc83dab0Sjsing {
950dc83dab0Sjsing return (PKCS7_DIGEST *)ASN1_item_new(&PKCS7_DIGEST_it);
951dc83dab0Sjsing }
952cedac418Stb LCRYPTO_ALIAS(PKCS7_DIGEST_new);
953dc83dab0Sjsing
954dc83dab0Sjsing void
PKCS7_DIGEST_free(PKCS7_DIGEST * a)955dc83dab0Sjsing PKCS7_DIGEST_free(PKCS7_DIGEST *a)
956dc83dab0Sjsing {
957dc83dab0Sjsing ASN1_item_free((ASN1_VALUE *)a, &PKCS7_DIGEST_it);
958dc83dab0Sjsing }
959cedac418Stb LCRYPTO_ALIAS(PKCS7_DIGEST_free);
960da347917Sbeck
961da347917Sbeck /* Specials for authenticated attributes */
962da347917Sbeck
963da347917Sbeck /* When signing attributes we want to reorder them to match the sorted
964da347917Sbeck * encoding.
965da347917Sbeck */
966da347917Sbeck
967cf6930feSjsing static const ASN1_TEMPLATE PKCS7_ATTR_SIGN_item_tt = {
968cf6930feSjsing .flags = ASN1_TFLG_SET_ORDER,
969cf6930feSjsing .tag = 0,
970cf6930feSjsing .offset = 0,
971cf6930feSjsing .field_name = "PKCS7_ATTRIBUTES",
972cf6930feSjsing .item = &X509_ATTRIBUTE_it,
973cf6930feSjsing };
974cf6930feSjsing
975cf6930feSjsing const ASN1_ITEM PKCS7_ATTR_SIGN_it = {
976cf6930feSjsing .itype = ASN1_ITYPE_PRIMITIVE,
977cf6930feSjsing .utype = -1,
978cf6930feSjsing .templates = &PKCS7_ATTR_SIGN_item_tt,
979cf6930feSjsing .tcount = 0,
980cf6930feSjsing .funcs = NULL,
981cf6930feSjsing .size = 0,
982cf6930feSjsing .sname = "PKCS7_ATTR_SIGN",
983cf6930feSjsing };
984*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_ATTR_SIGN_it);
985da347917Sbeck
986da347917Sbeck /* When verifying attributes we need to use the received order. So
987da347917Sbeck * we use SEQUENCE OF and tag it to SET OF
988da347917Sbeck */
989da347917Sbeck
990cf6930feSjsing static const ASN1_TEMPLATE PKCS7_ATTR_VERIFY_item_tt = {
991cf6930feSjsing .flags = ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TFLG_UNIVERSAL,
992cf6930feSjsing .tag = V_ASN1_SET,
993cf6930feSjsing .offset = 0,
994cf6930feSjsing .field_name = "PKCS7_ATTRIBUTES",
995cf6930feSjsing .item = &X509_ATTRIBUTE_it,
996cf6930feSjsing };
997cf6930feSjsing
998cf6930feSjsing const ASN1_ITEM PKCS7_ATTR_VERIFY_it = {
999cf6930feSjsing .itype = ASN1_ITYPE_PRIMITIVE,
1000cf6930feSjsing .utype = -1,
1001cf6930feSjsing .templates = &PKCS7_ATTR_VERIFY_item_tt,
1002cf6930feSjsing .tcount = 0,
1003cf6930feSjsing .funcs = NULL,
1004cf6930feSjsing .size = 0,
1005cf6930feSjsing .sname = "PKCS7_ATTR_VERIFY",
1006cf6930feSjsing };
1007*589ce5b7Sbeck LCRYPTO_ALIAS(PKCS7_ATTR_VERIFY_it);
10080a5d6edeSdjm
1009402dcee2Sjsing
1010402dcee2Sjsing int
PKCS7_print_ctx(BIO * out,PKCS7 * x,int indent,const ASN1_PCTX * pctx)1011402dcee2Sjsing PKCS7_print_ctx(BIO *out, PKCS7 *x, int indent, const ASN1_PCTX *pctx)
1012402dcee2Sjsing {
1013402dcee2Sjsing return ASN1_item_print(out, (ASN1_VALUE *)x, indent,
1014402dcee2Sjsing &PKCS7_it, pctx);
1015402dcee2Sjsing }
1016cedac418Stb LCRYPTO_ALIAS(PKCS7_print_ctx);
1017c66cbe72Sbeck
1018c66cbe72Sbeck PKCS7 *
d2i_PKCS7_bio(BIO * bp,PKCS7 ** p7)1019c66cbe72Sbeck d2i_PKCS7_bio(BIO *bp, PKCS7 **p7)
1020c66cbe72Sbeck {
1021c66cbe72Sbeck return ASN1_item_d2i_bio(&PKCS7_it, bp, p7);
1022c66cbe72Sbeck }
1023cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_bio);
1024c66cbe72Sbeck
1025c66cbe72Sbeck int
i2d_PKCS7_bio(BIO * bp,PKCS7 * p7)1026c66cbe72Sbeck i2d_PKCS7_bio(BIO *bp, PKCS7 *p7)
1027c66cbe72Sbeck {
1028c66cbe72Sbeck return ASN1_item_i2d_bio(&PKCS7_it, bp, p7);
1029c66cbe72Sbeck }
1030cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_bio);
1031c66cbe72Sbeck
1032c66cbe72Sbeck PKCS7 *
d2i_PKCS7_fp(FILE * fp,PKCS7 ** p7)1033c66cbe72Sbeck d2i_PKCS7_fp(FILE *fp, PKCS7 **p7)
1034c66cbe72Sbeck {
1035c66cbe72Sbeck return ASN1_item_d2i_fp(&PKCS7_it, fp, p7);
1036c66cbe72Sbeck }
1037cedac418Stb LCRYPTO_ALIAS(d2i_PKCS7_fp);
1038c66cbe72Sbeck
1039c66cbe72Sbeck int
i2d_PKCS7_fp(FILE * fp,PKCS7 * p7)1040c66cbe72Sbeck i2d_PKCS7_fp(FILE *fp, PKCS7 *p7)
1041c66cbe72Sbeck {
1042c66cbe72Sbeck return ASN1_item_i2d_fp(&PKCS7_it, fp, p7);
1043c66cbe72Sbeck }
1044cedac418Stb LCRYPTO_ALIAS(i2d_PKCS7_fp);
1045c66cbe72Sbeck
1046c66cbe72Sbeck int
PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL * data,const EVP_MD * type,unsigned char * md,unsigned int * len)1047c66cbe72Sbeck PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data,
1048c66cbe72Sbeck const EVP_MD *type, unsigned char *md, unsigned int *len)
1049c66cbe72Sbeck {
1050c66cbe72Sbeck return(ASN1_item_digest(&PKCS7_ISSUER_AND_SERIAL_it, type,
1051c66cbe72Sbeck (char *)data, md, len));
1052c66cbe72Sbeck }
1053cedac418Stb LCRYPTO_ALIAS(PKCS7_ISSUER_AND_SERIAL_digest);
1054