<?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.9 -->

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

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

<rfc ipr="trust200902" docName="draft-irtf-cfrg-hpke-00" category="info">

  <front>
    <title abbrev="HPKE">Hybrid Public Key Encryption</title>

    <author initials="R.L." surname="Barnes" fullname="Richard L. Barnes">
      <organization>Cisco</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>
    <author initials="K." surname="Bhargavan" fullname="Karthik Bhargavan">
      <organization>Inria</organization>
      <address>
        <email>karthikeyan.bhargavan@inria.fr</email>
      </address>
    </author>

    <date year="2019" month="July" day="03"/>

    
    
    <keyword>Internet-Draft</keyword>

    <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>

  <middle>


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

<t>“Hybrid” public-key encryption schemes (HPKE) that combine
asymmetric and symmetric algorithms are a substantially more
efficient solution than traditional public key encryption techniques
such as those based on RSA or ElGamal.  Encrypted messages convey a
single ciphertext and authentication tag alongside a short public
key, which may be further compressed. The key size and computational
complexity of elliptic curve cryptographic primitives for
authenticated encryption therefore make it compelling for a variety
of use cases. This type of public key encryption has many
applications in practice, for example:</t>

<t><list style="symbols">
  <t>PGP <xref target="RFC6637"/></t>
  <t>Messaging Layer Security <xref target="I-D.ietf-mls-protocol"/></t>
  <t>Encrypted Server Name Indication <xref target="I-D.ietf-tls-esni"/></t>
  <t>Protection of 5G subscriber identities <xref target="fiveG"/></t>
</list></t>

<t>Currently, there are numerous competing and non-interoperable
standards and variants for hybrid encryption, including ANSI X9.63
<xref target="ANSI"/>, IEEE 1363a <xref target="IEEE"/>, ISO/IEC 18033-2 <xref target="ISO"/>, and SECG SEC
1 <xref target="SECG"/>.  All of these existing schemes have problems, e.g.,
because they rely on outdated primitives, lack proofs of IND-CCA2
security, or fail to provide test vectors.</t>

<t>This document defines an HPKE scheme that provides a subset
of the functions provided by the collection of schemes above, but
specified with sufficient clarity that they can be interoperably
implemented and formally verified.</t>

</section>
<section anchor="requirements-notation" title="Requirements Notation">

<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”,
“SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and
“OPTIONAL” in this document are to be interpreted as described in
BCP14 <xref target="RFC2119"/> <xref target="RFC8174"/>  when, and only when, they appear in
all capitals, as shown here.</t>

</section>
<section anchor="security-properties" title="Security Properties">

<t>As a hybrid authentication encryption algorithm, we desire security
against (adaptive) chosen ciphertext attacks (IND-CCA2 secure). The
HPKE variants described in this document achieve this property under
the Random Oracle model assuming the gap Computational Diffie
Hellman (CDH) problem is hard <xref target="S01"/>.</t>

<t>[[ TODO - Provide citations to these proofs once they exist ]]</t>

</section>
<section anchor="notation" title="Notation">

<t>The following terms are used throughout this document to describe the
operations, roles, and behaviors of HPKE:</t>

<t><list style="symbols">
  <t>Initiator (I): Sender of an encrypted message.</t>
  <t>Responder (R): Receiver of an encrypted message.</t>
  <t>Ephemeral (E): A fresh random value meant for one-time use.</t>
  <t><spanx style="verb">(skX, pkX)</spanx>: A KEM key pair used in role X; <spanx style="verb">skX</spanx> is the private
key and <spanx style="verb">pkX</spanx> is the public key</t>
  <t><spanx style="verb">pk(skX)</spanx>: The public key corresponding to private key <spanx style="verb">skX</spanx></t>
  <t><spanx style="verb">len(x)</spanx>: The length of the octet string <spanx style="verb">x</spanx>, expressed as a
two-octet unsigned integer in network (big-endian) byte order</t>
  <t><spanx style="verb">encode_big_endian(x, n)</spanx>: An octet string encoding the integer
value <spanx style="verb">x</spanx> as an n-byte big-endian value</t>
  <t><spanx style="verb">concat(x0, ..., xN)</spanx>: Concatenation of octet strings.
<spanx style="verb">concat(0x01, 0x0203, 0x040506) = 0x010203040506</spanx></t>
  <t><spanx style="verb">zero(n)</spanx>: An all-zero octet string of length <spanx style="verb">n</spanx>. <spanx style="verb">zero(4) =
0x00000000</spanx></t>
  <t><spanx style="verb">xor(a,b)</spanx>: XOR of octet strings; <spanx style="verb">xor(0xF0F0, 0x1234) = 0xE2C4</spanx>.
It is an error to call this function with two arguments of unequal
length.</t>
</list></t>

</section>
<section anchor="cryptographic-dependencies" title="Cryptographic Dependencies">

<t>HPKE variants rely on the following primitives:</t>

<t><list style="symbols">
  <t>A Key Encapsulation Mechanism (KEM):
  <list style="symbols">
      <t>GenerateKeyPair(): Generate a key pair (sk, pk)</t>
      <t>Marshal(pk): Produce a fixed-length octet string encoding the
public key <spanx style="verb">pk</spanx></t>
      <t>Unmarshal(enc): Parse a fixed-length octet string to recover a
public key</t>
      <t>Encap(pk): Generate an ephemeral symmetric key and a
fixed-length encapsulation of that key that can be decapsulated
by the holder of the private key corresponding to pk</t>
      <t>Decap(enc, sk): Use the private key <spanx style="verb">sk</spanx> to recover the ephemeral
symmetric key from its encapsulated representation <spanx style="verb">enc</spanx></t>
      <t>AuthEncap(pkR, skI) (optional): Same as Encap(), but the outputs
encode an assurance that the ephemeral shared key is known only
to the holder of the private key <spanx style="verb">skI</spanx></t>
      <t>AuthDecap(skR, pkI) (optional): Same as Decap(), but the holder
of the private key <spanx style="verb">skR</spanx> is assured that the ephemeral shared
key is known only to the holder of the private key corresponding
to <spanx style="verb">pkI</spanx></t>
      <t>Nenc: The length in octets of an encapsulated key from this KEM</t>
      <t>Npk: The length in octets of a public key for this KEM</t>
    </list></t>
  <t>A Key Derivation Function:
  <list style="symbols">
      <t>Extract(salt, IKM): Extract a pseudorandom key of fixed length
from input keying material <spanx style="verb">IKM</spanx> and an optional octet string
<spanx style="verb">salt</spanx></t>
      <t>Expand(PRK, info, L): Expand a pseudorandom key <spanx style="verb">PRK</spanx> using
optional string <spanx style="verb">info</spanx> into <spanx style="verb">L</spanx> bytes of output keying material</t>
      <t>Nh: The output size of the Extract function</t>
    </list></t>
  <t>An AEAD encryption algorithm <xref target="RFC5116"/>:
  <list style="symbols">
      <t>Seal(key, nonce, aad, pt): Encrypt and authenticate plaintext
<spanx style="verb">pt</spanx> with associated data <spanx style="verb">aad</spanx> using secret key <spanx style="verb">key</spanx> and nonce
<spanx style="verb">nonce</spanx>, yielding ciphertext and tag <spanx style="verb">ct</spanx></t>
      <t>Open(key, nonce, aad, ct): Decrypt ciphertext <spanx style="verb">ct</spanx> using
associated data <spanx style="verb">aad</spanx> with secret key <spanx style="verb">key</spanx> and nonce <spanx style="verb">nonce</spanx>,
returning plaintext message <spanx style="verb">pt</spanx> or the error value <spanx style="verb">OpenError</spanx></t>
      <t>Nk: The length in octets of a key for this algorithm</t>
      <t>Nn: The length in octets of a nonce for this algorithm</t>
    </list></t>
</list></t>

<t>A set of algorithm identifiers for concrete instantiations of these
primitives is provided in <xref target="ciphersuites"/>.  Algorithm identifier
values are two octets long.</t>

<section anchor="dh-based-kem" title="DH-Based KEM">

<t>Suppose we are given a Diffie-Hellman group that provides the
following operations:</t>

<t><list style="symbols">
  <t>GenerateKeyPair(): Generate an ephemeral key pair <spanx style="verb">(sk, pk)</spanx>
for the DH group in use</t>
  <t>DH(sk, pk): Perform a non-interactive DH exchange using the
private key sk and public key pk to produce a fixed-length shared
secret</t>
  <t>Marshal(pk): Produce a fixed-length octet string encoding the
public key <spanx style="verb">pk</spanx></t>
  <t>Unmarshal(enc): Parse a fixed-length octet string to recover a
public key</t>
</list></t>

<t>Then we can construct a KEM (which we’ll call “DHKEM”) in the
following way:</t>

<figure><artwork><![CDATA[
def Encap(pkR):
  skE, pkE = GenerateKeyPair()
  zz = DH(skE, pkR)
  enc = Marshal(pkE)
  return zz, enc

def Decap(enc, skR):
  pkE = Unmarshal(enc)
  return DH(skR, pkE)

def AuthEncap(pkR, skI):
  skE, pkE = GenerateKeyPair()
  zz = concat(DH(skE, pkR), DH(skI, pkR))
  enc = Marshal(pkE)
  return zz, enc

def AuthDecap(enc, skR, pkI):
  pkE = Unmarshal(enc)
  return concat(DH(skR, pkE), DH(skR, pkI))
]]></artwork></figure>

<t>The GenerateKeyPair, Marshal, and Unmarshal functions are the same
as for the underlying DH group.  The Marshal functions for the
curves referenced in {#ciphersuites} are as follows:</t>

<t><list style="symbols">
  <t>P-256: The X-coordinate of the point, encoded as a 32-octet
big-endian integer</t>
  <t>P-521: The X-coordinate of the point, encoded as a 66-octet
big-endian integer</t>
  <t>Curve25519: The standard 32-octet representation of the public key</t>
  <t>Curve448: The standard 56-octet representation of the public key</t>
</list></t>

</section>
</section>
<section anchor="hybrid-public-key-encryption" title="Hybrid Public Key Encryption">

<t>In this section, we define a few HPKE variants.  All variants take a
recipient public key and a sequence of plaintexts <spanx style="verb">pt</spanx>, and produce an
encapsulated key <spanx style="verb">enc</spanx> and a sequence of ciphertexts <spanx style="verb">ct</spanx>.  These outputs are
constructed so that only the holder of the private key corresponding
to <spanx style="verb">pkR</spanx> can decapsulate the key from <spanx style="verb">enc</spanx> and decrypt the
ciphertexts.  All of the algorithms also take an <spanx style="verb">info</spanx> parameter
that can be used to influence the generation of keys (e.g., to fold
in identity information) and an <spanx style="verb">aad</spanx> parameter that provides
Additional Authenticated Data to the AEAD algorithm in use.</t>

<t>In addition to the base case of encrypting to a public key, we
include two authenticated variants, one of which authenticates
possession of a pre-shared key, and one of which authenticates
possession of a KEM private key.  The following one-octet values
will be used to distinguish between modes:</t>

<texttable>
      <ttcol align='left'>Mode</ttcol>
      <ttcol align='left'>Value</ttcol>
      <c>mode_base</c>
      <c>0x00</c>
      <c>mode_psk</c>
      <c>0x01</c>
      <c>mode_auth</c>
      <c>0x02</c>
      <c>mode_psk_auth</c>
      <c>0x03</c>
</texttable>

<t>All of these cases follow the same basic two-step pattern:</t>

<t><list style="numbers">
  <t>Set up an encryption context that is shared between the sender
and the recipient</t>
  <t>Use that context to encrypt or decrypt content</t>
</list></t>

<t>A “context” encodes the AEAD algorithm and key in use, and manages
the nonces used so that the same nonce is not used with multiple
plaintexts.</t>

<t>The procedures described in this session are laid out in a
Python-like pseudocode.  The algorithms in use are left implicit.</t>

<section anchor="creating-an-encryption-context" title="Creating an Encryption Context">

<t>The variants of HPKE defined in this document share a common
mechanism for translating the protocol inputs into an encryption
context.  The key schedule inputs are as follows:</t>

<t><list style="symbols">
  <t><spanx style="verb">pkR</spanx> - The receiver’s public key</t>
  <t><spanx style="verb">zz</spanx> - A shared secret generated via the KEM for this transaction</t>
  <t><spanx style="verb">enc</spanx> - An encapsulated key produced by the KEM for the receiver</t>
  <t><spanx style="verb">info</spanx> - Application-supplied information (optional; default value
“”)</t>
  <t><spanx style="verb">psk</spanx> - A pre-shared secret held by both the initiator
and the receiver (optional; default value <spanx style="verb">zero(Nh)</spanx>).</t>
  <t><spanx style="verb">pskID</spanx> - An identifier for the PSK (optional; default
value <spanx style="verb">"" = zero(0)</spanx></t>
  <t><spanx style="verb">pkI</spanx> - The initiator’s public key (optional; default
value <spanx style="verb">zero(Npk)</spanx>)</t>
</list></t>

<t>The <spanx style="verb">psk</spanx> and <spanx style="verb">pskID</spanx> fields MUST appear together or not at all.
That is, if a non-default value is provided for one of them, then
the other MUST be set to a non-default value.</t>

<t>The key and nonce computed by this algorithm have the property that
they are only known to the holder of the receipient private key, and
the party that ran the KEM to generate <spanx style="verb">zz</spanx> and <spanx style="verb">enc</spanx>.  If the <spanx style="verb">psk</spanx>
and <spanx style="verb">pskID</spanx> arguments are provided, then the recipient is assured
that the initiator held the PSK.  If the <spanx style="verb">pkIm</spanx> argument is
provided, then the recipient is assued that the initator held the
corresponding private key (assuming that <spanx style="verb">zz</spanx> and <spanx style="verb">enc</spanx> were
generated using the AuthEncap / AuthDecap methods; see below).</t>

<figure><artwork><![CDATA[
default_pkIm = zero(Npk)
default_psk = zero(Nh)
default_pskId = zero(0)

def VerifyMode(mode, psk, pskID, pkIm):
  got_psk = (psk != default_psk and pskID != default_pskID)
  no_psk = (psk == default_psk and pskID == default_pskID)
  got_pkIm = (pkIm != default_pkIm)
  no_pkIm = (pkIm == default_pkIm)

  if mode == mode_base and (got_psk or got_pkIm):
    raise Exception("Invalid configuration for mode_base")
  if mode == mode_psk and (no_psk or got_pkIm):
    raise Exception("Invalid configuration for mode_psk")
  if mode == mode_auth and (got_psk or no_pkIm):
    raise Exception("Invalid configuration for mode_auth")
  if mode == mode_psk_auth and (no_psk or no_pkIm):
    raise Exception("Invalid configuration for mode_psk_auth")

def EncryptionContext(mode, pkRm, zz, enc, info, psk, pskID, pkIm):
  VerifyMode(mode, psk, pskID, pkI)

  pkRm = Marshal(pkR)
  context = concat(mode, ciphersuite, enc, pkRm, pkIm,
                   len(pskID), pskID, len(info), info)

  secret = Extract(psk, zz)
  key = Expand(secret, concat("hpke key", context), Nk)
  nonce = Expand(secret, concat("hpke nonce", context), Nn)
  return Context(key, nonce)
]]></artwork></figure>

<t>Note that the context construction in the KeySchedule procedure is
equivalent to serializing a structure of the following form in the
TLS presentation syntax:</t>

<figure><artwork><![CDATA[
struct {
    // Mode and algorithms
    uint8 mode;
    uint16 ciphersuite;

    // Public inputs to this key exchange
    opaque enc[Nenc];
    opaque pkR[Npk];
    opaque pkI[Npk];
    opaque pskID<0..2^16-1>;

    // Application-supplied info
    opaque info<0..2^16-1>;
} HPKEContext;
]]></artwork></figure>

</section>
<section anchor="encryption-to-a-public-key" title="Encryption to a Public Key">

<t>The most basic function of an HPKE scheme is to enable encryption
for the holder of a given KEM private key.  The <spanx style="verb">SetupBaseI()</spanx> and
<spanx style="verb">SetupBaseR()</spanx> procedures establish contexts that can be used to
encrypt and decrypt, respectively, for a given private key.</t>

<t>The the shared secret produced by the KEM is combined via the KDF
with information describing the key exchange, as well as the
explicit <spanx style="verb">info</spanx> parameter provided by the caller.</t>

<figure><artwork><![CDATA[
def SetupBaseI(pkR, info):
  zz, enc = Encap(pkR)
  return enc, KeySchedule(mode_base, pkR, zz, enc, info,
                          default_psk, default_pskID, default_pkIm)

def SetupBaseR(enc, skR, info):
  zz = Decap(enc, skR)
  return KeySchedule(mode_base, pk(skR), zz, enc, info,
                     default_psk, default_pskID, default_pkIm)
]]></artwork></figure>

</section>
<section anchor="authentication-using-a-pre-shared-key" title="Authentication using a Pre-Shared Key">

<t>This variant extends the base mechansism by allowing the recipient
to authenticate that the sender possessed a given pre-shared key
(PSK).  We assume that both parties have been provisioned with both
the PSK value <spanx style="verb">psk</spanx> and another octet string <spanx style="verb">pskID</spanx> that is used to
identify which PSK should be used.</t>

<t>The primary differences from the base case are:</t>

<t><list style="symbols">
  <t>The PSK is used as the <spanx style="verb">salt</spanx> input to the KDF (instead of 0)</t>
  <t>The PSK ID is added to the context string used as the <spanx style="verb">info</spanx> input
to the KDF</t>
</list></t>

<t>This mechanism is not suitable for use with a low-entropy password
as the PSK.  A malicious recipient that does not possess the PSK can
use decryption of a plaintext as an oracle for performing offline
dictionary attacks.</t>

<figure><artwork><![CDATA[
def SetupPSKI(pkR, psk, pskID, info):
  zz, enc = Encap(pkR)
  return enc, KeySchedule(pkR, zz, enc, info,
                          psk, pskId, default_pkIm)

def SetupPSKR(enc, skR, psk, pskID, info):
  zz = Decap(enc, skR)
  return KeySchedule(pk(skR), zz, enc, info,
                     psk, pskId, default_pkIm)
]]></artwork></figure>

</section>
<section anchor="authentication-using-an-asymmetric-key" title="Authentication using an Asymmetric Key">

<t>This variant extends the base mechansism by allowing the recipient
to authenticate that the sender possessed a given KEM private key.
This assurance is based on the assumption that
<spanx style="verb">AuthDecap(enc, skR, pkI)</spanx> produces the correct shared secret
only if the encapsulated value <spanx style="verb">enc</spanx> was produced by
<spanx style="verb">AuthEncap(pkR, skI)</spanx>, where <spanx style="verb">skI</spanx> is the private key corresponding
to <spanx style="verb">pkI</spanx>.  In other words, only two people could have produced this
secret, so if the recipient is one, then the sender must be the
other.</t>

<t>The primary differences from the base case are:</t>

<t><list style="symbols">
  <t>The calls to <spanx style="verb">Encap</spanx> and <spanx style="verb">Decap</spanx> are replaced with calls to
<spanx style="verb">AuthEncap</spanx> and <spanx style="verb">AuthDecap</spanx>.</t>
  <t>The initiator public key is added to the context string</t>
</list></t>

<t>Obviously, this variant can only be used with a KEM that provides
<spanx style="verb">AuthEncap()</spanx> and <spanx style="verb">AuthDecap()</spanx> procuedures.</t>

<t>This mechanism authenticates only the key pair of the initiator, not
any other identity.  If an application wishes to authenticate some
other identity for the sender (e.g., an email address or domain
name), then this identity should be included in the <spanx style="verb">info</spanx> parameter
to avoid unknown key share attacks.</t>

<figure><artwork><![CDATA[
def SetupAuthI(pkR, skI, info):
  zz, enc = AuthEncap(pkR, skI)
  pkIm = Marshal(pk(skI))
  return enc, KeySchedule(pkR, zz, enc, info,
                          default_psk, default_pskID, pkIm)

def SetupAuthR(enc, skR, pkI, info):
  zz = AuthDecap(enc, skR, pkI)
  pkIm = Marshal(pkI)
  return KeySchedule(pk(skR), zz, enc, info,
                     default_psk, default_pskID, pkIm)
]]></artwork></figure>

</section>
<section anchor="authentication-using-both-a-psk-and-an-asymmetric-key" title="Authentication using both a PSK and an Asymmetric Key">

<t>This mode is a straightforward combination of the PSK and
authenticated modes.  The PSK is passed through to the key schedule
as in the former, and as in the latter, we use the authenticated KEM
variants.</t>

<figure><artwork><![CDATA[
def SetupAuthI(pkR, psk, pskID, skI, info):
  zz, enc = AuthEncap(pkR, skI)
  pkIm = Marshal(pk(skI))
  return enc, KeySchedule(pkR, zz, enc, info, psk, pskID, pkIm)

def SetupAuthR(enc, skR, psk, pskID, pkI, info):
  zz = AuthDecap(enc, skR, pkI)
  pkIm = Marshal(pkI)
  return KeySchedule(pk(skR), zz, enc, info, psk, pskID, pkIm)
]]></artwork></figure>

</section>
<section anchor="encryption-and-decryption" title="Encryption and Decryption">

<t>HPKE allows multiple encryption operations to be done based on a
given setup transaction.  Since the public-key operations involved
in setup are typically more expensive than symmetric encryption or
decryption, this allows applications to “amortize” the cost of the
public-key operations, reducing the overall overhead.</t>

<t>In order to avoid nonce reuse, however, this decryption must be
stateful.  Each of the setup procedures above produces a context
object that stores the required state:</t>

<t><list style="symbols">
  <t>The AEAD algorithm in use</t>
  <t>The key to be used with the AEAD algorithm</t>
  <t>A base nonce value</t>
  <t>A sequence number (initially 0)</t>
</list></t>

<t>All of these fields except the sequence number are constant.  The
sequence number is used to provide nonce uniqueness: The nonce used
for each encryption or decryption operation is the result of XORing
the base nonce with the current sequence number, encoded as a
big-endian integer of the same length as the nonce.  Implementations
MAY use a sequence number that is shorter than the nonce (padding on
the left with zero), but MUST return an error if the sequence number
overflows.</t>

<t>Each encryption or decryption operation increments the sequence
number for the context in use.  A given context SHOULD be used either
only for encryption or only for decryption.</t>

<t>It is up to the application to ensure that encryptions and
decryptions are done in the proper sequence, so that the nonce
values used for encryption and decryption line up.</t>

<figure><artwork><![CDATA[
[[ TODO: Check for overflow, a la TLS ]]
def Context.Nonce(seq):
  encSeq = encode_big_endian(seq, len(self.nonce))
  return xor(self.nonce, encSeq)

def Context.Seal(aad, pt):
  ct = Seal(self.key, self.Nonce(self.seq), aad, pt)
  self.seq += 1
  return ct

def Context.Open(aad, ct):
  pt = Open(self.key, self.Nonce(self.seq), aad, ct)
  if pt == OpenError:
    return OpenError
  self.seq += 1
  return pt
]]></artwork></figure>

</section>
</section>
<section anchor="ciphersuites" title="Algorithm Identifiers">

<section anchor="key-encapsulation-mechanisms-kems" title="Key Encapsulation Mechanisms (KEMs)">

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>KEM</ttcol>
      <ttcol align='left'>Nenc</ttcol>
      <ttcol align='left'>Npk</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x0000</c>
      <c>(reserved)</c>
      <c>N/A</c>
      <c>N/A</c>
      <c>N/A</c>
      <c>0x0001</c>
      <c>DHKEM(P-256)</c>
      <c>32</c>
      <c>32</c>
      <c><xref target="NISTCurves"/></c>
      <c>0x0002</c>
      <c>DHKEM(Curve25519)</c>
      <c>32</c>
      <c>32</c>
      <c><xref target="RFC7748"/></c>
      <c>0x0003</c>
      <c>DHKEM(P-521)</c>
      <c>65</c>
      <c>65</c>
      <c><xref target="NISTCurves"/></c>
      <c>0x0004</c>
      <c>DHKEM(Curve448)</c>
      <c>56</c>
      <c>56</c>
      <c><xref target="RFC7748"/></c>
</texttable>

<t>For the NIST curves P-256 and P-521, the Marshal function of the DH
scheme produces the normal (non-compressed) representation of the
public key, according to <xref target="SECG"/>.  When these curves are used, the
recipient of an HPKE ciphertext MUST validate that the ephemeral public
key <spanx style="verb">pkE</spanx> is on the curve.  The relevant validation procedures are
defined in <xref target="keyagreement"/></t>

<t>For the CFRG curves Curve25519 and Curve448, the Marshal function is
the identity function, since these curves already use fixed-length
octet strings for public keys.</t>

</section>
<section anchor="key-derivation-functions-kdfs" title="Key Derivation Functions (KDFs)">

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>KDF</ttcol>
      <ttcol align='left'>Nh</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x0000</c>
      <c>(reserved)</c>
      <c>N/A</c>
      <c>N/A</c>
      <c>0x0001</c>
      <c>HKDF-SHA256</c>
      <c>32</c>
      <c><xref target="RFC5869"/></c>
      <c>0x0002</c>
      <c>HKDF-SHA512</c>
      <c>64</c>
      <c><xref target="RFC5869"/></c>
</texttable>

</section>
<section anchor="authentication-encryption-with-associated-data-aead-functions" title="Authentication Encryption with Associated Data (AEAD) Functions">

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>AEAD</ttcol>
      <ttcol align='left'>Nk</ttcol>
      <ttcol align='left'>Nn</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x0000</c>
      <c>(reserved)</c>
      <c>N/A</c>
      <c>N/A</c>
      <c>N/A</c>
      <c>0x0001</c>
      <c>AES-GCM-128</c>
      <c>16</c>
      <c>12</c>
      <c><xref target="GCM"/></c>
      <c>0x0002</c>
      <c>AES-GCM-256</c>
      <c>32</c>
      <c>12</c>
      <c><xref target="GCM"/></c>
      <c>0x0003</c>
      <c>ChaCha20Poly1305</c>
      <c>32</c>
      <c>12</c>
      <c><xref target="RFC8439"/></c>
</texttable>

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

<t>[[ TODO ]]</t>

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

<t>[[ TODO: Make IANA registries for the above ]]</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference  anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor="RFC8174" target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></author>
<date year='2017' month='May' />
<abstract><t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='8174'/>
<seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>



<reference  anchor="RFC5116" target='https://www.rfc-editor.org/info/rfc5116'>
<front>
<title>An Interface and Algorithms for Authenticated Encryption</title>
<author initials='D.' surname='McGrew' fullname='D. McGrew'><organization /></author>
<date year='2008' month='January' />
<abstract><t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms.  The interface and registry can be used as an application-independent set of cryptoalgorithm suites.  This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='5116'/>
<seriesInfo name='DOI' value='10.17487/RFC5116'/>
</reference>




    </references>

    <references title='Informative References'>

<reference anchor="S01" target="http://www.shoup.net/papers/iso-2_1.pdf">
  <front>
    <title>A Proposal for an ISO Standard for Public Key Encryption (verison 2.1)</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="ANSI" >
  <front>
    <title>Public Key Cryptography for the Financial Services Industry -- Key Agreement and Key Transport Using Elliptic Curve Cryptography</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="IEEE" >
  <front>
    <title>IEEE 1363a, Standard Specifications for Public Key Cryptography - Amendment 1 -- Additional Techniques</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="ISO" >
  <front>
    <title>ISO/IEC 18033-2, Information Technology - Security Techniques - Encryption Algorithms - Part 2 -- Asymmetric Ciphers</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="SECG" target="http://www.secg.org/download/aid-780/sec1-v2.pdf">
  <front>
    <title>Elliptic Curve Cryptography, Standards for Efficient Cryptography Group, ver. 2</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="MAEA10" target="http://sceweb.sce.uhcl.edu/yang/teaching/csci5234WebSecurityFall2011/Chaum-blind-signatures.PDF">
  <front>
    <title>A Comparison of the Standardized Versions of ECIES</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


<reference anchor="keyagreement" >
  <front>
    <title>Recommendation for Pair-Wise Key Establishment Schemes Using Discrete Logarithm Cryptography</title>
    <author initials="E." surname="Barker" fullname="Elaine Barker">
      <organization></organization>
    </author>
    <author initials="L." surname="Chen" fullname="Lily Chen">
      <organization></organization>
    </author>
    <author initials="A." surname="Roginsky" fullname="Allen Roginsky">
      <organization></organization>
    </author>
    <author initials="M." surname="Smid" fullname="Miles Smid">
      <organization></organization>
    </author>
    <date year="2013" month="May"/>
  </front>
  <seriesInfo name="National Institute of Standards and Technology" value="report"/>
  <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar2"/>
</reference>

<reference anchor="NISTCurves" >
  <front>
    <title>Digital Signature Standard (DSS)</title>
    <author >
      <organization></organization>
    </author>
    <date year="2013" month="July"/>
  </front>
  <seriesInfo name="National Institute of Standards and Technology" value="report"/>
  <seriesInfo name="DOI" value="10.6028/nist.fips.186-4"/>
</reference>

<reference anchor="GCM" >
  <front>
    <title>Recommendation for block cipher modes of operation :</title>
    <author initials="M." surname="Dworkin" fullname="M J Dworkin">
      <organization></organization>
    </author>
    <date year="2007"/>
  </front>
  <seriesInfo name="National Institute of Standards and Technology" value="report"/>
  <seriesInfo name="DOI" value="10.6028/nist.sp.800-38d"/>
</reference>


<reference anchor="fiveG" target="https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=3169">
  <front>
    <title>Security architecture and procedures for 5G System</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>




<reference  anchor="RFC6637" target='https://www.rfc-editor.org/info/rfc6637'>
<front>
<title>Elliptic Curve Cryptography (ECC) in OpenPGP</title>
<author initials='A.' surname='Jivsov' fullname='A. Jivsov'><organization /></author>
<date year='2012' month='June' />
<abstract><t>This document defines an Elliptic Curve Cryptography extension to the OpenPGP public key format and specifies three Elliptic Curves that enjoy broad support by other standards, including standards published by the US National Institute of Standards and Technology.  The document specifies the conventions for interoperability between compliant OpenPGP implementations that make use of this extension and these Elliptic Curves.   [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6637'/>
<seriesInfo name='DOI' value='10.17487/RFC6637'/>
</reference>



<reference anchor="I-D.ietf-mls-protocol">
<front>
<title>The Messaging Layer Security (MLS) Protocol</title>

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

<author initials='J' surname='Millican' fullname='Jon Millican'>
    <organization />
</author>

<author initials='E' surname='Omara' fullname='Emad Omara'>
    <organization />
</author>

<author initials='K' surname='Cohn-Gordon' fullname='Katriel Cohn-Gordon'>
    <organization />
</author>

<author initials='R' surname='Robert' fullname='Raphael Robert'>
    <organization />
</author>

<date month='May' day='30' year='2019' />

<abstract><t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages.  Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time.  In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy and post-compromise security for groups in size ranging from two to thousands.</t></abstract>

</front>

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



<reference anchor="I-D.ietf-tls-esni">
<front>
<title>Encrypted Server Name Indication for TLS 1.3</title>

<author initials='E' surname='Rescorla' fullname='Eric Rescorla'>
    <organization />
</author>

<author initials='K' surname='Oku' fullname='Kazuho Oku'>
    <organization />
</author>

<author initials='N' surname='Sullivan' fullname='Nick Sullivan'>
    <organization />
</author>

<author initials='C' surname='Wood' fullname='Christopher Wood'>
    <organization />
</author>

<date month='March' day='11' year='2019' />

<abstract><t>This document defines a simple mechanism for encrypting the Server Name Indication for TLS 1.3.</t></abstract>

</front>

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



<reference  anchor="RFC7748" target='https://www.rfc-editor.org/info/rfc7748'>
<front>
<title>Elliptic Curves for Security</title>
<author initials='A.' surname='Langley' fullname='A. Langley'><organization /></author>
<author initials='M.' surname='Hamburg' fullname='M. Hamburg'><organization /></author>
<author initials='S.' surname='Turner' fullname='S. Turner'><organization /></author>
<date year='2016' month='January' />
<abstract><t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS).  These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t></abstract>
</front>
<seriesInfo name='RFC' value='7748'/>
<seriesInfo name='DOI' value='10.17487/RFC7748'/>
</reference>



<reference  anchor="RFC5869" target='https://www.rfc-editor.org/info/rfc5869'>
<front>
<title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
<author initials='H.' surname='Krawczyk' fullname='H. Krawczyk'><organization /></author>
<author initials='P.' surname='Eronen' fullname='P. Eronen'><organization /></author>
<date year='2010' month='May' />
<abstract><t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications.  The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions.  This document is not an Internet  Standards Track specification; it is published for informational  purposes.</t></abstract>
</front>
<seriesInfo name='RFC' value='5869'/>
<seriesInfo name='DOI' value='10.17487/RFC5869'/>
</reference>



<reference  anchor="RFC8439" target='https://www.rfc-editor.org/info/rfc8439'>
<front>
<title>ChaCha20 and Poly1305 for IETF Protocols</title>
<author initials='Y.' surname='Nir' fullname='Y. Nir'><organization /></author>
<author initials='A.' surname='Langley' fullname='A. Langley'><organization /></author>
<date year='2018' month='June' />
<abstract><t>This document defines the ChaCha20 stream cipher as well as the use of the Poly1305 authenticator, both as stand-alone algorithms and as a &quot;combined mode&quot;, or Authenticated Encryption with Associated Data (AEAD) algorithm.</t><t>RFC 7539, the predecessor of this document, was meant to serve as a stable reference and an implementation guide.  It was a product of the Crypto Forum Research Group (CFRG).  This document merges the errata filed against RFC 7539 and adds a little text to the Security Considerations section.</t></abstract>
</front>
<seriesInfo name='RFC' value='8439'/>
<seriesInfo name='DOI' value='10.17487/RFC8439'/>
</reference>




    </references>


<section anchor="possible-todos" title="Possible TODOs">

<t>The following extensions might be worth specifying:</t>

<t><list style="symbols">
  <t>Multiple recipients - It might be possible to add some
simplifications / assurances for the case where the same value is
being encrypted to multiple recipients.</t>
  <t>Test vectors - Obviously, we can provide decryption test vectors
in this document.  In order to provide known-answer tests, we
would have to introduce a non-secure deterministic mode where the
ephemeral key pair is derived from the inputs.  And to do that
safely, we would need to augment the decrypt function to detect
the deterministic mode and fail.</t>
  <t>A reference implementation in hacspec or similar</t>
</list></t>

</section>


  </back>

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

-->

</rfc>

