<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.13 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

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

<rfc ipr="trust200902" docName="draft-stebila-tls-hybrid-design-03" category="info">

  <front>
    <title abbrev="stebila-tls-hybrid-design">Hybrid key exchange in TLS 1.3</title>

    <author initials="D." surname="Stebila" fullname="Douglas Stebila">
      <organization>University of Waterloo</organization>
      <address>
        <email>dstebila@uwaterloo.ca</email>
      </address>
    </author>
    <author initials="S." surname="Fluhrer" fullname="Scott Fluhrer">
      <organization>Cisco Systems</organization>
      <address>
        <email>sfluhrer@cisco.com</email>
      </address>
    </author>
    <author initials="S." surname="Gueron" fullname="Shay Gueron">
      <organization abbrev="U. Haifa, Amazon Web Services">University of Haifa and Amazon Web Services</organization>
      <address>
        <email>shay.gueron@gmail.com</email>
      </address>
    </author>

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

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>Hybrid key exchange refers to using multiple key exchange algorithms simultaneously and combining the result with the goal of providing security even if all but one of the component algorithms is broken.  It is motivated by transition to post-quantum cryptography.  This document provides a construction for hybrid key exchange in the Transport Layer Security (TLS) protocol version 1.3.</t>

<t>Discussion of this work is encouraged to happen on the TLS IETF mailing list tls@ietf.org or on the GitHub repository which contains the draft: https://github.com/dstebila/draft-stebila-tls-hybrid-design.</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>This document gives a construction for hybrid key exchange in TLS 1.3.  The overall design approach is a simple, “concatenation”-based approach: each hybrid key exchange combination should be viewed as a single new key exchange method, negotiated and transmitted using the existing TLS 1.3 mechanisms.</t>

<t>This document does not propose specific post-quantum mechanisms; see <xref target="scope"/> for more on the scope of this document.</t>

<section anchor="revision-history" title="Revision history">

<t><list style='empty'>
  <t><spanx style="strong">RFC Editor’s Note:</spanx> Please remove this section prior to publication of a final version of this document.</t>
</list></t>

<t>Earlier versions of this document categorized various design decisions one could make when implementing hybrid key exchange in TLS 1.3.  These have been moved to the appendix of the current draft, and will be eventually be removed.</t>

<t><list style="symbols">
  <t>draft-03:
  <list style="symbols">
      <t>Add requirement for KEMs to provide protection against key reuse.</t>
      <t>Clarify FIPS-compliance of shared secret concatenation method.</t>
    </list></t>
  <t>draft-02:
  <list style="symbols">
      <t>Design considerations from draft-00 and draft-01 are moved to the appendix.</t>
      <t>A single construction is given in the main body.</t>
    </list></t>
  <t>draft-01:
  <list style="symbols">
      <t>Add <xref target="comb-kdf-1">(Comb-KDF-1)</xref> and <xref target="comb-kdf-2">(Comb-KDF-2)</xref> options.</t>
      <t>Add two candidate instantiations.</t>
    </list></t>
  <t>draft-00: Initial version.</t>
</list></t>

</section>
<section anchor="terminology" title="Terminology">

<t>For the purposes of this document, it is helpful to be able to divide cryptographic algorithms into two classes:</t>

<t><list style="symbols">
  <t>“Traditional” algorithms: Algorithms which are widely deployed today, but which may be deprecated in the future.  In the context of TLS 1.3 in 2019, examples of traditional key exchange algorithms include elliptic curve Diffie–Hellman using secp256r1 or x25519, or finite-field Diffie–Hellman.</t>
  <t>“Next-generation” (or “next-gen”) algorithms: Algorithms which are not yet widely deployed, but which may eventually be widely deployed.  An additional facet of these algorithms may be that we have less confidence in their security due to them being relatively new or less studied.  This includes “post-quantum” algorithms.</t>
</list></t>

<t>“Hybrid” key exchange, in this context, means the use of two (or more) key exchange algorithms based on different cryptographic assumptions, e.g., one traditional algorithm and one next-gen algorithm, with the purpose of the final session key being secure as long as at least one of the component key exchange algorithms remains unbroken.  We use the term “component” algorithms to refer to the algorithms combined in a hybrid key exchange.</t>

<t>The primary motivation of this document is preparing for post-quantum algorithms.  However, it is possible that public key cryptography based on alternative mathematical constructions will be required independent of the advent of a quantum computer, for example because of a cryptanalytic breakthrough.  As such we opt for the more generic term “next-generation” algorithms rather than exclusively “post-quantum” algorithms.</t>

<t>Note that TLS 1.3 uses the phrase “groups” to refer to key exchange algorithms – for example, the <spanx style="verb">supported_groups</spanx> extension – since all key exchange algorithms in TLS 1.3 are Diffie–Hellman-based.  As a result, some parts of this document will refer to data structures or messages with the term “group” in them despite using a key exchange algorithm that is not Diffie–Hellman-based nor a group.</t>

</section>
<section anchor="motivation" title="Motivation for use of hybrid key exchange">

<t>A hybrid key exchange algorithm allows early adopters eager for post-quantum security to have the potential of post-quantum security (possibly from a less-well-studied algorithm) while still retaining at least the security currently offered by traditional algorithms.  They may even need to retain traditional algorithms due to regulatory constraints, for example FIPS compliance.</t>

<t>Ideally, one would not use hybrid key exchange: one would have confidence in a single algorithm and parameterization that will stand the test of time.  However, this may not be the case in the face of quantum computers and cryptanalytic advances more generally.</t>

<t>Many (though not all) post-quantum algorithms currently under consideration are relatively new; they have not been subject to the same depth of study as RSA and finite-field or elliptic curve Diffie–Hellman, and thus the security community does not necessarily have as much confidence in their fundamental security, or the concrete security level of specific parameterizations.</t>

<t>Moreover, it is possible that even by the end of the NIST Post-Quantum Cryptography Standardization Project, and for a period of time thereafter, conservative users may not have full confidence in some algorithms.</t>

<t>As such, there may be users for whom hybrid key exchange is an appropriate step prior to an eventual transition to next-generation algorithms.</t>

</section>
<section anchor="scope" title="Scope">

<t>This document focuses on hybrid ephemeral key exchange in TLS 1.3 <xref target="TLS13"/>.  It intentionally does not address:</t>

<t><list style="symbols">
  <t>Selecting which next-generation algorithms to use in TLS 1.3, nor algorithm identifiers nor encoding mechanisms for next-generation algorithms.  This selection will be based on the recommendations by the Crypto Forum Research Group (CFRG), which is currently waiting for the results of the NIST Post-Quantum Cryptography Standardization Project <xref target="NIST"/>.</t>
  <t>Authentication using next-generation algorithms.  If a cryptographic assumption is broken due to the advent of a quantum computer or some other cryptanalytic breakthrough, confidentiality of information can be broken retroactively by any adversary who has passively recorded handshakes and encrypted communications.  In contrast, session authentication cannot be retroactively broken.</t>
</list></t>

</section>
<section anchor="goals" title="Goals">

<t>The primary goal of a hybrid key exchange mechanism is to facilitate the establishment of a shared secret which remains secure as long as as one of the component key exchange mechanisms remains unbroken.</t>

<t>In addition to the primary cryptographic goal, there may be several additional goals in the context of TLS 1.3:</t>

<t><list style="symbols">
  <t><spanx style="strong">Backwards compatibility:</spanx> Clients and servers who are “hybrid-aware”, i.e., compliant with whatever hybrid key exchange standard is developed for TLS, should remain compatible with endpoints and middle-boxes that are not hybrid-aware.  The three scenarios to consider are:
  <list style="numbers">
      <t>Hybrid-aware client, hybrid-aware server: These parties should establish a hybrid shared secret.</t>
      <t>Hybrid-aware client, non-hybrid-aware server:  These parties should establish a traditional shared secret (assuming the hybrid-aware client is willing to downgrade to traditional-only).</t>
      <t>Non-hybrid-aware client, hybrid-aware server:  These parties should establish a traditional shared secret (assuming the hybrid-aware server is willing to downgrade to traditional-only).</t>
    </list>
Ideally backwards compatibility should be achieved without extra round trips and without sending duplicate information; see below.</t>
  <t><spanx style="strong">High performance:</spanx> Use of hybrid key exchange should not be prohibitively expensive in terms of computational performance.  In general this will depend on the performance characteristics of the specific cryptographic algorithms used, and as such is outside the scope of this document.  See <xref target="BCNS15"/>, <xref target="CECPQ1"/>, <xref target="FRODO"/> for preliminary results about performance characteristics.</t>
  <t><spanx style="strong">Low latency:</spanx> Use of hybrid key exchange should not substantially increase the latency experienced to establish a connection.  Factors affecting this may include the following.
  <list style="symbols">
      <t>The computational performance characteristics of the specific algorithms used.  See above.</t>
      <t>The size of messages to be transmitted.  Public key and ciphertext sizes for post-quantum algorithms range from hundreds of bytes to over one hundred kilobytes, so this impact can be substantially.  See <xref target="BCNS15"/>, <xref target="FRODO"/> for preliminary results in a laboratory setting, and <xref target="LANGLEY"/> for preliminary results on more realistic networks.</t>
      <t>Additional round trips added to the protocol.  See below.</t>
    </list></t>
  <t><spanx style="strong">No extra round trips:</spanx> Attempting to negotiate hybrid key exchange should not lead to extra round trips in any of the three hybrid-aware/non-hybrid-aware scenarios listed above.</t>
  <t><spanx style="strong">Minimal duplicate information:</spanx> Attempting to negotiate hybrid key exchange should not mean having to send multiple public keys of the same type.</t>
</list></t>

</section>
</section>
<section anchor="kems" title="Key encapsulation mechanisms">

<t>In the context of the NIST Post-Quantum Cryptography Standardization Project, key exchange algorithms are formulated as key encapsulation mechanisms (KEMs), which consist of three algorithms:</t>

<t><list style="symbols">
  <t><spanx style="verb">KeyGen() -&gt; (pk, sk)</spanx>: A probabilistic key generation algorithm, which generates a public key <spanx style="verb">pk</spanx> and a secret key <spanx style="verb">sk</spanx>.</t>
  <t><spanx style="verb">Encaps(pk) -&gt; (ct, ss)</spanx>: A probabilistic encapsulation algorithm, which takes as input a public key <spanx style="verb">pk</spanx> and outputs a ciphertext <spanx style="verb">ct</spanx> and shared secret <spanx style="verb">ss</spanx>.</t>
  <t><spanx style="verb">Decaps(sk, ct) -&gt; ss</spanx>: A decapsulation algorithm, which takes as input a secret key <spanx style="verb">sk</spanx> and ciphertext <spanx style="verb">ct</spanx> and outputs a shared secret <spanx style="verb">ss</spanx>, or in some cases a distinguished error value.</t>
</list></t>

<t>The main security property for KEMs is indistinguishability under adaptive chosen ciphertext attack (IND-CCA2), which means that shared secret values should be indistinguishable from random strings even given the ability to have arbitrary ciphertexts decapsulated.  IND-CCA2 corresponds to security against an active attacker, and the public key / secret key pair can be treated as a long-term key or reused.  A common design pattern for obtaining security under key reuse is to apply the Fujisaki–Okamoto (FO) transform <xref target="FO"/> or a variant thereof <xref target="HHK"/>.</t>

<t>A weaker security notion is indistinguishability under chosen plaintext attack (IND-CPA), which means that the shared secret values should be indistinguishable from random strings given a copy of the public key.  IND-CPA roughly corresponds to security against a passive attacker, and sometimes corresponds to one-time key exchange.</t>

<t>Key exchange in TLS 1.3 is phrased in terms of Diffie–Hellman key exchange in a group.  DH key exchange can be modeled as a KEM, with <spanx style="verb">KeyGen</spanx> corresponding to selecting an exponent <spanx style="verb">x</spanx> as the secret key and computing the public key <spanx style="verb">g^x</spanx>; encapsulation corresponding to selecting an exponent <spanx style="verb">y</spanx>, computing the ciphertext <spanx style="verb">g^y</spanx> and the shared secret <spanx style="verb">g^(xy)</spanx>, and decapsulation as computing the shared secret <spanx style="verb">g^(xy)</spanx>. See <xref target="I-D.irtf-cfrg-hpke"/> for more details of such Diffie–Hellman-based key encapsulation mechanisms.</t>

<t>TLS 1.3 does not require that ephemeral public keys be used only in a single key exchange session; some implementations may reuse them, at the cost of limited forward secrecy.  As a result, any KEM used in this document MUST explicitly be designed to be secure in the event that the public key is re-used, such as achieving IND-CCA2 security or having a transform like the Fujisaki–Okamoto transform <xref target="FO"/> <xref target="HHK"/> applied.  While it is recommended that implementations avoid reuse of KEM public keys, implementations that do reuse KEM public keys MUST ensure that the number of reuses of a KEM public key abides by any bounds in the specification of the KEM or subsequent security analyses.  Implementations MUST NOT reuse randomness in the generation of KEM ciphertexts.</t>

</section>
<section anchor="construction" title="Construction for hybrid key exchange">

<section anchor="construction-negotiation" title="Negotiation">

<t>Each particular combination of algorithms in a hybrid key exchange will be represented as a <spanx style="verb">NamedGroup</spanx> and sent in the <spanx style="verb">supported_groups</spanx> extension.  No internal structure or grammar is implied or required in the value of the identifier; they are simply opaque identifiers.</t>

<t>Each value representing a hybrid key exchange will correspond to an ordered pair of two algorithms.  For example, a future document could specify that hybrid value 0x2000 corresponds to secp256r1+ntruhrss701, and 0x2001 corresponds to x25519+ntruhrss701.  (We note that this is independent from future documents standardizing solely post-quantum key exchange methods, which would have to be assigned their own identifier.)</t>

<t>Specific values shall be standardized by IANA in the TLS Supported Groups registry.  We suggest that values 0x2000 through 0x2EFF are suitable for hybrid key exchange methods (the leading “2” suggesting that there are 2 algorithms), noting that 0x2A2A is reserved as a GREASE value <xref target="GREASE"/>.  This document requests that values 0x2F00 through 0x2FFF be reserved for Private Use for hybrid key exchange.</t>

<figure><artwork><![CDATA[
    enum {

          /* Elliptic Curve Groups (ECDHE) */
          secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
          x25519(0x001D), x448(0x001E),

          /* Finite Field Groups (DHE) */
          ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
          ffdhe6144(0x0103), ffdhe8192(0x0104),

          /* Hybrid Key Exchange Methods */
          TBD(0xTBD), ...,

          /* Reserved Code Points */
          ffdhe_private_use(0x01FC..0x01FF),
          hybrid_private_use(0x2F00..0x2FFF),
          ecdhe_private_use(0xFE00..0xFEFF),
          (0xFFFF)
    } NamedGroup;
]]></artwork></figure>

</section>
<section anchor="construction-transmitting" title="Transmitting public keys and ciphertexts">

<t>We take the relatively simple “concatenation approach”: the messages from the two algorithms being hybridized will be concatenated together and transmitted as a single value, to avoid having to change existing data structures.  However we do add structure in the concatenation procedure, specifically including length fields, so that the concatenation operation is unambiguous.  Note that among the Round 2 candidates in the NIST Post-Quantum Cryptography Standardization Project, not all algorithms have fixed public key sizes; for example, the SIKE key encapsulation mechanism permits compressed or uncompressed public keys at each security level, and the compressed and uncompressed formats are interoperable.</t>

<t>Recall that in TLS 1.3 a KEM public key or KEM ciphertext is represented as a <spanx style="verb">KeyShareEntry</spanx>:</t>

<figure><artwork><![CDATA[
    struct {
        NamedGroup group;
        opaque key_exchange<1..2^16-1>;
    } KeyShareEntry;
]]></artwork></figure>

<t>These are transmitted in the <spanx style="verb">extension_data</spanx> fields of <spanx style="verb">KeyShareClientHello</spanx> and <spanx style="verb">KeyShareServerHello</spanx> extensions:</t>

<figure><artwork><![CDATA[
    struct {
        KeyShareEntry client_shares<0..2^16-1>;
    } KeyShareClientHello;

    struct {
        KeyShareEntry server_share;
    } KeyShareServerHello;
]]></artwork></figure>

<t>The client’s shares are listed in descending order of client preference; the server selects one algorithm and sends its corresponding share.</t>

<t>For a hybrid key exchange, the <spanx style="verb">key_exchange</spanx> field of a <spanx style="verb">KeyShareEntry</spanx> is the following data structure:</t>

<figure><artwork><![CDATA[
    struct {
        opaque key_exchange_1<1..2^16-1>;
        opaque key_exchange_2<1..2^16-1>;
    } HybridKeyExchange
]]></artwork></figure>

<t>The order of shares in the <spanx style="verb">HybridKeyExchange</spanx> struct is the same as the order of algorithms indicated in the definition of the <spanx style="verb">NamedGroup</spanx>.</t>

<t>For the client’s share, the <spanx style="verb">key_exchange_1</spanx> and <spanx style="verb">key_exchange_2</spanx> values are the <spanx style="verb">pk</spanx> outputs of the corresponding KEMs’ <spanx style="verb">KeyGen</spanx> algorithms, if that algorithm corresponds to a KEM; or the (EC)DH ephemeral key share, if that algorithm corresponds to an (EC)DH group.  For the server’s share, the <spanx style="verb">key_exchange_1</spanx> and <spanx style="verb">key_exchange_2</spanx> values are the <spanx style="verb">ct</spanx> outputs of the corresponding KEMs’ <spanx style="verb">Encaps</spanx> algorithms, if that algorithm corresponds to a KEM; or the (EC)DH ephemeral key share, if that algorithm corresponds to an (EC)DH group.</t>

</section>
<section anchor="construction-shared-secret" title="Shared secret calculation">

<t>Here we also take a simple “concatenation approach”: the two shared secrets are concatenated together and used as the shared secret in the existing TLS 1.3 key schedule.  In this case, we do not add any additional structure (length fields) in the concatenation procedure: among all Round 2 candidates, once the algorithm and variant are specified, the shared secret output length is fixed.</t>

<t>In other words, the shared secret is calculated as</t>

<figure><artwork><![CDATA[
    concatenated_shared_secret = shared_secret_1 || shared_secret_2
]]></artwork></figure>

<t>and inserted into the TLS 1.3 key schedule in place of the (EC)DHE shared secret:</t>

<figure><artwork><![CDATA[
                                    0
                                    |
                                    v
                      PSK ->  HKDF-Extract = Early Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                    v
                              Derive-Secret(., "derived", "")
                                    |
                                    v
concatenated_shared_secret -> HKDF-Extract = Handshake Secret
^^^^^^^^^^^^^^^^^^^^^^^^^^          |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                    v
                              Derive-Secret(., "derived", "")
                                    |
                                    v
                         0 -> HKDF-Extract = Master Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
]]></artwork></figure>

<t><spanx style="strong">FIPS-compliance of shared secret concatenation.</spanx>
<xref target="NIST-SP-800-56C"/> or <xref target="NIST-SP-800-135"/> give NIST recommendations for key derivation methods in key exchange protocols.  Some hybrid combinations may combine the shared secret from a NIST-approved algorithm (e.g., ECDH using the nistp256/secp256r1 curve) with a shared secret from a non-approved algorithm (e.g., post-quantum).  Although the simple concatenation approach above is not currently an approved method in <xref target="NIST-SP-800-56C"/> or <xref target="NIST-SP-800-135"/>, NIST indicated in January 2020 that a forthcoming revision of <xref target="NIST-SP-800-56C"/> will list simple concatenation as an approved method <xref target="NIST-FAQ"/>.</t>

</section>
</section>
<section anchor="comb-open-questions" title="Open questions">

<t><spanx style="strong">Larger public keys and/or ciphertexts.</spanx>
The <spanx style="verb">HybridKeyExchange</spanx> struct in <xref target="construction-transmitting"/> limits public keys and ciphertexts to 2^16-1 bytes; this is bounded by the same (2^16-1)-byte limit on the <spanx style="verb">key_exchange</spanx> field in the <spanx style="verb">KeyShareEntry</spanx> struct.  Some post-quantum KEMs have larger public keys and/or ciphertexts; for example, Classic McEliece’s smallest parameter set has public key size 261,120 bytes.  Hence this draft can not accommodate all current NIST Round 2 candidates.</t>

<t>If it is desired to accommodate algorithms with public keys or ciphertexts larger than 2^16-1 bytes, options include a) revising the TLS 1.3 standard to allow longer <spanx style="verb">key_exchange</spanx> fields; b) creating an alternative extension which is sufficiently large; or c) providing a reference to an external public key, e.g. a URL at which to look up the public key (along with a hash to verify).</t>

<t><spanx style="strong">Duplication of key shares.</spanx>
Concatenation of public keys in the <spanx style="verb">HybridKeyExchange</spanx> struct as described in <xref target="construction-transmitting"/> can result in sending duplicate key shares.  For example, if a client wanted to offer support for two combinations, say “secp256r1+sikep503” and “x25519+sikep503”, it would end up sending two sikep503 public keys, since the <spanx style="verb">KeyShareEntry</spanx> for each combination contains its own copy of a sikep503 key.  This duplication may be more problematic for post-quantum algorithms which have larger public keys.</t>

<t>If it is desired to avoid duplication of key shares, options include a) disconnect the use of a combination for the algorithm identifier from the use of concatenation of public keys by introducing new logic and/or data structures (see <xref target="shares-multiple"/> or <xref target="shares-ext-additional"/>); or b) provide some back reference from a later key share entry to an earlier one.</t>

<t><spanx style="strong">Variable-length shared secrets.</spanx>
The shared secret calculation in <xref target="construction-shared-secret"/> directly concatenates the shared secret values of each scheme, rather than encoding them with length fields.  This implicitly assumes that the length of each shared secret is fixed once the algorithm is fixed.  This is the case for all Round 2 candidates.</t>

<t>However, if it is envisioned that this specification be used with algorithms which do not have fixed-length shared secrets (after the variant has been fixed by the algorithm identifier in the <spanx style="verb">NamedGroup</spanx> negotiation in <xref target="construction-negotiation"/>), then <xref target="construction-shared-secret"/> should be revised to use an unambiguous concatenation method such as the following:</t>

<figure><artwork><![CDATA[
    struct {
        opaque shared_secret_1<1..2^16-1>;
        opaque shared_secret_2<1..2^16-1>;
    } HybridSharedSecret
]]></artwork></figure>

<t>Guidance from the working group is particularly requested on this point.</t>

<t><spanx style="strong">Resumption.</spanx>
TLS 1.3 allows for session resumption via a PSK.  When a PSK is used during session establishment, an ephemeral key exchange can also be used to enhance forward secrecy.  If the original key exchange was hybrid, should an ephemeral key exchange in a resumption of that original key exchange be required to use the same hybrid algorithms?</t>

<t><spanx style="strong">Failures.</spanx>
Some post-quantum key exchange algorithms have non-trivial failure rates: two honest parties may fail to agree on the same shared secret with non-negligible probability.  Does a non-negligible failure rate affect the security of TLS?  How should such a failure be treated operationally?  What is an acceptable failure rate?</t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>Identifiers for specific key exchange algorithm combinations will be defined in later documents.  This document requests IANA reserve values 0x2F00..0x2FFF in the TLS Supported Groups registry for private use for hybrid key exchange methods.</t>

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

<t>The shared secrets computed in the hybrid key exchange should be computed in a way that achieves the “hybrid” property: the resulting secret is secure as long as at least one of the component key exchange algorithms is unbroken.  See <xref target="GIACON"/> and <xref target="BINDEL"/> for an investigation of these issues.  Under the assumption that shared secrets are fixed length once the combination is fixed, the construction from <xref target="construction-shared-secret"/> corresponds to the dual-PRF combiner of <xref target="BINDEL"/> which is shown to preserve security under the assumption that the hash function is a dual-PRF.</t>

<t>As noted in <xref target="kems"/>, KEMs used in this document MUST explicitly be designed to be secure in the event that the public key is re-used, such as achieving IND-CCA2 security or having a transform like the Fujisaki–Okamoto transform applied.  Some IND-CPA-secure post-quantum KEMs (i.e., without countermeasures such as the FO transform) are completely insecure under public key reuse; for example, some lattice-based IND-CPA-secure KEMs are vulnerable to attacks that recover the private key after just a few thousand samples <xref target="FLUHRER"/>.</t>

</section>
<section anchor="acknowledgements" title="Acknowledgements">

<t>These ideas have grown from discussions with many colleagues, including Christopher Wood, Matt Campagna, Eric Crockett, authors of the various hybrid Internet-Drafts and implementations cited in this document, and members of the TLS working group.  The immediate impetus for this document came from discussions with attendees at the Workshop on Post-Quantum Software in Mountain View, California, in January 2019.  Martin Thomson suggested the <xref target="comb-kdf-1">(Comb-KDF-1)</xref> approach.  Daniel J. Bernstein and Tanja Lange commented on the risks of reuse of ephemeral public keys.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference  anchor="TLS13" target='https://www.rfc-editor.org/info/rfc8446'>
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<date year='2018' month='August' />
<abstract><t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t><t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t></abstract>
</front>
<seriesInfo name='RFC' value='8446'/>
<seriesInfo name='DOI' value='10.17487/RFC8446'/>
</reference>




    </references>

    <references title='Informative References'>



<reference anchor="BCNS15" >
  <front>
    <title>Post-Quantum Key Exchange for the TLS Protocol from the Ring Learning with Errors Problem</title>
    <author initials="J." surname="Bos" fullname="Joppe W. Bos">
      <organization></organization>
    </author>
    <author initials="C." surname="Costello" fullname="Craig Costello">
      <organization></organization>
    </author>
    <author initials="M." surname="Naehrig" fullname="Michael Naehrig">
      <organization></organization>
    </author>
    <author initials="D." surname="Stebila" fullname="Douglas Stebila">
      <organization></organization>
    </author>
    <date year="2015" month="May"/>
  </front>
  <seriesInfo name="2015 IEEE Symposium on Security and" value="Privacy"/>
  <seriesInfo name="DOI" value="10.1109/sp.2015.40"/>
</reference>

<reference anchor="BERNSTEIN" >
  <front>
    <title>Post-Quantum Cryptography</title>
    <author >
      <organization></organization>
    </author>
    <date year="2009"/>
  </front>
  <seriesInfo name="Springer Berlin Heidelberg" value="book"/>
  <seriesInfo name="DOI" value="10.1007/978-3-540-88702-7"/>
</reference>

<reference anchor="BINDEL" >
  <front>
    <title>Hybrid Key Encapsulation Mechanisms and Authenticated Key Exchange</title>
    <author initials="N." surname="Bindel" fullname="Nina Bindel">
      <organization></organization>
    </author>
    <author initials="J." surname="Brendel" fullname="Jacqueline Brendel">
      <organization></organization>
    </author>
    <author initials="M." surname="Fischlin" fullname="Marc Fischlin">
      <organization></organization>
    </author>
    <author initials="B." surname="Goncalves" fullname="Brian Goncalves">
      <organization></organization>
    </author>
    <author initials="D." surname="Stebila" fullname="Douglas Stebila">
      <organization></organization>
    </author>
    <date year="2019"/>
  </front>
  <seriesInfo name="Post-Quantum Cryptography" value="pp. 206-226"/>
  <seriesInfo name="DOI" value="10.1007/978-3-030-25510-7_12"/>
</reference>


<reference anchor="CECPQ1" target="https://security.googleblog.com/2016/07/experimenting-with-post-quantum.html">
  <front>
    <title>Experimenting with Post-Quantum Cryptography</title>
    <author initials="M." surname="Braithwaite">
      <organization></organization>
    </author>
    <date year="2016" month="July" day="07"/>
  </front>
</reference>
<reference anchor="CECPQ2" target="https://www.imperialviolet.org/2018/12/12/cecpq2.html">
  <front>
    <title>CECPQ2</title>
    <author initials="A." surname="Langley">
      <organization></organization>
    </author>
    <date year="2018" month="December" day="12"/>
  </front>
</reference>


<reference anchor="DFGS15" >
  <front>
    <title>A Cryptographic Analysis of the TLS 1.3 Handshake Protocol Candidates</title>
    <author initials="B." surname="Dowling" fullname="Benjamin Dowling">
      <organization></organization>
    </author>
    <author initials="M." surname="Fischlin" fullname="Marc Fischlin">
      <organization></organization>
    </author>
    <author initials="F." surname="Günther" fullname="Felix Günther">
      <organization></organization>
    </author>
    <author initials="D." surname="Stebila" fullname="Douglas Stebila">
      <organization></organization>
    </author>
    <date year="2015"/>
  </front>
  <seriesInfo name="Proceedings of the 22nd ACM SIGSAC Conference on Computer and Communications Security - CCS" value="'15"/>
  <seriesInfo name="DOI" value="10.1145/2810103.2813653"/>
</reference>

<reference anchor="DODIS" >
  <front>
    <title>Chosen-Ciphertext Security of Multiple Encryption</title>
    <author initials="Y." surname="Dodis" fullname="Yevgeniy Dodis">
      <organization></organization>
    </author>
    <author initials="J." surname="Katz" fullname="Jonathan Katz">
      <organization></organization>
    </author>
    <date year="2005"/>
  </front>
  <seriesInfo name="Theory of Cryptography" value="pp. 188-209"/>
  <seriesInfo name="DOI" value="10.1007/978-3-540-30576-7_11"/>
</reference>

<reference anchor="DOWLING" >
  <front>
    <title>Provable Security of Internet Protocols</title>
    <author initials="B." surname="Dowling" fullname="Benjamin James Dowling">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
  <seriesInfo name="Queensland University of Technology" value="dissertation"/>
  <seriesInfo name="DOI" value="10.5204/thesis.eprints.108960"/>
</reference>


<reference anchor="ETSI" target="https://www.etsi.org/images/files/ETSIWhitePapers/QuantumSafeWhitepaper.pdf">
  <front>
    <title>Quantum safe cryptography and security: An introduction, benefits, enablers and challengers</title>
    <author initials="M." surname="Campagna" role="editor">
      <organization></organization>
    </author>
    <author initials="." surname="others">
      <organization></organization>
    </author>
    <date year="2015" month="June"/>
  </front>
  <seriesInfo name="ETSI White Paper No. 8" value=""/>
</reference>


<reference anchor="EVEN" >
  <front>
    <title>On the Power of Cascade Ciphers</title>
    <author initials="S." surname="Even" fullname="S. Even">
      <organization></organization>
    </author>
    <author initials="O." surname="Goldreich" fullname="O. Goldreich">
      <organization></organization>
    </author>
    <date year="1984"/>
  </front>
  <seriesInfo name="Advances in Cryptology" value="pp. 43-50"/>
  <seriesInfo name="DOI" value="10.1007/978-1-4684-4730-9_4"/>
</reference>



<reference anchor="EXTERN-PSK">
<front>
<title>TLS 1.3 Extension for Certificate-based Authentication with an External Pre-Shared Key</title>

<author initials='R' surname='Housley' fullname='Russ Housley'>
    <organization />
</author>

<date month='December' day='23' year='2019' />

<abstract><t>This document specifies a TLS 1.3 extension that allows a server to authenticate with a combination of a certificate and an external pre- shared key (PSK).</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-tls-tls13-cert-with-extern-psk-07' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-tls-tls13-cert-with-extern-psk-07.txt' />
</reference>


<reference anchor="FLUHRER" target="https://eprint.iacr.org/2016/085">
  <front>
    <title>Cryptanalysis of ring-LWE based key exchange with key share reuse</title>
    <author initials="S." surname="Fluhrer">
      <organization></organization>
    </author>
    <date year="2016" month="January"/>
  </front>
  <seriesInfo name="Cryptology ePrint Archive, Report 2016/085" value=""/>
</reference>


<reference anchor="FO" >
  <front>
    <title>Secure Integration of Asymmetric and Symmetric Encryption Schemes</title>
    <author initials="E." surname="Fujisaki" fullname="Eiichiro Fujisaki">
      <organization></organization>
    </author>
    <author initials="T." surname="Okamoto" fullname="Tatsuaki Okamoto">
      <organization></organization>
    </author>
    <date year="2011" month="December"/>
  </front>
  <seriesInfo name="Journal of Cryptology" value="Vol. 26, pp. 80-101"/>
  <seriesInfo name="DOI" value="10.1007/s00145-011-9114-1"/>
</reference>

<reference anchor="FRODO" >
  <front>
    <title>Frodo</title>
    <author initials="J." surname="Bos" fullname="Joppe Bos">
      <organization></organization>
    </author>
    <author initials="C." surname="Costello" fullname="Craig Costello">
      <organization></organization>
    </author>
    <author initials="L." surname="Ducas" fullname="Leo Ducas">
      <organization></organization>
    </author>
    <author initials="I." surname="Mironov" fullname="Ilya Mironov">
      <organization></organization>
    </author>
    <author initials="M." surname="Naehrig" fullname="Michael Naehrig">
      <organization></organization>
    </author>
    <author initials="V." surname="Nikolaenko" fullname="Valeria Nikolaenko">
      <organization></organization>
    </author>
    <author initials="A." surname="Raghunathan" fullname="Ananth Raghunathan">
      <organization></organization>
    </author>
    <author initials="D." surname="Stebila" fullname="Douglas Stebila">
      <organization></organization>
    </author>
    <date year="2016"/>
  </front>
  <seriesInfo name="Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security -" value="CCS'16"/>
  <seriesInfo name="DOI" value="10.1145/2976749.2978425"/>
</reference>

<reference anchor="GIACON" >
  <front>
    <title>KEM Combiners</title>
    <author initials="F." surname="Giacon" fullname="Federico Giacon">
      <organization></organization>
    </author>
    <author initials="F." surname="Heuer" fullname="Felix Heuer">
      <organization></organization>
    </author>
    <author initials="B." surname="Poettering" fullname="Bertram Poettering">
      <organization></organization>
    </author>
    <date year="2018"/>
  </front>
  <seriesInfo name="Public-Key Cryptography – PKC 2018" value="pp. 190-218"/>
  <seriesInfo name="DOI" value="10.1007/978-3-319-76578-5_7"/>
</reference>



<reference anchor="GREASE">
<front>
<title>Applying GREASE to TLS Extensibility</title>

<author initials='D' surname='Benjamin' fullname='David Benjamin'>
    <organization />
</author>

<date month='August' day='22' year='2019' />

<abstract><t>This document describes GREASE (Generate Random Extensions And Sustain Extensibility), a mechanism to prevent extensibility failures in the TLS ecosystem.  It reserves a set of TLS protocol values that may be advertised to ensure peers correctly handle unknown values.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-tls-grease-04' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-tls-grease-04.txt' />
</reference>

<reference anchor="HARNIK" >
  <front>
    <title>On Robust Combiners for Oblivious Transfer and Other Primitives</title>
    <author initials="D." surname="Harnik" fullname="Danny Harnik">
      <organization></organization>
    </author>
    <author initials="J." surname="Kilian" fullname="Joe Kilian">
      <organization></organization>
    </author>
    <author initials="M." surname="Naor" fullname="Moni Naor">
      <organization></organization>
    </author>
    <author initials="O." surname="Reingold" fullname="Omer Reingold">
      <organization></organization>
    </author>
    <author initials="A." surname="Rosen" fullname="Alon Rosen">
      <organization></organization>
    </author>
    <date year="2005"/>
  </front>
  <seriesInfo name="Lecture Notes in Computer Science" value="pp. 96-113"/>
  <seriesInfo name="DOI" value="10.1007/11426639_6"/>
</reference>



<reference anchor="HOFFMAN">
<front>
<title>The Transition from Classical to Post-Quantum Cryptography</title>

<author initials='P' surname='Hoffman' fullname='Paul Hoffman'>
    <organization />
</author>

<date month='November' day='25' year='2019' />

<abstract><t>Quantum computing is the study of computers that use quantum features in calculations.  For over 20 years, it has been known that if very large, specialized quantum computers could be built, they could have a devastating effect on asymmetric classical cryptographic algorithms such as RSA and elliptic curve signatures and key exchange, as well as (but in smaller scale) on symmetric cryptographic algorithms such as block ciphers, MACs, and hash functions.  There has already been a great deal of study on how to create algorithms that will resist large, specialized quantum computers, but so far, the properties of those algorithms make them onerous to adopt before they are needed.  Small quantum computers are being built today, but it is still far from clear when large, specialized quantum computers will be built that can recover private or secret keys in classical algorithms at the key sizes commonly used today.  It is important to be able to predict when large, specialized quantum computers usable for cryptanalysis will be possible so that organization can change to post-quantum cryptographic algorithms well before they are needed.  This document describes quantum computing, how it might be used to attack classical cryptographic algorithms, and possibly how to predict when large, specialized quantum computers will become feasible.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-hoffman-c2pq-06' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-hoffman-c2pq-06.txt' />
</reference>

<reference anchor="HHK" >
  <front>
    <title>A Modular Analysis of the Fujisaki-Okamoto Transformation</title>
    <author initials="D." surname="Hofheinz" fullname="Dennis Hofheinz">
      <organization></organization>
    </author>
    <author initials="K." surname="Hövelmanns" fullname="Kathrin Hövelmanns">
      <organization></organization>
    </author>
    <author initials="E." surname="Kiltz" fullname="Eike Kiltz">
      <organization></organization>
    </author>
    <date year="2017"/>
  </front>
  <seriesInfo name="Theory of Cryptography" value="pp. 341-371"/>
  <seriesInfo name="DOI" value="10.1007/978-3-319-70500-2_12"/>
</reference>



<reference anchor="IKE-HYBRID">
<front>
<title>Framework to Integrate Post-quantum Key Exchanges into Internet Key Exchange Protocol Version 2 (IKEv2)</title>

<author initials='C' surname='Tjhai' fullname='C. Tjhai'>
    <organization />
</author>

<author initials='M' surname='Tomlinson' fullname='M. Tomlinson'>
    <organization />
</author>

<author initials='g' surname='grbartle@cisco.com' fullname='grbartle@cisco.com'>
    <organization />
</author>

<author initials='S' surname='Fluhrer' fullname='Scott Fluhrer'>
    <organization />
</author>

<author initials='D' surname='Geest' fullname='Daniel Van Geest'>
    <organization />
</author>

<author initials='O' surname='Garcia-Morchon' fullname='Oscar Garcia-Morchon'>
    <organization />
</author>

<author initials='V' surname='Smyslov' fullname='Valery Smyslov'>
    <organization />
</author>

<date month='July' day='9' year='2019' />

<abstract><t>This document describes how to extend Internet Key Exchange Protocol Version 2 (IKEv2) so that the shared secret exchanged between peers has resistance against quantum computer attacks.  The basic idea is to exchange one or more post-quantum key exchange payloads in conjunction with the existing (Elliptic Curve) Diffie-Hellman payload.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-tjhai-ipsecme-hybrid-qske-ikev2-04' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-tjhai-ipsecme-hybrid-qske-ikev2-04.txt' />
</reference>



<reference anchor="IKE-PSK">
<front>
<title>Mixing Preshared Keys in IKEv2 for Post-quantum Security</title>

<author initials='S' surname='Fluhrer' fullname='Scott Fluhrer'>
    <organization />
</author>

<author initials='P' surname='Kampanakis' fullname='Panos Kampanakis'>
    <organization />
</author>

<author initials='D' surname='McGrew' fullname='David McGrew'>
    <organization />
</author>

<author initials='V' surname='Smyslov' fullname='Valery Smyslov'>
    <organization />
</author>

<date month='January' day='14' year='2020' />

<abstract><t>The possibility of quantum computers poses a serious challenge to cryptographic algorithms deployed widely today.  IKEv2 is one example of a cryptosystem that could be broken; someone storing VPN communications today could decrypt them at a later time when a quantum computer is available.  It is anticipated that IKEv2 will be extended to support quantum-secure key exchange algorithms; however that is not likely to happen in the near term.  To address this problem before then, this document describes an extension of IKEv2 to allow it to be resistant to a quantum computer, by using preshared keys.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-ipsecme-qr-ikev2-11' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-ipsecme-qr-ikev2-11.txt' />
</reference>



<reference anchor="KIEFER">
<front>
<title>Hybrid ECDHE-SIDH Key Exchange for TLS</title>

<author initials='F' surname='Kiefer' fullname='Franziskus Kiefer'>
    <organization />
</author>

<author initials='K' surname='Kwiatkowski' fullname='Krzysztof Kwiatkowski'>
    <organization />
</author>

<date month='November' day='5' year='2018' />

<abstract><t>This draft specifies a TLS key exchange that combines the post- quantum key exchange, Supersingular elliptic curve isogenie diffie- hellman (SIDH), with elliptic curve Diffie-Hellman (ECDHE) key exchange.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-kiefer-tls-ecdhe-sidh-00' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-kiefer-tls-ecdhe-sidh-00.txt' />
</reference>

<reference anchor="KPW13" >
  <front>
    <title>On the Security of the TLS Protocol: A Systematic Analysis</title>
    <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk">
      <organization></organization>
    </author>
    <author initials="K." surname="Paterson" fullname="Kenneth G. Paterson">
      <organization></organization>
    </author>
    <author initials="H." surname="Wee" fullname="Hoeteck Wee">
      <organization></organization>
    </author>
    <date year="2013"/>
  </front>
  <seriesInfo name="Advances in Cryptology – CRYPTO 2013" value="pp. 429-448"/>
  <seriesInfo name="DOI" value="10.1007/978-3-642-40041-4_24"/>
</reference>


<reference anchor="LANGLEY" target="https://www.imperialviolet.org/2018/04/11/pqconftls.html">
  <front>
    <title>Post-quantum confidentiality for TLS</title>
    <author initials="A." surname="Langley">
      <organization></organization>
    </author>
    <date year="2018" month="April" day="11"/>
  </front>
</reference>
<reference anchor="NIELSEN" >
  <front>
    <title>Quantum Computation and Quantum Information</title>
    <author initials="M.A." surname="Nielsen">
      <organization></organization>
    </author>
    <author initials="I.L." surname="Chuang">
      <organization></organization>
    </author>
    <date year="2000"/>
  </front>
  <seriesInfo name="Cambridge University Press" value=""/>
</reference>
<reference anchor="NIST" target="https://www.nist.gov/pqcrypto">
  <front>
    <title>Post-Quantum Cryptography</title>
    <author >
      <organization>National Institute of Standards and Technology (NIST)</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="NIST-FAQ" target="https://csrc.nist.gov/Projects/post-quantum-cryptography/faqs">
  <front>
    <title>Post-Quantum Cryptography - FAQs</title>
    <author >
      <organization>National Institute of Standards and Technology (NIST)</organization>
    </author>
    <date year="2020" month="January" day="28"/>
  </front>
</reference>
<reference anchor="NIST-SP-800-56C" target="https://doi.org/10.6028/NIST.SP.800-56Cr1">
  <front>
    <title>Recommendation for Key-Derivation Methods in Key-Establishment Schemes</title>
    <author >
      <organization>National Institute of Standards and Technology (NIST)</organization>
    </author>
    <date year="2018" month="April"/>
  </front>
</reference>
<reference anchor="NIST-SP-800-135" target="https://doi.org/10.6028/NIST.SP.800-135r1">
  <front>
    <title>Recommendation for Existing Application-Specific Key Derivation Functions</title>
    <author >
      <organization>National Institute of Standards and Technology (NIST)</organization>
    </author>
    <date year="2011" month="December"/>
  </front>
</reference>
<reference anchor="OQS-102" target="https://github.com/open-quantum-safe/openssl/tree/OQS-OpenSSL_1_0_2-stable">
  <front>
    <title>OQS-OpenSSL-1-0-2_stable</title>
    <author >
      <organization>Open Quantum Safe Project</organization>
    </author>
    <date year="2018" month="November"/>
  </front>
</reference>
<reference anchor="OQS-111" target="https://github.com/open-quantum-safe/openssl/tree/OQS-OpenSSL_1_1_1-stable">
  <front>
    <title>OQS-OpenSSL-1-1-1_stable</title>
    <author >
      <organization>Open Quantum Safe Project</organization>
    </author>
    <date year="2018" month="November"/>
  </front>
</reference>




<reference anchor="SCHANCK">
<front>
<title>A Transport Layer Security (TLS) Extension For Establishing An Additional Shared Secret</title>

<author initials='J' surname='Schanck' fullname='John Schanck'>
    <organization />
</author>

<author initials='D' surname='Stebila' fullname='Douglas Stebila'>
    <organization />
</author>

<date month='April' day='17' year='2017' />

<abstract><t>This document defines a Transport Layer Security (TLS) extension that allows parties to establish an additional shared secret using a second key exchange algorithm and incorporates this shared secret into the TLS key schedule.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-schanck-tls-additional-keyshare-00' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-schanck-tls-additional-keyshare-00.txt' />
</reference>



<reference anchor="WHYTE12">
<front>
<title>Quantum-Safe Hybrid (QSH) Ciphersuite for Transport Layer Security (TLS) version 1.2</title>

<author initials='J' surname='Schanck' fullname='John Schanck'>
    <organization />
</author>

<author initials='W' surname='Whyte' fullname='William Whyte'>
    <organization />
</author>

<author initials='Z' surname='Zhang' fullname='Zhenfei Zhang'>
    <organization />
</author>

<date month='July' day='22' year='2016' />

<abstract><t>This document describes the Quantum-Safe Hybrid ciphersuite, a new cipher suite providing modular design for quantum-safe cryptography to be adopted in the handshake for the Transport Layer Security (TLS) protocol version 1.2.  In particular, it specifies the use of the NTRUEncrypt encryption scheme in a TLS handshake.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-whyte-qsh-tls12-02' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-whyte-qsh-tls12-02.txt' />
</reference>



<reference anchor="WHYTE13">
<front>
<title>Quantum-Safe Hybrid (QSH) Key Exchange for Transport Layer Security (TLS) version 1.3</title>

<author initials='W' surname='Whyte' fullname='William Whyte'>
    <organization />
</author>

<author initials='Z' surname='Zhang' fullname='Zhenfei Zhang'>
    <organization />
</author>

<author initials='S' surname='Fluhrer' fullname='Scott Fluhrer'>
    <organization />
</author>

<author initials='O' surname='Garcia-Morchon' fullname='Oscar Garcia-Morchon'>
    <organization />
</author>

<date month='October' day='3' year='2017' />

<abstract><t>This document describes the Quantum-Safe Hybrid Key Exchange, a mechanism for providing modular design for quantum-safe cryptography to be adopted in the handshake for the Transport Layer Security (TLS) protocol version 1.3.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-whyte-qsh-tls13-06' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-whyte-qsh-tls13-06.txt' />
</reference>



<reference  anchor="XMSS" target='https://www.rfc-editor.org/info/rfc8391'>
<front>
<title>XMSS: eXtended Merkle Signature Scheme</title>
<author initials='A.' surname='Huelsing' fullname='A. Huelsing'><organization /></author>
<author initials='D.' surname='Butin' fullname='D. Butin'><organization /></author>
<author initials='S.' surname='Gazdag' fullname='S. Gazdag'><organization /></author>
<author initials='J.' surname='Rijneveld' fullname='J. Rijneveld'><organization /></author>
<author initials='A.' surname='Mohaisen' fullname='A. Mohaisen'><organization /></author>
<date year='2018' month='May' />
<abstract><t>This note describes the eXtended Merkle Signature Scheme (XMSS), a hash-based digital signature system that is based on existing descriptions in scientific literature.  This note specifies Winternitz One-Time Signature Plus (WOTS+), a one-time signature scheme; XMSS, a single-tree scheme; and XMSS^MT, a multi-tree variant of XMSS.  Both XMSS and XMSS^MT use WOTS+ as a main building block. XMSS provides cryptographic digital signatures without relying on the conjectured hardness of mathematical problems.  Instead, it is proven that it only relies on the properties of cryptographic hash functions.  XMSS provides strong security guarantees and is even secure when the collision resistance of the underlying hash function is broken.  It is suitable for compact implementations, is relatively simple to implement, and naturally resists side-channel attacks. Unlike most other signature systems, hash-based signatures can so far withstand known attacks using quantum computers.</t></abstract>
</front>
<seriesInfo name='RFC' value='8391'/>
<seriesInfo name='DOI' value='10.17487/RFC8391'/>
</reference>

<reference anchor="ZHANG" >
  <front>
    <title>On the Security of Multiple Encryption or CCA-security+CCA-security=CCA-security?</title>
    <author initials="R." surname="Zhang" fullname="Rui Zhang">
      <organization></organization>
    </author>
    <author initials="G." surname="Hanaoka" fullname="Goichiro Hanaoka">
      <organization></organization>
    </author>
    <author initials="J." surname="Shikata" fullname="Junji Shikata">
      <organization></organization>
    </author>
    <author initials="H." surname="Imai" fullname="Hideki Imai">
      <organization></organization>
    </author>
    <date year="2004"/>
  </front>
  <seriesInfo name="Public Key Cryptography – PKC 2004" value="pp. 360-374"/>
  <seriesInfo name="DOI" value="10.1007/978-3-540-24632-9_26"/>
</reference>



<reference anchor="I-D.irtf-cfrg-hpke">
<front>
<title>Hybrid Public Key Encryption</title>

<author initials='R' surname='Barnes' fullname='Richard Barnes'>
    <organization />
</author>

<author initials='K' surname='Bhargavan' fullname='Karthikeyan Bhargavan'>
    <organization />
</author>

<date month='November' day='4' year='2019' />

<abstract><t>This document describes a scheme for hybrid public-key encryption (HPKE).  This scheme provides authenticated public key encryption of arbitrary-sized plaintexts for a recipient public key.  HPKE works for any combination of an asymmetric key encapsulation mechanism (KEM), key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function.  We provide instantiations of the scheme using widely-used and efficient primitives.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-irtf-cfrg-hpke-02' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-irtf-cfrg-hpke-02.txt' />
</reference>




    </references>


<section anchor="related-work" title="Related work">

<t>Quantum computing and post-quantum cryptography in general are outside the scope of this document.  For a general introduction to quantum computing, see a standard textbook such as <xref target="NIELSEN"/>.  For an overview of post-quantum cryptography as of 2009, see <xref target="BERNSTEIN"/>.  For the current status of the NIST Post-Quantum Cryptography Standardization Project, see <xref target="NIST"/>.  For additional perspectives on the general transition from classical to post-quantum cryptography, see for example <xref target="ETSI"/> and <xref target="HOFFMAN"/>, among others.</t>

<t>There have been several Internet-Drafts describing mechanisms for embedding post-quantum and/or hybrid key exchange in TLS:</t>

<t><list style="symbols">
  <t>Internet-Drafts for TLS 1.2: <xref target="WHYTE12"/></t>
  <t>Internet-Drafts for TLS 1.3: <xref target="KIEFER"/>, <xref target="SCHANCK"/>, <xref target="WHYTE13"/></t>
</list></t>

<t>There have been several prototype implementations for post-quantum and/or hybrid key exchange in TLS:</t>

<t><list style="symbols">
  <t>Experimental implementations in TLS 1.2: <xref target="BCNS15"/>, <xref target="CECPQ1"/>, <xref target="FRODO"/>, <xref target="OQS-102"/></t>
  <t>Experimental implementations in TLS 1.3: <xref target="CECPQ2"/>, <xref target="OQS-111"/></t>
</list></t>

<t>These experimental implementations have taken an ad hoc approach and not attempted to implement one of the drafts listed above.</t>

<t>Unrelated to post-quantum but still related to the issue of combining multiple types of keying material in TLS is the use of pre-shared keys, especially the recent TLS working group document on including an external pre-shared key <xref target="EXTERN-PSK"/>.</t>

<t>Considering other IETF standards, there is work on post-quantum preshared keys in IKEv2 <xref target="IKE-PSK"/> and a framework for hybrid key exchange in IKEv2 <xref target="IKE-HYBRID"/>.  The XMSS hash-based signature scheme has been published as an informational RFC by the IRTF <xref target="XMSS"/>.</t>

<t>In the academic literature, <xref target="EVEN"/> initiated the study of combining multiple symmetric encryption schemes; <xref target="ZHANG"/>, <xref target="DODIS"/>, and <xref target="HARNIK"/> examined combining multiple public key encryption schemes, and <xref target="HARNIK"/> coined the term “robust combiner” to refer to a compiler that constructs a hybrid scheme from individual schemes while preserving security properties.  <xref target="GIACON"/> and <xref target="BINDEL"/> examined combining multiple key encapsulation mechanisms.</t>

</section>
<section anchor="design-considerations" title="Design Considerations">

<t>This appendix discusses choices one could make along four distinct axes when integrating hybrid key exchange into TLS 1.3:</t>

<t><list style="numbers">
  <t>How to negotiate the use of hybridization in general and component algorithms specifically?</t>
  <t>How many component algorithms can be combined?</t>
  <t>How should multiple key shares (public keys / ciphertexts) be conveyed?</t>
  <t>How should multiple shared secrets be combined?</t>
</list></t>

<t>The construction in the main body illustrates one selection along each of these axes.  The remainder of this appendix outlines various options we have identified for each of these choices.  Immediately below we provide a summary list.  Options are labelled with a short code in parentheses to provide easy cross-referencing.</t>

<t><list style="numbers">
  <t><xref target="neg">(Neg)</xref> How to negotiate the use of hybridization in general and component algorithms specifically?  <list style="symbols">
      <t><xref target="neg-ind">(Neg-Ind)</xref> Negotiating component algorithms individually      <list style="symbols">
          <t><xref target="neg-ind-1">(Neg-Ind-1)</xref> Traditional algorithms in <spanx style="verb">ClientHello</spanx> <spanx style="verb">supported_groups</spanx> extension, next-gen algorithms in another extension</t>
          <t><xref target="neg-ind-2">(Neg-Ind-2)</xref> Both types of algorithms in <spanx style="verb">supported_groups</spanx> with external mapping to tradition/next-gen.</t>
          <t><xref target="neg-ind-3">(Neg-Ind-3)</xref> Both types of algorithms in <spanx style="verb">supported_groups</spanx> separated by a delimiter.</t>
        </list></t>
      <t><xref target="neg-comb">(Neg-Comb)</xref> Negotiating component algorithms as a combination      <list style="symbols">
          <t><xref target="neg-comb-1">(Neg-Comb-1)</xref> Standardize <spanx style="verb">NamedGroup</spanx> identifiers for each desired combination.</t>
          <t><xref target="neg-comb-2">(Neg-Comb-2)</xref> Use placeholder identifiers in <spanx style="verb">supported_groups</spanx> with an extension defining the combination corresponding to each placeholder.</t>
          <t><xref target="neg-comb-3">(Neg-Comb-3)</xref> List combinations by inserting grouping delimiters into <spanx style="verb">supported_groups</spanx> list.</t>
        </list></t>
    </list></t>
  <t><xref target="num">(Num)</xref> How many component algorithms can be combined?  <list style="symbols">
      <t><xref target="num-2">(Num-2)</xref> Two.</t>
      <t><xref target="num-2-plus">(Num-2+)</xref> Two or more.</t>
    </list></t>
  <t><xref target="shares">(Shares)</xref> How should multiple key shares (public keys / ciphertexts) be conveyed?  <list style="symbols">
      <t><xref target="shares-concat">(Shares-Concat)</xref> Concatenate each combination of key shares.</t>
      <t><xref target="shares-multiple">(Shares-Multiple)</xref> Send individual key shares for each algorithm.</t>
      <t><xref target="shares-ext-additional">(Shares-Ext-Additional)</xref> Use an extension to convey key shares for component algorithms.</t>
    </list></t>
  <t><xref target="comb">(Comb)</xref> How should multiple shared secrets be combined?  <list style="symbols">
      <t><xref target="comb-concat">(Comb-Concat)</xref> Concatenate the shared secrets then use directly in the TLS 1.3 key schedule.</t>
      <t><xref target="comb-kdf-1">(Comb-KDF-1)</xref> and <xref target="comb-kdf-2">(Comb-KDF-2)</xref> KDF the shared secrets together, then use the output in the TLS 1.3 key schedule.</t>
      <t><xref target="comb-xor">(Comb-XOR)</xref> XOR the shared secrets then use directly in the TLS 1.3 key schedule.</t>
      <t><xref target="comb-chain">(Comb-Chain)</xref> Extend the TLS 1.3 key schedule so that there is a stage of the key schedule for each shared secret.</t>
      <t><xref target="comb-altinput">(Comb-AltInput)</xref> Use the second shared secret in an alternate (otherwise unused) input in the TLS 1.3 key schedule.</t>
    </list></t>
</list></t>

<section anchor="neg" title="(Neg) How to negotiate hybridization and component algorithms?">

<section anchor="key-exchange-negotiation-in-tls-13" title="Key exchange negotiation in TLS 1.3">

<t>Recall that in TLS 1.3, the key exchange mechanism is negotiated via the <spanx style="verb">supported_groups</spanx> extension.  The <spanx style="verb">NamedGroup</spanx> enum is a list of standardized groups for Diffie–Hellman key exchange, such as <spanx style="verb">secp256r1</spanx>, <spanx style="verb">x25519</spanx>, and <spanx style="verb">ffdhe2048</spanx>.</t>

<t>The client, in its <spanx style="verb">ClientHello</spanx> message, lists its supported mechanisms in the <spanx style="verb">supported_groups</spanx> extension.  The client also optionally includes the public key of one or more of these groups in the <spanx style="verb">key_share</spanx> extension as a guess of which mechanisms the server might accept in hopes of reducing the number of round trips.</t>

<t>If the server is willing to use one of the client’s requested mechanisms, it responds with a <spanx style="verb">key_share</spanx> extension containing its public key for the desired mechanism.</t>

<t>If the server is not willing to use any of the client’s requested mechanisms, the server responds with a <spanx style="verb">HelloRetryRequest</spanx> message that includes an extension indicating its preferred mechanism.</t>

</section>
<section anchor="neg-ind" title="(Neg-Ind) Negotiating component algorithms individually">

<t>In these three approaches, the parties negotiate which traditional algorithm and which next-gen algorithm to use independently.  The <spanx style="verb">NamedGroup</spanx> enum is extended to include algorithm identifiers for each next-gen algorithm.</t>

<section anchor="neg-ind-1" title="(Neg-Ind-1)">

<t>The client advertises two lists to the server: one list containing its supported traditional mechanisms (e.g. via the existing <spanx style="verb">ClientHello</spanx> <spanx style="verb">supported_groups</spanx> extension), and a second list containing its supported next-generation mechanisms (e.g., via an additional <spanx style="verb">ClientHello</spanx> extension).  A server could then select one algorithm from the traditional list, and one algorithm from the next-generation list.  (This is the approach in <xref target="SCHANCK"/>.)</t>

</section>
<section anchor="neg-ind-2" title="(Neg-Ind-2)">

<t>The client advertises a single list to the server which contains both its traditional and next-generation mechanisms (e.g., all in the existing <spanx style="verb">ClientHello</spanx> <spanx style="verb">supported_groups</spanx> extension), but with some external table provides a standardized mapping of those mechanisms as either “traditional” or “next-generation”.  A server could then select two algorithms from this list, one from each category.</t>

</section>
<section anchor="neg-ind-3" title="(Neg-Ind-3)">

<t>The client advertises a single list to the server delimited into sublists: one for its traditional mechanisms and one for its next-generation mechanisms, all in the existing <spanx style="verb">ClientHello</spanx> <spanx style="verb">supported_groups</spanx> extension, with a special code point serving as a delimiter between the two lists.  For example, <spanx style="verb">supported_groups = secp256r1, x25519, delimiter, nextgen1, nextgen4</spanx>.</t>

</section>
</section>
<section anchor="neg-comb" title="(Neg-Comb) Negotiating component algorithms as a combination">

<t>In these three approaches, combinations of key exchange mechanisms appear as a single monolithic block; the parties negotiate which of several combinations they wish to use.</t>

<section anchor="neg-comb-1" title="(Neg-Comb-1)">

<t>The <spanx style="verb">NamedGroup</spanx> enum is extended to include algorithm identifiers for each <spanx style="strong">combination</spanx> of algorithms desired by the working group.  There is no “internal structure” to the algorithm identifiers for each combination, they are simply new code points assigned arbitrarily.  The client includes any desired combinations in its <spanx style="verb">ClientHello</spanx> <spanx style="verb">supported_groups</spanx> list, and the server picks one of these.  This is the approach in <xref target="KIEFER"/> and <xref target="OQS-111"/>.</t>

</section>
<section anchor="neg-comb-2" title="(Neg-Comb-2)">

<t>The <spanx style="verb">NamedGroup</spanx> enum is extended to include algorithm identifiers for each next-gen algorithm.  Some additional field/extension is used to convey which combinations the parties wish to use.  For example, in <xref target="WHYTE13"/>, there are distinguished <spanx style="verb">NamedGroup</spanx> called <spanx style="verb">hybrid_marker 0</spanx>, <spanx style="verb">hybrid_marker 1</spanx>, <spanx style="verb">hybrid_marker 2</spanx>, etc.  This is complemented by a <spanx style="verb">HybridExtension</spanx> which contains mappings for each numbered <spanx style="verb">hybrid_marker</spanx> to the set of component key exchange algorithms (2 or more) for that proposed combination.</t>

</section>
<section anchor="neg-comb-3" title="(Neg-Comb-3)">

<t>The client lists combinations in <spanx style="verb">supported_groups</spanx> list, using a special delimiter to indicate combinations.  For example,
<spanx style="verb">supported_groups = combo_delimiter, secp256r1, nextgen1, combo_delimiter, secp256r1, nextgen4, standalone_delimiter, secp256r1, x25519</spanx> would indicate that the client’s highest preference is the combination secp256r1+nextgen1, the next highest preference is the combination secp2561+nextgen4, then the single algorithm secp256r1, then the single algorithm x25519.  A hybrid-aware server would be able to parse these; a hybrid-unaware server would see <spanx style="verb">unknown, secp256r1, unknown, unknown, secp256r1, unknown, unknown, secp256r1, x25519</spanx>, which it would be able to process, although there is the potential that every “projection” of a hybrid list that is tolerable to a client does not result in list that is tolerable to the client.</t>

</section>
</section>
<section anchor="benefits-and-drawbacks" title="Benefits and drawbacks">

<t><spanx style="strong">Combinatorial explosion.</spanx> <xref target="neg-comb-1">(Neg-Comb-1)</xref> requires new identifiers to be defined for each desired combination.  The other 4 options in this section do not.</t>

<t><spanx style="strong">Extensions.</spanx> <xref target="neg-ind-1">(Neg-Ind-1)</xref> and <xref target="neg-comb-2">(Neg-Comb-2)</xref> require new extensions to be defined.  The other options in this section do not.</t>

<t><spanx style="strong">New logic.</spanx> All options in this section except <xref target="neg-comb-1">(Neg-Comb-1)</xref> require new logic to process negotiation.</t>

<t><spanx style="strong">Matching security levels.</spanx> <xref target="neg-ind-1">(Neg-Ind-1)</xref>, <xref target="neg-ind-2">(Neg-Ind-2)</xref>, <xref target="neg-ind-3">(Neg-Ind-3)</xref>, and <xref target="neg-comb-2">(Neg-Comb-2)</xref> allow algorithms of different claimed security level from their corresponding lists to be combined.  For example, this could result in combining ECDH secp256r1 (classical security level 128) with NewHope-1024 (classical security level 256).  Implementations dissatisfied with a mismatched security levels must either accept this mismatch or attempt to renegotiate.  <xref target="neg-ind-1">(Neg-Ind-1)</xref>, <xref target="neg-ind-2">(Neg-Ind-2)</xref>, and <xref target="neg-ind-3">(Neg-Ind-3)</xref> give control over the combination to the server; <xref target="neg-comb-2">(Neg-Comb-2)</xref> gives control over the combination to the client.  <xref target="neg-comb-1">(Neg-Comb-1)</xref> only allows standardized combinations, which could be set by TLS working group to have matching security (provided security estimates do not evolve separately).</t>

<t><spanx style="strong">Backwards-compability.</spanx> TLS 1.3-compliant hybrid-unaware servers should ignore unreocgnized elements in <spanx style="verb">supported_groups</spanx> <xref target="neg-ind-2">(Neg-Ind-2)</xref>, <xref target="neg-ind-3">(Neg-Ind-3)</xref>, <xref target="neg-comb-1">(Neg-Comb-1)</xref>, <xref target="neg-comb-2">(Neg-Comb-2)</xref> and unrecognized <spanx style="verb">ClientHello</spanx> extensions <xref target="neg-ind-1">(Neg-Ind-1)</xref>, <xref target="neg-comb-2">(Neg-Comb-2)</xref>.  In <xref target="neg-ind-3">(Neg-Ind-3)</xref> and <xref target="neg-comb-3">(Neg-Comb-3)</xref>, a server that is hybrid-unaware will ignore the delimiters in <spanx style="verb">supported_groups</spanx>, and thus might try to negotiate an algorithm individually that is only meant to be used in combination; depending on how such an implementation is coded, it may also encounter bugs when the same element appears multiple times in the list.</t>

</section>
</section>
<section anchor="num" title="(Num) How many component algorithms to combine?">

<section anchor="num-2" title="(Num-2) Two">

<t>Exactly two algorithms can be combined together in hybrid key exchange.  This is the approach taken in <xref target="KIEFER"/> and <xref target="SCHANCK"/>.</t>

</section>
<section anchor="num-2-plus" title="(Num-2+) Two or more">

<t>Two or more algorithms can be combined together in hybrid key exchange.  This is the approach taken in <xref target="WHYTE13"/>.</t>

</section>
<section anchor="benefits-and-drawbacks-1" title="Benefits and Drawbacks">

<t>Restricting the number of component algorithms that can be hybridized to two substantially reduces the generality required.  On the other hand, some adopters may want to further reduce risk by employing multiple next-gen algorithms built on different cryptographic assumptions.</t>

</section>
</section>
<section anchor="shares" title="(Shares) How to convey key shares?">

<t>In ECDH ephmeral key exchange, the client sends its ephmeral public key in the <spanx style="verb">key_share</spanx> extension of the <spanx style="verb">ClientHello</spanx> message, and the server sends its ephmeral public key in the <spanx style="verb">key_share</spanx> extension of the <spanx style="verb">ServerHello</spanx> message.</t>

<t>For a general key encapsulation mechanism used for ephemeral key exchange, we imagine that that client generates a fresh KEM public key / secret pair for each connection, sends it to the client, and the server responds with a KEM ciphertext.  For simplicity and consistency with TLS 1.3 terminology, we will refer to both of these types of objects as “key shares”.</t>

<t>In hybrid key exchange, we have to decide how to convey the client’s two (or more) key shares, and the server’s two (or more) key shares.</t>

<section anchor="shares-concat" title="(Shares-Concat) Concatenate key shares">

<t>The client concatenates the bytes representing its two key shares and uses this directly as the <spanx style="verb">key_exchange</spanx> value in a <spanx style="verb">KeyShareEntry</spanx> in its <spanx style="verb">key_share</spanx> extension.  The server does the same thing.  Note that the <spanx style="verb">key_exchange</spanx> value can be an octet string of length at most 2^16-1.  This is the approach taken in <xref target="KIEFER"/>, <xref target="OQS-111"/>, and <xref target="WHYTE13"/>.</t>

</section>
<section anchor="shares-multiple" title="(Shares-Multiple) Send multiple key shares">

<t>The client sends multiple key shares directly in the <spanx style="verb">client_shares</spanx> vectors of the <spanx style="verb">ClientHello</spanx> <spanx style="verb">key_share</spanx> extension.  The server does the same.  (Note that while the existing <spanx style="verb">KeyShareClientHello</spanx> struct allows for multiple key share entries, the existing <spanx style="verb">KeyShareServerHello</spanx> only permits a single key share entry, so some modification would be required to use this approach for the server to send multiple key shares.)</t>

</section>
<section anchor="shares-ext-additional" title="(Shares-Ext-Additional) Extension carrying additional key shares">

<t>The client sends the key share for its traditional algorithm in the original <spanx style="verb">key_share</spanx> extension of the <spanx style="verb">ClientHello</spanx> message, and the key share for its next-gen algorithm in some additional extension in the <spanx style="verb">ClientHello</spanx> message.  The server does the same thing.  This is the approach taken in <xref target="SCHANCK"/>.</t>

</section>
<section anchor="benefits-and-drawbacks-2" title="Benefits and Drawbacks">

<t><spanx style="strong">Backwards compatibility.</spanx> <xref target="shares-multiple">(Shares-Multiple)</xref> is fully backwards compatible with non-hybrid-aware servers.  <xref target="shares-ext-additional">(Shares-Ext-Additional)</xref> is backwards compatible with non-hybrid-aware servers provided they ignore unrecognized extensions.  <xref target="shares-concat">(Shares-Concat)</xref> is backwards-compatible with non-hybrid aware servers, but may result in duplication / additional round trips (see below).</t>

<t><spanx style="strong">Duplication versus additional round trips.</spanx> If a client wants to offer multiple key shares for multiple combinations in order to avoid retry requests, then the client may ended up sending a key share for one algorithm multiple times when using <xref target="shares-ext-additional">(Shares-Ext-Additional)</xref> and <xref target="shares-concat">(Shares-Concat)</xref>.  (For example, if the client wants to send an ECDH-secp256r1 + McEliece123 key share, and an ECDH-secp256r1 + NewHope1024 key share, then the same ECDH public key may be sent twice.  If the client also wants to offer a traditional ECDH-only key share for non-hybrid-aware implementations and avoid retry requests, then that same ECDH public key may be sent another time.)  <xref target="shares-multiple">(Shares-Multiple)</xref> does not result in duplicate key shares.</t>

</section>
</section>
<section anchor="comb" title="(Comb) How to use keys?">

<t>Each component key exchange algorithm establishes a shared secret.  These shared secrets must be combined in some way that achieves the “hybrid” property: the resulting secret is secure as long as at least one of the component key exchange algorithms is unbroken.</t>

<section anchor="comb-concat" title="(Comb-Concat) Concatenate keys">

<t>Each party concatenates the shared secrets established by each component algorithm in an agreed-upon order, then feeds that through the TLS key schedule.  In the context of TLS 1.3, this would mean using the concatenated shared secret in place of the (EC)DHE input to the second call to <spanx style="verb">HKDF-Extract</spanx> in the TLS 1.3 key schedule:</t>

<figure><artwork><![CDATA[
                                    0
                                    |
                                    v
                      PSK ->  HKDF-Extract = Early Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                    v
                              Derive-Secret(., "derived", "")
                                    |
                                    v
concatenated_shared_secret -> HKDF-Extract = Handshake Secret
^^^^^^^^^^^^^^^^^^^^^^^^^^          |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                    v
                              Derive-Secret(., "derived", "")
                                    |
                                    v
                         0 -> HKDF-Extract = Master Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
]]></artwork></figure>

<t>This is the approach used in <xref target="KIEFER"/>, <xref target="OQS-111"/>, and <xref target="WHYTE13"/>.</t>

<t><xref target="GIACON"/> analyzes the security of applying a KDF to concatenated KEM shared secrets, but their analysis does not exactly apply here since the transcript of ciphertexts is included in the KDF application (though it should follow relatively straightforwardly).</t>

<t><xref target="BINDEL"/> analyzes the security of the (Comb-Concat) approach as abstracted in their <spanx style="verb">dualPRF</spanx> combiner.  They show that, if the component KEMs are IND-CPA-secure (or IND-CCA-secure), then the values output by <spanx style="verb">Derive-Secret</spanx> are IND-CPA-secure (respectively, IND-CCA-secure).  An important aspect of their analysis is that each ciphertext is input to the final PRF calls; this holds for TLS 1.3 since the <spanx style="verb">Derive-Secret</spanx> calls that derive output keys (application traffic secrets, and exporter and resumption master secrets) include the transcript hash as input.</t>

</section>
<section anchor="comb-kdf-1" title="(Comb-KDF-1) KDF keys">

<t>Each party feeds the shared secrets established by each component algorithm in an agreed-upon order into a KDF, then feeds that through the TLS key schedule.  In the context of TLS 1.3, this would mean first applying <spanx style="verb">HKDF-Extract</spanx> to the shared secrets, then using the output in place of the (EC)DHE input to the second call to <spanx style="verb">HKDF-Extract</spanx> in the TLS 1.3 key schedule:</t>

<figure><artwork><![CDATA[
                                    0
                                    |
                                    v
                      PSK ->  HKDF-Extract = Early Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
               Next-Gen             |
                   |                v
  (EC)DHE -> HKDF-Extract     Derive-Secret(., "derived", "")
                   |                |
                   v                v
                output -----> HKDF-Extract = Handshake Secret
                ^^^^^^              |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                    v
                              Derive-Secret(., "derived", "")
                                    |
                                    v
                         0 -> HKDF-Extract = Master Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
]]></artwork></figure>

</section>
<section anchor="comb-kdf-2" title="(Comb-KDF-2) KDF keys">

<t>Each party concatenates the shared secrets established by each component algorithm in an agreed-upon order then feeds that into a KDF, then feeds the result through the TLS key schedule.</t>

<t>Compared with <xref target="comb-kdf-1">(Comb-KDF-1)</xref>, this method concatenates the (2 or more) shared secrets prior to input to the KDF, whereas (Comb-KDF-1) puts the (exactly 2) shared secrets in the two different input slots to the KDF.</t>

<t>Compared with <xref target="comb-concat">(Comb-Concat)</xref>, this method has an extract KDF application.  While this adds computational overhead, this may provide a cleaner abstraction of the hybridization mechanism for the purposes of formal security analysis.</t>

<figure><artwork><![CDATA[
                                    0
                                    |
                                    v
                      PSK ->  HKDF-Extract = Early Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                   v
  concatenated     0
  shared           |
  secret  -> HKDF-Extract     Derive-Secret(., "derived", "")
  ^^^^^^           |                |
                   v                v
                output -----> HKDF-Extract = Handshake Secret
                ^^^^^^              |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                    v
                              Derive-Secret(., "derived", "")
                                    |
                                    v
                         0 -> HKDF-Extract = Master Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
]]></artwork></figure>

</section>
<section anchor="comb-xor" title="(Comb-XOR) XOR keys">

<t>Each party XORs the shared secrets established by each component algorithm (possibly after padding secrets of different lengths), then feeds that through the TLS key schedule.  In the context of TLS 1.3, this would mean using the XORed shared secret in place of the (EC)DHE input to the second call to <spanx style="verb">HKDF-Extract</spanx> in the TLS 1.3 key schedule.</t>

<t><xref target="GIACON"/> analyzes the security of applying a KDF to the XORed KEM shared secrets, but their analysis does not quite apply here since the transcript of ciphertexts is included in the KDF application (though it should follow relatively straightforwardly).</t>

</section>
<section anchor="comb-chain" title="(Comb-Chain) Chain of KDF applications for each key">

<t>Each party applies a chain of key derivation functions to the shared secrets established by each component algorithm in an agreed-upon order; roughly speaking: <spanx style="verb">F(k1 || F(k2))</spanx>.  In the context of TLS 1.3, this would mean extending the key schedule to have one round of the key schedule applied for each component algorithm’s shared secret:</t>

<figure><artwork><![CDATA[
                                    0
                                    |
                                    v
                      PSK ->  HKDF-Extract = Early Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                    v
                              Derive-Secret(., "derived", "")
                                    |
                                    v
 traditional_shared_secret -> HKDF-Extract
 ^^^^^^^^^^^^^^^^^^^^^^^^^          |
                              Derive-Secret(., "derived", "")
                                    |
                                    v
    next_gen_shared_secret -> HKDF-Extract = Handshake Secret
    ^^^^^^^^^^^^^^^^^^^^^^          |                             
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                    v
                              Derive-Secret(., "derived", "")
                                    |
                                    v
                         0 -> HKDF-Extract = Master Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
]]></artwork></figure>

<t>This is the approach used in <xref target="SCHANCK"/>.</t>

<t><xref target="BINDEL"/> analyzes the security of this approach as abstracted in their nested dual-PRF <spanx style="verb">N</spanx> combiner, showing a similar result as for the dualPRF combiner that it preserves IND-CPA (or IND-CCA) security. Again their analysis depends on each ciphertext being input to the final PRF (<spanx style="verb">Derive-Secret</spanx>) calls, which holds for TLS 1.3.</t>

</section>
<section anchor="comb-altinput" title="(Comb-AltInput) Second shared secret in an alternate KDF input">

<t>In the context of TLS 1.3, the next-generation shared secret is used in place of a currently unused input in the TLS 1.3 key schedule, namely replacing the <spanx style="verb">0</spanx> “IKM” input to the final <spanx style="verb">HKDF-Extract</spanx>:</t>

<figure><artwork><![CDATA[
                                    0
                                    |
                                    v
                      PSK ->  HKDF-Extract = Early Secret
                                    |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                    v
                              Derive-Secret(., "derived", "")
                                    |
                                    v
 traditional_shared_secret -> HKDF-Extract = Handshake Secret
 ^^^^^^^^^^^^^^^^^^^^^^^^^          |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    |
                                    v
                              Derive-Secret(., "derived", "")
                                    |
                                    v
    next_gen_shared_secret -> HKDF-Extract = Master Secret
    ^^^^^^^^^^^^^^^^^^^^^^          |
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
                                    +-----> Derive-Secret(...)
]]></artwork></figure>

<t>This approach is not taken in any of the known post-quantum/hybrid TLS drafts.  However, it bears some similarities to the approach for using external PSKs in <xref target="EXTERN-PSK"/>.</t>

</section>
<section anchor="benefits-and-drawbacks-3" title="Benefits and Drawbacks">

<t><spanx style="strong">New logic.</spanx>  While <xref target="comb-concat">(Comb-Concat)</xref>, <xref target="comb-kdf-1">(Comb-KDF-1)</xref>, and <xref target="comb-kdf-2">(Comb-KDF-2)</xref> require new logic to compute the concatenated shared secret, this value can then be used by the TLS 1.3 key schedule without changes to the key schedule logic.  In contrast, <xref target="comb-chain">(Comb-Chain)</xref> requires the TLS 1.3 key schedule to be extended for each extra component algorithm.</t>

<t><spanx style="strong">Philosophical.</spanx>  The TLS 1.3 key schedule already applies a new stage for different types of keying material (PSK versus (EC)DHE), so <xref target="comb-chain">(Comb-Chain)</xref> continues that approach.</t>

<t><spanx style="strong">Efficiency.</spanx> <xref target="comb-kdf-1">(Comb-KDF-1)</xref>, <xref target="comb-kdf-2">(Comb-KDF-2)</xref>, and <xref target="comb-chain">(Comb-Chain)</xref> increase the number of KDF applications for each component algorithm, whereas <xref target="comb-concat">(Comb-Concat)</xref> and <xref target="comb-altinput">(Comb-AltInput)</xref> keep the number of KDF applications the same (though with potentially longer inputs).</t>

<t><spanx style="strong">Extensibility.</spanx>  <xref target="comb-altinput">(Comb-AltInput)</xref> changes the use of an existing input, which might conflict with other future changes to the use of the input.</t>

<t><spanx style="strong">More than 2 component algorithms.</spanx>  The techniques in <xref target="comb-concat">(Comb-Concat)</xref> and <xref target="comb-chain">(Comb-Chain)</xref> can naturally accommodate more than 2 component shared secrets since there is no distinction to how each shared secret is treated.  <xref target="comb-altinput">(Comb-AltInput)</xref> would have to make some distinct, since the 2 component shared secrets are used in different ways; for example, the first shared secret is used as the “IKM” input in the 2nd <spanx style="verb">HKDF-Extract</spanx> call, and all subsequent shared secrets are concatenated to be used as the “IKM” input in the 3rd <spanx style="verb">HKDF-Extract</spanx> call.</t>

</section>
</section>
</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>

