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_POINTER
| SEC_ASN1_CONTEXT_SPECIFIC
| SEC_ASN1_XTRN
| 0,
257 offsetof(SecCmsRecipientIdentifier
,id
.subjectKeyID
),
258 SEC_ASN1_SUB(kSecAsn1OctetStringTemplate
) ,
259 SecCmsRecipientIDSubjectKeyID
},
260 { SEC_ASN1_POINTER
| SEC_ASN1_XTRN
,
261 offsetof(SecCmsRecipientIdentifier
,id
.issuerAndSN
),
262 SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate
),
263 SecCmsRecipientIDIssuerSN
},
268 static const SecAsn1Template SecCmsKeyTransRecipientInfoTemplate
[] = {
270 0, NULL
, sizeof(SecCmsKeyTransRecipientInfo
) },
271 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
272 offsetof(SecCmsKeyTransRecipientInfo
,version
) },
274 offsetof(SecCmsKeyTransRecipientInfo
,recipientIdentifier
),
275 SecCmsRecipientIdentifierTemplate
},
276 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
277 offsetof(SecCmsKeyTransRecipientInfo
,keyEncAlg
),
278 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
279 { SEC_ASN1_OCTET_STRING
,
280 offsetof(SecCmsKeyTransRecipientInfo
,encKey
) },
284 /* -----------------------------------------------------------------------------
285 * key agreement recipient info
288 static const SecAsn1Template SecCmsOriginatorPublicKeyTemplate
[] = {
290 0, NULL
, sizeof(SecCmsOriginatorPublicKey
) },
291 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
292 offsetof(SecCmsOriginatorPublicKey
,algorithmIdentifier
),
293 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
294 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
295 offsetof(SecCmsOriginatorPublicKey
,publicKey
),
296 SEC_ASN1_SUB(kSecAsn1BitStringTemplate
) },
301 static const SecAsn1Template SecCmsOriginatorIdentifierOrKeyTemplate
[] = {
303 offsetof(SecCmsOriginatorIdentifierOrKey
,identifierType
), NULL
,
304 sizeof(SecCmsOriginatorIdentifierOrKey
) },
305 { SEC_ASN1_POINTER
| SEC_ASN1_XTRN
,
306 offsetof(SecCmsOriginatorIdentifierOrKey
,id
.issuerAndSN
),
307 SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate
),
308 SecCmsOriginatorIDOrKeyIssuerSN
},
309 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
|
310 /* this was tag 1 here, 2 for the next; RFC 3852 says they are 0 and 1 */
312 offsetof(SecCmsOriginatorIdentifierOrKey
,id
.subjectKeyID
),
313 kSecAsn1OctetStringTemplate
,
314 SecCmsOriginatorIDOrKeySubjectKeyID
},
315 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 1,
316 offsetof(SecCmsOriginatorIdentifierOrKey
,id
.originatorPublicKey
),
317 SecCmsOriginatorPublicKeyTemplate
,
318 SecCmsOriginatorIDOrKeyOriginatorPublicKey
},
322 const SecAsn1Template SecCmsRecipientKeyIdentifierTemplate
[] = {
324 0, NULL
, sizeof(SecCmsRecipientKeyIdentifier
) },
325 { SEC_ASN1_INLINE
| SEC_ASN1_OCTET_STRING
,
326 offsetof(SecCmsRecipientKeyIdentifier
,subjectKeyIdentifier
),
327 SEC_ASN1_SUB(kSecAsn1OctetStringTemplate
) },
328 { SEC_ASN1_INLINE
| SEC_ASN1_OPTIONAL
| SEC_ASN1_GENERALIZED_TIME
,
329 offsetof(SecCmsRecipientKeyIdentifier
,date
),
330 SEC_ASN1_SUB(kSecAsn1GeneralizedTimeTemplate
) },
331 { SEC_ASN1_INLINE
| SEC_ASN1_OPTIONAL
| SEC_ASN1_ANY
,
332 offsetof(SecCmsRecipientKeyIdentifier
,other
) },
337 static const SecAsn1Template SecCmsKeyAgreeRecipientIdentifierTemplate
[] = {
339 offsetof(SecCmsKeyAgreeRecipientIdentifier
,identifierType
), NULL
,
340 sizeof(SecCmsKeyAgreeRecipientIdentifier
) },
341 { SEC_ASN1_POINTER
| SEC_ASN1_XTRN
,
342 offsetof(SecCmsKeyAgreeRecipientIdentifier
,id
.issuerAndSN
),
343 SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate
),
344 SecCmsKeyAgreeRecipientIDIssuerSN
},
345 { SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 0,
346 offsetof(SecCmsKeyAgreeRecipientIdentifier
,id
.recipientKeyIdentifier
),
347 SecCmsRecipientKeyIdentifierTemplate
,
348 SecCmsKeyAgreeRecipientIDRKeyID
},
352 static const SecAsn1Template SecCmsRecipientEncryptedKeyTemplate
[] = {
354 0, NULL
, sizeof(SecCmsRecipientEncryptedKey
) },
356 offsetof(SecCmsRecipientEncryptedKey
,recipientIdentifier
),
357 SecCmsKeyAgreeRecipientIdentifierTemplate
},
358 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
359 offsetof(SecCmsRecipientEncryptedKey
,encKey
),
360 SEC_ASN1_SUB(kSecAsn1OctetStringTemplate
) },
364 static const SecAsn1Template SecCmsKeyAgreeRecipientInfoTemplate
[] = {
366 0, NULL
, sizeof(SecCmsKeyAgreeRecipientInfo
) },
367 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
368 offsetof(SecCmsKeyAgreeRecipientInfo
,version
) },
369 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 0,
370 offsetof(SecCmsKeyAgreeRecipientInfo
,originatorIdentifierOrKey
),
371 SecCmsOriginatorIdentifierOrKeyTemplate
},
372 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_EXPLICIT
|
373 SEC_ASN1_CONTEXT_SPECIFIC
| SEC_ASN1_XTRN
| 1,
374 offsetof(SecCmsKeyAgreeRecipientInfo
,ukm
),
375 SEC_ASN1_SUB(kSecAsn1OctetStringTemplate
) },
376 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
377 offsetof(SecCmsKeyAgreeRecipientInfo
,keyEncAlg
),
378 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
379 { SEC_ASN1_SEQUENCE_OF
,
380 offsetof(SecCmsKeyAgreeRecipientInfo
,recipientEncryptedKeys
),
381 SecCmsRecipientEncryptedKeyTemplate
},
385 /* -----------------------------------------------------------------------------
389 static const SecAsn1Template SecCmsKEKIdentifierTemplate
[] = {
391 0, NULL
, sizeof(SecCmsKEKIdentifier
) },
392 { SEC_ASN1_OCTET_STRING
,
393 offsetof(SecCmsKEKIdentifier
,keyIdentifier
) },
394 { SEC_ASN1_OPTIONAL
| SEC_ASN1_OCTET_STRING
,
395 offsetof(SecCmsKEKIdentifier
,date
) },
396 { SEC_ASN1_OPTIONAL
| SEC_ASN1_OCTET_STRING
,
397 offsetof(SecCmsKEKIdentifier
,other
) },
401 static const SecAsn1Template SecCmsKEKRecipientInfoTemplate
[] = {
403 0, NULL
, sizeof(SecCmsKEKRecipientInfo
) },
404 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
405 offsetof(SecCmsKEKRecipientInfo
,version
) },
407 offsetof(SecCmsKEKRecipientInfo
,kekIdentifier
),
408 SecCmsKEKIdentifierTemplate
},
409 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
410 offsetof(SecCmsKEKRecipientInfo
,keyEncAlg
),
411 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
412 { SEC_ASN1_OCTET_STRING
,
413 offsetof(SecCmsKEKRecipientInfo
,encKey
) },
417 /* -----------------------------------------------------------------------------
420 const SecAsn1Template SecCmsRecipientInfoTemplate
[] = {
422 offsetof(SecCmsRecipientInfo
,recipientInfoType
), NULL
,
423 sizeof(SecCmsRecipientInfo
) },
424 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 1,
425 offsetof(SecCmsRecipientInfo
,ri
.keyAgreeRecipientInfo
),
426 SecCmsKeyAgreeRecipientInfoTemplate
,
427 SecCmsRecipientInfoIDKeyAgree
},
428 { SEC_ASN1_EXPLICIT
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 2,
429 offsetof(SecCmsRecipientInfo
,ri
.kekRecipientInfo
),
430 SecCmsKEKRecipientInfoTemplate
,
431 SecCmsRecipientInfoIDKEK
},
433 offsetof(SecCmsRecipientInfo
,ri
.keyTransRecipientInfo
),
434 SecCmsKeyTransRecipientInfoTemplate
,
435 SecCmsRecipientInfoIDKeyTrans
},
439 /* -----------------------------------------------------------------------------
443 const SecAsn1Template SecCmsDigestedDataTemplate
[] = {
444 { SEC_ASN1_SEQUENCE
| SEC_ASN1_MAY_STREAM
,
445 0, NULL
, sizeof(SecCmsDigestedData
) },
446 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
447 offsetof(SecCmsDigestedData
,version
) },
448 { SEC_ASN1_INLINE
| SEC_ASN1_XTRN
,
449 offsetof(SecCmsDigestedData
,digestAlg
),
450 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate
) },
452 offsetof(SecCmsDigestedData
,contentInfo
),
453 SecCmsEncapsulatedContentInfoTemplate
},
454 { SEC_ASN1_OCTET_STRING
,
455 offsetof(SecCmsDigestedData
,digest
) },
459 const SecAsn1Template NSS_PointerToCMSDigestedDataTemplate
[] = {
460 { SEC_ASN1_POINTER
, 0, SecCmsDigestedDataTemplate
}
463 const SecAsn1Template SecCmsEncryptedDataTemplate
[] = {
464 { SEC_ASN1_SEQUENCE
| SEC_ASN1_MAY_STREAM
,
465 0, NULL
, sizeof(SecCmsEncryptedData
) },
466 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
467 offsetof(SecCmsEncryptedData
,version
) },
469 offsetof(SecCmsEncryptedData
,contentInfo
),
470 SecCmsEncryptedContentInfoTemplate
},
471 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 1,
472 offsetof(SecCmsEncryptedData
,unprotectedAttr
),
473 nss_cms_set_of_attribute_template
},
477 const SecAsn1Template NSS_PointerToCMSEncryptedDataTemplate
[] = {
478 { SEC_ASN1_POINTER
, 0, SecCmsEncryptedDataTemplate
}
481 /* -----------------------------------------------------------------------------
482 * SetOfSignedCrlTemplate
484 const SecAsn1Template SecCmsIssuerAndSNTemplate
[] = {
486 0, NULL
, sizeof(SecCmsIssuerAndSN
) },
487 #if 1 // @@@ Switch to using NSS_NameTemplate
489 offsetof(SecCmsIssuerAndSN
,derIssuer
) },
492 offsetof(SecCmsIssuerAndSN
,issuer
),
495 { SEC_ASN1_INTEGER
| SEC_ASN1_SIGNED_INT
,
496 offsetof(SecCmsIssuerAndSN
,serialNumber
) },
501 /* -----------------------------------------------------------------------------
504 const SecAsn1Template NSS_SMIMEKEAParamTemplateSkipjack
[] = {
506 0, NULL
, sizeof(SecCmsSMIMEKEAParameters
) },
507 { SEC_ASN1_OCTET_STRING
/* | SEC_ASN1_OPTIONAL */,
508 offsetof(SecCmsSMIMEKEAParameters
,originatorKEAKey
) },
509 { SEC_ASN1_OCTET_STRING
,
510 offsetof(SecCmsSMIMEKEAParameters
,originatorRA
) },
514 const SecAsn1Template NSS_SMIMEKEAParamTemplateNoSkipjack
[] = {
516 0, NULL
, sizeof(SecCmsSMIMEKEAParameters
) },
517 { SEC_ASN1_OCTET_STRING
/* | SEC_ASN1_OPTIONAL */,
518 offsetof(SecCmsSMIMEKEAParameters
,originatorKEAKey
) },
519 { SEC_ASN1_OCTET_STRING
,
520 offsetof(SecCmsSMIMEKEAParameters
,originatorRA
) },
521 { SEC_ASN1_OCTET_STRING
| SEC_ASN1_OPTIONAL
,
522 offsetof(SecCmsSMIMEKEAParameters
,nonSkipjackIV
) },
526 const SecAsn1Template NSS_SMIMEKEAParamTemplateAllParams
[] = {
528 0, NULL
, sizeof(SecCmsSMIMEKEAParameters
) },
529 { SEC_ASN1_OCTET_STRING
/* | SEC_ASN1_OPTIONAL */,
530 offsetof(SecCmsSMIMEKEAParameters
,originatorKEAKey
) },
531 { SEC_ASN1_OCTET_STRING
,
532 offsetof(SecCmsSMIMEKEAParameters
,originatorRA
) },
533 { SEC_ASN1_OCTET_STRING
| SEC_ASN1_OPTIONAL
,
534 offsetof(SecCmsSMIMEKEAParameters
,nonSkipjackIV
) },
535 { SEC_ASN1_OCTET_STRING
| SEC_ASN1_OPTIONAL
,
536 offsetof(SecCmsSMIMEKEAParameters
,bulkKeySize
) },
540 /*TODO: this should be in some header */
541 const SecAsn1Template
*
542 nss_cms_get_kea_template(SecCmsKEATemplateSelector whichTemplate
);
543 const SecAsn1Template
*
544 nss_cms_get_kea_template(SecCmsKEATemplateSelector whichTemplate
)
546 const SecAsn1Template
*returnVal
= NULL
;
548 switch(whichTemplate
)
550 case SecCmsKEAUsesNonSkipjack
:
551 returnVal
= NSS_SMIMEKEAParamTemplateNoSkipjack
;
553 case SecCmsKEAUsesSkipjack
:
554 returnVal
= NSS_SMIMEKEAParamTemplateSkipjack
;
556 case SecCmsKEAUsesNonSkipjackWithPaddedEncKey
:
558 returnVal
= NSS_SMIMEKEAParamTemplateAllParams
;
564 /* -----------------------------------------------------------------------------
567 static const SecAsn1Template
*
568 nss_cms_choose_content_template(void *src_or_dest
, Boolean encoding
, const char *buf
, size_t len
, void *dest
)
570 const SecAsn1Template
*theTemplate
;
571 SecCmsContentInfoRef cinfo
;
573 PORT_Assert (src_or_dest
!= NULL
);
574 if (src_or_dest
== NULL
)
577 cinfo
= (SecCmsContentInfoRef
)src_or_dest
;
578 switch (SecCmsContentInfoGetContentTypeTag(cinfo
)) {
580 theTemplate
= SEC_ASN1_GET(kSecAsn1PointerToAnyTemplate
);
582 case SEC_OID_PKCS7_DATA
:
584 theTemplate
= SEC_ASN1_GET(kSecAsn1PointerToOctetStringTemplate
);
586 case SEC_OID_PKCS7_SIGNED_DATA
:
587 theTemplate
= NSS_PointerToCMSSignedDataTemplate
;
589 case SEC_OID_PKCS7_ENVELOPED_DATA
:
590 theTemplate
= NSS_PointerToCMSEnvelopedDataTemplate
;
592 case SEC_OID_PKCS7_DIGESTED_DATA
:
593 theTemplate
= NSS_PointerToCMSDigestedDataTemplate
;
595 case SEC_OID_PKCS7_ENCRYPTED_DATA
:
596 theTemplate
= NSS_PointerToCMSEncryptedDataTemplate
;