123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- /*
- * Header for CMS types.
- */
- #ifndef _CMST_H_
- #define _CMST_H_
- #include "seccomon.h"
- #include "secoidt.h"
- #include "certt.h"
- #include "secmodt.h"
- #include "secmodt.h"
- #include "plarena.h"
- /* Non-opaque objects. NOTE, though: I want them to be treated as
- * opaque as much as possible. If I could hide them completely,
- * I would. (I tried, but ran into trouble that was taking me too
- * much time to get out of.) I still intend to try to do so.
- * In fact, the only type that "outsiders" should even *name* is
- * NSSCMSMessage, and they should not reference its fields.
- */
- /* rjr: PKCS #11 cert handling (pk11cert.c) does use NSSCMSRecipientInfo's.
- * This is because when we search the recipient list for the cert and key we
- * want, we need to invert the order of the loops we used to have. The old
- * loops were:
- *
- * For each recipient {
- * find_cert = PK11_Find_AllCert(recipient->issuerSN);
- * [which unrolls to... ]
- * For each slot {
- * Log into slot;
- * search slot for cert;
- * }
- * }
- *
- * the new loop searchs all the recipients at once on a slot. this allows
- * PKCS #11 to order slots in such a way that logout slots don't get checked
- * if we can find the cert on a logged in slot. This eliminates lots of
- * spurious password prompts when smart cards are installed... so why this
- * comment? If you make NSSCMSRecipientInfo completely opaque, you need
- * to provide a non-opaque list of issuerSN's (the only field PKCS#11 needs
- * and fix up pk11cert.c first. NOTE: Only S/MIME calls this special PKCS #11
- * function.
- */
- typedef struct NSSCMSMessageStr NSSCMSMessage;
- typedef union NSSCMSContentUnion NSSCMSContent;
- typedef struct NSSCMSContentInfoStr NSSCMSContentInfo;
- typedef struct NSSCMSSignedDataStr NSSCMSSignedData;
- typedef struct NSSCMSSignerInfoStr NSSCMSSignerInfo;
- typedef struct NSSCMSSignerIdentifierStr NSSCMSSignerIdentifier;
- typedef struct NSSCMSEnvelopedDataStr NSSCMSEnvelopedData;
- typedef struct NSSCMSOriginatorInfoStr NSSCMSOriginatorInfo;
- typedef struct NSSCMSRecipientInfoStr NSSCMSRecipientInfo;
- typedef struct NSSCMSDigestedDataStr NSSCMSDigestedData;
- typedef struct NSSCMSEncryptedDataStr NSSCMSEncryptedData;
- typedef struct NSSCMSGenericWrapperDataStr NSSCMSGenericWrapperData;
- typedef struct NSSCMSAttributeStr NSSCMSAttribute;
- typedef struct NSSCMSDecoderContextStr NSSCMSDecoderContext;
- typedef struct NSSCMSEncoderContextStr NSSCMSEncoderContext;
- typedef struct NSSCMSCipherContextStr NSSCMSCipherContext;
- typedef struct NSSCMSDigestContextStr NSSCMSDigestContext;
- typedef struct NSSCMSContentInfoPrivateStr NSSCMSContentInfoPrivate;
- typedef SECStatus (*NSSCMSGenericWrapperDataCallback)(NSSCMSGenericWrapperData *);
- typedef void (*NSSCMSGenericWrapperDataDestroy)(NSSCMSGenericWrapperData *);
- extern const SEC_ASN1Template NSSCMSGenericWrapperDataTemplate[];
- extern const SEC_ASN1Template NSS_PointerToCMSGenericWrapperDataTemplate[];
- SEC_ASN1_CHOOSER_DECLARE(NSS_PointerToCMSGenericWrapperDataTemplate)
- SEC_ASN1_CHOOSER_DECLARE(NSSCMSGenericWrapperDataTemplate)
- /*
- * Type of function passed to NSSCMSDecode or NSSCMSDecoderStart.
- * If specified, this is where the content bytes (only) will be "sent"
- * as they are recovered during the decoding.
- * And:
- * Type of function passed to NSSCMSEncode or NSSCMSEncoderStart.
- * This is where the DER-encoded bytes will be "sent".
- *
- * XXX Should just combine this with NSSCMSEncoderContentCallback type
- * and use a simpler, common name.
- */
- typedef void (*NSSCMSContentCallback)(void *arg, const char *buf, unsigned long len);
- /*
- * Type of function passed to NSSCMSDecode or NSSCMSDecoderStart
- * to retrieve the decryption key. This function is intended to be
- * used for EncryptedData content info's which do not have a key available
- * in a certificate, etc.
- */
- typedef PK11SymKey *(*NSSCMSGetDecryptKeyCallback)(void *arg, SECAlgorithmID *algid);
- /* =============================================================================
- * ENCAPSULATED CONTENTINFO & CONTENTINFO
- */
- union NSSCMSContentUnion {
- /* either unstructured */
- SECItem *data;
- /* or structured data */
- NSSCMSDigestedData *digestedData;
- NSSCMSEncryptedData *encryptedData;
- NSSCMSEnvelopedData *envelopedData;
- NSSCMSSignedData *signedData;
- NSSCMSGenericWrapperData *genericData;
- /* or anonymous pointer to something */
- void *pointer;
- };
- struct NSSCMSContentInfoStr {
- SECItem contentType;
- NSSCMSContent content;
- /* --------- local; not part of encoding --------- */
- SECOidData *contentTypeTag;
- /* additional info for encryptedData and envelopedData */
- /* we waste this space for signedData and digestedData. sue me. */
- SECAlgorithmID contentEncAlg;
- SECItem *rawContent; /* encrypted DER, optional */
- /* XXXX bytes not encrypted, but encoded? */
- /* --------- local; not part of encoding --------- */
- PK11SymKey *bulkkey; /* bulk encryption key */
- int keysize; /* size of bulk encryption key
- * (only used by creation code) */
- SECOidTag contentEncAlgTag; /* oid tag of encryption algorithm
- * (only used by creation code) */
- NSSCMSContentInfoPrivate *privateInfo; /* place for NSS private info */
- void *reserved; /* keep binary compatibility */
- };
- /* =============================================================================
- * MESSAGE
- */
- struct NSSCMSMessageStr {
- NSSCMSContentInfo contentInfo; /* "outer" cinfo */
- /* --------- local; not part of encoding --------- */
- PLArenaPool *poolp;
- PRBool poolp_is_ours;
- int refCount;
- /* properties of the "inner" data */
- SECAlgorithmID **detached_digestalgs;
- SECItem **detached_digests;
- void *pwfn_arg;
- NSSCMSGetDecryptKeyCallback decrypt_key_cb;
- void *decrypt_key_cb_arg;
- };
- /* ============================================================================
- * GENERIC WRAPPER
- *
- * used for user defined types.
- */
- struct NSSCMSGenericWrapperDataStr {
- NSSCMSContentInfo contentInfo;
- /* ---- local; not part of encoding ------ */
- NSSCMSMessage *cmsg;
- /* wrapperspecific data starts here */
- };
- /* =============================================================================
- * SIGNEDDATA
- */
- struct NSSCMSSignedDataStr {
- SECItem version;
- SECAlgorithmID **digestAlgorithms;
- NSSCMSContentInfo contentInfo;
- SECItem **rawCerts;
- CERTSignedCrl **crls;
- NSSCMSSignerInfo **signerInfos;
- /* --------- local; not part of encoding --------- */
- NSSCMSMessage *cmsg; /* back pointer to message */
- SECItem **digests;
- CERTCertificate **certs;
- CERTCertificateList **certLists;
- CERTCertificate **tempCerts; /* temporary certs, needed
- * for example for signature
- * verification */
- };
- #define NSS_CMS_SIGNED_DATA_VERSION_BASIC 1 /* what we *create* */
- #define NSS_CMS_SIGNED_DATA_VERSION_EXT 3 /* what we *create* */
- typedef enum {
- NSSCMSVS_Unverified = 0,
- NSSCMSVS_GoodSignature = 1,
- NSSCMSVS_BadSignature = 2,
- NSSCMSVS_DigestMismatch = 3,
- NSSCMSVS_SigningCertNotFound = 4,
- NSSCMSVS_SigningCertNotTrusted = 5,
- NSSCMSVS_SignatureAlgorithmUnknown = 6,
- NSSCMSVS_SignatureAlgorithmUnsupported = 7,
- NSSCMSVS_MalformedSignature = 8,
- NSSCMSVS_ProcessingError = 9
- } NSSCMSVerificationStatus;
- typedef enum {
- NSSCMSSignerID_IssuerSN = 0,
- NSSCMSSignerID_SubjectKeyID = 1
- } NSSCMSSignerIDSelector;
- struct NSSCMSSignerIdentifierStr {
- NSSCMSSignerIDSelector identifierType;
- union {
- CERTIssuerAndSN *issuerAndSN;
- SECItem *subjectKeyID;
- } id;
- };
- struct NSSCMSSignerInfoStr {
- SECItem version;
- NSSCMSSignerIdentifier signerIdentifier;
- SECAlgorithmID digestAlg;
- NSSCMSAttribute **authAttr;
- SECAlgorithmID digestEncAlg;
- SECItem encDigest;
- NSSCMSAttribute **unAuthAttr;
- /* --------- local; not part of encoding --------- */
- NSSCMSMessage *cmsg; /* back pointer to message */
- CERTCertificate *cert;
- CERTCertificateList *certList;
- PRTime signingTime;
- NSSCMSVerificationStatus verificationStatus;
- SECKEYPrivateKey *signingKey; /* Used if we're using subjKeyID*/
- SECKEYPublicKey *pubKey;
- };
- #define NSS_CMS_SIGNER_INFO_VERSION_ISSUERSN 1 /* what we *create* */
- #define NSS_CMS_SIGNER_INFO_VERSION_SUBJKEY 3 /* what we *create* */
- typedef enum {
- NSSCMSCM_None = 0,
- NSSCMSCM_CertOnly = 1,
- NSSCMSCM_CertChain = 2,
- NSSCMSCM_CertChainWithRoot = 3
- } NSSCMSCertChainMode;
- /* =============================================================================
- * ENVELOPED DATA
- */
- struct NSSCMSEnvelopedDataStr {
- SECItem version;
- NSSCMSOriginatorInfo *originatorInfo; /* optional */
- NSSCMSRecipientInfo **recipientInfos;
- NSSCMSContentInfo contentInfo;
- NSSCMSAttribute **unprotectedAttr;
- /* --------- local; not part of encoding --------- */
- NSSCMSMessage *cmsg; /* back pointer to message */
- };
- #define NSS_CMS_ENVELOPED_DATA_VERSION_REG 0 /* what we *create* */
- #define NSS_CMS_ENVELOPED_DATA_VERSION_ADV 2 /* what we *create* */
- struct NSSCMSOriginatorInfoStr {
- SECItem **rawCerts;
- CERTSignedCrl **crls;
- /* --------- local; not part of encoding --------- */
- CERTCertificate **certs;
- };
- /* -----------------------------------------------------------------------------
- * key transport recipient info
- */
- typedef enum {
- NSSCMSRecipientID_IssuerSN = 0,
- NSSCMSRecipientID_SubjectKeyID = 1,
- NSSCMSRecipientID_BrandNew = 2
- } NSSCMSRecipientIDSelector;
- struct NSSCMSRecipientIdentifierStr {
- NSSCMSRecipientIDSelector identifierType;
- union {
- CERTIssuerAndSN *issuerAndSN;
- SECItem *subjectKeyID;
- } id;
- };
- typedef struct NSSCMSRecipientIdentifierStr NSSCMSRecipientIdentifier;
- struct NSSCMSKeyTransRecipientInfoStr {
- SECItem version;
- NSSCMSRecipientIdentifier recipientIdentifier;
- SECAlgorithmID keyEncAlg;
- SECItem encKey;
- };
- typedef struct NSSCMSKeyTransRecipientInfoStr NSSCMSKeyTransRecipientInfo;
- /*
- * View comments before NSSCMSRecipientInfoStr for purpose of this
- * structure.
- */
- struct NSSCMSKeyTransRecipientInfoExStr {
- NSSCMSKeyTransRecipientInfo recipientInfo;
- int version; /* version of this structure (0) */
- SECKEYPublicKey *pubKey;
- };
- typedef struct NSSCMSKeyTransRecipientInfoExStr NSSCMSKeyTransRecipientInfoEx;
- #define NSS_CMS_KEYTRANS_RECIPIENT_INFO_VERSION_ISSUERSN 0 /* what we *create* */
- #define NSS_CMS_KEYTRANS_RECIPIENT_INFO_VERSION_SUBJKEY 2 /* what we *create* */
- /* -----------------------------------------------------------------------------
- * key agreement recipient info
- */
- struct NSSCMSOriginatorPublicKeyStr {
- SECAlgorithmID algorithmIdentifier;
- SECItem publicKey; /* bit string! */
- };
- typedef struct NSSCMSOriginatorPublicKeyStr NSSCMSOriginatorPublicKey;
- typedef enum {
- NSSCMSOriginatorIDOrKey_IssuerSN = 0,
- NSSCMSOriginatorIDOrKey_SubjectKeyID = 1,
- NSSCMSOriginatorIDOrKey_OriginatorPublicKey = 2
- } NSSCMSOriginatorIDOrKeySelector;
- struct NSSCMSOriginatorIdentifierOrKeyStr {
- NSSCMSOriginatorIDOrKeySelector identifierType;
- union {
- CERTIssuerAndSN *issuerAndSN; /* static-static */
- SECItem *subjectKeyID; /* static-static */
- NSSCMSOriginatorPublicKey originatorPublicKey; /* ephemeral-static */
- } id;
- };
- typedef struct NSSCMSOriginatorIdentifierOrKeyStr NSSCMSOriginatorIdentifierOrKey;
- struct NSSCMSRecipientKeyIdentifierStr {
- SECItem *subjectKeyIdentifier;
- SECItem *date; /* optional */
- SECItem *other; /* optional */
- };
- typedef struct NSSCMSRecipientKeyIdentifierStr NSSCMSRecipientKeyIdentifier;
- typedef enum {
- NSSCMSKeyAgreeRecipientID_IssuerSN = 0,
- NSSCMSKeyAgreeRecipientID_RKeyID = 1
- } NSSCMSKeyAgreeRecipientIDSelector;
- struct NSSCMSKeyAgreeRecipientIdentifierStr {
- NSSCMSKeyAgreeRecipientIDSelector identifierType;
- union {
- CERTIssuerAndSN *issuerAndSN;
- NSSCMSRecipientKeyIdentifier recipientKeyIdentifier;
- } id;
- };
- typedef struct NSSCMSKeyAgreeRecipientIdentifierStr NSSCMSKeyAgreeRecipientIdentifier;
- struct NSSCMSRecipientEncryptedKeyStr {
- NSSCMSKeyAgreeRecipientIdentifier recipientIdentifier;
- SECItem encKey;
- };
- typedef struct NSSCMSRecipientEncryptedKeyStr NSSCMSRecipientEncryptedKey;
- struct NSSCMSKeyAgreeRecipientInfoStr {
- SECItem version;
- NSSCMSOriginatorIdentifierOrKey originatorIdentifierOrKey;
- SECItem *ukm; /* optional */
- SECAlgorithmID keyEncAlg;
- NSSCMSRecipientEncryptedKey **recipientEncryptedKeys;
- };
- typedef struct NSSCMSKeyAgreeRecipientInfoStr NSSCMSKeyAgreeRecipientInfo;
- #define NSS_CMS_KEYAGREE_RECIPIENT_INFO_VERSION 3 /* what we *create* */
- /* -----------------------------------------------------------------------------
- * KEK recipient info
- */
- struct NSSCMSKEKIdentifierStr {
- SECItem keyIdentifier;
- SECItem *date; /* optional */
- SECItem *other; /* optional */
- };
- typedef struct NSSCMSKEKIdentifierStr NSSCMSKEKIdentifier;
- struct NSSCMSKEKRecipientInfoStr {
- SECItem version;
- NSSCMSKEKIdentifier kekIdentifier;
- SECAlgorithmID keyEncAlg;
- SECItem encKey;
- };
- typedef struct NSSCMSKEKRecipientInfoStr NSSCMSKEKRecipientInfo;
- #define NSS_CMS_KEK_RECIPIENT_INFO_VERSION 4 /* what we *create* */
- /* -----------------------------------------------------------------------------
- * recipient info
- */
- typedef enum {
- NSSCMSRecipientInfoID_KeyTrans = 0,
- NSSCMSRecipientInfoID_KeyAgree = 1,
- NSSCMSRecipientInfoID_KEK = 2
- } NSSCMSRecipientInfoIDSelector;
- /*
- * In order to preserve backwards binary compatibility when implementing
- * creation of Recipient Info's that uses subjectKeyID in the
- * keyTransRecipientInfo we need to stash a public key pointer in this
- * structure somewhere. We figured out that NSSCMSKeyTransRecipientInfo
- * is the smallest member of the ri union. We're in luck since that's
- * the very structure that would need to use the public key. So we created
- * a new structure NSSCMSKeyTransRecipientInfoEx which has a member
- * NSSCMSKeyTransRecipientInfo as the first member followed by a version
- * and a public key pointer. This way we can keep backwards compatibility
- * without changing the size of this structure.
- *
- * BTW, size of structure:
- * NSSCMSKeyTransRecipientInfo: 9 ints, 4 pointers
- * NSSCMSKeyAgreeRecipientInfo: 12 ints, 8 pointers
- * NSSCMSKEKRecipientInfo: 10 ints, 7 pointers
- *
- * The new structure:
- * NSSCMSKeyTransRecipientInfoEx: sizeof(NSSCMSKeyTransRecipientInfo) +
- * 1 int, 1 pointer
- */
- struct NSSCMSRecipientInfoStr {
- NSSCMSRecipientInfoIDSelector recipientInfoType;
- union {
- NSSCMSKeyTransRecipientInfo keyTransRecipientInfo;
- NSSCMSKeyAgreeRecipientInfo keyAgreeRecipientInfo;
- NSSCMSKEKRecipientInfo kekRecipientInfo;
- NSSCMSKeyTransRecipientInfoEx keyTransRecipientInfoEx;
- } ri;
- /* --------- local; not part of encoding --------- */
- NSSCMSMessage *cmsg; /* back pointer to message */
- CERTCertificate *cert; /* recipient's certificate */
- };
- /* =============================================================================
- * DIGESTED DATA
- */
- struct NSSCMSDigestedDataStr {
- SECItem version;
- SECAlgorithmID digestAlg;
- NSSCMSContentInfo contentInfo;
- SECItem digest;
- /* --------- local; not part of encoding --------- */
- NSSCMSMessage *cmsg; /* back pointer */
- SECItem cdigest; /* calculated digest */
- };
- #define NSS_CMS_DIGESTED_DATA_VERSION_DATA 0 /* what we *create* */
- #define NSS_CMS_DIGESTED_DATA_VERSION_ENCAP 2 /* what we *create* */
- /* =============================================================================
- * ENCRYPTED DATA
- */
- struct NSSCMSEncryptedDataStr {
- SECItem version;
- NSSCMSContentInfo contentInfo;
- NSSCMSAttribute **unprotectedAttr; /* optional */
- /* --------- local; not part of encoding --------- */
- NSSCMSMessage *cmsg; /* back pointer */
- };
- #define NSS_CMS_ENCRYPTED_DATA_VERSION 0 /* what we *create* */
- #define NSS_CMS_ENCRYPTED_DATA_VERSION_UPATTR 2 /* what we *create* */
- /*
- * *****************************************************************************
- * *****************************************************************************
- * *****************************************************************************
- */
- /*
- * See comment above about this type not really belonging to CMS.
- */
- struct NSSCMSAttributeStr {
- /* The following fields make up an encoded Attribute: */
- SECItem type;
- SECItem **values; /* data may or may not be encoded */
- /* The following fields are not part of an encoded Attribute: */
- SECOidData *typeTag;
- PRBool encoded; /* when true, values are encoded */
- };
- #endif /* _CMST_H_ */
|