<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>

<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-lamps-cms-kemri-08" number="9629" category="std" consensus="true" submissionType="IETF" obsoletes="" updates="5652" tocInclude="true" sortRefs="true" symRefs="true" version="3" xml:lang="en">

  <front>
    <title abbrev="CMS KEMRecipientInfo">Using Key Encapsulation Mechanism (KEM) Algorithms in the Cryptographic Message Syntax (CMS)</title>
    <seriesInfo name="RFC" value="9629"/>
    <author fullname="Russ Housley">
      <organization abbrev="Vigil Security">Vigil Security, LLC</organization>
      <address>
        <postal>
          <city>Herndon</city>
	  <region>VA</region>
          <country>United States of America</country>
        </postal>
        <email>housley@vigilsec.com</email>
      </address>
    </author>
    <author fullname="John Gray">
      <organization>Entrust</organization>
      <address>
        <postal>
          <city>Minneapolis</city>
	  <region>MN</region>
          <country>United States of America</country>
        </postal>
        <email>john.gray@entrust.com</email>
      </address>
    </author>
    <author fullname="大久保　智史" asciiFullname="Tomofumi Okubo">
      <organization>Penguin Securities Pte. Ltd.</organization>
      <address>
        <postal>
          <country>Singapore</country>
        </postal>
        <email>tomofumi.okubo+ietf@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="August"/>
    <area>SEC</area>
    <workgroup>lamps</workgroup>

<keyword>kemri</keyword>
<keyword>KEMRecipientInfo</keyword>

    <abstract>
<t>The Cryptographic Message Syntax (CMS) supports key transport and
key agreement algorithms.  In recent years, cryptographers have been
specifying Key Encapsulation Mechanism (KEM) algorithms, including
quantum-secure KEM algorithms.  This document defines conventions for
the use of KEM algorithms by the originator and recipients to encrypt
and decrypt CMS content.  This document updates RFC 5652.</t>
    </abstract>
  </front>
  <middle>


<section anchor="intro">
      <name>Introduction</name>
      <t>This document updates "<xref target="RFC5652" format="title"/>" <xref target="RFC5652" format="default"/>.</t>
      <t>The CMS enveloped-data content type
<xref target="RFC5652"/> and the CMS authenticated-enveloped-data content type
<xref target="RFC5083"/> support both key transport and key agreement algorithms to
establish the key used to encrypt and decrypt the content.  In recent
years, cryptographers have been specifying Key Encapsulation Mechanism
(KEM) algorithms, including quantum-secure KEM algorithms.  This document
defines conventions for the use of KEM algorithms for the CMS
enveloped-data content type and the CMS authenticated-enveloped-data
content type.</t>
      <t>A KEM algorithm is a one-pass (store-and-forward) mechanism for
transporting random keying material to a recipient using the recipient's
public key.  This means that the originator and the recipients do not need
to be online at the same time.  The recipient's private key is needed to
recover the random keying material, which is then treated as a pairwise
shared secret (ss) between the originator and recipient.</t>
      <t>The KEMRecipientInfo structure defined in this document uses the pairwise
shared secret as an input to a key derivation function (KDF) to produce a
pairwise key-encryption key (KEK).  Then, the pairwise KEK is used to encrypt a
content-encryption key (CEK) or a content-authenticated-encryption key (CAEK)
for that recipient.  All of the recipients receive the same CEK or CAEK.</t>
      <t>In this environment, security depends on three things.  First, the KEM algorithm
must be secure against adaptive chosen ciphertext attacks.  Second, the
key-encryption algorithm must provide confidentiality and integrity protection.  Third,
the choices of the KDF and the key-encryption algorithm need to provide the same
level of security as the KEM algorithm.</t>
      <t>A KEM algorithm provides three functions:</t>
      <dl spacing="normal" newline="true">
        <dt>KeyGen() -&gt; (pk, sk):</dt>
          <dd>Generate the public key (pk) and a private key (sk).</dd>
          <dt>Encapsulate(pk) -&gt; (ct, ss):</dt>
          <dd>Given the recipient's public key (pk), produce a ciphertext (ct) to be
passed to the recipient and shared secret (ss) for the originator.</dd>
          <dt>Decapsulate(sk, ct) -&gt; ss:</dt>
          <dd>Given the private key (sk) and the ciphertext (ct), produce the
shared secret (ss) for the recipient.</dd>
      </dl>
      <t>To support a particular KEM algorithm, the CMS originator <bcp14>MUST</bcp14> implement
the KEM Encapsulate() function.</t>
      <t>To support a particular KEM algorithm, the CMS recipient <bcp14>MUST</bcp14> implement the KEM
KeyGen() function and the KEM Decapsulate() function.  The recipient's public key
is usually carried in a certificate <xref target="RFC5280"/>.</t>
      <section anchor="terms">
        <name>Terminology</name>
         <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
         "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>",
         "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>",
         "<bcp14>SHOULD NOT</bcp14>",
         "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
         "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document
         are to be interpreted as described in BCP&nbsp;14
         <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only
         when, they appear in all capitals, as shown here.</t>
</section>
      <section anchor="asn1">
        <name>ASN.1</name>
        <t>CMS values are generated using ASN.1 <xref target="X.680"/>, which uses the Basic
Encoding Rules (BER) and the Distinguished Encoding Rules (DER) <xref target="X.690"/>.</t>
      </section>
      <section anchor="cms-version-numbers">
        <name>CMS Version Numbers</name>
        <t>As described in <xref section="1.3" sectionFormat="of" target="RFC5652"/>, the major data structures
include a version number as the first item in
the data structure.  The version number is intended to avoid ASN.1 decode
errors.  Some implementations do not check the version number prior to
attempting a decode, and then if a decode error occurs, the version
number is checked as part of the error-handling routine.  This is a
reasonable approach; it places error processing outside of the fast path.
This approach is also forgiving when an incorrect version number is used
by the originator.</t>
        <t>Whenever the structure is updated, a higher version number will be
assigned.  However, to ensure maximum interoperability, the higher
version number is only used when the new syntax feature is employed.  That
is, the lowest version number that supports the generated syntax is used.</t>
      </section>
    </section>
    <section anchor="kem-processing-overview">
      <name>KEM Processing Overview</name>
      <t>KEM algorithms can be used with  three CMS content types: the
enveloped-data content type <xref target="RFC5652"/>, the authenticated-data
content type <xref target="RFC5652"/>, or the authenticated-enveloped-data
content type <xref target="RFC5083"/>.  For simplicity, the terminology associated
with the enveloped-data content type will be used in this overview.</t>
      <t>The originator randomly generates the CEK (or the CAEK), and then
all recipients obtain that key as an encrypted object within the KEMRecipientInfo
encryptedKey field explained in <xref target="kemri"/>.  All recipients use
the originator-generated symmetric key to decrypt the CMS message.</t>
      <t>A KEM algorithm and a key derivation function are used to securely
establish a pairwise symmetric KEK, which is used to encrypt
the originator-generated CEK (or the CAEK).</t>
      <t>In advance, each recipient uses the KEM KeyGen() function to create a key pair.
The recipient will often obtain a certificate <xref target="RFC5280"/> that includes the newly
generated public key.  Whether the public key is certified or not, the newly
generated public key is made available to potential originators.</t>
      <t>The originator establishes the CEK (or the CAEK) using these steps:</t>
      <ol spacing="normal" type="1"><li>
          <t>The CEK (or the CAEK) is generated at random.</t>
        </li>
        <li>
          <t>For each recipient:  </t>
          <ul spacing="normal">
            <li>
              <t>The recipient's public key is used with the KEM Encapsulate() function to obtain a pairwise shared secret (ss) and the ciphertext for the recipient.</t>
            </li>
            <li>
              <t>The key derivation function is used to derive a pairwise symmetric KEK, from the pairwise ss and other data that is optionally sent in the ukm field.</t>
            </li>
            <li>
              <t>The KEK is used to encrypt the CEK for this recipient.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>The CEK (or the CAEK) is used to encrypt the content for all recipients.</t>
        </li>
      </ol>
      <t>The recipient obtains the CEK (or the CAEK) using these steps:</t>
      <ol spacing="normal" type="1"><li>
          <t>The recipient's private key and the ciphertext are used with the KEM Decapsulate() function to obtain a pairwise ss.</t>
        </li>
        <li>
          <t>The key derivation function is used to derive a pairwise symmetric KEK, from the pairwise ss and other data that is optionally sent in the ukm field.</t>
        </li>
        <li>
          <t>The KEK is used to decrypt the CEK (or the CAEK).</t>
        </li>
        <li>
          <t>The CEK (or the CAEK) is used to decrypt the content.</t>
        </li>
      </ol>
    </section>
    <section anchor="kemri">
      <name>KEM Recipient Information</name>
      <t>This document defines KEMRecipientInfo for use with KEM algorithms.
As specified in <xref target="RFC5652" sectionFormat="of" section="6.2.5"/>,
recipient information for
additional key management techniques is represented in the
OtherRecipientInfo type. Each key management technique is identified by a unique
ASN.1 object identifier.</t>
      <t>The object identifier associated with KEMRecipientInfo is:</t>
      <artwork><![CDATA[
  id-ori OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840)
    rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) 13 }

  id-ori-kem OBJECT IDENTIFIER ::= { id-ori 3 }
]]></artwork>
      <t>The KEMRecipientInfo type is:</t>
      <artwork><![CDATA[
  KEMRecipientInfo ::= SEQUENCE {
    version CMSVersion,  -- always set to 0
    rid RecipientIdentifier,
    kem KEMAlgorithmIdentifier,
    kemct OCTET STRING,
    kdf KeyDerivationAlgorithmIdentifier,
    kekLength INTEGER (1..65535),
    ukm [0] EXPLICIT UserKeyingMaterial OPTIONAL,
    wrap KeyEncryptionAlgorithmIdentifier,
    encryptedKey EncryptedKey }
]]></artwork>
      <t>The fields of the KEMRecipientInfo type have the following meanings:</t>
          <t indent="3">version is the syntax version number.  The version <bcp14>MUST</bcp14> be 0.  The
CMSVersion type is described in <xref target="RFC5652" sectionFormat="of" section="10.2.5"/>.</t>
          <t indent="3">rid specifies the recipient's certificate or key that was used by
the originator with the KEM Encapsulate() function.  The
RecipientIdentifier provides two alternatives for specifying the
recipient's certificate <xref target="RFC5280"/>, and thereby the recipient's public
key.  The recipient's certificate <bcp14>MUST</bcp14> contain a KEM public key.  Therefore,
a recipient X.509 version 3 certificate that contains a key usage
extension <bcp14>MUST</bcp14> assert the keyEncipherment bit.  The issuerAndSerialNumber
alternative identifies the recipient's certificate by the issuer's
distinguished name and the certificate serial number; the
subjectKeyIdentifier alternative identifies the recipient's certificate by a key
identifier.  When an X.509 certificate is referenced, 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.  For recipient
processing, implementations <bcp14>MUST</bcp14> support both of these alternatives for
specifying the recipient's certificate.  For originator processing,
implementations <bcp14>MUST</bcp14> support at least one of these alternatives.</t>
          <t indent="3">kem identifies the KEM algorithm, and any associated parameters, used
by the originator.  The KEMAlgorithmIdentifier is described in <xref target="kemalg"/>.</t>
          <t indent="3">kemct is the ciphertext produced by the KEM Encapsulate() function for
this recipient.</t>
          <t indent="3">kdf identifies the key derivation function, and any associated parameters,
used by the originator to generate the KEK.  The
KeyDerivationAlgorithmIdentifier is described in <xref target="RFC5652" sectionFormat="of" section="10.1.6"/>.</t>
          <t indent="3">kekLength is the size of the KEK in octets.  This value is one
of the inputs to the key derivation function.  The upper bound on the integer
value is provided to make it clear to implementers that support for very
large integer values is not needed.  Implementations <bcp14>MUST</bcp14> confirm that
the value provided is consistent with the key-encryption algorithm
identified in the wrap field below.</t>
          <t indent="3">ukm is optional user keying material.  When the ukm value is provided,
it is used as part of the info structure described in <xref target="kdf"/> to
provide a context input to the key derivation function.  For example, the
ukm value could include a nonce, application-specific context information,
or an identifier for the originator.  A KEM algorithm may place
requirements on the ukm value.  Implementations that do not support the
ukm field <bcp14>SHOULD</bcp14> gracefully discontinue processing when the ukm field is
present.  Note that this requirement expands the original purpose of the
ukm described in <xref target="RFC5652" sectionFormat="of" section="10.2.6"/>; it is not limited to being
used with key agreement algorithms.</t>
          <t indent="3">wrap identifies a key-encryption algorithm used to encrypt the
CEK.  The KeyEncryptionAlgorithmIdentifier
is described in <xref target="RFC5652" sectionFormat="of" section="10.1.3"/>.</t>
          <t indent="3">encryptedKey is the result of encrypting the CEK or the
CAEK (the content-authenticated-encryption key, as discussed in <xref target="RFC5083"/>) with the KEK.
EncryptedKey is an OCTET STRING.</t>
    </section>
    <section anchor="kemalg">
      <name>KEM Algorithm Identifier</name>
      <t>The KEMAlgorithmIdentifier type identifies a KEM algorithm used to
establish a pairwise ss.  The details of establishment depend on
the KEM algorithm used.  A key derivation function is used to transform
the pairwise ss value into a KEK.</t>
      <artwork><![CDATA[
  KEMAlgorithmIdentifier ::= AlgorithmIdentifier{ KEM-ALGORITHM, {...} }
]]></artwork>
    </section>
    <section anchor="kdf">
      <name>Key Derivation</name>
      <t>This section describes the conventions of using the KDF to compute the
KEK for KEMRecipientInfo.  For simplicity, the
terminology used in the HKDF specification <xref target="RFC5869"/> is used here.</t>
      <t>Many KDFs internally employ a one-way hash function.  When this is
the case, the hash function that is used is indirectly indicated by
the KeyDerivationAlgorithmIdentifier.  Other KDFs internally employ an
encryption algorithm.  When this is the case, the encryption that is
used is indirectly indicated by the KeyDerivationAlgorithmIdentifier.</t>
      <t>The KDF inputs are as follows:</t>
          <t indent="3">IKM is the input keying material. It is a symmetric secret input to
the KDF. The KDF may use a hash function or an encryption algorithm
to generate a pseudorandom key. The algorithm used to derive the
IKM is dependent on the algorithm identified in the
KeyDerivationAlgorithmIdentifier.</t>
          <t indent="3">L is the length of the output keying material in octets. L is
identified in the kekLength of the KEMRecipientInfo.  The
value is dependent on the key-encryption algorithm used;
the key-encryption algorithm is identified in the KeyEncryptionAlgorithmIdentifier.</t>
          <t indent="3">info is contextual input to the KDF.  The DER-encoded
CMSORIforKEMOtherInfo structure is created from elements of the
KEMRecipientInfo structure.  CMSORIforKEMOtherInfo is defined as:</t>
      <artwork><![CDATA[
      CMSORIforKEMOtherInfo ::= SEQUENCE {
        wrap KeyEncryptionAlgorithmIdentifier,
        kekLength INTEGER (1..65535),
        ukm [0] EXPLICIT UserKeyingMaterial OPTIONAL }
]]></artwork>
      <t>The CMSORIforKEMOtherInfo structure contains the following:</t>
          <t indent="3">wrap identifies a key-encryption algorithm; the output of the
key derivation function will be used as a key for this algorithm.</t>
          <t indent="3">kekLength is the length of the KEK in octets; the
output of the key derivation function will be exactly this size.</t>
          <t indent="3">ukm is optional user keying material; see <xref target="kemri"/>.</t>
      <t>The KDF output is as follows:</t>
          <t indent="3">OKM is the output keying material with the exact length of L octets.
The OKM is the KEK that is used to encrypt the CEK or the CAEK.</t>
      <t>An acceptable KDF <bcp14>MUST</bcp14> accept an IKM, L, and info as inputs.  An acceptable
KDF <bcp14>MAY</bcp14> also accept a salt input value, which is carried as a parameter to
the KeyDerivationAlgorithmIdentifier if present.  All of these
inputs <bcp14>MUST</bcp14> influence the output of the KDF.</t>
    </section>
    <section anchor="asn1-mod">
      <name>ASN.1 Modules</name>
      <t>This section provides two ASN.1 modules <xref target="X.680"/>.  The first ASN.1
module is an extension to the AlgorithmInformation-2009 module discussed in
<xref target="RFC5912"/>; it defines the KEM-ALGORITHM CLASS.  The second
ASN.1 module defines the structures needed to use KEM algorithms
with CMS <xref target="RFC5652"/>.</t>
      <t>The first ASN.1 module uses EXPLICIT tagging, and the second
ASN.1 module uses IMPLICIT tagging.</t>
      <t>Both ASN.1 modules follow the conventions established in
<xref target="RFC5911"/>, <xref target="RFC5912"/>, and <xref target="RFC6268"/>.</t>

      <section anchor="asn1-mod-1">
        <name>KEMAlgorithmInformation-2023 ASN.1 Module</name>
        <sourcecode type="asn.1" markers="true"><![CDATA[
  KEMAlgorithmInformation-2023
    { iso(1) identified-organization(3) dod(6) internet(1)
      security(5) mechanisms(5) pkix(7) id-mod(0)
          id-mod-kemAlgorithmInformation-2023(109) }

  DEFINITIONS EXPLICIT TAGS ::=
  BEGIN
  -- EXPORTS ALL;
  IMPORTS
    ParamOptions, PUBLIC-KEY, SMIME-CAPS
    FROM AlgorithmInformation-2009
      { iso(1) identified-organization(3) dod(6) internet(1)
        security(5) mechanisms(5) pkix(7) id-mod(0)
        id-mod-algorithmInformation-02(58) } ;

  -- KEM-ALGORITHM
  --
  -- Describes the basic properties of a KEM algorithm
  --
  -- Suggested prefix for KEM algorithm objects is: kema-
  --
  --  &id - contains the OID identifying the KEM algorithm
  --  &Value - if present, contains a type definition for the kemct;
  --               if absent, implies that no ASN.1 encoding is
  --               performed on the kemct value
  --  &Params - if present, contains the type for the algorithm
  --               parameters; if absent, implies no parameters
  --  &paramPresence - parameter presence requirement
  --  &PublicKeySet - specifies which public keys are used with
  --               this algorithm
  --  &Ukm - if absent, type for user keying material
  --  &ukmPresence - specifies the requirements to define the UKM
  --               field
  --  &smimeCaps - contains the object describing how the S/MIME
  --               capabilities are presented.
  --
  -- Example:
  -- kema-kem-rsa KEM-ALGORITHM ::= {
  --    IDENTIFIER id-kem-rsa
  --    PARAMS TYPE RsaKemParameters ARE optional
  --    PUBLIC-KEYS { pk-rsa | pk-rsa-kem }
  --    UKM ARE optional
  --    SMIME-CAPS { TYPE GenericHybridParameters
  --        IDENTIFIED BY id-rsa-kem }
  -- }

  KEM-ALGORITHM ::= CLASS {
    &id             OBJECT IDENTIFIER UNIQUE,
    &Value          OPTIONAL,
    &Params         OPTIONAL,
    &paramPresence  ParamOptions DEFAULT absent,
    &PublicKeySet   PUBLIC-KEY OPTIONAL,
    &Ukm            OPTIONAL,
    &ukmPresence    ParamOptions DEFAULT absent,
    &smimeCaps      SMIME-CAPS OPTIONAL
  } WITH SYNTAX {
    IDENTIFIER &id
    [VALUE &Value]
    [PARAMS [TYPE &Params] ARE &paramPresence]
    [PUBLIC-KEYS &PublicKeySet]
    [UKM [TYPE &Ukm] ARE &ukmPresence]
    [SMIME-CAPS &smimeCaps]
  }

  END
]]></sourcecode>
      </section>
      <section anchor="asn1-mod-2">
        <name>CMS-KEMRecipientInfo-2023 ASN.1 Module</name>
        <sourcecode type="asn.1" markers="true"><![CDATA[
  CMS-KEMRecipientInfo-2023
    { iso(1) member-body(2) us(840) rsadsi(113549)
      pkcs(1) pkcs-9(9) smime(16) modules(0)
      id-mod-cms-kemri-2023(77) }

  DEFINITIONS IMPLICIT TAGS ::=
  BEGIN
  -- EXPORTS ALL;
  IMPORTS
    OTHER-RECIPIENT, CMSVersion, RecipientIdentifier,
    EncryptedKey, KeyDerivationAlgorithmIdentifier,
    KeyEncryptionAlgorithmIdentifier, UserKeyingMaterial
      FROM CryptographicMessageSyntax-2010  -- RFC 6268
        { iso(1) member-body(2) us(840) rsadsi(113549)
          pkcs(1) pkcs-9(9) smime(16) modules(0)
          id-mod-cms-2009(58) }
    KEM-ALGORITHM
      FROM KEMAlgorithmInformation-2023  -- RFC 9629
        { iso(1) identified-organization(3) dod(6) internet(1)
          security(5) mechanisms(5) pkix(7) id-mod(0)
          id-mod-kemAlgorithmInformation-2023(109) }
    AlgorithmIdentifier{}
      FROM AlgorithmInformation-2009  -- RFC 5912
        { iso(1) identified-organization(3) dod(6) internet(1)
          security(5) mechanisms(5) pkix(7) id-mod(0)
          id-mod-algorithmInformation-02(58) } ;

  --
  -- OtherRecipientInfo Types (ori-)
  --

  SupportedOtherRecipInfo OTHER-RECIPIENT ::= { ori-KEM, ... }

  ori-KEM OTHER-RECIPIENT ::= {
    KEMRecipientInfo IDENTIFIED BY id-ori-kem }

  id-ori OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840)
    rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) 13 }

  id-ori-kem OBJECT IDENTIFIER ::= { id-ori 3 }

  --
  -- KEMRecipientInfo
  --

  KEMRecipientInfo ::= SEQUENCE {
    version CMSVersion,  -- always set to 0
    rid RecipientIdentifier,
    kem KEMAlgorithmIdentifier,
    kemct OCTET STRING,
    kdf KeyDerivationAlgorithmIdentifier,
    kekLength INTEGER (1..65535),
    ukm [0] EXPLICIT UserKeyingMaterial OPTIONAL,
    wrap KeyEncryptionAlgorithmIdentifier,
    encryptedKey EncryptedKey }

  KEMAlgSet KEM-ALGORITHM ::= { ... }

  KEMAlgorithmIdentifier ::=
    AlgorithmIdentifier{ KEM-ALGORITHM, {KEMAlgSet} }

  --
  -- CMSORIforKEMOtherInfo
  --

  CMSORIforKEMOtherInfo ::= SEQUENCE {
    wrap KeyEncryptionAlgorithmIdentifier,
    kekLength INTEGER (1..65535),
    ukm [0] EXPLICIT UserKeyingMaterial OPTIONAL }

  END
]]></sourcecode>
      </section>
    </section>
    <section anchor="sec-cons">
      <name>Security Considerations</name>
      <t>The security considerations discussed in <xref target="RFC5652"/> are applicable to this document.</t>
      <t>To be appropriate for use with this specification, the KEM algorithm <bcp14>MUST</bcp14>
explicitly be designed to be secure when the public key is used many
times.  For example, a KEM algorithm with a single-use public key is not
appropriate, because the public key is expected to be carried in a
long-lived certificate <xref target="RFC5280"/> and used over and over.  Thus, KEM
algorithms that offer indistinguishability under adaptive chosen ciphertext
attack (IND-CCA2) security are appropriate.  A common design pattern for
obtaining IND-CCA2 security with public key reuse is to apply the
Fujisaki-Okamoto (FO) transform <xref target="FO"/> or a variant of the FO
transform <xref target="HHK"/>.</t>
      <t>The KDF <bcp14>SHOULD</bcp14> offer at least the security level of the KEM.</t>
      <t>The choice of the key-encryption algorithm and the size of the
KEK <bcp14>SHOULD</bcp14> be made based on the security level
provided by the KEM. The key-encryption algorithm and the
KEK <bcp14>SHOULD</bcp14> offer at least the security level of
the KEM.</t>
      <t>KEM algorithms do not provide data origin authentication; therefore, when
a KEM algorithm is used with the authenticated-data content type, the
contents are delivered with integrity from an unknown source.</t>
      <t>Implementations <bcp14>MUST</bcp14> protect the KEM private key, the KEK, and the CEK (or the
CAEK).  Compromise of the KEM private key may
result in the disclosure of all contents protected with that KEM private key.
However, compromise of the KEK, the CEK, or the CAEK may result in disclosure
of the encrypted content of a single message.</t>
      <t>The KEM produces the IKM input value for the KDF.  This IKM value <bcp14>MUST NOT</bcp14>
be reused for any other purpose.  Likewise, any random value used by
the KEM algorithm to produce the shared secret or its encapsulation <bcp14>MUST NOT</bcp14>
be reused for any other purpose.  That is, the originator <bcp14>MUST</bcp14> generate a
fresh KEM shared secret for each recipient in the KEMRecipientInfo
structure, including any random value used by the KEM algorithm to produce
the KEM shared secret.  In addition, the originator <bcp14>MUST</bcp14> discard the KEM shared
secret, including any random value used by the KEM algorithm to produce
the KEM shared secret, after constructing the entry in the KEMRecipientInfo
structure for the corresponding recipient.  Similarly, the recipient <bcp14>MUST</bcp14>
discard the KEM shared secret, including any random value used by the KEM
algorithm to produce the KEM shared secret, after constructing the
KEK from the KEMRecipientInfo structure.</t>
      <t>Implementations <bcp14>MUST</bcp14> randomly generate content-encryption keys,
content-authenticated-encryption keys, and message-authentication keys.
Also, the generation of KEM key pairs relies on random numbers.  The use
of inadequate pseudorandom number generators (PRNGs) to generate these
keys can result in little or no security.  An attacker may find it much
easier to reproduce the PRNG environment that produced the keys,
searching the resulting small set of possibilities, rather than brute-force searching the whole key space.  The generation of quality random
numbers is difficult.  <xref target="RFC4086"/> offers important guidance in this area.</t>
      <t>If the cipher and key sizes used for the key-encryption algorithm and the
content-encryption algorithm are different, the effective security is
determined by the weaker of the two algorithms.  If, for example, the
content is encrypted with AES-CBC using a 128-bit CEK and the CEK is
wrapped with AES-KEYWRAP using a 256-bit KEK, then at most 128 bits of
protection is provided.</t>
      <t>If the cipher and key sizes used for the key-encryption algorithm and the
content-authenticated-encryption algorithm are different, the effective
security is determined by the weaker of the two algorithms.  If, for example,
the content is encrypted with AES-GCM using a 128-bit
CAEK and the CAEK is wrapped with AES-KEYWRAP using a 192-bit KEK, then at
most 128 bits of protection is provided.</t>
      <t>If the cipher and key sizes used for the key-encryption algorithm and the
message-authentication algorithm are different, the effective security is
determined by the weaker of the two algorithms.  If, for example, the
content is authenticated with HMAC-SHA256 using a 512-bit
message-authentication key and the message-authentication key is wrapped
with AES-KEYWRAP using a 256-bit KEK, then at most 256 bits of
protection is provided.</t>
      <t>Implementers should be aware that cryptographic algorithms, including KEM
algorithms, become weaker with time.  As new cryptoanalysis techniques are
developed and computing capabilities advance, the work factor to break a
particular cryptographic algorithm will be reduced.  As a result,
cryptographic algorithm implementations should be modular, allowing new
algorithms to be readily inserted.  That is, implementers should be prepared
for the set of supported algorithms to change over time.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>For KEMRecipientInfo as defined in <xref target="kemri"/>, IANA has
      assigned the following OID in the "SMI Security for
      S/MIME Other Recipient Info Identifiers (1.2.840.113549.1.9.16.13)"
      registry:
      </t>

<table anchor="iana-table1" align="left"> 
  <name></name>    
  <thead>
    <tr>
      <th>Decimal</th>
      <th>Description</th>
      <th>References</th>
    </tr>
  </thead>
  <tbody>      
    <tr>
      <td>3</td>
      <td>id-ori-kem</td>
      <td>RFC 9629</td>
    </tr>
  </tbody>
</table>
      
      <t>For the ASN.1 module defined in <xref target="asn1-mod-1"/>, IANA has
      assigned the following OID in the "SMI Security for PKIX Module
      Identifier" registry (1.3.6.1.5.5.7.0):
      </t>

<table anchor="iana-table2" align="left">
  <name></name>
  <thead>
    <tr>
      <th>Decimal</th>
      <th>Description</th>
      <th>References</th>
    </tr>
  </thead>
  <tbody>      
    <tr>
      <td>109</td>
      <td>id-mod-kemAlgorithmInformation-2023</td>
      <td>RFC 9629</td>
    </tr>
  </tbody>
</table>
      
      <t>For the ASN.1 module defined in <xref target="asn1-mod-2"/>, IANA has
      assigned the following OID in the "SMI Security for S/MIME Module
      Identifier (1.2.840.113549.1.9.16.0)" registry:
      </t>
<table anchor="iana-table3" align="left">
  <name></name>
  <thead>
    <tr>
      <th>Decimal</th>
      <th>Description</th>
      <th>References</th>
    </tr>
  </thead>
  <tbody>      
    <tr>
      <td>77</td>
      <td>id-mod-cms-kemri-2023</td>
      <td>RFC 9629</td>
    </tr>
  </tbody>
</table>
      
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>

	<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5083.xml"/>
	<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml"/>
	<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5652.xml"/>
	<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5911.xml"/>
	<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5912.xml"/>

        <reference anchor="X.680" target="https://www.itu.int/rec/T-REC-X.680">
          <front>
            <title>Information technology - Abstract Syntax Notation One (ASN.1): Specification of basic notation</title>
            <author>
              <organization>ITU-T</organization>
            </author>
            <date year="2021" month="February"/>
          </front>
          <seriesInfo name="ITU-T Recommendation" value="X.680"/>
          <seriesInfo name="ISO/IEC" value="8824-1:2021"/>
        </reference>

        <reference anchor="X.690" target="https://www.itu.int/rec/T-REC-X.690">
          <front>
            <title>Information technology - ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)</title>
            <author>
              <organization>ITU-T</organization>
            </author>
            <date year="2021" month="February"/>
          </front>
          <seriesInfo name="ITU-T Recommendation" value="X.690"/>
          <seriesInfo name="ISO/IEC" value="8825-1:2021"/>
        </reference>

        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>

      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>

        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4086.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5869.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6268.xml"/>

        <reference anchor="FO" target="https://doi.org/10.1007/s00145-011-9114-1">
          <front>
            <title>Secure Integration of Asymmetric and Symmetric Encryption Schemes</title>
            <author fullname="Eiichiro Fujisaki" initials="E." surname="Fujisaki">
              <organization/>
            </author>
            <author fullname="Tatsuaki Okamoto" initials="T." surname="Okamoto">
              <organization/>
            </author>
            <date month="December" year="2011"/>
          </front>
          <refcontent>Springer Science and Business Media LLC</refcontent>
          <refcontent>Journal of Cryptology, vol. 26, no. 1, pp. 80-101</refcontent>
          <seriesInfo name="DOI" value="10.1007/s00145-011-9114-1"/>
        </reference>

        <reference anchor="HHK" target="https://doi.org/10.1007/978-3-319-70500-2_12">
          <front>
            <title>A Modular Analysis of the Fujisaki-Okamoto Transformation</title>
            <author fullname="Dennis Hofheinz" initials="D." surname="Hofheinz">
              <organization/>
            </author>
            <author fullname="Kathrin Hövelmanns" initials="K." surname="Hövelmanns">
              <organization/>
            </author>
            <author fullname="Eike Kiltz" initials="E." surname="Kiltz">
              <organization/>
            </author>
            <date month="November" year="2017"/>
          </front>
          <refcontent>Springer International Publishing</refcontent>
          <refcontent>Theory of Cryptography, TCC 2017, Lecture Notes in Computer Science, vol. 10677, pp. 341-371</refcontent>
          <refcontent>Print ISBN 9783319704999, Online ISBN 9783319705002</refcontent>
          <seriesInfo name="DOI" value="10.1007/978-3-319-70500-2_12"/>
        </reference>

      </references>
    </references>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Our thanks to <contact fullname="Burt Kaliski"/> for his guidance and design review.</t>
      <t>Our thanks to <contact fullname="Carl Wallace"/> for his careful review of the ASN.1 modules.</t>
      <t>Our thanks to
<contact fullname="Hendrik Brockhaus"/>,
<contact fullname="Jonathan Hammell"/>,
<contact fullname="Mike Jenkins"/>,
<contact fullname="David von Oheimb"/>,
<contact fullname="Francois Rousseau"/>, and
<contact fullname="Linda Dunbar"/>
for their careful reviews and thoughtful comments.</t>
    </section>
  </back>
</rfc>
