<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.18 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-bastian-dvs-jose-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="DVS for JOSE">Designated Verifier Signatures for JOSE</title>
    <seriesInfo name="Internet-Draft" value="draft-bastian-dvs-jose-01"/>
    <author fullname="Paul Bastian">
      <organization>Bundesdruckerei GmbH</organization>
      <address>
        <email>bastianpaul@googlemail.com</email>
      </address>
    </author>
    <author fullname="Micha Kraus">
      <organization>Bundesdruckerei GmbH</organization>
      <address>
        <email>kraus.micha@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="August" day="09"/>
    <area>Security</area>
    <workgroup>Javascript Object Signing and Encryption</workgroup>
    <keyword>JOSE</keyword>
    <keyword>JWS</keyword>
    <keyword>designated verifier signature</keyword>
    <keyword>HPKE</keyword>
    <abstract>
      <?line 51?>

<t>This specification defines designated verifier signatures for JOSE and defines algorithms that use a combination of key agreement and MACs.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://paulbastian.github.io/draft-bastian-dvs-jose/draft-bastian-dvs-jose.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-bastian-dvs-jose/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Javascript Object Signing and Encryption Working Group mailing list (<eref target="mailto:jose@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/jose/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/jose/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/paulbastian/draft-bastian-dvs-jose"/>.</t>
    </note>
  </front>
  <middle>
    <?line 55?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Designated verifier signatures (DVS) are signature schemes in which signatures are generated, that can only be verified a particular party. Unlike conventional digital signature schemes like ECDSA, this enables repudiable signatures.</t>
      <t>This specification describes a general structure for designated verifier signature schemes and specified a set of instantiations that use a combination of an ECDH key exchange with an HMAC.</t>
      <t>This specification and all described algorithms should respect the efforts for <eref target="https://www.ietf.org/archive/id/draft-jones-jose-fully-specified-algorithms-00.html">Fully Specified Algorithms</eref>.</t>
      <t>This algorithm is intended for use with digital credentials ecosystems, including the Issuer-Holder-Verifier model described by W3C VCDM or IETF SD-JWT-VC.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The draft uses "JSON Web Signature", "JOSE Header", "JWS Signature", "JWS Signing Input" as defined by <xref target="RFC7515"/>.</t>
      <dl>
        <dt>Signing Party:</dt>
        <dd>
          <t>The Party that performs the key agreement first and generates the MAC. Similar to a Signer.</t>
        </dd>
        <dt>Verifying Party:</dt>
        <dd>
          <t>The Party that performs the key agreement second, generates the MAC and compares it to a given value. Similar to a Verifier.</t>
        </dd>
      </dl>
    </section>
    <section anchor="cryptographic-dependencies">
      <name>Cryptographic Dependencies</name>
      <t>DVS rely on the following primitives:</t>
      <ul spacing="normal">
        <li>
          <t>A Diffie-Hellman Key Agreement (DHKA)
          </t>
          <ul spacing="normal">
            <li>
              <t><tt>DH(skX, pkY)</tt>: Perform a non-interactive Diffie-Hellman exchange using the private key <tt>skX</tt> and public key <tt>pkY</tt> to produce a Diffie-Hellman shared secret of length Ndh. This function can raise a ValidationError.</t>
            </li>
            <li>
              <t><tt>Ndh</tt>: The length in bytes of a Diffie-Hellman shared secret produced by <tt>DH()</tt>.</t>
            </li>
            <li>
              <t><tt>Nsk</tt>: The length in bytes of a Diffie-Hellman private key.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>A key derivation function (KDF):
          </t>
          <ul spacing="normal">
            <li>
              <t><tt>Extract(salt, ikm)</tt>: Extract a pseudorandom key of fixed length Nh bytes from input keying material <tt>ikm</tt> and an optional byte string <tt>salt</tt>.</t>
            </li>
            <li>
              <t><tt>Expand(prk, info, L)</tt>: Expand a pseudorandom key <tt>prk</tt> using optional string <tt>info</tt> into <tt>L</tt> bytes of output keying material.</t>
            </li>
            <li>
              <t><tt>Nh</tt>: The output size of the Extract() function in bytes.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>A Message Authentication Code algorithm (MAC)
          </t>
          <ul spacing="normal">
            <li>
              <t><tt>MacSign(k, i)</tt>: Returns an authenticated tag for the given input <tt>i</tt> and key <tt>k</tt>.</t>
            </li>
            <li>
              <t><tt>Nk</tt>: The length in bytes of key <tt>k</tt>.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>An HPKE algorithm (for the HPKE variants):
          </t>
          <ul spacing="normal">
            <li>
              <t><tt>SealAuth(pkR, info, aad, pt, skS)</tt>: encrypts and authenticates single plaintext <tt>pt</tt> with associated data <tt>aad</tt> and context <tt>info</tt> using a private sender key <tt>skS</tt> and public receiver key <tt>pkR</tt>.</t>
            </li>
            <li>
              <t><tt>OpenAuth(enc, skR, info, aad, ct, pkS)</tt>: decrypts ciphertext and tag <tt>ct</tt> with associated data <tt>aad</tt> and context <tt>info</tt> using a private receiver key <tt>skR</tt> and public sender key <tt>pkS</tt>.</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="designated-verifier-signatures">
      <name>Designated Verifier Signatures</name>
      <t>A designated verifier signature requires three components for an algorithm:</t>
      <ol spacing="normal" type="1"><li>
          <t>a Diffie-Hellman Key Agreement (DHKA)</t>
        </li>
        <li>
          <t>a Key Derivation Function (KDF)</t>
        </li>
        <li>
          <t>a Message Authentication Code algorithm (MAC)</t>
        </li>
      </ol>
      <t>In general, these parameters are chosen by the Signing Party. These parameters need to be communicated to the Verifying Party before the generation of a Designated Verifier Signature.</t>
      <t>The following functions are defined to describe a generic, composable Designated Verifier Signature Scheme:</t>
      <artwork><![CDATA[
def dvsSign(pkR, skS, msg, salt= "", info = "DVS-1")
   dh =  DH(skS, pkR)
   prk = Extract(salt, dh)
   k = Expand(prk, info, Nk)
   mac = MacSign(k, msg)
   return mac

def dvsVerify(skR, pkS, msg, salt = "", info = "DVS-1", mac)
   dh =  DH(skR, pkS)
   prk = Extract(salt, dh)
   k = Expand(prk, info, Nk)
   mac' = MacSign(k, msg)
   if mac != mac':
      raise Exception("Designated Verifier Signature invalid")
   return
]]></artwork>
      <section anchor="signature-generation">
        <name>Signature Generation</name>
        <t>The generation of the Designated Verifier Signature takes the private key of the Signing Party, the public key of the Verifying Party and the message as inputs. The retrieval and communication of the Verifying Party's public key is out of scope of this specification and subject to the implementing protocols.</t>
        <t>Input:</t>
        <ul spacing="normal">
          <li>
            <t><tt>skS</tt>: private key of the Signing Party</t>
          </li>
          <li>
            <t><tt>pkR</tt>: public key of the Verifying Party</t>
          </li>
          <li>
            <t><tt>msg</tt>: JWS Signing Input</t>
          </li>
          <li>
            <t><tt>salt</tt> : Salt for key derivation</t>
          </li>
          <li>
            <t><tt>info</tt> : optional info for key derivation</t>
          </li>
        </ul>
        <t>Steps:
 * TODO</t>
      </section>
      <section anchor="signature-verification">
        <name>Signature Verification</name>
        <t>The generation of the Designated Verifier Signature takes the private key of the Signing Party, the public key of the Verifying Party and the message as inputs. The retrieval and communication of the Verifying Party's public key is out of scope of this specification and subject to the implementing protocols.</t>
        <t>Input:</t>
        <ul spacing="normal">
          <li>
            <t><tt>skR</tt>: private key of the Verifying Party</t>
          </li>
          <li>
            <t><tt>pkS</tt>: public key of the Signing Party</t>
          </li>
          <li>
            <t><tt>msg</tt>: JWS Signing Input</t>
          </li>
          <li>
            <t><tt>salt</tt> : Salt for key derivation</t>
          </li>
          <li>
            <t><tt>info</tt> : optional info for key derivation</t>
          </li>
          <li>
            <t><tt>signature</tt> : the Message Authentication Code</t>
          </li>
        </ul>
        <t>Steps:
 * TODO</t>
      </section>
      <section anchor="generic_suites">
        <name>Signature Suites</name>
        <t>Algorithms <bcp14>MUST</bcp14> follow the naming <tt>DVS-&lt;DHKA&gt;-&lt;KDF&gt;-&lt;MAC&gt;</tt>.</t>
      </section>
    </section>
    <section anchor="designated-verifier-signatures-using-hpke">
      <name>Designated Verifier Signatures using HPKE</name>
      <t>This section describes a simple designated verifier signature scheme based on Hybrid Public Key Encryption (HPKE) <xref target="RFC9180"/> in auth mode.
It reuses the authentication scheme underlying the AEAD algorithm in use, while using the KEM to establish a one-time authentication key from a pair of KEM public keys.
This scheme was described in early specification drafts of HPKE <xref target="RFC9180"/></t>
      <section anchor="signature-generation-1">
        <name>Signature Generation</name>
        <t>To create a signature, the sender simply calls the single-shot <tt>Seal()</tt> method with an empty plaintext value and the message to be signed as AAD.
This produces an encoded key enc and a ciphertext value that contains only the AAD tag. The signature value is the concatenation of the encoded key and the AAD tag.</t>
        <t>Input:</t>
        <ul spacing="normal">
          <li>
            <t><tt>skS</tt>: private key of the Signing Party</t>
          </li>
          <li>
            <t><tt>pkR</tt>: public key of the Verifying Party</t>
          </li>
          <li>
            <t><tt>msg</tt>: JWS Signing Input</t>
          </li>
          <li>
            <t><tt>info</tt> : optional info for key derivation</t>
          </li>
        </ul>
        <t>Steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Call <tt>enc</tt>, <tt>ct</tt> = <tt>SealAuth(pkR, info, aad, pt, skS)</tt> with
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>aad</tt> = <tt>msg</tt></t>
              </li>
              <li>
                <t><tt>pt</tt> = ""</t>
              </li>
            </ul>
          </li>
          <li>
            <t>JWS Signature is the octet string concatenation of (<tt>enc</tt> || <tt>ct</tt>)</t>
          </li>
        </ol>
      </section>
      <section anchor="signature-verification-1">
        <name>Signature Verification</name>
        <t>To verify a signature, the recipient extracts encoded key and the AAD tag from the signature value and calls the single-shor <tt>Open()</tt> with the provided ciphertext.
If the AEAD authentication passes, then the signature is valid.</t>
        <t>Input:</t>
        <ul spacing="normal">
          <li>
            <t><tt>skR</tt>: private key of the Verifying Party</t>
          </li>
          <li>
            <t><tt>pkS</tt>: public key of the Signing Party</t>
          </li>
          <li>
            <t><tt>msg</tt>: JWS Signing Input</t>
          </li>
          <li>
            <t><tt>info</tt> : optional info for key derivation</t>
          </li>
          <li>
            <t><tt>signature</tt>: JWS Signature octet string</t>
          </li>
        </ul>
        <t>Steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Decode <tt>enc</tt> || <tt>ct</tt> = <tt>signature</tt> by length of <tt>enc</tt> and <tt>ct</tt>. See <xref target="HPKE-IANA"/> for length of ct and enc.</t>
          </li>
          <li>
            <t>Call <tt>pt</tt> = <tt>OpenAuth(enc, skR, info, aad, ct, pkS)</tt> with
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>aad</tt> = msg</t>
              </li>
            </ul>
          </li>
          <li>
            <t>the signature is valid, when <tt>OpenAuth()</tt> returns <tt>pt</tt> = "" with no authentication exception</t>
          </li>
        </ol>
        <t>NOTE: <tt>ct</tt> contains only a tag. It's length depends on the AEAD algorithm (see Nt values in RFC9180 chapter 7.3.)</t>
      </section>
      <section anchor="hpke_suites">
        <name>Signature Suites</name>
        <t>Algorithms <bcp14>MUST</bcp14> follow the naming <tt>DVS-HPKE-&lt;Mode&gt;-&lt;KEM&gt;-&lt;KDF&gt;-&lt;AEAD&gt;</tt>.
"Mode" is Auth (PSKAuth could also be used).
The "KEM", "KDF", and "AEAD" values are chosen from the HPKE IANA registry <xref target="HPKE-IANA"/>.</t>
      </section>
    </section>
    <section anchor="designated-verifier-signatures-for-jose">
      <name>Designated Verifier Signatures for JOSE</name>
      <t>Designated Verifier Signatures behave like a digital signature as described in Section 3 of <xref target="RFC7518"/> and are intended for use in JSON Web Signatures (JWS) as described in <xref target="RFC7515"/>. The Generating Party performs the <tt>Message Signature or MAC Computation</tt> as defined by Section 5.1 of <xref target="RFC7515"/>. The Verifying Party performs the <tt>Message Signature or MAC Validation</tt> as defined by Section 5.2 of <xref target="RFC7515"/>.</t>
      <t>The following JWS headers are used to convey Designated Verifier Signatures for JOSE:</t>
      <ul spacing="normal">
        <li>
          <t><tt>alg</tt> : <bcp14>REQUIRED</bcp14>. The algorithm parameter describes the chosen signature suite, for example the ones described in (#generic_suites) and (#hpke_suites).</t>
        </li>
        <li>
          <t><tt>rpk</tt> : <bcp14>REQUIRED</bcp14>. The <tt>rpk</tt> (recipient public key) parameter represents the encoded public key of the Verifying Party that was used in the DHKA algorithm as a JSON Web Key according to <xref target="RFC7517"/>. This parameter <bcp14>MUST</bcp14> be present.</t>
        </li>
        <li>
          <t><tt>nonce</tt> : <bcp14>OPTIONAL</bcp14>. The <tt>nonce</tt> may be provided by the Verifying Party additional to it's public key and ensure additional freshness of the signature. If provided, the Signing Party <bcp14>SHOULD</bcp14> add the <tt>nonce</tt> to the header.</t>
        </li>
      </ul>
      <t>The Signing Party may use existing JWS header parameters like <tt>x5c</tt>, <tt>jwk</tt> or <tt>kid</tt> to represent or reference it's public key according to <xref target="RFC7517"/>.</t>
      <section anchor="example-jwt">
        <name>Example JWT</name>
        <t>The JWT/JWS header:</t>
        <artwork><![CDATA[
{
    "typ" : "JWT",
    "alg" : "DVS-P256-SHA256-HS256",
    "jwk" : <JWK of the Signing Party>,
    "rpk" : <JWK of Verifying Party>
}
]]></artwork>
        <t>The JWT/JWS payload:</t>
        <artwork><![CDATA[
{
    "iss" : "https://example.as.com",
    "iat" : "1701870613",
    "given_name" : "Erika",
    "family_name" : "Mustermann"
}
]]></artwork>
        <t>The JWT/JWS signature:</t>
        <artwork><![CDATA[
base64-encoded MAC
]]></artwork>
        <t>This specification described instantiations of Designated Verifier Signatures using specific algorithm combinations:</t>
        <artwork type="ascii-art"><![CDATA[
+-----------------------+-----------------------------+----------------+
| Algorithm Name        | Algorithm Description       |                |
|                       |                             | Requirements   |
+-----------------------+-----------------------------+----------------+
| DVS-P256-SHA256-HS256 | ECDH using NIST P-256,      | Optional       |
|                       | HKDF using SHA-256 and      |                |
|                       | HMAC using SHA-256          |                |
+-----------------------+-----------------------------+----------------+
| DVS-HPKE-Auth-X25519  | DVS based on HPKE using     |                |
| -SHA256               | DHKEM(X25519, HKDF-SHA256)  |   Optional     |
| -ChaCha20Poly1305     | HKDF-SHA256 KDF and         |                |
|                       | ChaCha20Poly1305 AEAD       |                |
+-----------------------+-----------------------------+----------------+
| DVS-HPKE-Auth-P256    | DVS based on HPKE using     |                |
| -SHA256-AES128GCM     | DHKEM(P-256, HKDF-SHA256)   |   Optional     |
|                       | HKDF-SHA256 KDF and         |                |
|                       | AES-128-GCM AEAD            |                |
+-----------------------+-----------------------------+----------------+
]]></artwork>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="replay-attack-detection">
        <name>Replay Attack Detection</name>
        <ul spacing="normal">
          <li>
            <t>Verifying Party <bcp14>MUST</bcp14> ensure the freshness of signatures by utilizing ephemeral keys in <tt>rpk</tt> or by providing a nonce for <tt>nonce</tt>.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>Define:</t>
      <ul spacing="normal">
        <li>
          <t>define new <tt>rpk</tt> header parameter</t>
        </li>
        <li>
          <t>alg values for DVS-P256-SHA256-HS256 and some more</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC7515">
          <front>
            <title>JSON Web Signature (JWS)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </reference>
        <reference anchor="RFC7517">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
        <reference anchor="RFC7518">
          <front>
            <title>JSON Web Algorithms (JWA)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification registers cryptographic algorithms and identifiers to be used with the JSON Web Signature (JWS), JSON Web Encryption (JWE), and JSON Web Key (JWK) specifications. It defines several IANA registries for these identifiers.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7518"/>
          <seriesInfo name="DOI" value="10.17487/RFC7518"/>
        </reference>
        <reference anchor="RFC9180">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <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">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="HPKE-IANA" target="https://www.iana.org/assignments/hpke/hpke.xhtml">
          <front>
            <title>Hybrid Public Key Encryption (HPKE) IANA Registry</title>
            <author>
              <organization/>
            </author>
            <date year="2023" month="October"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 315?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to:</t>
      <ul spacing="normal">
        <li>
          <t>Brian Campbell</t>
        </li>
        <li>
          <t>John Bradley</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
RTKLYZSHkVh6nvdfNfIrVSYxAAA=

-->

</rfc>
