2 * The contents of this file are subject to the Mozilla Public
3 * License Version 1.1 (the "License"); you may not use this file
4 * except in compliance with the License. You may obtain a copy of
5 * the License at http://www.mozilla.org/MPL/
7 * Software distributed under the License is distributed on an "AS
8 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9 * implied. See the License for the specific language governing
10 * rights and limitations under the License.
12 * The Original Code is the Netscape security libraries.
14 * The Initial Developer of the Original Code is Netscape
15 * Communications Corporation. Portions created by Netscape are
16 * Copyright (C) 1994-2000 Netscape Communications Corporation. All
21 * Alternatively, the contents of this file may be used under the
22 * terms of the GNU General Public License Version 2 or later (the
23 * "GPL"), in which case the provisions of the GPL are applicable
24 * instead of those above. If you wish to allow use of your
25 * version of this file only under the terms of the GPL and not to
26 * allow others to use your version of this file under the MPL,
27 * indicate your decision by deleting the provisions above and
28 * replace them with the notice and other provisions required by
29 * the GPL. If you do not delete the provisions above, a recipient
30 * may use your version of this file under either the MPL or the
38 #include <Security/SecCmsContentInfo.h>
43 #include <security_asn1/secasn1.h>
44 #include <security_asn1/secerr.h>
47 extern const SecAsn1Template nss_cms_set_of_attribute_template
[];
49 //SEC_ASN1_MKSUB(CERT_IssuerAndSNTemplate)
50 //SEC_ASN1_MKSUB(CERT_SetOfSignedCrlTemplate)
51 SEC_ASN1_MKSUB(SECOID_AlgorithmIDTemplate
)
52 SEC_ASN1_MKSUB(kSecAsn1BitStringTemplate
)
53 SEC_ASN1_MKSUB(kSecAsn1OctetStringTemplate
)
54 SEC_ASN1_MKSUB(kSecAsn1PointerToOctetStringTemplate
)
55 SEC_ASN1_MKSUB(kSecAsn1SetOfAnyTemplate
)
57 /* -----------------------------------------------------------------------------
59 * (uses SecCmsContentInfo)
62 /* forward declaration */
63 static const SecAsn1Template
*
64 nss_cms_choose_content_template(void *src_or_dest
, Boolean encoding
, const char *buf
, size_t len
, void *dest
);
66 static const SecAsn1TemplateChooserPtr nss_cms_chooser
67 = nss_cms_choose_content_template
;
69 const SecAsn1Template SecCmsMessageTemplate
[] = {
70 { SEC_ASN1_SEQUENCE
| SEC_ASN1_MAY_STREAM
,
71 0, NULL
, sizeof(SecCmsMessage
) },
73 offsetof(SecCmsMessage
,contentInfo
.contentType
) },
74 { SEC_ASN1_OPTIONAL
| SEC_ASN1_DYNAMIC
| SEC_ASN1_MAY_STREAM
75 | SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 0,
76 offsetof(SecCmsMessage
,contentInfo
.content
),
82 static const SecAsn1Template NSS_PointerToCMSMessageTemplate
[] = {
83 { SEC_ASN1_POINTER
, 0, SecCmsMessageTemplate
}
87 /* -----------------------------------------------------------------------------
88 * ENCAPSULATED & ENCRYPTED CONTENTINFO
89 * (both use a SecCmsContentInfo)
91 static const SecAsn1Template SecCmsEncapsulatedContentInfoTemplate
[] = {
92 { SEC_ASN1_SEQUENCE
| SEC_ASN1_MAY_STREAM
,
93 0, NULL
, sizeof(SecCmsContentInfo
) },
95 offsetof(SecCmsContentInfo
,contentType
) },
96 { SEC_ASN1_OPTIONAL
| SEC_ASN1_EXPLICIT
| SEC_ASN1_MAY_STREAM
|
97 SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| SEC_ASN1_XTRN
| 0,
98 offsetof(SecCmsContentInfo
,rawContent
),
99 SEC_ASN1_SUB(kSecAsn1PointerToOctetStringTemplate
) },
103 static const SecAsn1Template SecCmsEncryptedContentInfoTemplate
[] = {
104 { SEC_ASN1_SEQUENCE
| SEC_ASN1_MAY_STREAM
,
105 0, NULL
, sizeof(SecCmsContentInfo
) },
106 { SEC_ASN1_OBJECT_ID
,
107 offsetof(SecCmsContentInfo
,contentType
) },
108 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
109 offsetof(SecCmsContentInfo
,contentEncAlg
),
110 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
111 { SEC_ASN1_OPTIONAL
| SEC_ASN1_POINTER
| SEC_ASN1_MAY_STREAM
|
112 SEC_ASN1_CONTEXT_SPECIFIC
| SEC_ASN1_XTRN
| 0,
113 offsetof(SecCmsContentInfo
,rawContent
),
114 SEC_ASN1_SUB(kSecAsn1OctetStringTemplate
) },
118 /* -----------------------------------------------------------------------------
122 const SecAsn1Template SecCmsSignerInfoTemplate
[];
125 const SecAsn1Template SecCmsSignedDataTemplate
[] = {
126 { SEC_ASN1_SEQUENCE
| SEC_ASN1_MAY_STREAM
,
127 0, NULL
, sizeof(SecCmsSignedData
) },
128 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
129 offsetof(SecCmsSignedData
,version
) },
130 { SEC_ASN1_SET_OF
| SEC_ASN1_XTRN
,
131 offsetof(SecCmsSignedData
,digestAlgorithms
),
132 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
134 offsetof(SecCmsSignedData
,contentInfo
),
135 SecCmsEncapsulatedContentInfoTemplate
},
136 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
|
138 offsetof(SecCmsSignedData
,rawCerts
),
139 SEC_ASN1_SUB(kSecAsn1SetOfAnyTemplate
) },
140 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
|
142 offsetof(SecCmsSignedData
,rawCrls
),
143 SEC_ASN1_SUB(kSecAsn1SetOfAnyTemplate
) },
145 offsetof(SecCmsSignedData
,signerInfos
),
146 SecCmsSignerInfoTemplate
},
150 const SecAsn1Template NSS_PointerToCMSSignedDataTemplate
[] = {
151 { SEC_ASN1_POINTER
, 0, SecCmsSignedDataTemplate
}
154 /* -----------------------------------------------------------------------------
158 static const SecAsn1Template SecCmsSignerIdentifierTemplate
[] = {
160 offsetof(SecCmsSignerIdentifier
,identifierType
), NULL
,
161 sizeof(SecCmsSignerIdentifier
) },
162 { SEC_ASN1_POINTER
| SEC_ASN1_CONTEXT_SPECIFIC
| SEC_ASN1_XTRN
| 0,
163 offsetof(SecCmsSignerIdentifier
,id
.subjectKeyID
),
164 SEC_ASN1_SUB(kSecAsn1OctetStringTemplate
) ,
165 SecCmsRecipientIDSubjectKeyID
},
166 { SEC_ASN1_POINTER
| SEC_ASN1_XTRN
,
167 offsetof(SecCmsSignerIdentifier
,id
.issuerAndSN
),
168 SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate
),
169 SecCmsRecipientIDIssuerSN
},
173 /* -----------------------------------------------------------------------------
177 const SecAsn1Template SecCmsSignerInfoTemplate
[] = {
179 0, NULL
, sizeof(SecCmsSignerInfo
) },
180 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
181 offsetof(SecCmsSignerInfo
,version
) },
183 offsetof(SecCmsSignerInfo
,signerIdentifier
),
184 SecCmsSignerIdentifierTemplate
},
185 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
186 offsetof(SecCmsSignerInfo
,digestAlg
),
187 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
188 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 0,
189 offsetof(SecCmsSignerInfo
,authAttr
),
190 nss_cms_set_of_attribute_template
},
191 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
192 offsetof(SecCmsSignerInfo
,digestEncAlg
),
193 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
194 { SEC_ASN1_OCTET_STRING
,
195 offsetof(SecCmsSignerInfo
,encDigest
) },
196 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 1,
197 offsetof(SecCmsSignerInfo
,unAuthAttr
),
198 nss_cms_set_of_attribute_template
},
202 /* -----------------------------------------------------------------------------
206 static const SecAsn1Template SecCmsOriginatorInfoTemplate
[] = {
208 0, NULL
, sizeof(SecCmsOriginatorInfo
) },
209 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
|
211 offsetof(SecCmsOriginatorInfo
,rawCerts
),
212 SEC_ASN1_SUB(kSecAsn1SetOfAnyTemplate
) },
213 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
|
215 offsetof(SecCmsOriginatorInfo
,rawCrls
),
216 SEC_ASN1_SUB(kSecAsn1SetOfAnyTemplate
) },
220 const SecAsn1Template SecCmsRecipientInfoTemplate
[];
222 const SecAsn1Template SecCmsEnvelopedDataTemplate
[] = {
223 { SEC_ASN1_SEQUENCE
| SEC_ASN1_MAY_STREAM
,
224 0, NULL
, sizeof(SecCmsEnvelopedData
) },
225 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
226 offsetof(SecCmsEnvelopedData
,version
) },
227 { SEC_ASN1_OPTIONAL
| SEC_ASN1_POINTER
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 0,
228 offsetof(SecCmsEnvelopedData
,originatorInfo
),
229 SecCmsOriginatorInfoTemplate
},
231 offsetof(SecCmsEnvelopedData
,recipientInfos
),
232 SecCmsRecipientInfoTemplate
},
234 offsetof(SecCmsEnvelopedData
,contentInfo
),
235 SecCmsEncryptedContentInfoTemplate
},
236 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 1,
237 offsetof(SecCmsEnvelopedData
,unprotectedAttr
),
238 nss_cms_set_of_attribute_template
},
242 const SecAsn1Template NSS_PointerToCMSEnvelopedDataTemplate
[] = {
243 { SEC_ASN1_POINTER
, 0, SecCmsEnvelopedDataTemplate
}
246 /* here come the 15 gazillion templates for all the v3 varieties of RecipientInfo */
248 /* -----------------------------------------------------------------------------
249 * key transport recipient info
252 static const SecAsn1Template SecCmsRecipientIdentifierTemplate
[] = {
254 offsetof(SecCmsRecipientIdentifier
,identifierType
), NULL
,
255 sizeof(SecCmsRecipientIdentifier
) },
256 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
|
258 offsetof(SecCmsRecipientIdentifier
,id
.subjectKeyID
),
259 SEC_ASN1_SUB(kSecAsn1PointerToOctetStringTemplate
) ,
260 SecCmsRecipientIDSubjectKeyID
},
261 { SEC_ASN1_POINTER
| SEC_ASN1_XTRN
,
262 offsetof(SecCmsRecipientIdentifier
,id
.issuerAndSN
),
263 SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate
),
264 SecCmsRecipientIDIssuerSN
},
269 static const SecAsn1Template SecCmsKeyTransRecipientInfoTemplate
[] = {
271 0, NULL
, sizeof(SecCmsKeyTransRecipientInfo
) },
272 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
273 offsetof(SecCmsKeyTransRecipientInfo
,version
) },
275 offsetof(SecCmsKeyTransRecipientInfo
,recipientIdentifier
),
276 SecCmsRecipientIdentifierTemplate
},
277 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
278 offsetof(SecCmsKeyTransRecipientInfo
,keyEncAlg
),
279 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
280 { SEC_ASN1_OCTET_STRING
,
281 offsetof(SecCmsKeyTransRecipientInfo
,encKey
) },
285 /* -----------------------------------------------------------------------------
286 * key agreement recipient info
289 static const SecAsn1Template SecCmsOriginatorPublicKeyTemplate
[] = {
291 0, NULL
, sizeof(SecCmsOriginatorPublicKey
) },
292 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
293 offsetof(SecCmsOriginatorPublicKey
,algorithmIdentifier
),
294 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
295 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
296 offsetof(SecCmsOriginatorPublicKey
,publicKey
),
297 SEC_ASN1_SUB(kSecAsn1BitStringTemplate
) },
302 static const SecAsn1Template SecCmsOriginatorIdentifierOrKeyTemplate
[] = {
304 offsetof(SecCmsOriginatorIdentifierOrKey
,identifierType
), NULL
,
305 sizeof(SecCmsOriginatorIdentifierOrKey
) },
306 { SEC_ASN1_POINTER
| SEC_ASN1_XTRN
,
307 offsetof(SecCmsOriginatorIdentifierOrKey
,id
.issuerAndSN
),
308 SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate
),
309 SecCmsOriginatorIDOrKeyIssuerSN
},
310 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
|
311 /* this was tag 1 here, 2 for the next; RFC 3852 says they are 0 and 1 */
313 offsetof(SecCmsOriginatorIdentifierOrKey
,id
.subjectKeyID
),
314 kSecAsn1OctetStringTemplate
,
315 SecCmsOriginatorIDOrKeySubjectKeyID
},
316 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 1,
317 offsetof(SecCmsOriginatorIdentifierOrKey
,id
.originatorPublicKey
),
318 SecCmsOriginatorPublicKeyTemplate
,
319 SecCmsOriginatorIDOrKeyOriginatorPublicKey
},
323 const SecAsn1Template SecCmsRecipientKeyIdentifierTemplate
[] = {
325 0, NULL
, sizeof(SecCmsRecipientKeyIdentifier
) },
326 { SEC_ASN1_OCTET_STRING
,
327 offsetof(SecCmsRecipientKeyIdentifier
,subjectKeyIdentifier
) },
328 { SEC_ASN1_OPTIONAL
| SEC_ASN1_OCTET_STRING
,
329 offsetof(SecCmsRecipientKeyIdentifier
,date
) },
330 { SEC_ASN1_OPTIONAL
| SEC_ASN1_OCTET_STRING
,
331 offsetof(SecCmsRecipientKeyIdentifier
,other
) },
336 static const SecAsn1Template SecCmsKeyAgreeRecipientIdentifierTemplate
[] = {
338 offsetof(SecCmsKeyAgreeRecipientIdentifier
,identifierType
), NULL
,
339 sizeof(SecCmsKeyAgreeRecipientIdentifier
) },
340 { SEC_ASN1_POINTER
| SEC_ASN1_XTRN
,
341 offsetof(SecCmsKeyAgreeRecipientIdentifier
,id
.issuerAndSN
),
342 SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate
),
343 SecCmsKeyAgreeRecipientIDIssuerSN
},
344 { SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 0,
345 offsetof(SecCmsKeyAgreeRecipientIdentifier
,id
.recipientKeyIdentifier
),
346 SecCmsRecipientKeyIdentifierTemplate
,
347 SecCmsKeyAgreeRecipientIDRKeyID
},
351 static const SecAsn1Template SecCmsRecipientEncryptedKeyTemplate
[] = {
353 0, NULL
, sizeof(SecCmsRecipientEncryptedKey
) },
355 offsetof(SecCmsRecipientEncryptedKey
,recipientIdentifier
),
356 SecCmsKeyAgreeRecipientIdentifierTemplate
},
357 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
358 offsetof(SecCmsRecipientEncryptedKey
,encKey
),
359 SEC_ASN1_SUB(kSecAsn1OctetStringTemplate
) },
363 static const SecAsn1Template SecCmsKeyAgreeRecipientInfoTemplate
[] = {
365 0, NULL
, sizeof(SecCmsKeyAgreeRecipientInfo
) },
366 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
367 offsetof(SecCmsKeyAgreeRecipientInfo
,version
) },
368 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 0,
369 offsetof(SecCmsKeyAgreeRecipientInfo
,originatorIdentifierOrKey
),
370 SecCmsOriginatorIdentifierOrKeyTemplate
},
371 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_EXPLICIT
|
372 SEC_ASN1_CONTEXT_SPECIFIC
| SEC_ASN1_XTRN
| 1,
373 offsetof(SecCmsKeyAgreeRecipientInfo
,ukm
),
374 SEC_ASN1_SUB(kSecAsn1OctetStringTemplate
) },
375 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
376 offsetof(SecCmsKeyAgreeRecipientInfo
,keyEncAlg
),
377 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
378 { SEC_ASN1_SEQUENCE_OF
,
379 offsetof(SecCmsKeyAgreeRecipientInfo
,recipientEncryptedKeys
),
380 SecCmsRecipientEncryptedKeyTemplate
},
384 /* -----------------------------------------------------------------------------
388 static const SecAsn1Template SecCmsKEKIdentifierTemplate
[] = {
390 0, NULL
, sizeof(SecCmsKEKIdentifier
) },
391 { SEC_ASN1_OCTET_STRING
,
392 offsetof(SecCmsKEKIdentifier
,keyIdentifier
) },
393 { SEC_ASN1_OPTIONAL
| SEC_ASN1_OCTET_STRING
,
394 offsetof(SecCmsKEKIdentifier
,date
) },
395 { SEC_ASN1_OPTIONAL
| SEC_ASN1_OCTET_STRING
,
396 offsetof(SecCmsKEKIdentifier
,other
) },
400 static const SecAsn1Template SecCmsKEKRecipientInfoTemplate
[] = {
402 0, NULL
, sizeof(SecCmsKEKRecipientInfo
) },
403 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
404 offsetof(SecCmsKEKRecipientInfo
,version
) },
406 offsetof(SecCmsKEKRecipientInfo
,kekIdentifier
),
407 SecCmsKEKIdentifierTemplate
},
408 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
409 offsetof(SecCmsKEKRecipientInfo
,keyEncAlg
),
410 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
411 { SEC_ASN1_OCTET_STRING
,
412 offsetof(SecCmsKEKRecipientInfo
,encKey
) },
416 /* -----------------------------------------------------------------------------
419 const SecAsn1Template SecCmsRecipientInfoTemplate
[] = {
421 offsetof(SecCmsRecipientInfo
,recipientInfoType
), NULL
,
422 sizeof(SecCmsRecipientInfo
) },
423 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 1,
424 offsetof(SecCmsRecipientInfo
,ri
.keyAgreeRecipientInfo
),
425 SecCmsKeyAgreeRecipientInfoTemplate
,
426 SecCmsRecipientInfoIDKeyAgree
},
427 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 2,
428 offsetof(SecCmsRecipientInfo
,ri
.kekRecipientInfo
),
429 SecCmsKEKRecipientInfoTemplate
,
430 SecCmsRecipientInfoIDKEK
},
432 offsetof(SecCmsRecipientInfo
,ri
.keyTransRecipientInfo
),
433 SecCmsKeyTransRecipientInfoTemplate
,
434 SecCmsRecipientInfoIDKeyTrans
},
438 /* -----------------------------------------------------------------------------
442 const SecAsn1Template SecCmsDigestedDataTemplate
[] = {
443 { SEC_ASN1_SEQUENCE
| SEC_ASN1_MAY_STREAM
,
444 0, NULL
, sizeof(SecCmsDigestedData
) },
445 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
446 offsetof(SecCmsDigestedData
,version
) },
447 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
448 offsetof(SecCmsDigestedData
,digestAlg
),
449 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
451 offsetof(SecCmsDigestedData
,contentInfo
),
452 SecCmsEncapsulatedContentInfoTemplate
},
453 { SEC_ASN1_OCTET_STRING
,
454 offsetof(SecCmsDigestedData
,digest
) },
458 const SecAsn1Template NSS_PointerToCMSDigestedDataTemplate
[] = {
459 { SEC_ASN1_POINTER
, 0, SecCmsDigestedDataTemplate
}
462 const SecAsn1Template SecCmsEncryptedDataTemplate
[] = {
463 { SEC_ASN1_SEQUENCE
| SEC_ASN1_MAY_STREAM
,
464 0, NULL
, sizeof(SecCmsEncryptedData
) },
465 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
466 offsetof(SecCmsEncryptedData
,version
) },
468 offsetof(SecCmsEncryptedData
,contentInfo
),
469 SecCmsEncryptedContentInfoTemplate
},
470 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 1,
471 offsetof(SecCmsEncryptedData
,unprotectedAttr
),
472 nss_cms_set_of_attribute_template
},
476 const SecAsn1Template NSS_PointerToCMSEncryptedDataTemplate
[] = {
477 { SEC_ASN1_POINTER
, 0, SecCmsEncryptedDataTemplate
}
480 /* -----------------------------------------------------------------------------
481 * SetOfSignedCrlTemplate
483 const SecAsn1Template SecCmsIssuerAndSNTemplate
[] = {
485 0, NULL
, sizeof(SecCmsIssuerAndSN
) },
486 #if 1 // @@@ Switch to using NSS_NameTemplate
488 offsetof(SecCmsIssuerAndSN
,derIssuer
) },
491 offsetof(SecCmsIssuerAndSN
,issuer
),
494 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
495 offsetof(SecCmsIssuerAndSN
,serialNumber
) },
500 /* -----------------------------------------------------------------------------
503 const SecAsn1Template NSS_SMIMEKEAParamTemplateSkipjack
[] = {
505 0, NULL
, sizeof(SecCmsSMIMEKEAParameters
) },
506 { SEC_ASN1_OCTET_STRING
/* | SEC_ASN1_OPTIONAL */,
507 offsetof(SecCmsSMIMEKEAParameters
,originatorKEAKey
) },
508 { SEC_ASN1_OCTET_STRING
,
509 offsetof(SecCmsSMIMEKEAParameters
,originatorRA
) },
513 const SecAsn1Template NSS_SMIMEKEAParamTemplateNoSkipjack
[] = {
515 0, NULL
, sizeof(SecCmsSMIMEKEAParameters
) },
516 { SEC_ASN1_OCTET_STRING
/* | SEC_ASN1_OPTIONAL */,
517 offsetof(SecCmsSMIMEKEAParameters
,originatorKEAKey
) },
518 { SEC_ASN1_OCTET_STRING
,
519 offsetof(SecCmsSMIMEKEAParameters
,originatorRA
) },
520 { SEC_ASN1_OCTET_STRING
| SEC_ASN1_OPTIONAL
,
521 offsetof(SecCmsSMIMEKEAParameters
,nonSkipjackIV
) },
525 const SecAsn1Template NSS_SMIMEKEAParamTemplateAllParams
[] = {
527 0, NULL
, sizeof(SecCmsSMIMEKEAParameters
) },
528 { SEC_ASN1_OCTET_STRING
/* | SEC_ASN1_OPTIONAL */,
529 offsetof(SecCmsSMIMEKEAParameters
,originatorKEAKey
) },
530 { SEC_ASN1_OCTET_STRING
,
531 offsetof(SecCmsSMIMEKEAParameters
,originatorRA
) },
532 { SEC_ASN1_OCTET_STRING
| SEC_ASN1_OPTIONAL
,
533 offsetof(SecCmsSMIMEKEAParameters
,nonSkipjackIV
) },
534 { SEC_ASN1_OCTET_STRING
| SEC_ASN1_OPTIONAL
,
535 offsetof(SecCmsSMIMEKEAParameters
,bulkKeySize
) },
539 /*TODO: this should be in some header */
540 const SecAsn1Template
*
541 nss_cms_get_kea_template(SecCmsKEATemplateSelector whichTemplate
);
542 const SecAsn1Template
*
543 nss_cms_get_kea_template(SecCmsKEATemplateSelector whichTemplate
)
545 const SecAsn1Template
*returnVal
= NULL
;
547 switch(whichTemplate
)
549 case SecCmsKEAUsesNonSkipjack
:
550 returnVal
= NSS_SMIMEKEAParamTemplateNoSkipjack
;
552 case SecCmsKEAUsesSkipjack
:
553 returnVal
= NSS_SMIMEKEAParamTemplateSkipjack
;
555 case SecCmsKEAUsesNonSkipjackWithPaddedEncKey
:
557 returnVal
= NSS_SMIMEKEAParamTemplateAllParams
;
563 /* -----------------------------------------------------------------------------
566 static const SecAsn1Template
*
567 nss_cms_choose_content_template(void *src_or_dest
, Boolean encoding
, const char *buf
, size_t len
, void *dest
)
569 const SecAsn1Template
*theTemplate
;
570 SecCmsContentInfoRef cinfo
;
572 PORT_Assert (src_or_dest
!= NULL
);
573 if (src_or_dest
== NULL
)
576 cinfo
= (SecCmsContentInfoRef
)src_or_dest
;
577 switch (SecCmsContentInfoGetContentTypeTag(cinfo
)) {
579 theTemplate
= SEC_ASN1_GET(kSecAsn1PointerToAnyTemplate
);
581 case SEC_OID_PKCS7_DATA
:
583 theTemplate
= SEC_ASN1_GET(kSecAsn1PointerToOctetStringTemplate
);
585 case SEC_OID_PKCS7_SIGNED_DATA
:
586 theTemplate
= NSS_PointerToCMSSignedDataTemplate
;
588 case SEC_OID_PKCS7_ENVELOPED_DATA
:
589 theTemplate
= NSS_PointerToCMSEnvelopedDataTemplate
;
591 case SEC_OID_PKCS7_DIGESTED_DATA
:
592 theTemplate
= NSS_PointerToCMSDigestedDataTemplate
;
594 case SEC_OID_PKCS7_ENCRYPTED_DATA
:
595 theTemplate
= NSS_PointerToCMSEncryptedDataTemplate
;