]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_smime/lib/cmsasn1.c
Security-57336.1.9.tar.gz
[apple/security.git] / Security / libsecurity_smime / lib / cmsasn1.c
diff --git a/Security/libsecurity_smime/lib/cmsasn1.c b/Security/libsecurity_smime/lib/cmsasn1.c
deleted file mode 100644 (file)
index 6e8a3eb..0000000
+++ /dev/null
@@ -1,599 +0,0 @@
-/*
- * The contents of this file are subject to the Mozilla Public
- * License Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.mozilla.org/MPL/
- * 
- * Software distributed under the License is distributed on an "AS
- * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * rights and limitations under the License.
- * 
- * The Original Code is the Netscape security libraries.
- * 
- * The Initial Developer of the Original Code is Netscape
- * Communications Corporation.  Portions created by Netscape are 
- * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
- * Rights Reserved.
- * 
- * Contributor(s):
- * 
- * Alternatively, the contents of this file may be used under the
- * terms of the GNU General Public License Version 2 or later (the
- * "GPL"), in which case the provisions of the GPL are applicable 
- * instead of those above.  If you wish to allow use of your 
- * version of this file only under the terms of the GPL and not to
- * allow others to use your version of this file under the MPL,
- * indicate your decision by deleting the provisions above and
- * replace them with the notice and other provisions required by
- * the GPL.  If you do not delete the provisions above, a recipient
- * may use your version of this file under either the MPL or the
- * GPL.
- */
-
-/*
- * CMS ASN.1 templates
- */
-
-#include <Security/SecCmsContentInfo.h>
-
-#include "cmslocal.h"
-
-#include "secoid.h"
-#include <security_asn1/secasn1.h>
-#include <security_asn1/secerr.h>
-
-
-extern const SecAsn1Template nss_cms_set_of_attribute_template[];
-
-//SEC_ASN1_MKSUB(CERT_IssuerAndSNTemplate)
-//SEC_ASN1_MKSUB(CERT_SetOfSignedCrlTemplate)
-SEC_ASN1_MKSUB(SECOID_AlgorithmIDTemplate)
-SEC_ASN1_MKSUB(kSecAsn1BitStringTemplate)
-SEC_ASN1_MKSUB(kSecAsn1OctetStringTemplate)
-SEC_ASN1_MKSUB(kSecAsn1PointerToOctetStringTemplate)
-SEC_ASN1_MKSUB(kSecAsn1SetOfAnyTemplate)
-
-/* -----------------------------------------------------------------------------
- * MESSAGE
- * (uses SecCmsContentInfo)
- */
-
-/* forward declaration */
-static const SecAsn1Template *
-nss_cms_choose_content_template(void *src_or_dest, Boolean encoding, const char *buf, void *dest);
-
-static const SecAsn1TemplateChooserPtr nss_cms_chooser
-       = nss_cms_choose_content_template;
-
-const SecAsn1Template SecCmsMessageTemplate[] = {
-    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM,
-         0, NULL, sizeof(SecCmsMessage) },
-    { SEC_ASN1_OBJECT_ID,
-         offsetof(SecCmsMessage,contentInfo.contentType) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_DYNAMIC | SEC_ASN1_MAY_STREAM
-     | SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
-         offsetof(SecCmsMessage,contentInfo.content),
-         &nss_cms_chooser },
-    { 0 }
-};
-
-#if 0
-static const SecAsn1Template NSS_PointerToCMSMessageTemplate[] = {
-    { SEC_ASN1_POINTER, 0, SecCmsMessageTemplate }
-};
-#endif
-
-/* -----------------------------------------------------------------------------
- * ENCAPSULATED & ENCRYPTED CONTENTINFO
- * (both use a SecCmsContentInfo)
- */
-static const SecAsn1Template SecCmsEncapsulatedContentInfoTemplate[] = {
-    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM,
-         0, NULL, sizeof(SecCmsContentInfo) },
-    { SEC_ASN1_OBJECT_ID,
-         offsetof(SecCmsContentInfo,contentType) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT | SEC_ASN1_MAY_STREAM |
-       SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
-         offsetof(SecCmsContentInfo,rawContent),
-         SEC_ASN1_SUB(kSecAsn1PointerToOctetStringTemplate) },
-    { 0 }
-};
-
-static const SecAsn1Template SecCmsEncryptedContentInfoTemplate[] = {
-    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM,
-         0, NULL, sizeof(SecCmsContentInfo) },
-    { SEC_ASN1_OBJECT_ID,
-         offsetof(SecCmsContentInfo,contentType) },
-    { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
-         offsetof(SecCmsContentInfo,contentEncAlg),
-         SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_POINTER | SEC_ASN1_MAY_STREAM | 
-      SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
-         offsetof(SecCmsContentInfo,rawContent),
-         SEC_ASN1_SUB(kSecAsn1OctetStringTemplate) },
-    { 0 }
-};
-
-/* -----------------------------------------------------------------------------
- * SIGNED DATA
- */
-
-const SecAsn1Template SecCmsSignerInfoTemplate[];
-
-
-const SecAsn1Template SecCmsSignedDataTemplate[] = {
-    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM,
-         0, NULL, sizeof(SecCmsSignedData) },
-    { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT,
-         offsetof(SecCmsSignedData,version) },
-    { SEC_ASN1_SET_OF | SEC_ASN1_XTRN,
-         offsetof(SecCmsSignedData,digestAlgorithms),
-         SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
-    { SEC_ASN1_INLINE,
-         offsetof(SecCmsSignedData,contentInfo),
-         SecCmsEncapsulatedContentInfoTemplate },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC |
-      SEC_ASN1_XTRN | 0,
-         offsetof(SecCmsSignedData,rawCerts),
-         SEC_ASN1_SUB(kSecAsn1SetOfAnyTemplate) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC |
-      SEC_ASN1_XTRN | 1,
-         offsetof(SecCmsSignedData,rawCrls),
-         SEC_ASN1_SUB(kSecAsn1SetOfAnyTemplate) },
-    { SEC_ASN1_SET_OF,
-         offsetof(SecCmsSignedData,signerInfos),
-         SecCmsSignerInfoTemplate },
-    { 0 }
-};
-
-const SecAsn1Template NSS_PointerToCMSSignedDataTemplate[] = {
-    { SEC_ASN1_POINTER, 0, SecCmsSignedDataTemplate }
-};
-
-/* -----------------------------------------------------------------------------
- * signeridentifier
- */
-
-static const SecAsn1Template SecCmsSignerIdentifierTemplate[] = {
-    { SEC_ASN1_CHOICE,
-         offsetof(SecCmsSignerIdentifier,identifierType), NULL,
-         sizeof(SecCmsSignerIdentifier) },
-    { SEC_ASN1_POINTER | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
-         offsetof(SecCmsSignerIdentifier,id.subjectKeyID),
-         SEC_ASN1_SUB(kSecAsn1OctetStringTemplate) ,
-         SecCmsRecipientIDSubjectKeyID },
-    { SEC_ASN1_POINTER | SEC_ASN1_XTRN,
-         offsetof(SecCmsSignerIdentifier,id.issuerAndSN),
-         SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate),
-         SecCmsRecipientIDIssuerSN },
-    { 0 }
-};
-
-/* -----------------------------------------------------------------------------
- * signerinfo
- */
-
-const SecAsn1Template SecCmsSignerInfoTemplate[] = {
-    { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsSignerInfo) },
-    { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT,
-         offsetof(SecCmsSignerInfo,version) },
-    { SEC_ASN1_INLINE,
-         offsetof(SecCmsSignerInfo,signerIdentifier),
-         SecCmsSignerIdentifierTemplate },
-    { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
-         offsetof(SecCmsSignerInfo,digestAlg),
-         SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
-         offsetof(SecCmsSignerInfo,authAttr),
-         nss_cms_set_of_attribute_template },
-    { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
-         offsetof(SecCmsSignerInfo,digestEncAlg),
-         SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
-    { SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsSignerInfo,encDigest) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
-         offsetof(SecCmsSignerInfo,unAuthAttr),
-         nss_cms_set_of_attribute_template },
-    { 0 }
-};
-
-/* -----------------------------------------------------------------------------
- * ENVELOPED DATA
- */
-
-static const SecAsn1Template SecCmsOriginatorInfoTemplate[] = {
-    { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsOriginatorInfo) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC |
-      SEC_ASN1_XTRN | 0,
-         offsetof(SecCmsOriginatorInfo,rawCerts),
-         SEC_ASN1_SUB(kSecAsn1SetOfAnyTemplate) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC |
-      SEC_ASN1_XTRN | 1,
-         offsetof(SecCmsOriginatorInfo,rawCrls),
-         SEC_ASN1_SUB(kSecAsn1SetOfAnyTemplate) },
-    { 0 }
-};
-
-const SecAsn1Template SecCmsRecipientInfoTemplate[];
-
-const SecAsn1Template SecCmsEnvelopedDataTemplate[] = {
-    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM,
-         0, NULL, sizeof(SecCmsEnvelopedData) },
-    { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT,
-         offsetof(SecCmsEnvelopedData,version) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_POINTER | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
-         offsetof(SecCmsEnvelopedData,originatorInfo),
-         SecCmsOriginatorInfoTemplate },
-    { SEC_ASN1_SET_OF,
-         offsetof(SecCmsEnvelopedData,recipientInfos),
-         SecCmsRecipientInfoTemplate },
-    { SEC_ASN1_INLINE,
-         offsetof(SecCmsEnvelopedData,contentInfo),
-         SecCmsEncryptedContentInfoTemplate },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
-         offsetof(SecCmsEnvelopedData,unprotectedAttr),
-         nss_cms_set_of_attribute_template },
-    { 0 }
-};
-
-const SecAsn1Template NSS_PointerToCMSEnvelopedDataTemplate[] = {
-    { SEC_ASN1_POINTER, 0, SecCmsEnvelopedDataTemplate }
-};
-
-/* here come the 15 gazillion templates for all the v3 varieties of RecipientInfo */
-
-/* -----------------------------------------------------------------------------
- * key transport recipient info
- */
-
-static const SecAsn1Template SecCmsRecipientIdentifierTemplate[] = {
-    { SEC_ASN1_CHOICE,
-         offsetof(SecCmsRecipientIdentifier,identifierType), NULL,
-         sizeof(SecCmsRecipientIdentifier) },
-    { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC |
-      SEC_ASN1_XTRN | 0,
-         offsetof(SecCmsRecipientIdentifier,id.subjectKeyID),
-         SEC_ASN1_SUB(kSecAsn1PointerToOctetStringTemplate) ,
-         SecCmsRecipientIDSubjectKeyID },
-    { SEC_ASN1_POINTER | SEC_ASN1_XTRN,
-         offsetof(SecCmsRecipientIdentifier,id.issuerAndSN),
-         SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate),
-         SecCmsRecipientIDIssuerSN },
-    { 0 }
-};
-
-
-static const SecAsn1Template SecCmsKeyTransRecipientInfoTemplate[] = {
-    { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsKeyTransRecipientInfo) },
-    { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT,
-         offsetof(SecCmsKeyTransRecipientInfo,version) },
-    { SEC_ASN1_INLINE,
-         offsetof(SecCmsKeyTransRecipientInfo,recipientIdentifier),
-         SecCmsRecipientIdentifierTemplate },
-    { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
-         offsetof(SecCmsKeyTransRecipientInfo,keyEncAlg),
-         SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
-    { SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsKeyTransRecipientInfo,encKey) },
-    { 0 }
-};
-
-/* -----------------------------------------------------------------------------
- * key agreement recipient info
- */
-
-static const SecAsn1Template SecCmsOriginatorPublicKeyTemplate[] = {
-    { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsOriginatorPublicKey) },
-    { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
-         offsetof(SecCmsOriginatorPublicKey,algorithmIdentifier),
-         SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
-    { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
-         offsetof(SecCmsOriginatorPublicKey,publicKey),
-         SEC_ASN1_SUB(kSecAsn1BitStringTemplate) },
-    { 0 }
-};
-
-
-static const SecAsn1Template SecCmsOriginatorIdentifierOrKeyTemplate[] = {
-    { SEC_ASN1_CHOICE,
-         offsetof(SecCmsOriginatorIdentifierOrKey,identifierType), NULL,
-         sizeof(SecCmsOriginatorIdentifierOrKey) },
-    { SEC_ASN1_POINTER | SEC_ASN1_XTRN,
-         offsetof(SecCmsOriginatorIdentifierOrKey,id.issuerAndSN),
-         SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate),
-         SecCmsOriginatorIDOrKeyIssuerSN },
-    { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC |
-      /* this was tag 1 here, 2 for the next; RFC 3852 says they are 0 and 1 */
-      SEC_ASN1_XTRN | 0,
-         offsetof(SecCmsOriginatorIdentifierOrKey,id.subjectKeyID),
-         kSecAsn1OctetStringTemplate,
-         SecCmsOriginatorIDOrKeySubjectKeyID },
-    { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
-         offsetof(SecCmsOriginatorIdentifierOrKey,id.originatorPublicKey),
-         SecCmsOriginatorPublicKeyTemplate,
-         SecCmsOriginatorIDOrKeyOriginatorPublicKey },
-    { 0 }
-};
-
-const SecAsn1Template SecCmsRecipientKeyIdentifierTemplate[] = {
-    { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsRecipientKeyIdentifier) },
-    { SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsRecipientKeyIdentifier,subjectKeyIdentifier) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsRecipientKeyIdentifier,date) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsRecipientKeyIdentifier,other) },
-    { 0 }
-};
-
-
-static const SecAsn1Template SecCmsKeyAgreeRecipientIdentifierTemplate[] = {
-    { SEC_ASN1_CHOICE,
-         offsetof(SecCmsKeyAgreeRecipientIdentifier,identifierType), NULL,
-         sizeof(SecCmsKeyAgreeRecipientIdentifier) },
-    { SEC_ASN1_POINTER | SEC_ASN1_XTRN,
-         offsetof(SecCmsKeyAgreeRecipientIdentifier,id.issuerAndSN),
-         SEC_ASN1_SUB(SecCmsIssuerAndSNTemplate),
-         SecCmsKeyAgreeRecipientIDIssuerSN },
-    { SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
-         offsetof(SecCmsKeyAgreeRecipientIdentifier,id.recipientKeyIdentifier),
-         SecCmsRecipientKeyIdentifierTemplate,
-         SecCmsKeyAgreeRecipientIDRKeyID },
-    { 0 }
-};
-
-static const SecAsn1Template SecCmsRecipientEncryptedKeyTemplate[] = {
-    { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsRecipientEncryptedKey) },
-    { SEC_ASN1_INLINE,
-         offsetof(SecCmsRecipientEncryptedKey,recipientIdentifier),
-         SecCmsKeyAgreeRecipientIdentifierTemplate },
-    { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
-         offsetof(SecCmsRecipientEncryptedKey,encKey),
-         SEC_ASN1_SUB(kSecAsn1OctetStringTemplate) },
-    { 0 }
-};
-
-static const SecAsn1Template SecCmsKeyAgreeRecipientInfoTemplate[] = {
-    { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsKeyAgreeRecipientInfo) },
-    { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT,
-         offsetof(SecCmsKeyAgreeRecipientInfo,version) },
-    { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
-         offsetof(SecCmsKeyAgreeRecipientInfo,originatorIdentifierOrKey),
-         SecCmsOriginatorIdentifierOrKeyTemplate },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT |
-      SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 1,
-         offsetof(SecCmsKeyAgreeRecipientInfo,ukm),
-         SEC_ASN1_SUB(kSecAsn1OctetStringTemplate) },
-    { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
-         offsetof(SecCmsKeyAgreeRecipientInfo,keyEncAlg),
-         SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
-    { SEC_ASN1_SEQUENCE_OF,
-         offsetof(SecCmsKeyAgreeRecipientInfo,recipientEncryptedKeys),
-         SecCmsRecipientEncryptedKeyTemplate },
-    { 0 }
-};
-
-/* -----------------------------------------------------------------------------
- * KEK recipient info
- */
-
-static const SecAsn1Template SecCmsKEKIdentifierTemplate[] = {
-    { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsKEKIdentifier) },
-    { SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsKEKIdentifier,keyIdentifier) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsKEKIdentifier,date) },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsKEKIdentifier,other) },
-    { 0 }
-};
-
-static const SecAsn1Template SecCmsKEKRecipientInfoTemplate[] = {
-    { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsKEKRecipientInfo) },
-    { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT,
-         offsetof(SecCmsKEKRecipientInfo,version) },
-    { SEC_ASN1_INLINE,
-         offsetof(SecCmsKEKRecipientInfo,kekIdentifier),
-         SecCmsKEKIdentifierTemplate },
-    { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
-         offsetof(SecCmsKEKRecipientInfo,keyEncAlg),
-         SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
-    { SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsKEKRecipientInfo,encKey) },
-    { 0 }
-};
-
-/* -----------------------------------------------------------------------------
- * recipient info
- */
-const SecAsn1Template SecCmsRecipientInfoTemplate[] = {
-    { SEC_ASN1_CHOICE,
-         offsetof(SecCmsRecipientInfo,recipientInfoType), NULL,
-         sizeof(SecCmsRecipientInfo) },
-    { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
-         offsetof(SecCmsRecipientInfo,ri.keyAgreeRecipientInfo),
-         SecCmsKeyAgreeRecipientInfoTemplate,
-         SecCmsRecipientInfoIDKeyAgree },
-    { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 2,
-         offsetof(SecCmsRecipientInfo,ri.kekRecipientInfo),
-         SecCmsKEKRecipientInfoTemplate,
-         SecCmsRecipientInfoIDKEK },
-    { SEC_ASN1_INLINE,
-         offsetof(SecCmsRecipientInfo,ri.keyTransRecipientInfo),
-         SecCmsKeyTransRecipientInfoTemplate,
-         SecCmsRecipientInfoIDKeyTrans },
-    { 0 }
-};
-
-/* -----------------------------------------------------------------------------
- *
- */
-
-const SecAsn1Template SecCmsDigestedDataTemplate[] = {
-    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM,
-         0, NULL, sizeof(SecCmsDigestedData) },
-    { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT,
-         offsetof(SecCmsDigestedData,version) },
-    { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
-         offsetof(SecCmsDigestedData,digestAlg),
-         SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
-    { SEC_ASN1_INLINE,
-         offsetof(SecCmsDigestedData,contentInfo),
-         SecCmsEncapsulatedContentInfoTemplate },
-    { SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsDigestedData,digest) },
-    { 0 }
-};
-
-const SecAsn1Template NSS_PointerToCMSDigestedDataTemplate[] = {
-    { SEC_ASN1_POINTER, 0, SecCmsDigestedDataTemplate }
-};
-
-const SecAsn1Template SecCmsEncryptedDataTemplate[] = {
-    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM,
-         0, NULL, sizeof(SecCmsEncryptedData) },
-    { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT,
-         offsetof(SecCmsEncryptedData,version) },
-    { SEC_ASN1_INLINE,
-         offsetof(SecCmsEncryptedData,contentInfo),
-         SecCmsEncryptedContentInfoTemplate },
-    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
-         offsetof(SecCmsEncryptedData,unprotectedAttr),
-         nss_cms_set_of_attribute_template },
-    { 0 }
-};
-
-const SecAsn1Template NSS_PointerToCMSEncryptedDataTemplate[] = {
-    { SEC_ASN1_POINTER, 0, SecCmsEncryptedDataTemplate }
-};
-
-/* -----------------------------------------------------------------------------
- * SetOfSignedCrlTemplate
- */
-const SecAsn1Template SecCmsIssuerAndSNTemplate[] = {
-    { SEC_ASN1_SEQUENCE,
-          0, NULL, sizeof(SecCmsIssuerAndSN) },
-#if 1 // @@@ Switch to using NSS_NameTemplate
-    { SEC_ASN1_ANY,
-          offsetof(SecCmsIssuerAndSN,derIssuer) },
-#else
-    { SEC_ASN1_INLINE,
-         offsetof(SecCmsIssuerAndSN,issuer),
-         NSS_NameTemplate },
-#endif
-    { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT,
-          offsetof(SecCmsIssuerAndSN,serialNumber) },
-    { 0 }
-};
-
-
-/* -----------------------------------------------------------------------------
- * FORTEZZA KEA
- */
-const SecAsn1Template NSS_SMIMEKEAParamTemplateSkipjack[] = {
-       { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsSMIMEKEAParameters) },
-       { SEC_ASN1_OCTET_STRING /* | SEC_ASN1_OPTIONAL */,
-         offsetof(SecCmsSMIMEKEAParameters,originatorKEAKey) },
-       { SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsSMIMEKEAParameters,originatorRA) },
-       { 0 }
-};
-
-const SecAsn1Template NSS_SMIMEKEAParamTemplateNoSkipjack[] = {
-       { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsSMIMEKEAParameters) },
-       { SEC_ASN1_OCTET_STRING /* | SEC_ASN1_OPTIONAL */,
-         offsetof(SecCmsSMIMEKEAParameters,originatorKEAKey) },
-       { SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsSMIMEKEAParameters,originatorRA) },
-       { SEC_ASN1_OCTET_STRING  | SEC_ASN1_OPTIONAL ,
-         offsetof(SecCmsSMIMEKEAParameters,nonSkipjackIV) },
-       { 0 }
-};
-
-const SecAsn1Template NSS_SMIMEKEAParamTemplateAllParams[] = {
-       { SEC_ASN1_SEQUENCE,
-         0, NULL, sizeof(SecCmsSMIMEKEAParameters) },
-       { SEC_ASN1_OCTET_STRING /* | SEC_ASN1_OPTIONAL */,
-         offsetof(SecCmsSMIMEKEAParameters,originatorKEAKey) },
-       { SEC_ASN1_OCTET_STRING,
-         offsetof(SecCmsSMIMEKEAParameters,originatorRA) },
-       { SEC_ASN1_OCTET_STRING  | SEC_ASN1_OPTIONAL ,
-         offsetof(SecCmsSMIMEKEAParameters,nonSkipjackIV) },
-       { SEC_ASN1_OCTET_STRING  | SEC_ASN1_OPTIONAL ,
-         offsetof(SecCmsSMIMEKEAParameters,bulkKeySize) },
-       { 0 }
-};
-
-/*TODO: this should be in some header */
-const SecAsn1Template *
-nss_cms_get_kea_template(SecCmsKEATemplateSelector whichTemplate);
-const SecAsn1Template *
-nss_cms_get_kea_template(SecCmsKEATemplateSelector whichTemplate)
-{
-       const SecAsn1Template *returnVal = NULL;
-
-       switch(whichTemplate)
-       {
-       case SecCmsKEAUsesNonSkipjack:
-               returnVal = NSS_SMIMEKEAParamTemplateNoSkipjack;
-               break;
-       case SecCmsKEAUsesSkipjack:
-               returnVal = NSS_SMIMEKEAParamTemplateSkipjack;
-               break;
-       case SecCmsKEAUsesNonSkipjackWithPaddedEncKey:
-       default:
-               returnVal = NSS_SMIMEKEAParamTemplateAllParams;
-               break;
-       }
-       return returnVal;
-}
-
-/* -----------------------------------------------------------------------------
- *
- */
-static const SecAsn1Template *
-nss_cms_choose_content_template(void *src_or_dest, Boolean encoding, const char *buf, void *dest)
-{
-    const SecAsn1Template *theTemplate;
-    SecCmsContentInfoRef cinfo;
-
-    PORT_Assert (src_or_dest != NULL);
-    if (src_or_dest == NULL)
-       return NULL;
-
-    cinfo = (SecCmsContentInfoRef)src_or_dest;
-    switch (SecCmsContentInfoGetContentTypeTag(cinfo)) {
-    default:
-       theTemplate = SEC_ASN1_GET(kSecAsn1PointerToAnyTemplate);
-       break;
-    case SEC_OID_PKCS7_DATA:
-    case SEC_OID_OTHER:
-       theTemplate = SEC_ASN1_GET(kSecAsn1PointerToOctetStringTemplate);
-       break;
-    case SEC_OID_PKCS7_SIGNED_DATA:
-       theTemplate = NSS_PointerToCMSSignedDataTemplate;
-       break;
-    case SEC_OID_PKCS7_ENVELOPED_DATA:
-       theTemplate = NSS_PointerToCMSEnvelopedDataTemplate;
-       break;
-    case SEC_OID_PKCS7_DIGESTED_DATA:
-       theTemplate = NSS_PointerToCMSDigestedDataTemplate;
-       break;
-    case SEC_OID_PKCS7_ENCRYPTED_DATA:
-       theTemplate = NSS_PointerToCMSEncryptedDataTemplate;
-       break;
-    }
-    return theTemplate;
-}