<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.25 (Ruby 2.7.0) -->


<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [

<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC2986 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2986.xml">
<!ENTITY RFC3211 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3211.xml">
<!ENTITY RFC4210 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4210.xml">
<!ENTITY RFC5280 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml">
<!ENTITY RFC5652 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5652.xml">
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8411 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8411.xml">
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-ounsworth-pq-composite-encryption-01" category="std">
  <front>
    <title abbrev="PQ Composite Certs">Composite Encryption For Use In Internet PKI</title>

    <author initials="M." surname="Ounsworth" fullname="Mike Ounsworth">
      <organization abbrev="Entrust">Entrust Limited</organization>
      <address>
        <postal>
          <street>2500 Solandt Road -- Suite 100</street>
          <city>Ottawa, Ontario</city>
          <code>K2K 3G5</code>
          <country>Canada</country>
        </postal>
        <email>mike.ounsworth@entrust.com</email>
      </address>
    </author>
    <author initials="J." surname="Gray" fullname="John Gray">
      <organization abbrev="Entrust">Entrust Limited</organization>
      <address>
        <email>john.gray@entrust.com</email>
      </address>
    </author>
    <author initials="S." surname="Mister" fullname="Serge Mister">
      <organization abbrev="Entrust">Entrust Limited</organization>
      <address>
        <email>serge.mister@entrust.com</email>
      </address>
    </author>

    <date year="2022" month="February" day="12"/>

    <area>Security</area>
    <workgroup>LAMPS</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>With the widespread adoption of post-quantum cryptography will come the need for an entity to possess multiple public keys on different cryptographic algorithms. Since the trustworthiness of individual post-quantum algorithms is at question, a multi-key cryptographic operation will need to be performed in such a way that breaking it requires breaking each of the component algorithms individually. This requires defining new structures for holding composite encryption data.</t>

<t>This document defines a content encryption process following the hybrid model as described in the NIST Post-Quantum Crypto FAQ. This draft defines three composite encryption modes. First, Composite Key Transport using Encryption primitives which encrypts a message (typically a content encryption key) for a recipient with a composite public key composed entirely of encryption keys by encrypting it with multiple one-time-pad keys, each encrypted under a different recipient public key. Second, Composite Key Transport using Encryption and KEM primitives is the generalization of the previous mode to support a mixture of encryption and KEM algorithms. Third, Composite Key Exchange is the most general and supports establishing a shared secret using any combination of encryption, KEM, and key exchange primitives where a master shared secret is generated using NIST SP 800-56Cr2.</t>

<!-- End of Abstract -->



    </abstract>



  </front>

  <middle>


<section anchor="sec-intro" title="Introduction">

<t>During the transition to post-quantum cryptography, there will be uncertainty as to the strength of cryptographic algorithms; we will no longer fully trust traditional cryptography such as RSA, Diffie-Hellman, DSA and their elliptic curve variants, but we will also not fully trust their post-quantum replacements until they have had sufficient scrutiny. Unlike previous cryptographic algorithm migrations, the choice of when to migrate and which algorithms to migrate to, is not so clear. Even after the migration period, it may be advantageous for an entity&#39;s cryptographic identity to be composed of key pairs associated with different public-key algorithms.</t>

<t>The deployment of composite public keys and composite encryption using post-quantum algorithms will face two challenges:</t>

<t><list style="symbols">
  <t>Algorithm strength uncertainty: During the transition period, some post-quantum signature and encryption algorithms will not be fully trusted, while the trust in legacy public key algorithms will start to erode.  A relying party may learn some time after deployment that a public key algorithm has become untrustworthy, but in the interim, they may not know which algorithm an adversary has compromised.</t>
  <t>Backwards compatibility: During the transition period, post-quantum algorithms will not be supported by all clients.</t>
</list></t>

<t>This document provides mechanisms to address algorithm strength uncertainty by building on ~~ reference draft-ounsworth-pq-composite-pubkeys ~~ by providing formats for both wrapping a content encryption key using multiple public key encryption mechanisms, or performing key exchange using a combination of encryption, key encapsulation, and key exchange primitives. The issue of backwards compatibility is addressed with support for Composite Or recipient keys in each mode.</t>

<t>This document is intended for general applicability anywhere that content encryption or key exchange is used.</t>

<!-- End of Introduction section -->

<section anchor="sec-terminology" title="Terminology">
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/>  <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>

<t>The following terms are used in this document:</t>

<t>ALGORITHM:
          An information object class for identifying the type of
            cryptographic operation to be performed. This document is
            primarily concerned with algorithms for producing encryption 
            keys.</t>

<t>BER:
          Basic Encoding Rules (BER) as defined in <xref target="X.690"></xref>.</t>

<t>COMPONENT ALGORITHM:
          A single basic algorithm which is contained within a
            composite algorithm.</t>

<t>COMPOSITE ALGORITHM:
          An algorithm which is a sequence of one or more component
            algorithms..</t>

<t>DER:
          Distinguished Encoding Rules as defined in <xref target="X.690"></xref>.</t>

<t>PUBLIC / PRIVATE KEY:
          The public and private portion of an asymmetric cryptographic
            key, making no assumptions about which algorithm.</t>

<t>PRIMITIVE PUBLIC KEY / SIGNATURE:
          A public key or signature object of a non-composite algorithm
          type.</t>

<t>SIGNATURE:
          A digital cryptographic signature, making no assumptions
            about which algorithm.</t>

<t>SECRET or SHARED SECRET:
        Cryptographic material established between two parties.
        May be generated by one party and send encrypted to the other, 
        or may be the output of an exchange of public information between two or more
        parties that generates a unique shared value for all involved parties.</t>

<t>KEY DERIVATION FUNCTION:
        A function used to derive secure secret keys using shared secrets, hashing 
        and other cryptographic primitives.</t>

<t>COMPOSITE ENCRYPTION KEY:
        A structure that contains a sequence of content encryption keys, or secrets used to derive a content encryption keys.</t>

</section>
</section>
<section anchor="sec-com-key-trans_encr" title="Composite Key Transport using Encryption primitives">

<t>In this composite encryption mode, a message to be encrypted is provided by the calling application. 
This message to be encrypted is assumed to have length less than the maximum message size of the chosen encryption algorithms, as is the case when a suitably-sized symmetric key is encrypted.</t>

<t>This mode is compatible with protocols requiring a key transport primitive, such as CMS&#39; KeyTransRecipientInfo <xref target="RFC5652"></xref>.</t>

<t>Composite Key Transport using Encryption primitives uses a trivial XOR one-time-pad scheme, as defined in <xref target="sec-com-key-trans_encr_process"/>. It transports n one-time-pad secret keys of the same length as the content to be encryption, where n is the number of recipient component public keys, and each one-time-pad secret key is encrypted under a different recipient component public key. The trivial XOR key-sharing scheme requires the recipient to use all component private keys in order to recover the content encryption key. Note that it would be possible to use an &quot;n of m&quot; or &quot;threshold&quot; secret sharing scheme if it was desired for the recipient to be able to complete the key transport using a subset of their private keys, but that mechanism is not defined in this document.</t>

<t>EDNOTE: we have not been able to find a reference and security analysis for the trivial XOR key-sharing scheme. This may need review by CFRG. We could re-frame this process as &quot;a one-time pad with n-1 one-time pad keys, which we transport using the recipients public keys&quot;, then this could leverage one-time pad security analysis.</t>

<t>Composite encryption uses the following structure:</t>

<t>EDNOTE:  Should a different composite OID be used to determine the type of composite encryption (Key Transport or Key Agreement?).  Probably not because the desired key usage will be handled in the protocols that uses this privitive.</t>

<figure><artwork type="asn.1" name="CompositeEncryptionStructure"><![CDATA[
CompositeEncryptedKey ::= EncryptedKey{ SEQUENCE SIZE (2..Max)  OF OCTET STRING}
]]></artwork></figure>

<t>EDNOTE: This ASN.1 probably does not compile. The intent is that this fits into any EncryptedKey field, but defines some structure within the existing EncryptedKey ::= OCTET STRING, but I&#39;m not sure exactly how to specify that.</t>

<t>Where each OCTET STRING within the SEQUENCE contains an encrypted one-time-pad secret key encrypted under one of the recipient component public keys. The CompositeEncryptedKey MUST list encrypted values in the same order as the recipient public key&#39;s component keys.</t>

<section anchor="algorithm-identifier" title="Algorithm Identifier">

<t>The id-alg-composite-encryption object identifier MUST be used to identify the usage of this mode</t>

<figure><artwork type="asn.1"><![CDATA[
id-alg-composite-encryption OBJECT IDENTIFIER ::= {
    id-alg-composite-encryption OBJECT IDENTIFIER ::= {
    joint-iso-itu-t(2) country(16) us(840) organization(1) entrust(114027)
    Algorithm(80) Composite(4) id-alg-composite-encryption(4) }
]]></artwork></figure>

<t>EDNOTE: this is a temporary OID for the purposes of prototyping. Permanent OIDs should be requested from IANA, see <xref target="sec-iana"/>.</t>

</section>
<section anchor="public-key-and-key-usage" title="Public key and key usage">

<t>The recipient MUST have a composite public key which supports key transport operations. Where the recipient public key has an associated keyUsage as specified in <xref target="RFC5280"></xref>, it MUST have keyUsage: keyEncipherment. In other words, the mechanism specified in this section applies only if all of the recipient&#39;s public keys are associated with encryption algorithms.</t>

<section anchor="composite-or" title="Composite-OR">

<t>The design intent of this mode is to support migration scenarios where a recipient has been provisioned with a composite key containing algorithms that its peers may not yet support. This mode allows the sender to encrypt for a subset of the recipient&#39;s public keys. Support for Composite OR subset encryption is indicated by the recipient at key generation time by marking its composite key with the id-composite-or-key algorithm identifier as defined in ~~~cite properly draft-ounsworth-pq-composite-keys~~~. To maximize security strength of the ciphertext, clients SHOULD encrypt for as many keys as they support and as the migration and compatibility situation allow.</t>

<t>Policy mechanisms defining allowed subets of algorithms could be applied here, but are out of scope of this document. As defined in this document, a recipient marking their public key as id-composite-or-key must accept the risk that a sender may encrypt sensitive data for it using any one of its component keys in isolation. Composite Or is a direct tradeoff of lower security for increased migration flexibility.</t>

</section>
</section>
<section anchor="sec-com-key-trans_encr-params" title="Algorithm parameters">

<t>The composite key transport using encryption mode does not require additional parameters, and therefore any associated Params are ABSENT.</t>

</section>
<section anchor="sec-com-key-trans_encr_process" title="Encryption process">

<t>The process for performing Composite Key Transport using Encryption primitives is as follows:</t>

<t>The first n-1 one-time-pad keys are random bit strings of the same length as 
the content encryption key.  The final one-time-pad key is 
computed by XOR&#39;ing the content encryption key with each of n-1 previous keys.</t>

<figure><artwork><![CDATA[
Input:
     n                  The number of recipient component public keys

     P1, P2, .., Pn     Recipient component public keys

     A1, A2, .., An     Cryptographic algorithms to be used with 
                          public keys P1, P2, .., Pn

     CEK                The Content Encryption Key

     SIZE               The size of the Content Encryption Key in bits

Output:
     E1, E2, .., En     EncryptedKey values corresponding to each recipient
                          component public key

Intermediate values:
     S1, S2, .., Sn-1   One-time-pad secret keys to be encapsulated by each 
                          component algorithm
     C                  One-time-pad ciphertext of the CEK under S1, S2, .., Sn-1

Generation Procedure:

   1. If recipient public key is of type id-composite-or-key, determine the
      index of the last recipient public key to be encrypted for
        i_last := index of last Pi to be encrypted for
      Else,
        i_last = n


   2. To generate secret keys Sn, compute the following

      C = CEK
      for i := 1 to n

        a. If id-composite-or-key and Pi is to be skipped
          Ei := emptyOctetString
          continue to next i

        b. If i == i_last
            Ei = encrypt(C, Pi, Ai)
            break
          Else,
            Si := random_bits(SIZE)
            C := C XOR Si
            Ei = encrypt(Si, Pi, Ai)

   3. Output E1, E2, .., En
]]></artwork></figure>

<t>Where <spanx style="verb">random_bits(SIZE)</spanx> is a cryptographically-secure random bit generator outputting SIZE bits, and where <spanx style="verb">emptyOctetString</spanx> is the octet string of length 0.</t>

<t>EDNOTE: we currently do not define a composite algorithmID type to carry A1, A2, .., An. We may need to add one analogously to the CompositeParams ::= SEQUENCE SIZE (2..MAX) OF AlgorithmIdentifier that we have in the composite signutares draft.</t>

<t>If the sender does not support Composite Or encryption, this algorithm may be simplified by omitting step 1, 2a, and the if i == i_last statement in 2b.</t>

<t>The design intent is that Composite Or encryption with a single recipient key collapses to being equivalent to direct encryption of the CEK.</t>

</section>
<section anchor="sec-com-key-trans_decr_process" title="Decryption process">

<t>To obtain the content-encryption key from a CompositeEncryptedKey, each component 
algorithm MUST be used to decrypt the set of one-time-pad keys.  The keys are then XOR&#39;ed together to recover the content encryption key.</t>

<figure><artwork><![CDATA[
Input:
     n                  The number of recipient component public keys

     SK1, SK2, .., SKn  Recipient component secret keys


     A1, A2, .., An     Cryptographic algorithms to be used with 
                          public keys P1, P2, .., Pn
     
     E1, E2, .., En     EncryptedKey values corresponding to each recipient
                        component public key


Intermediate values:
     S1, S2, .., Sn     One-time-pad keys and ciphertext to be decapsulated
                        by each component algorithm

Output:
     CEK  The Content Encryption Key


Generation Procedure:
   1. Recover each one-time-pad key
        for i := 1 to n
          if Ei == emptyOctetString
            Si := emptyOctetString
          Else,
            Si := decrypt(Ei, SKi)

   2. Recover the CEK;
      For each one-time-pad key
        CEK = S1
        for i := 2 to n
           if Si != emptyOctetString
             CEK = CEK XOR Si

   3. Output CEK
]]></artwork></figure>

<t>The if statement in step 1 (and ensuring its proper bit length for the XOR in step 2) is the only modification required to support Composite Or encryption. The designers have intentionally omitted a check that the recipient key is of type id-composite-or-key because even if the sender erroneously used composite or subset encryption for a recipient key which is not of type id-composite-or-key, the damage has already been done by encrypting and transmitting the data, no further harm can be done by decrypting it. However, where appropriate, clients SHOULD indicate a warning to users that this data was transmitted with weaker encrypting than their public key allows.</t>

<t>EDNOTE: investigate whether this is actually a special case of the next mechanism, and therefore both sections can be folded together.</t>

</section>
</section>
<section anchor="sec-com-key-trans_kem" title="Composite Key Transport using Encryption and KEM primitives">

<t>This composite encryption mode is the generalization of the mode defined in <xref target="sec-com-key-trans_encr"/> to support a composite recipient public key which may contain a mixture of one or more encryption component algorithms with zero or more key encapsulation mechanism (KEM) component algorithms.</t>

<t>This mode is compatible with protocols requiring a key transport primitive, such as CMS&#39; KeyTransRecipientInfo <xref target="RFC5652"></xref>.</t>

<t>Security consideration: for a recipient composite public key to be applicable to this mode, all component KEMs MUST produce a shared secret whose bits are independent and uniformly distributed (aka &quot;uniformly IID&quot; or &quot;uniformly random&quot; or &quot;full entropy&quot;) and therefore the shared secret is safe to use direcly as a symmetric key. If a recipient public key contains component KEMs which are not know to have this property, then implementors SHOULD use the more general mode described in <xref target="sec-com-key-exchange"/> which incorporates the use of a key derivation function. See <xref target="sec-consider-iid"/> for a further discussion of this security consideration.</t>

<t>EDNOTE: also put this in the Security considerations section.</t>

<section anchor="algorithm-identifier-1" title="Algorithm Identifier">

<t>The id-alg-composite-kem object identifier MUST be used to identify the usage of this mode</t>

<figure><artwork type="asn.1"><![CDATA[
id-alg-composite-kem OBJECT IDENTIFIER ::= {
    id-alg-composite-encryption OBJECT IDENTIFIER ::= {
    joint-iso-itu-t(2) country(16) us(840) organization(1) entrust(114027)
    Algorithm(80) Composite(4) id-alg-composite-kem(5)} 
]]></artwork></figure>

<t>EDNOTE: this is a temporary OID for the purposes of prototyping. Permanent OIDs should be requested from IANA, see <xref target="sec-iana"/>.</t>

</section>
<section anchor="public-key-and-key-usage-1" title="Public key and key usage">

<t>The recipient MUST have a composite public key which supports key transport or key encapsulation operations. Where the recipient public key has an associated keyUsage as specified in <xref target="RFC5280"></xref>, it MUST have keyUsage: keyEncipherment. In other words, the mechanism specified in this section applies only if all of the recipient&#39;s public keys are encryption or KEM algorithms.</t>

<t>In addition, for a recipient composite public key to be applicable to this mode, all component KEMs MUST be capable of producing a shared secret of SIZE bits, where SIZE is the length in bits of the content encryption key (CEK) to be transported. This is assumed for the remainder of this section.</t>

<section anchor="composite-or-1" title="Composite-OR">

<t>The design intent of this mode is to support migration scenarios where a recipient has been provisioned with a composite key containing algorithms that its peers may not yet support. This mode allows the sender to encrypt for a subset of the recipient&#39;s public keys. Support for Composite OR subset encryption is indicated by the recipient at key generation time by marking its composite key with the id-composite-or-key algorithm identifier as defined in ~~~cite properly draft-ounsworth-pq-composite-keys~~~.</t>

<t>Policy mechanisms defining allowed subets of algorithms could be applied here, but are out of scope of this document. As defined in this document, a recipient marking their public key as id-composite-or-key must accept the risk that a sender may encrypt sensitive data for it using any one of its component keys in isolation. Composite Or is a direct tradeoff of lower security for increased migration flexibility.</t>

</section>
</section>
<section anchor="sec-com-key-trans_kem-params" title="Algorithm parameters">

<t>The composite key transport using encryption and KEM mode does not require additional parameters, and therefore any associated Params are ABSENT.</t>

</section>
<section anchor="encryption-process" title="Encryption process">

<t>Given these conditions are met, the encryption process defined in <xref target="sec-com-key-trans_encr_process"/> is modified as follows:</t>

<figure><artwork><![CDATA[
Input:
     n                  The number of recipient component public keys
     P1, P2, .., Pn     Recipient component public keys
     CEK                The Content Encryption Key
     SIZE               The size of the Content Encryption Key in bits

Output:
     E1, E2, .., En     EncryptedKey values corresponding to each recipient
                        component public key

Intermediate values:
     S1, S2, .., Sn     One-time-pad secret keys to be encapsulated by each 
                        component algorithm

Generation Procedure:

   1. If recipient public key is of type id-composite-or-key, determine the
      index of the last recipient public key to be encrypted for
        i_last := index of last Pi to be encrypted for
      Else,
        i_last = n

  
   2. 
      for i := 1 to n
        a. if id-composite-or-key and Pi is to be skipped
            Ei := emptyOctetString
            continue to next i

        b. If i == i_last
            continue to next i
          Else, if Pi is of type KEM:
            Si,Ei := encaps(Pi)
            CEK := CEK XOR Si
          Else:
            Si := random_bits(SIZE)
            CEK := CEK XOR Si
            Ei := encrypt(Si, Pi)


   3. Encrypt the final CEK value 
            Ei_last = encrypt(CEK, Pi_last)

   4. Output E1, E2, .., En

]]></artwork></figure>

<t>Where <spanx style="verb">random_bits(SIZE)</spanx> is a cryptographically-secure random bit generator outputting SIZE bits, and where <spanx style="verb">emptyOctetString</spanx> is the octet string of length 0.</t>

<t>If the sender does not support Composite Or encryption, this algorithm may be simplified by omitting step 1, 2a, and the if i == i_last statement in 2b.</t>

<t>The design intent is that Composite Or encryption with a single recipient key collapses to being equivalent to direct encryption of the CEK.</t>

</section>
<section anchor="decryption-process" title="Decryption process">

<t>The decryption process defined in <xref target="sec-com-key-trans_decr_process"/> applies directly where <spanx style="verb">decrypt()</spanx> is substituted for <spanx style="verb">decaps()</spanx> when the underlying primitive is a KEM.</t>

</section>
</section>
<section anchor="sec-com-key-exchange" title="Composite Key Exchange">

<t>This mode is the most general in that it supports a composite recipient public key which MAY contain an arbitrary mixture of encryption, key encapsulation mechanism (KEM), and key agreement component algorithms. Due to the nature of key agreement algorithms, this mode cannot take a content encryption key as input, but instead generates a master shared secret as an output. As such, the nomenclature in this mode differs from the modes above.</t>

<t>This mode is compatible with protocols requiring a key agreement primitive, such as CMS&#39; KeyAgreeRecipientInfo <xref target="RFC5652"></xref>.</t>

<t>Composite key exchange uses the underlying primitive to either encrypt for, encapsulate, or interactively do key agreement with each of the recipient&#39;s public keys, then all shared secrets are concatenated together and a KDF is applies as prescribed by NIST SP 800-56Cr2 <xref target="SP80056cr2"></xref>.</t>

<section anchor="algorithm-identifier-2" title="Algorithm Identifier">

<t>The id-alg-composite-keyex object identifier MUST be used to identify the usage of this mode</t>

<figure><artwork type="asn.1"><![CDATA[
id-alg-composite-keyex OBJECT IDENTIFIER ::= {
    id-alg-composite-encryption OBJECT IDENTIFIER ::= {
    joint-iso-itu-t(2) country(16) us(840) organization(1) entrust(114027)
    Algorithm(80) Composite(4) id-alg-composite-encryption(6) }
]]></artwork></figure>

<t>EDNOTE: this is a temporary OID for the purposes of prototyping. Permanent OIDs should be requested from IANA, see <xref target="sec-iana"/>.</t>

</section>
<section anchor="public-key-and-key-usage-2" title="Public key and key usage">

<t>The recipient MUST have a composite public key which supports key transport, key encapsulation, or key exchange operations. Where the recipient public key has an associated keyUsage as specified in <xref target="RFC5280"></xref>, it MUST have keyUsage: keyEncipherment, keyAgreement. This mode is the most general and places the fewest restrictions on the recipient public key.</t>

<t>EDNOTE: I think this violates our public key draft where we say that the public key&#39;s KU MUST apply to all components. ... we did not want mixing of signatures and encryption keys, but I think in this case we do want to allow mixing of keyEncipherment and keyExchange keys. Not sure how to fix that.</t>

<section anchor="composite-or-2" title="Composite-OR">

<t>The design intent of this mode is to support migration scenarios where a recipient has been provisioned with a composite key containing algorithms that its peers may not yet support. This mode allows the sender to encrypt for a subset of the recipient&#39;s public keys. Support for Composite OR subset encryption is indicated by the recipient at key generation time by marking its composite key with the id-composite-or-key algorithm identifier as defined in ~~~cite properly draft-ounsworth-pq-composite-keys~~~.</t>

<t>Policy mechanisms defining allowed subets of algorithms could be applied here, but are out of scope of this document. As defined in this document, a recipient marking their public key as id-composite-or-key must accept the risk that a sender may encrypt sensitive data for it using any one of its component keys in isolation. Composite Or is a direct tradeoff of lower security for increased migration flexibility.</t>

</section>
</section>
<section anchor="sec-com-key-exchange-params" title="Algorithm parameters">

<t>The composite key exchange mode requires additional parameters to specify the KDF used to combine shared secrets into a master shared secret.</t>

<figure><artwork><![CDATA[
Params ::= KeyDerivationAlgorithmIdentifier
]]></artwork></figure>

<t>The KeyDerivationAlgorithmIdentifier type is specified in <xref target="RFC5652"></xref>. The KeyDerivationAlgorithmIdentifier definition is repeated
here for completeness.</t>

<figure><artwork><![CDATA[
KeyDerivationAlgorithmIdentifier ::= AlgorithmIdentifier
]]></artwork></figure>

</section>
<section anchor="encapsulation-process" title="Encapsulation Process">

<t>Composite key exchange uses the underlying primitive to either encrypt for, encapsulate, or interactively do key agreement with each of the recipient&#39;s public keys, then all shared secrets are concatenated together and a KDF is applies as prescribed by NIST SP 800-56Cr2 <xref target="SP80056cr2"></xref>.</t>

<figure><artwork name="alg-composite-encaps"><![CDATA[
Input:
     P1, P2, .., Pn     Public keys for the n component encryption
                        algorithms, a CompositePublicKey
    
    SIZE                The size, in bits, for shared secrets to be combined by both 
                        parties into a content encryption key. This value SHOULD correspond
                        to the size of the content encryption key.

    KDF                 A key derivation function

Output:
     E1, E2, .., En     EncryptedKey values corresponding to each recipient
                        component public key

     M                  Master shared secret
    

Ciphertext and master secret Generation Procedure:
     1. Generate a set of one-time-pad secret keys of 
      the same length as the content encryption key
        for i := 1 to n

      a. if id-composite-or-key and Pi is to be skipped
            Si = emptyOctetString
            Ei := emptyOctetString
            continue to next i

      b. if P1 is of type KEM or keyExchange:
            Si,Ei := encaps(Pi)
        else:
            Si := random_bits(SIZE)
            Ei := encrypt(Si, Pi)

   2. Generate Z via concatenation
        Z = S1 || S2 || .. || Sn

   3. Generate the master shared secret via a KDF
        M = KDF(Z)

   4. Output M
        Output E1, E2, .., En

]]></artwork></figure>

<t>Where <spanx style="verb">emptyOctetString</spanx> is the octet string of length 0 that serves as a no-op or identity element for the concatenation in step 2.</t>

<t>In cases where KDF is extensible output function, the length of M must be carried in the KeyDerivationAlgorithmIdentifier defined in <xref target="sec-com-key-exchange-params"/>.</t>

<t>EDNOTE: It isn&#39;t clear to us how one uses the defined HKDF algorithmid (RFC 8619) here. Those OIDs specify a hash, but no output length or seed or info parameter either implicitely or explicitely. But we also don&#39;t see how it would be used with CMS either, for the same reason. ..?</t>

<t>If the sender does not support Composite Or encryption, this algorithm may be simplified by omitting step 2a.</t>

<t>EDNOTE: investigate whether step 3 really belongs here, or whether the surrounding protocol (ex. CMS EnvelopedData) will perform a final KDF anyways. We believe that outputting an IID master secret is consistent with modern KEM behaviour.</t>

</section>
<section anchor="decapsulation-process" title="Decapsulation Process">

<figure><artwork name="alg-composite-decaps"><![CDATA[
Input:
     n                  The number of recipient component public keys

     SK1, SK2, .., SKn  Recipient component secret keys

     E1, E2, .., En     EncryptedKey values corresponding to each recipient
                          component public key

     KDF                A key derivation function


Intermediate values:
     S1, S2, .., Sn     Shared secrets to be encapsulated by 
                          each component algorithm

Output:
     M                  Master shared secret
    

 Master Secret Recovery Procedure:
   1. Recover each shared secret
        for i := 1 to n
          if Ei == null
            Si = EMPTY_STRING
          Si := decrypt_or_decaps(Ei, SKi)

   2. Generate Z via concatenation
        Z = S1 || S2 || .. || Sn

   3. Generate the master shared secret via a KDF
        M = KDF(Z)

  4. Output M
]]></artwork></figure>

<t>&quot;EMPTY_STRING&quot; indicates a string or byte array of length zero so that that value as essentially omitted from the concatenation in step 2.</t>

<t>The if statement in step 1 is the only modification required to support Composite Or encryption. The designers have intentionally omitted a check that the recipient key is of type id-composite-or-key because even if the sender erroneously used composite or subset for a recipient key which is not of type id-composite-or-key, the damage has already been done by generating a master secret and potentially transmitting data encrypted with it, no further harm can be done by decrypting it. However, where appropriate, clients SHOULD indicate a warning to users that this data was transmitted with weaker encrypting than their public key allows.</t>

</section>
</section>
<section anchor="sec-in-pract" title="In Practice">

<t>This section addresses practical issues of how this draft affects other protocols and standards.</t>

<!-- End of In Practice section -->

</section>
<section anchor="sec-iana" title="IANA Considerations">
<t>The following OIDs are to be assigned by IANA.  The authors suggest that IANA assign OIDs for composite encryption on the id-pkix arc:</t>

<figure><artwork type="asn.1"><![CDATA[
id-alg-composite OBJECT IDENTIFIER ::= {
    iso(1) identified-organization(3) dod(6) internet(1) security(5)
    mechanisms(5) pkix(7) algorithms(6) composite(??) id-alg-composite-encryption(??)}
]]></artwork></figure>

<figure><artwork type="asn.1"><![CDATA[
id-alg-composite-kem OBJECT IDENTIFIER ::= {
    iso(1) identified-organization(3) dod(6) internet(1) security(5)
    mechanisms(5) pkix(7) algorithms(6) composite(??) id-alg-composite-kem(??)}
]]></artwork></figure>

<figure><artwork type="asn.1"><![CDATA[

id-alg-composite-keyex OBJECT IDENTIFIER ::= {
    iOBJECT IDENTIFIER ::= {
    iso(1) identified-organization(3) dod(6) internet(1) security(5)
    mechanisms(5) pkix(7) algorithms(6) composite(??) id-alg-composite-encryption(??)}
]]></artwork></figure>

<!-- End of IANA Considerations section -->

</section>
<section anchor="security-considerations" title="Security Considerations">

<section anchor="sec-consider-iid" title="IID property of KEM primitives">

<t>Composite Key Transport using Encryption and KEM primitives defined in <xref target="sec-com-key-trans_kem"/> directly uses the shared secret output from the underlying KEM primitevas as a one-time-pad key to encrypt the CEK. Therefore the output of the KEM primitive of needs to meet the security properties of a one-time-pad key, namely that its bits are independent and identically distributed (IID). In particular, key agreement schemes such as ECDH or SIKE do not produce shared secrets that meet this requirement and therefore MUST use the fully general mechanism Composite Key Exchange defined in <xref target="sec-com-key-exchange"/>.</t>

<t>EDNOTE: Should this be brough to CFRG to decide which KEMs are appropriate to use with this mechanism? It may be possible that we need to run the KEM output through a KDF; but we&#39;re trying to avoid needing to carry a KDF AlgID here.</t>

</section>
<section anchor="composite-or-modes" title="Composite-OR modes">

<t>Composite-OR eases migration at the expense of security. For composite encryption and key encapsulation, the weakening of security is entirely at the discretion of the sender, since once data has been encrypted and transmitted with weak ciphers, there is nothing the recipient can do to protect the data against record &amp; decrypt attacks. Clients performing Composite Or encryption operations MUST ensure that the recipient&#39;s public key is of type id-composite-or-key before producing a ciphertext with a subset of the recipient&#39;s public keys.</t>

<t>For some cases of composite key exchange, notably when the underlying key exchange primitive is used in a fully interactive (aka &quot;ephemeral-ephemeral&quot;) mode, the sender cannot begin encrypting data until the recipient has completed the key exchange. The recipient SHOULD reject the connection if one or more null ciphertexts are encountered when the recipient&#39;s public key is not of type id-composite-or-key.</t>

</section>
<section anchor="policy-for-deprecated-or-unacceptable-algorithms" title="Policy for Deprecated or Unacceptable Algorithms">

<t>Within the context of composite encryption, the sender holds the responsibility to ensure that chosen algorithms are of sufficient strength prior to encrypting and transmitting sensitive data under them. Composite is designed to provide security redundancy and to remain strong as long as at least one of the component algorithms remains strong.</t>

<t>When encrypting for a Composite-OR public key and using a subset of the recipient&#39;s public key, then these redundancy guarantees no longer apply. The sender SHOULD employ a policy mechanism to ensure that they are using a combination of algorithms of sufficient strength. Even though this document does not define such a policy mechanism, but implementors making use of Composite-OR encryption are strongly encouraged to implement a policy mechanism.</t>

<!-- End of Security Considerations section -->

</section>
</section>
<section anchor="appendices" title="Appendices">

<section anchor="asn1-module" title="ASN.1 Module">

<t>~~ TODO ~~</t>

</section>
<section anchor="intellectual-property-considerations" title="Intellectual Property Considerations">

<t>The following IPR Disclosure relates to this draft:</t>

<t>https://datatracker.ietf.org/ipr/3588/</t>

<t>We are grateful to all, including any contributors who may have
been inadvertently omitted from this list.</t>

<t>This document borrows text from similar documents, including those referenced below. Thanks go to the authors of those
   documents.  &quot;Copying always makes things easier and less error prone&quot; - <xref target="RFC8411"></xref>.</t>

</section>
<section anchor="making-contributions" title="Making contributions">

<t>Additional contributions to this draft are weclome. Please see the working copy of this draft at, as well as open issues at:</t>

<t>https://github.com/EntrustCorporation/draft-ounsworth-pq-composite-encryption</t>

<!-- End of Contributors section -->

</section>
</section>


  </middle>

  <back>

    <references title='Normative References'>

&RFC2119;
&RFC2986;
&RFC3211;
&RFC4210;
&RFC5280;
&RFC5652;
&RFC8174;
&RFC8411;
<reference anchor="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="2015" month="November"/>
  </front>
  <seriesInfo name="ISO/IEC" value="8825-1:2015"/>
</reference>
<reference anchor="SP80056cr2" >
  <front>
    <title>SP 800-56c Rev. 2: Recommendation for Key-Derivation Methods in Key-Establishment Schemes</title>
    <author >
      <organization>NIST</organization>
    </author>
    <date year="2020" month="August"/>
  </front>
</reference>


    </references>




  </back>

<!-- ##markdown-source:
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
bywd8+ongkVw5EuBL/n/D/aCmQ5yhwAA

-->

</rfc>
