Further, since all implementations will not support every possible
signature algorithm, all implementations MUST gracefully handle
unimplemented signature algorithms when they are encountered.
5.2. EncapsulatedContentInfo Type
The content is represented in the type EncapsulatedContentInfo:
EncapsulatedContentInfo ::= SEQUENCE {
eContentType ContentType,
eContent [0] EXPLICIT OCTET STRING OPTIONAL }
ContentType ::= OBJECT IDENTIFIER
The fields of type EncapsulatedContentInfo have the following
meanings:
eContentType is an object identifier. The object identifier
uniquely specifies the content type.
eContent is the content itself, carried as an octet string. The
eContent need not be DER encoded.
The optional omission of the eContent within the
EncapsulatedContentInfo field makes it possible to construct
"external signatures." In the case of external signatures, the
content being signed is absent from the EncapsulatedContentInfo value
included in the signed-data content type. If the eContent value
within EncapsulatedContentInfo is absent, then the signatureValue is
calculated and the eContentType is assigned as though the eContent
value was present.
In the degenerate case where there are no signers, the
EncapsulatedContentInfo value being "signed" is irrelevant. In this
case, the content type within the EncapsulatedContentInfo value being
"signed" MUST be id-data (as defined in section 4), and the content
field of the EncapsulatedContentInfo value MUST be omitted.
5.2.1. Compatibility with PKCS #7
This section contains a word of warning to implementers that wish to
support both the CMS and PKCS #7 [PKCS#7] SignedData content types.
Both the CMS and PKCS #7 identify the type of the encapsulated
content with an object identifier, but the ASN.1 type of the content
itself is variable in PKCS #7 SignedData content type.
PKCS #7 defines content as:
content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL
The CMS defines eContent as:
eContent [0] EXPLICIT OCTET STRING OPTIONAL
The CMS definition is much easier to use in most applications, and it
is compatible with both S/MIME v2 and S/MIME v3. S/MIME signed
messages using the CMS and PKCS #7 are compatible because identical
signed message formats are specified in RFC 2311 for S/MIME v2
[OLDMSG] and RFC 3851 for S/MIME v3.1 [MSG]. S/MIME v2 encapsulates
the MIME content in a Data type (that is, an OCTET STRING) carried in
the SignedData contentInfo content ANY field, and S/MIME v3 carries
the MIME content in the SignedData encapContentInfo eContent OCTET
STRING. Therefore, in both S/MIME v2 and S/MIME v3, the MIME content
is placed in an OCTET STRING and the message digest is computed over
the identical portions of the content. That is, the message digest
is computed over the octets comprising the value of the OCTET STRING,
neither the tag nor length octets are included.
There are incompatibilities between the CMS and PKCS #7 SignedData
types when the encapsulated content is not formatted using the Data
type. For example, when an RFC 2634 [ESS] signed receipt is
encapsulated in the CMS SignedData type, then the Receipt SEQUENCE is
encoded in the SignedData encapContentInfo eContent OCTET STRING and
the message digest is computed using the entire Receipt SEQUENCE
encoding (including tag, length and value octets). However, if an
RFC 2634 signed receipt is encapsulated in the PKCS #7 SignedData
type, then the Receipt SEQUENCE is DER encoded [X.509-88] in the
SignedData contentInfo content ANY field (a SEQUENCE, not an OCTET
STRING). Therefore, the message digest is computed using only the
value octets of the Receipt SEQUENCE encoding.
The following strategy can be used to achieve backward compatibility
with PKCS #7 when processing SignedData content types. If the
implementation is unable to ASN.1 decode the SignedData type using
the CMS SignedData encapContentInfo eContent OCTET STRING syntax,
then the implementation MAY attempt to decode the SignedData type
using the PKCS #7 SignedData contentInfo content ANY syntax and
compute the message digest accordingly.
The following strategy can be used to achieve backward compatibility
with PKCS #7 when creating a SignedData content type in which the
encapsulated content is not formatted using the Data type.
Implementations MAY examine the value of the eContentType, and then
adjust the expected DER encoding of eContent based on the object
identifier value. For example, to support Microsoft Authenticode
[MSAC], the following information MAY be included:
eContentType Object Identifier is set to { 1 3 6 1 4 1 311 2 1 4 }
eContent contains DER encoded Authenticode signing information
5.3. SignerInfo Type
Per-signer information is represented in the type SignerInfo:
SignerInfo ::= SEQUENCE {
version CMSVersion,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature SignatureValue,
unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }
SignerIdentifier ::= CHOICE {
issuerAndSerialNumber IssuerAndSerialNumber,
subjectKeyIdentifier [0] SubjectKeyIdentifier }
SignedAttributes ::= SET SIZE (1..MAX) OF Attribute
UnsignedAttributes ::= SET SIZE (1..MAX) OF Attribute
Attribute ::= SEQUENCE {
attrType OBJECT IDENTIFIER,
attrValues SET OF AttributeValue }
AttributeValue ::= ANY
SignatureValue ::= OCTET STRING
The fields of type SignerInfo have the following meanings:
version is the syntax version number. If the SignerIdentifier is
the CHOICE issuerAndSerialNumber, then the version MUST be 1. If
the SignerIdentifier is subjectKeyIdentifier, then the version
MUST be 3.
sid specifies the signer’s certificate (and thereby the signer’s
public key). The signer’s public key is needed by the recipient
to verify the signature. SignerIdentifier provides two
alternatives for specifying the signer’s public key. The
issuerAndSerialNumber alternative identifies the signer’s
certificate by the issuer’s distinguished name and the certificate
serial number; the subjectKeyIdentifier identifies the signer’s
certificate by a key identifier. When an X.509 certificate is
reference, the key identifier matches the X.509
subjectKeyIdentifier extension value. When other certificate
formats are referenced, the documents that specify the certificate
format and their use with the CMS must include details on matching
the key identifier to the appropriate certificate field.
Implementations MUST support the reception of the
issuerAndSerialNumber and subjectKeyIdentifier forms of
SignerIdentifier. When generating a SignerIdentifier,
implementations MAY support one of the forms (either
issuerAndSerialNumber or subjectKeyIdentifier) and always use it,
or implementations MAY arbitrarily mix the two forms. However,
subjectKeyIdentifier MUST be used to refer to a public key
contained in a non-X.509 certificate.
digestAlgorithm identifies the message digest algorithm, and any
associated parameters, used by the signer. The message digest is
computed on either the content being signed or the content
together with the signed attributes using the process described in
section 5.4. The message digest algorithm SHOULD be among those
listed in the digestAlgorithms field of the associated SignerData.
Implementations MAY fail to validate signatures that use a digest
algorithm that is not included in the SignedData digestAlgorithms
set.
signedAttrs is a collection of attributes that are signed. The
field is optional, but it MUST be present if the content type of
the EncapsulatedContentInfo value being signed is not id-data.
SignedAttributes MUST be DER encoded, even if the rest of the
structure is BER encoded. Useful attribute types, such as signing
time, are defined in Section 11. If the field is present, it MUST
contain, at a minimum, the following two attributes:
A content-type attribute having as its value the content type
of the EncapsulatedContentInfo value being signed. Section
11.1 defines the content-type attribute. However, the
content-type attribute MUST NOT be used as part of a
countersignature unsigned attribute as defined in section 11.4.
A message-digest attribute, having as its value the message
digest of the content. Section 11.2 defines the message-digest
attribute.
signatureAlgorithm identifies the signature algorithm, and any
associated parameters, used by the signer to generate the digital
signature.
signature is the result of digital signature generation, using the
message digest and the signer’s private key. The details of the
signature depend on the signature algorithm employed.
unsignedAttrs is a collection of attributes that are not signed.
The field is optional. Useful attribute types, such as
countersignatures, are defined in Section 11.
The fields of type SignedAttribute and UnsignedAttribute have the
following meanings:
attrType indicates the type of attribute. It is an object
identifier.
attrValues is a set of values that comprise the attribute. The
type of each value in the set can be determined uniquely by
attrType. The attrType can impose restrictions on the number of
items in the set.
5.4. Message Digest Calculation Process
The message digest calculation process computes a message digest on
either the content being signed or the content together with the
signed attributes. In either case, the initial input to the message
digest calculation process is the "value" of the encapsulated content
being signed. Specifically, the initial input is the
encapContentInfo eContent OCTET STRING to which the signing process
is applied. Only the octets comprising the value of the eContent
OCTET STRING are input to the message digest algorithm, not the tag
or the length octets.
The result of the message digest calculation process depends on
whether the signedAttrs field is present. When the field is absent,
the result is just the message digest of the content as described
above. When the field is present, however, the result is the message
digest of the complete DER encoding of the SignedAttrs value
contained in the signedAttrs field. Since the SignedAttrs value,
when present, must contain the content-type and the message-digest
attributes, those values are indirectly included in the result. The
content-type attribute MUST NOT be included in a countersignature
unsigned attribute as defined in section 11.4. A separate encoding
of the signedAttrs field is performed for message digest calculation.
The IMPLICIT [0] tag in the signedAttrs is not used for the DER
encoding, rather an EXPLICIT SET OF tag is used. That is, the DER
encoding of the EXPLICIT SET OF tag, rather than of the IMPLICIT [0]
tag, MUST be included in the message digest calculation along with
the length and content octets of the SignedAttributes value.
When the signedAttrs field is absent, only the octets comprising the
value of the SignedData encapContentInfo eContent OCTET STRING (e.g.,
the contents of a file) are input to the message digest calculation.
This has the advantage that the length of the content being signed
need not be known in advance of the signature generation process.
Although the encapContentInfo eContent OCTET STRING tag and length
octets are not included in the message digest calculation, they are
protected by other means. The length octets are protected by the
nature of the message digest algorithm since it is computationally
infeasible to find any two distinct message contents of any length
that have the same message digest.
5.5. Signature Generation Process
The input to the signature generation process includes the result of
the message digest calculation process and the signer’s private key.
The details of the signature generation depend on the signature
algorithm employed. The object identifier, along with any
parameters, that specifies the signature algorithm employed by the
signer is carried in the signatureAlgorithm field. The signature
value generated by the signer MUST be encoded as an OCTET STRING and
carried in the signature field.
5.6. Signature Verification Process
The input to the signature verification process includes the result
of the message digest calculation process and the signer’s public
key. The recipient MAY obtain the correct public key for the signer
by any means, but the preferred method is from a certificate obtained
from the SignedData certificates field. The selection and validation
of the signer’s public key MAY be based on certification path
validation (see [PROFILE]) as well as other external context, but is
beyond the scope of this document. The details of the signature
verification depend on the signature algorithm employed.
The recipient MUST NOT rely on any message digest values computed by
the originator. If the SignedData signerInfo includes
signedAttributes, then the content message digest MUST be calculated
as described in section 5.4. For the signature to be valid, the
message digest value calculated by the recipient MUST be the same as
the value of the messageDigest attribute included in the
signedAttributes of the SignedData signerInfo.
If the SignedData signerInfo includes signedAttributes, then the
content-type attribute value MUST match the SignedData
encapContentInfo eContentType value.
6. Enveloped-data Content Type
The enveloped-data content type consists of an encrypted content of
any type and encrypted content-encryption keys for one or more
recipients. The combination of the encrypted content and one
encrypted content-encryption key for a recipient is a "digital
envelope" for that recipient. Any type of content can be enveloped
for an arbitrary number of recipients using any of the supported key
management techniques for each recipient.
The typical application of the enveloped-data content type will
represent one or more recipients’ digital envelopes on content of the
data or signed-data content types.
Enveloped-data is constructed by the following steps:
1. A content-encryption key for a particular content-encryption
algorithm is generated at random.
2. The content-encryption key is encrypted for each recipient.
The details of this encryption depend on the key management
algorithm used, but four general techniques are supported:
key transport: the content-encryption key is encrypted in the
recipient’s public key;
key agreement: the recipient’s public key and the sender’s
private key are used to generate a pairwise symmetric key, then
the content-encryption key is encrypted in the pairwise
symmetric key;
symmetric key-encryption keys: the content-encryption key is
encrypted in a previously distributed symmetric key-encryption
key; and
passwords: the content-encryption key is encrypted in a key-
encryption key that is derived from a password or other shared
secret value.
3. For each recipient, the encrypted content-encryption key and
other recipient-specific information are collected into a
RecipientInfo value, defined in Section 6.2.
4. The content is encrypted with the content-encryption key.
Content encryption may require that the content be padded to a
multiple of some block size; see Section 6.3.
5. The RecipientInfo values for all the recipients are collected
together with the encrypted content to form an EnvelopedData
value as defined in Section 6.1.
A recipient opens the digital envelope by decrypting one of the
encrypted content-encryption keys and then decrypting the
encrypted content with the recovered content-encryption key.
This section is divided into four parts. The first part describes
the top-level type EnvelopedData, the second part describes the
per-recipient information type RecipientInfo, and the third and
fourth parts describe the content-encryption and key-encryption
processes.
6.1. EnvelopedData Type
The following object identifier identifies the enveloped-data content
type:
id-envelopedData OBJECT IDENTIFIER ::= { iso(1) member-body(2)
us(840) rsadsi(113549) pkcs(1) pkcs7(7) 3 }
The enveloped-data content type shall have ASN.1 type EnvelopedData:
EnvelopedData ::= SEQUENCE {
version CMSVersion,
originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
recipientInfos RecipientInfos,
encryptedContentInfo EncryptedContentInfo,
unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL }
OriginatorInfo ::= SEQUENCE {
certs [0] IMPLICIT CertificateSet OPTIONAL,
crls [1] IMPLICIT RevocationInfoChoices OPTIONAL }
RecipientInfos ::= SET SIZE (1..MAX) OF RecipientInfo
EncryptedContentInfo ::= SEQUENCE {
contentType ContentType,
contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL }
EncryptedContent ::= OCTET STRING
UnprotectedAttributes ::= SET SIZE (1..MAX) OF Attribute
The fields of type EnvelopedData have the following meanings:
version is the syntax version number. The appropriate value
depends on originatorInfo, RecipientInfo, and unprotectedAttrs.
The version MUST be assigned as follows:
IF (originatorInfo is present) AND
((any certificates with a type of other are present) OR
(any crls with a type of other are present))
THEN version is 4
ELSE
IF ((originatorInfo is present) AND
(any version 2 attribute certificates are present)) OR
(any RecipientInfo structures include pwri) OR
(any RecipientInfo structures include ori)
THEN version is 3
ELSE
IF (originatorInfo is absent) OR
(unprotectedAttrs is absent) OR
(all RecipientInfo structures are version 0)
THEN version is 0
ELSE version is 2
originatorInfo optionally provides information about the
originator. It is present only if required by the key management
algorithm. It may contain certificates and CRLs:
certs is a collection of certificates. certs may contain
originator certificates associated with several different key
management algorithms. certs may also contain attribute
certificates associated with the originator. The certificates
contained in certs are intended to be sufficient for all
recipients to build certification paths from a recognized
"root" or "top-level certification authority." However, certs
may contain more certificates than necessary, and there may be
certificates sufficient to make certification paths from two or
more independent top-level certification authorities.
Alternatively, certs may contain fewer certificates than
necessary, if it is expected that recipients have an alternate
means of obtaining necessary certificates (e.g., from a
previous set of certificates).
crls is a collection of CRLs. It is intended that the set
contain information sufficient to determine whether or not the
certificates in the certs field are valid, but such
correspondence is not necessary. There MAY be more CRLs than
necessary, and there MAY also be fewer CRLs than necessary.
recipientInfos is a collection of per-recipient information.
There MUST be at least one element in the collection.
encryptedContentInfo is the encrypted content information.
unprotectedAttrs is a collection of attributes that are not
encrypted. The field is optional. Useful attribute types are
defined in Section 11.
The fields of type EncryptedContentInfo have the following meanings:
contentType indicates the type of content.
contentEncryptionAlgorithm identifies the content-encryption
algorithm, and any associated parameters, used to encrypt the
content. The content-encryption process is described in Section
6.3. The same content-encryption algorithm and content-encryption
key are used for all recipients.
encryptedContent is the result of encrypting the content. The
field is optional, and if the field is not present, its intended
value must be supplied by other means.
The recipientInfos field comes before the encryptedContentInfo field
so that an EnvelopedData value may be processed in a single pass.
6.2. RecipientInfo Type
Per-recipient information is represented in the type RecipientInfo.
RecipientInfo has a different format for each of the supported key
management techniques. Any of the key management techniques can be
used for each recipient of the same encrypted content. In all cases,
the encrypted content-encryption key is transferred to one or more
recipients.
Since all implementations will not support every possible key
management algorithm, all implementations MUST gracefully handle
unimplemented algorithms when they are encountered. For example, if
a recipient receives a content-encryption key encrypted in their RSA
public key using RSA-OAEP and the implementation only supports RSA
PKCS #1 v1.5, then a graceful failure must be implemented.
Implementations MUST support key transport, key agreement, and
previously distributed symmetric key-encryption keys, as represented
by ktri, kari, and kekri, respectively. Implementations MAY support
the password-based key management as represented by pwri.
Implementations MAY support any other key management technique as
represented by ori. Since each recipient can employ a different key
management technique and future specifications could define
additional key management techniques, all implementations MUST
gracefully handle unimplemented alternatives within the RecipientInfo
CHOICE, all implementations MUST gracefully handle unimplemented
versions of otherwise supported alternatives within the RecipientInfo
CHOICE, and all implementations MUST gracefully handle unimplemented
or unknown ori alternatives.
RecipientInfo ::= CHOICE {
ktri KeyTransRecipientInfo,
kari [1] KeyAgreeRecipientInfo,
kekri [2] KEKRecipientInfo,
pwri [3] PasswordRecipientinfo,
ori [4] OtherRecipientInfo }
EncryptedKey ::= OCTET STRING
6.2.1. KeyTransRecipientInfo Type
Per-recipient information using key transport is represented in the
type KeyTransRecipientInfo. Each instance of KeyTransRecipientInfo
transfers the content-encryption key to one recipient.
KeyTransRecipientInfo ::= SEQUENCE {
version CMSVersion, -- always set to 0 or 2
rid RecipientIdentifier,
keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
encryptedKey EncryptedKey }
RecipientIdentifier ::= CHOICE {
issuerAndSerialNumber IssuerAndSerialNumber,