~ubuntu-branches/ubuntu/lucid/openssl/lucid-proposed

« back to all changes in this revision

Viewing changes to crypto/cms/cms_asn1.c

  • Committer: Bazaar Package Importer
  • Author(s): Nicolas Valcárcel Scerpella (Canonical)
  • Date: 2009-12-06 20:16:24 UTC
  • mfrom: (11.1.9 sid)
  • Revision ID: james.westby@ubuntu.com-20091206201624-u126qjpqm2n2uuhu
Tags: 0.9.8k-7ubuntu1
* Merge from debian unstable, remaining changes (LP: #493392):
  - Link using -Bsymbolic-functions
  - Add support for lpia
  - Disable SSLv2 during compile
  - Ship documentation in openssl-doc, suggested by the package.
  - Use a different priority for libssl0.9.8/restart-services
    depending on whether a desktop, or server dist-upgrade is being
    performed.
  - Display a system restart required notification bubble on libssl0.9.8
    upgrade.
  - Replace duplicate files in the doc directory with symlinks.
  - Move runtime libraries to /lib, for the benefit of wpasupplicant
* Strip the patches out of the source into quilt patches
* Disable CVE-2009-3555.patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* crypto/cms/cms_asn1.c */
 
2
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
 
3
 * project.
 
4
 */
 
5
/* ====================================================================
 
6
 * Copyright (c) 2008 The OpenSSL Project.  All rights reserved.
 
7
 *
 
8
 * Redistribution and use in source and binary forms, with or without
 
9
 * modification, are permitted provided that the following conditions
 
10
 * are met:
 
11
 *
 
12
 * 1. Redistributions of source code must retain the above copyright
 
13
 *    notice, this list of conditions and the following disclaimer. 
 
14
 *
 
15
 * 2. Redistributions in binary form must reproduce the above copyright
 
16
 *    notice, this list of conditions and the following disclaimer in
 
17
 *    the documentation and/or other materials provided with the
 
18
 *    distribution.
 
19
 *
 
20
 * 3. All advertising materials mentioning features or use of this
 
21
 *    software must display the following acknowledgment:
 
22
 *    "This product includes software developed by the OpenSSL Project
 
23
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 
24
 *
 
25
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 
26
 *    endorse or promote products derived from this software without
 
27
 *    prior written permission. For written permission, please contact
 
28
 *    licensing@OpenSSL.org.
 
29
 *
 
30
 * 5. Products derived from this software may not be called "OpenSSL"
 
31
 *    nor may "OpenSSL" appear in their names without prior written
 
32
 *    permission of the OpenSSL Project.
 
33
 *
 
34
 * 6. Redistributions of any form whatsoever must retain the following
 
35
 *    acknowledgment:
 
36
 *    "This product includes software developed by the OpenSSL Project
 
37
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 
38
 *
 
39
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 
40
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
41
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 
42
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 
43
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
44
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
45
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
46
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
47
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 
48
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
49
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 
50
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 
51
 * ====================================================================
 
52
 */
 
53
 
 
54
#include <openssl/asn1t.h>
 
55
#include <openssl/pem.h>
 
56
#include <openssl/x509v3.h>
 
57
#include "cms.h"
 
58
#include "cms_lcl.h"
 
59
 
 
60
 
 
61
ASN1_SEQUENCE(CMS_IssuerAndSerialNumber) = {
 
62
        ASN1_SIMPLE(CMS_IssuerAndSerialNumber, issuer, X509_NAME),
 
63
        ASN1_SIMPLE(CMS_IssuerAndSerialNumber, serialNumber, ASN1_INTEGER)
 
64
} ASN1_SEQUENCE_END(CMS_IssuerAndSerialNumber)
 
65
 
 
66
ASN1_SEQUENCE(CMS_OtherCertificateFormat) = {
 
67
        ASN1_SIMPLE(CMS_OtherCertificateFormat, otherCertFormat, ASN1_OBJECT),
 
68
        ASN1_OPT(CMS_OtherCertificateFormat, otherCert, ASN1_ANY)
 
69
} ASN1_SEQUENCE_END(CMS_OtherCertificateFormat)
 
70
 
 
71
ASN1_CHOICE(CMS_CertificateChoices) = {
 
72
        ASN1_SIMPLE(CMS_CertificateChoices, d.certificate, X509),
 
73
        ASN1_IMP(CMS_CertificateChoices, d.extendedCertificate, ASN1_SEQUENCE, 0),
 
74
        ASN1_IMP(CMS_CertificateChoices, d.v1AttrCert, ASN1_SEQUENCE, 1),
 
75
        ASN1_IMP(CMS_CertificateChoices, d.v2AttrCert, ASN1_SEQUENCE, 2),
 
76
        ASN1_IMP(CMS_CertificateChoices, d.other, CMS_OtherCertificateFormat, 3)
 
77
} ASN1_CHOICE_END(CMS_CertificateChoices)
 
78
 
 
79
ASN1_CHOICE(CMS_SignerIdentifier) = {
 
80
        ASN1_SIMPLE(CMS_SignerIdentifier, d.issuerAndSerialNumber, CMS_IssuerAndSerialNumber),
 
81
        ASN1_IMP(CMS_SignerIdentifier, d.subjectKeyIdentifier, ASN1_OCTET_STRING, 0)
 
82
} ASN1_CHOICE_END(CMS_SignerIdentifier)
 
83
 
 
84
ASN1_NDEF_SEQUENCE(CMS_EncapsulatedContentInfo) = {
 
85
        ASN1_SIMPLE(CMS_EncapsulatedContentInfo, eContentType, ASN1_OBJECT),
 
86
        ASN1_NDEF_EXP_OPT(CMS_EncapsulatedContentInfo, eContent, ASN1_OCTET_STRING_NDEF, 0)
 
87
} ASN1_NDEF_SEQUENCE_END(CMS_EncapsulatedContentInfo)
 
88
 
 
89
/* Minor tweak to operation: free up signer key, cert */
 
90
static int cms_si_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it)
 
91
        {
 
92
        if(operation == ASN1_OP_FREE_POST)
 
93
                {
 
94
                CMS_SignerInfo *si = (CMS_SignerInfo *)*pval;
 
95
                if (si->pkey)
 
96
                        EVP_PKEY_free(si->pkey);
 
97
                if (si->signer)
 
98
                        X509_free(si->signer);
 
99
                }
 
100
        return 1;
 
101
        }
 
102
 
 
103
ASN1_SEQUENCE_cb(CMS_SignerInfo, cms_si_cb) = {
 
104
        ASN1_SIMPLE(CMS_SignerInfo, version, LONG),
 
105
        ASN1_SIMPLE(CMS_SignerInfo, sid, CMS_SignerIdentifier),
 
106
        ASN1_SIMPLE(CMS_SignerInfo, digestAlgorithm, X509_ALGOR),
 
107
        ASN1_IMP_SET_OF_OPT(CMS_SignerInfo, signedAttrs, X509_ATTRIBUTE, 0),
 
108
        ASN1_SIMPLE(CMS_SignerInfo, signatureAlgorithm, X509_ALGOR),
 
109
        ASN1_SIMPLE(CMS_SignerInfo, signature, ASN1_OCTET_STRING),
 
110
        ASN1_IMP_SET_OF_OPT(CMS_SignerInfo, unsignedAttrs, X509_ATTRIBUTE, 1)
 
111
} ASN1_SEQUENCE_END_cb(CMS_SignerInfo, CMS_SignerInfo)
 
112
 
 
113
ASN1_SEQUENCE(CMS_OtherRevocationInfoFormat) = {
 
114
        ASN1_SIMPLE(CMS_OtherRevocationInfoFormat, otherRevInfoFormat, ASN1_OBJECT),
 
115
        ASN1_OPT(CMS_OtherRevocationInfoFormat, otherRevInfo, ASN1_ANY)
 
116
} ASN1_SEQUENCE_END(CMS_OtherRevocationInfoFormat)
 
117
 
 
118
ASN1_CHOICE(CMS_RevocationInfoChoice) = {
 
119
        ASN1_SIMPLE(CMS_RevocationInfoChoice, d.crl, X509_CRL),
 
120
        ASN1_IMP(CMS_RevocationInfoChoice, d.other, CMS_OtherRevocationInfoFormat, 1)
 
121
} ASN1_CHOICE_END(CMS_RevocationInfoChoice)
 
122
 
 
123
ASN1_NDEF_SEQUENCE(CMS_SignedData) = {
 
124
        ASN1_SIMPLE(CMS_SignedData, version, LONG),
 
125
        ASN1_SET_OF(CMS_SignedData, digestAlgorithms, X509_ALGOR),
 
126
        ASN1_SIMPLE(CMS_SignedData, encapContentInfo, CMS_EncapsulatedContentInfo),
 
127
        ASN1_IMP_SET_OF_OPT(CMS_SignedData, certificates, CMS_CertificateChoices, 0),
 
128
        ASN1_IMP_SET_OF_OPT(CMS_SignedData, crls, CMS_RevocationInfoChoice, 1),
 
129
        ASN1_SET_OF(CMS_SignedData, signerInfos, CMS_SignerInfo)
 
130
} ASN1_NDEF_SEQUENCE_END(CMS_SignedData)
 
131
 
 
132
ASN1_SEQUENCE(CMS_OriginatorInfo) = {
 
133
        ASN1_IMP_SET_OF_OPT(CMS_SignedData, certificates, CMS_CertificateChoices, 0),
 
134
        ASN1_IMP_SET_OF_OPT(CMS_SignedData, crls, CMS_RevocationInfoChoice, 1)
 
135
} ASN1_SEQUENCE_END(CMS_OriginatorInfo)
 
136
 
 
137
ASN1_NDEF_SEQUENCE(CMS_EncryptedContentInfo) = {
 
138
        ASN1_SIMPLE(CMS_EncryptedContentInfo, contentType, ASN1_OBJECT),
 
139
        ASN1_SIMPLE(CMS_EncryptedContentInfo, contentEncryptionAlgorithm, X509_ALGOR),
 
140
        ASN1_IMP_OPT(CMS_EncryptedContentInfo, encryptedContent, ASN1_OCTET_STRING_NDEF, 0)
 
141
} ASN1_NDEF_SEQUENCE_END(CMS_EncryptedContentInfo)
 
142
 
 
143
ASN1_SEQUENCE(CMS_KeyTransRecipientInfo) = {
 
144
        ASN1_SIMPLE(CMS_KeyTransRecipientInfo, version, LONG),
 
145
        ASN1_SIMPLE(CMS_KeyTransRecipientInfo, rid, CMS_SignerIdentifier),
 
146
        ASN1_SIMPLE(CMS_KeyTransRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR),
 
147
        ASN1_SIMPLE(CMS_KeyTransRecipientInfo, encryptedKey, ASN1_OCTET_STRING)
 
148
} ASN1_SEQUENCE_END(CMS_KeyTransRecipientInfo)
 
149
 
 
150
ASN1_SEQUENCE(CMS_OtherKeyAttribute) = {
 
151
        ASN1_SIMPLE(CMS_OtherKeyAttribute, keyAttrId, ASN1_OBJECT),
 
152
        ASN1_OPT(CMS_OtherKeyAttribute, keyAttr, ASN1_ANY)
 
153
} ASN1_SEQUENCE_END(CMS_OtherKeyAttribute)
 
154
 
 
155
ASN1_SEQUENCE(CMS_RecipientKeyIdentifier) = {
 
156
        ASN1_SIMPLE(CMS_RecipientKeyIdentifier, subjectKeyIdentifier, ASN1_OCTET_STRING),
 
157
        ASN1_OPT(CMS_RecipientKeyIdentifier, date, ASN1_GENERALIZEDTIME),
 
158
        ASN1_OPT(CMS_RecipientKeyIdentifier, other, CMS_OtherKeyAttribute)
 
159
} ASN1_SEQUENCE_END(CMS_RecipientKeyIdentifier)
 
160
 
 
161
ASN1_CHOICE(CMS_KeyAgreeRecipientIdentifier) = {
 
162
  ASN1_SIMPLE(CMS_KeyAgreeRecipientIdentifier, d.issuerAndSerialNumber, CMS_IssuerAndSerialNumber),
 
163
  ASN1_IMP(CMS_KeyAgreeRecipientIdentifier, d.rKeyId, CMS_RecipientKeyIdentifier, 0)
 
164
} ASN1_CHOICE_END(CMS_KeyAgreeRecipientIdentifier)
 
165
 
 
166
ASN1_SEQUENCE(CMS_RecipientEncryptedKey) = {
 
167
        ASN1_SIMPLE(CMS_RecipientEncryptedKey, rid, CMS_KeyAgreeRecipientIdentifier),
 
168
        ASN1_SIMPLE(CMS_RecipientEncryptedKey, encryptedKey, ASN1_OCTET_STRING)
 
169
} ASN1_SEQUENCE_END(CMS_RecipientEncryptedKey)
 
170
 
 
171
ASN1_SEQUENCE(CMS_OriginatorPublicKey) = {
 
172
  ASN1_SIMPLE(CMS_OriginatorPublicKey, algorithm, X509_ALGOR),
 
173
  ASN1_SIMPLE(CMS_OriginatorPublicKey, publicKey, ASN1_BIT_STRING)
 
174
} ASN1_SEQUENCE_END(CMS_OriginatorPublicKey)
 
175
 
 
176
ASN1_CHOICE(CMS_OriginatorIdentifierOrKey) = {
 
177
  ASN1_SIMPLE(CMS_OriginatorIdentifierOrKey, d.issuerAndSerialNumber, CMS_IssuerAndSerialNumber),
 
178
  ASN1_IMP(CMS_OriginatorIdentifierOrKey, d.subjectKeyIdentifier, ASN1_OCTET_STRING, 0),
 
179
  ASN1_IMP(CMS_OriginatorIdentifierOrKey, d.originatorKey, CMS_OriginatorPublicKey, 1)
 
180
} ASN1_CHOICE_END(CMS_OriginatorIdentifierOrKey)
 
181
 
 
182
ASN1_SEQUENCE(CMS_KeyAgreeRecipientInfo) = {
 
183
        ASN1_SIMPLE(CMS_KeyAgreeRecipientInfo, version, LONG),
 
184
        ASN1_EXP(CMS_KeyAgreeRecipientInfo, originator, CMS_OriginatorIdentifierOrKey, 0),
 
185
        ASN1_EXP_OPT(CMS_KeyAgreeRecipientInfo, ukm, ASN1_OCTET_STRING, 1),
 
186
        ASN1_SIMPLE(CMS_KeyAgreeRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR),
 
187
        ASN1_SEQUENCE_OF(CMS_KeyAgreeRecipientInfo, recipientEncryptedKeys, CMS_RecipientEncryptedKey)
 
188
} ASN1_SEQUENCE_END(CMS_KeyAgreeRecipientInfo)
 
189
 
 
190
ASN1_SEQUENCE(CMS_KEKIdentifier) = {
 
191
        ASN1_SIMPLE(CMS_KEKIdentifier, keyIdentifier, ASN1_OCTET_STRING),
 
192
        ASN1_OPT(CMS_KEKIdentifier, date, ASN1_GENERALIZEDTIME),
 
193
        ASN1_OPT(CMS_KEKIdentifier, other, CMS_OtherKeyAttribute)
 
194
} ASN1_SEQUENCE_END(CMS_KEKIdentifier)
 
195
 
 
196
ASN1_SEQUENCE(CMS_KEKRecipientInfo) = {
 
197
        ASN1_SIMPLE(CMS_KEKRecipientInfo, version, LONG),
 
198
        ASN1_SIMPLE(CMS_KEKRecipientInfo, kekid, CMS_KEKIdentifier),
 
199
        ASN1_SIMPLE(CMS_KEKRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR),
 
200
        ASN1_SIMPLE(CMS_KEKRecipientInfo, encryptedKey, ASN1_OCTET_STRING)
 
201
} ASN1_SEQUENCE_END(CMS_KEKRecipientInfo)
 
202
 
 
203
ASN1_SEQUENCE(CMS_PasswordRecipientInfo) = {
 
204
        ASN1_SIMPLE(CMS_PasswordRecipientInfo, version, LONG),
 
205
        ASN1_IMP_OPT(CMS_PasswordRecipientInfo, keyDerivationAlgorithm, X509_ALGOR, 0),
 
206
        ASN1_SIMPLE(CMS_PasswordRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR),
 
207
        ASN1_SIMPLE(CMS_PasswordRecipientInfo, encryptedKey, ASN1_OCTET_STRING)
 
208
} ASN1_SEQUENCE_END(CMS_PasswordRecipientInfo)
 
209
 
 
210
ASN1_SEQUENCE(CMS_OtherRecipientInfo) = {
 
211
  ASN1_SIMPLE(CMS_OtherRecipientInfo, oriType, ASN1_OBJECT),
 
212
  ASN1_OPT(CMS_OtherRecipientInfo, oriValue, ASN1_ANY)
 
213
} ASN1_SEQUENCE_END(CMS_OtherRecipientInfo)
 
214
 
 
215
/* Free up RecipientInfo additional data */
 
216
static int cms_ri_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it)
 
217
        {
 
218
        if(operation == ASN1_OP_FREE_PRE)
 
219
                {
 
220
                CMS_RecipientInfo *ri = (CMS_RecipientInfo *)*pval;
 
221
                if (ri->type == CMS_RECIPINFO_TRANS)
 
222
                        {
 
223
                        CMS_KeyTransRecipientInfo *ktri = ri->d.ktri;
 
224
                        if (ktri->pkey)
 
225
                                EVP_PKEY_free(ktri->pkey);
 
226
                        if (ktri->recip)
 
227
                                X509_free(ktri->recip);
 
228
                        }
 
229
                else if (ri->type == CMS_RECIPINFO_KEK)
 
230
                        {
 
231
                        CMS_KEKRecipientInfo *kekri = ri->d.kekri;
 
232
                        if (kekri->key)
 
233
                                {
 
234
                                OPENSSL_cleanse(kekri->key, kekri->keylen);
 
235
                                OPENSSL_free(kekri->key);
 
236
                                }
 
237
                        }
 
238
                }
 
239
        return 1;
 
240
        }
 
241
 
 
242
ASN1_CHOICE_cb(CMS_RecipientInfo, cms_ri_cb) = {
 
243
        ASN1_SIMPLE(CMS_RecipientInfo, d.ktri, CMS_KeyTransRecipientInfo),
 
244
        ASN1_IMP(CMS_RecipientInfo, d.kari, CMS_KeyAgreeRecipientInfo, 1),
 
245
        ASN1_IMP(CMS_RecipientInfo, d.kekri, CMS_KEKRecipientInfo, 2),
 
246
        ASN1_IMP(CMS_RecipientInfo, d.pwri, CMS_PasswordRecipientInfo, 3),
 
247
        ASN1_IMP(CMS_RecipientInfo, d.ori, CMS_OtherRecipientInfo, 4)
 
248
} ASN1_CHOICE_END_cb(CMS_RecipientInfo, CMS_RecipientInfo, type)
 
249
 
 
250
ASN1_NDEF_SEQUENCE(CMS_EnvelopedData) = {
 
251
        ASN1_SIMPLE(CMS_EnvelopedData, version, LONG),
 
252
        ASN1_IMP_OPT(CMS_EnvelopedData, originatorInfo, CMS_OriginatorInfo, 0),
 
253
        ASN1_SET_OF(CMS_EnvelopedData, recipientInfos, CMS_RecipientInfo),
 
254
        ASN1_SIMPLE(CMS_EnvelopedData, encryptedContentInfo, CMS_EncryptedContentInfo),
 
255
        ASN1_IMP_SET_OF_OPT(CMS_EnvelopedData, unprotectedAttrs, X509_ATTRIBUTE, 1)
 
256
} ASN1_NDEF_SEQUENCE_END(CMS_EnvelopedData)
 
257
 
 
258
ASN1_NDEF_SEQUENCE(CMS_DigestedData) = {
 
259
        ASN1_SIMPLE(CMS_DigestedData, version, LONG),
 
260
        ASN1_SIMPLE(CMS_DigestedData, digestAlgorithm, X509_ALGOR),
 
261
        ASN1_SIMPLE(CMS_DigestedData, encapContentInfo, CMS_EncapsulatedContentInfo),
 
262
        ASN1_SIMPLE(CMS_DigestedData, digest, ASN1_OCTET_STRING)
 
263
} ASN1_NDEF_SEQUENCE_END(CMS_DigestedData)
 
264
 
 
265
ASN1_NDEF_SEQUENCE(CMS_EncryptedData) = {
 
266
        ASN1_SIMPLE(CMS_EncryptedData, version, LONG),
 
267
        ASN1_SIMPLE(CMS_EncryptedData, encryptedContentInfo, CMS_EncryptedContentInfo),
 
268
        ASN1_IMP_SET_OF_OPT(CMS_EncryptedData, unprotectedAttrs, X509_ATTRIBUTE, 1)
 
269
} ASN1_NDEF_SEQUENCE_END(CMS_EncryptedData)
 
270
 
 
271
ASN1_NDEF_SEQUENCE(CMS_AuthenticatedData) = {
 
272
        ASN1_SIMPLE(CMS_AuthenticatedData, version, LONG),
 
273
        ASN1_IMP_OPT(CMS_AuthenticatedData, originatorInfo, CMS_OriginatorInfo, 0),
 
274
        ASN1_SET_OF(CMS_AuthenticatedData, recipientInfos, CMS_RecipientInfo),
 
275
        ASN1_SIMPLE(CMS_AuthenticatedData, macAlgorithm, X509_ALGOR),
 
276
        ASN1_IMP(CMS_AuthenticatedData, digestAlgorithm, X509_ALGOR, 1),
 
277
        ASN1_SIMPLE(CMS_AuthenticatedData, encapContentInfo, CMS_EncapsulatedContentInfo),
 
278
        ASN1_IMP_SET_OF_OPT(CMS_AuthenticatedData, authAttrs, X509_ALGOR, 2),
 
279
        ASN1_SIMPLE(CMS_AuthenticatedData, mac, ASN1_OCTET_STRING),
 
280
        ASN1_IMP_SET_OF_OPT(CMS_AuthenticatedData, unauthAttrs, X509_ALGOR, 3)
 
281
} ASN1_NDEF_SEQUENCE_END(CMS_AuthenticatedData)
 
282
 
 
283
ASN1_NDEF_SEQUENCE(CMS_CompressedData) = {
 
284
        ASN1_SIMPLE(CMS_CompressedData, version, LONG),
 
285
        ASN1_SIMPLE(CMS_CompressedData, compressionAlgorithm, X509_ALGOR),
 
286
        ASN1_SIMPLE(CMS_CompressedData, encapContentInfo, CMS_EncapsulatedContentInfo),
 
287
} ASN1_NDEF_SEQUENCE_END(CMS_CompressedData)
 
288
 
 
289
/* This is the ANY DEFINED BY table for the top level ContentInfo structure */
 
290
 
 
291
ASN1_ADB_TEMPLATE(cms_default) = ASN1_EXP(CMS_ContentInfo, d.other, ASN1_ANY, 0);
 
292
 
 
293
ASN1_ADB(CMS_ContentInfo) = {
 
294
        ADB_ENTRY(NID_pkcs7_data, ASN1_NDEF_EXP(CMS_ContentInfo, d.data, ASN1_OCTET_STRING_NDEF, 0)),
 
295
        ADB_ENTRY(NID_pkcs7_signed, ASN1_NDEF_EXP(CMS_ContentInfo, d.signedData, CMS_SignedData, 0)),
 
296
        ADB_ENTRY(NID_pkcs7_enveloped, ASN1_NDEF_EXP(CMS_ContentInfo, d.envelopedData, CMS_EnvelopedData, 0)),
 
297
        ADB_ENTRY(NID_pkcs7_digest, ASN1_NDEF_EXP(CMS_ContentInfo, d.digestedData, CMS_DigestedData, 0)),
 
298
        ADB_ENTRY(NID_pkcs7_encrypted, ASN1_NDEF_EXP(CMS_ContentInfo, d.encryptedData, CMS_EncryptedData, 0)),
 
299
        ADB_ENTRY(NID_id_smime_ct_authData, ASN1_NDEF_EXP(CMS_ContentInfo, d.authenticatedData, CMS_AuthenticatedData, 0)),
 
300
        ADB_ENTRY(NID_id_smime_ct_compressedData, ASN1_NDEF_EXP(CMS_ContentInfo, d.compressedData, CMS_CompressedData, 0)),
 
301
} ASN1_ADB_END(CMS_ContentInfo, 0, contentType, 0, &cms_default_tt, NULL);
 
302
 
 
303
ASN1_NDEF_SEQUENCE(CMS_ContentInfo) = {
 
304
        ASN1_SIMPLE(CMS_ContentInfo, contentType, ASN1_OBJECT),
 
305
        ASN1_ADB_OBJECT(CMS_ContentInfo)
 
306
} ASN1_NDEF_SEQUENCE_END(CMS_ContentInfo)
 
307
 
 
308
/* Specials for signed attributes */
 
309
 
 
310
/* When signing attributes we want to reorder them to match the sorted
 
311
 * encoding.
 
312
 */
 
313
 
 
314
ASN1_ITEM_TEMPLATE(CMS_Attributes_Sign) = 
 
315
        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_ORDER, 0, CMS_ATTRIBUTES, X509_ATTRIBUTE)
 
316
ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Sign)
 
317
 
 
318
/* When verifying attributes we need to use the received order. So 
 
319
 * we use SEQUENCE OF and tag it to SET OF
 
320
 */
 
321
 
 
322
ASN1_ITEM_TEMPLATE(CMS_Attributes_Verify) = 
 
323
        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TFLG_UNIVERSAL,
 
324
                                V_ASN1_SET, CMS_ATTRIBUTES, X509_ATTRIBUTE)
 
325
ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Verify)
 
326
 
 
327
 
 
328
 
 
329
ASN1_CHOICE(CMS_ReceiptsFrom) = {
 
330
  ASN1_IMP(CMS_ReceiptsFrom, d.allOrFirstTier, LONG, 0),
 
331
  ASN1_IMP_SEQUENCE_OF(CMS_ReceiptsFrom, d.receiptList, GENERAL_NAMES, 1)
 
332
} ASN1_CHOICE_END(CMS_ReceiptsFrom)
 
333
 
 
334
ASN1_SEQUENCE(CMS_ReceiptRequest) = {
 
335
  ASN1_SIMPLE(CMS_ReceiptRequest, signedContentIdentifier, ASN1_OCTET_STRING),
 
336
  ASN1_SIMPLE(CMS_ReceiptRequest, receiptsFrom, CMS_ReceiptsFrom),
 
337
  ASN1_SEQUENCE_OF(CMS_ReceiptRequest, receiptsTo, GENERAL_NAMES)
 
338
} ASN1_SEQUENCE_END(CMS_ReceiptRequest)
 
339
 
 
340
ASN1_SEQUENCE(CMS_Receipt) = {
 
341
  ASN1_SIMPLE(CMS_Receipt, version, LONG),
 
342
  ASN1_SIMPLE(CMS_Receipt, contentType, ASN1_OBJECT),
 
343
  ASN1_SIMPLE(CMS_Receipt, signedContentIdentifier, ASN1_OCTET_STRING),
 
344
  ASN1_SIMPLE(CMS_Receipt, originatorSignatureValue, ASN1_OCTET_STRING)
 
345
} ASN1_SEQUENCE_END(CMS_Receipt)
 
346