<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-dprive-dnscrypt-11" category="info" submissionType="independent" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="DNSCrypt">The DNSCrypt Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-dprive-dnscrypt-11"/>
    <author fullname="Frank Denis">
      <organization>Individual Contributor</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2026" month="July" day="23"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 32?>

<t>The DNSCrypt protocol is designed to encrypt and authenticate DNS traffic between clients and resolvers.</t>
      <t>This document specifies the protocol and its implementation, providing a standardized approach to securing DNS communications.</t>
      <t>DNSCrypt improves confidentiality, integrity, and resistance to attacks affecting the original DNS protocol while maintaining compatibility with existing DNS infrastructure.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://dnscrypt.github.io/dnscrypt-protocol/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-denis-dprive-dnscrypt/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/DNSCrypt/dnscrypt-protocol"/>.</t>
    </note>
  </front>
  <middle>
    <?line 40?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Domain Name System (DNS) <xref target="RFC1035"/> is a critical component of Internet infrastructure, but its original design did not include security features to protect the confidentiality and integrity of queries and responses.</t>
      <t>This fundamental security gap exposes DNS traffic to eavesdropping, tampering, and various attacks that can compromise user privacy and network security.</t>
      <t>To address these vulnerabilities, this document defines the DNSCrypt protocol, which encrypts and authenticates DNS queries and responses, providing strong confidentiality, integrity, and resistance to attacks affecting the original DNS protocol.</t>
      <t>The protocol is designed to be lightweight, extensible, and simple to implement securely on top of existing DNS infrastructure, offering a practical solution for securing DNS communications without requiring significant changes to current systems.</t>
      <t>The following sections detail the protocol's design, starting with an overview of its operation and then progressing through the technical specifications needed for implementation.</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="protocol-flow">
      <name>Protocol Flow</name>
      <t>The DNSCrypt protocol consists of two distinct phases:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Initial Setup Phase</strong> (one-time):
          </t>
          <ul spacing="normal">
            <li>
              <t>The client requests the server's certificate</t>
            </li>
            <li>
              <t>The server responds with its certificate containing public keys</t>
            </li>
          </ul>
        </li>
        <li>
          <t><strong>Ongoing Communication Phase</strong> (repeated as needed):
          </t>
          <ul spacing="normal">
            <li>
              <t>The client sends encrypted DNS queries</t>
            </li>
            <li>
              <t>The server responds with encrypted DNS responses</t>
            </li>
          </ul>
        </li>
      </ol>
      <t>The following diagram illustrates the complete protocol flow:</t>
      <artwork><![CDATA[
+--------+                    +--------+
|        |                    |        |
| Client |                    | Server |
|        |                    |        |
+--------+                    +--------+
    |                             |
    | 1. Request Certificate      |
    |---------------------------->|
    |                             |
    | 2. Certificate Response     |
    |<----------------------------|
    |                             |
    | 3. Encrypted Query          |
    |---------------------------->|
    |                             |
    | 4. Encrypted Query          |
    |---------------------------->|
    |                             |
    | 5. Encrypted Response       |
    |<----------------------------|
    |                             |
    | 6. Encrypted Response       |
    |<----------------------------|
    |                             |
    | 7. Encrypted Query          |
    |---------------------------->|
    |                             |
    | 8. Encrypted Response       |
    |<----------------------------|
    |                             |
    |                             |
]]></artwork>
      <t>The initial setup phase (steps 1-2) occurs only when:</t>
      <ul spacing="normal">
        <li>
          <t>A client first starts using a DNSCrypt server</t>
        </li>
        <li>
          <t>The client's cached certificate expires</t>
        </li>
        <li>
          <t>The client detects a certificate with a higher serial number</t>
        </li>
      </ul>
      <t>After the initial setup, the client and server engage in the ongoing communication phase (steps 3-8), where encrypted queries and responses are exchanged as needed.</t>
      <t>This phase can be repeated indefinitely until the certificate expires or a new certificate is available.</t>
      <t>The ongoing communication phase operates with several important characteristics that distinguish it from traditional DNS:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Stateless Operation</strong>: Each query and response is independent. The server does not maintain state between queries.</t>
        </li>
        <li>
          <t><strong>Out-of-Order Responses</strong>: Responses may arrive in a different order than the queries were sent. Each response is self-contained and can be processed independently.</t>
        </li>
        <li>
          <t><strong>Concurrent Queries</strong>: A client can send multiple queries without waiting for earlier responses, and responses can be processed independently as they arrive.</t>
        </li>
      </ol>
      <t>With this understanding of the protocol flow, we can now examine the specific components that make up DNSCrypt packets and their structure.</t>
    </section>
    <section anchor="protocol-components">
      <name>Protocol Components</name>
      <t>The DNSCrypt protocol defines specific packet structures for both client queries and server responses.</t>
      <t>These components work together to provide the security properties described in the previous section.</t>
      <t>Definitions for client queries:</t>
      <ul spacing="normal">
        <li>
          <t><tt>&lt;dnscrypt-query&gt;</tt>:  <tt>&lt;client-magic&gt;</tt> <tt>&lt;client-pk&gt;</tt> <tt>&lt;client-nonce&gt;</tt> <tt>&lt;encrypted-query&gt;</tt></t>
        </li>
        <li>
          <t><tt>&lt;client-magic&gt;</tt>: an 8 byte identifier for the resolver certificate chosen by the client (see the Certificates section).</t>
        </li>
        <li>
          <t><tt>&lt;client-pk&gt;</tt>: the client's public key, whose length depends on the encryption algorithm defined in the chosen certificate.</t>
        </li>
        <li>
          <t><tt>&lt;client-sk&gt;</tt>: the client's secret key.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-pk&gt;</tt>: the resolver's public key.</t>
        </li>
        <li>
          <t><tt>&lt;client-nonce&gt;</tt>: a unique query identifier for a given (<tt>&lt;client-sk&gt;</tt>, <tt>&lt;resolver-pk&gt;</tt>) tuple. Every newly encrypted DNSCrypt query for the same (<tt>&lt;client-sk&gt;</tt>, <tt>&lt;resolver-pk&gt;</tt>) tuple <bcp14>MUST</bcp14> use a distinct <tt>&lt;client-nonce&gt;</tt> value, even when the plaintext DNS query is being retried. Retransmitting the same already-encrypted DNSCrypt packet does not require changing its nonce. The length of <tt>&lt;client-nonce&gt;</tt> is determined by the chosen encryption algorithm.</t>
        </li>
        <li>
          <t><tt>AE</tt>: the authenticated encryption function for the selected certificate. For <tt>Box-XChaChaPoly</tt> and PQDNSCrypt (see the Post-Quantum Key Exchange section), it is the <tt>XChaCha20_DJB-Poly1305</tt> construction of Appendix 1, whose output is the 16-byte authentication tag followed by the ciphertext. This is the NaCl <tt>secretbox</tt> layout, in which the one-time Poly1305 key is taken from the start of the keystream; it is not the AEAD of <xref target="RFC8439"/>, and the two are not interchangeable. See Appendix 1 for details.</t>
        </li>
        <li>
          <t><tt>&lt;encrypted-query&gt;</tt>: <tt>AE(&lt;shared-key&gt;, &lt;client-nonce&gt; &lt;client-nonce-pad&gt;, &lt;client-query&gt; &lt;client-query-pad&gt;)</tt></t>
        </li>
        <li>
          <t><tt>&lt;shared-key&gt;</tt>: the shared key derived from <tt>&lt;resolver-pk&gt;</tt> and <tt>&lt;client-sk&gt;</tt>, using the key exchange algorithm defined in the chosen certificate.</t>
        </li>
        <li>
          <t><tt>&lt;client-query&gt;</tt>: the unencrypted client query. The query is not modified; in particular, the query flags are not altered. The DNS-over-TCP two-byte length prefix is transport framing and is not part of the plaintext encrypted by DNSCrypt.</t>
        </li>
        <li>
          <t><tt>&lt;client-nonce-pad&gt;</tt>: <tt>&lt;client-nonce&gt;</tt> length is half the nonce length required by the encryption algorithm. In client queries, the other half, <tt>&lt;client-nonce-pad&gt;</tt> is filled with NUL bytes. For <tt>&lt;es-version&gt;</tt> <tt>0x00 0x02</tt> (the encryption-system identifier carried in the certificate; see the Certificates section), the encryption algorithm uses a 24-byte nonce, so <tt>&lt;client-nonce&gt;</tt> is 12 bytes and <tt>&lt;client-nonce-pad&gt;</tt> is the remaining 12 NUL bytes.</t>
        </li>
        <li>
          <t><tt>&lt;client-query-pad&gt;</tt>: the variable-length padding.</t>
        </li>
      </ul>
      <t>Definitions for server responses:</t>
      <ul spacing="normal">
        <li>
          <t><tt>&lt;dnscrypt-response&gt;</tt>: <tt>&lt;resolver-magic&gt;</tt> <tt>&lt;nonce&gt;</tt> <tt>&lt;encrypted-response&gt;</tt></t>
        </li>
        <li>
          <t><tt>&lt;resolver-magic&gt;</tt>: the <tt>0x72 0x36 0x66 0x6e 0x76 0x57 0x6a 0x38</tt> byte sequence</t>
        </li>
        <li>
          <t><tt>&lt;nonce&gt;</tt>: <tt>&lt;client-nonce&gt;</tt> <tt>&lt;resolver-nonce&gt;</tt></t>
        </li>
        <li>
          <t><tt>&lt;client-nonce&gt;</tt>: the nonce sent by the client in the related query.</t>
        </li>
        <li>
          <t><tt>&lt;client-pk&gt;</tt>: the client's public key.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-sk&gt;</tt>: the resolver's secret key.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-nonce&gt;</tt>: a unique response identifier for a given <tt>(&lt;client-pk&gt;, &lt;resolver-sk&gt;)</tt> tuple. The length of <tt>&lt;resolver-nonce&gt;</tt> depends on the chosen encryption algorithm. It <bcp14>MUST NOT</bcp14> consist only of NUL bytes: the response nonce would then equal the query nonce, reusing a key and nonce pair for two different plaintexts. A resolver that picks <tt>&lt;resolver-nonce&gt;</tt> uniformly at random, as deployed resolvers do, satisfies both requirements.</t>
        </li>
        <li>
          <t><tt>AE</tt>: the authenticated encryption function for the selected certificate, as described for client queries above.</t>
        </li>
        <li>
          <t><tt>&lt;encrypted-response&gt;</tt>: <tt>AE(&lt;shared-key&gt;, &lt;nonce&gt;, &lt;resolver-response&gt; &lt;resolver-response-pad&gt;)</tt></t>
        </li>
        <li>
          <t><tt>&lt;shared-key&gt;</tt>: the shared key derived from <tt>&lt;resolver-sk&gt;</tt> and <tt>&lt;client-pk&gt;</tt>, using the key exchange algorithm defined in the chosen certificate.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-response&gt;</tt>: the unencrypted resolver response. The response is not modified; in particular, the query flags are not altered. The DNS-over-TCP two-byte length prefix is transport framing and is not part of the plaintext encrypted by DNSCrypt.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-response-pad&gt;</tt>: the variable-length padding.</t>
        </li>
      </ul>
      <t>The following diagram shows the structure of a DNSCrypt query packet:</t>
      <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Client Magic                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                      Client Public Key                        +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                        Client Nonce                           +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                       Encrypted Query                         +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      <t>The following diagram shows the structure of a DNSCrypt response packet:</t>
      <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Resolver Magic                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                          Nonce                                +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                      Encrypted Response                       +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      <t>These packet structures form the foundation for the protocol operations described in the next section, which details how clients and servers use these components to establish secure communications.</t>
    </section>
    <section anchor="protocol-description">
      <name>Protocol Description</name>
      <section anchor="overview">
        <name>Overview</name>
        <t>Building on the protocol flow and components described earlier, this section provides a detailed examination of how the DNSCrypt protocol operates.</t>
        <t>The protocol follows a well-defined sequence of steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>The DNSCrypt client sends a DNS query to a DNSCrypt server to retrieve the server's public keys.</t>
          </li>
          <li>
            <t>The client generates its own key pair.</t>
          </li>
          <li>
            <t>The client encrypts unmodified DNS queries using a server's public key, padding them as necessary, and concatenates them to a nonce and a copy of the client's public key. The resulting output is transmitted to the server via standard DNS transport mechanisms <xref target="RFC1035"/>.</t>
          </li>
          <li>
            <t>Encrypted queries are decrypted by the server using the attached client public key and the server's own secret key. The output is a regular DNS packet that doesn't require any special processing.</t>
          </li>
          <li>
            <t>To send an encrypted response, the server truncates the DNS response and sets the TC flag if the encrypted response would not fit within the size limit, adds padding, and encrypts the result using the shared key and a nonce made of the client's nonce followed by the resolver's nonce. The resulting packet is sent to the client using standard DNS mechanisms.</t>
          </li>
          <li>
            <t>The client authenticates and decrypts the response using the shared key and the nonce included in the response. If the response was truncated, the client retries over TCP <xref target="RFC7766"/> and can adjust internal parameters. If not, the output is a regular DNS response that can be directly forwarded to applications and stub resolvers.</t>
          </li>
        </ol>
        <t>Key features of the DNSCrypt protocol include:</t>
        <ul spacing="normal">
          <li>
            <t>Stateless operation: Every query can be processed independently from other queries, with no session identifiers required.</t>
          </li>
          <li>
            <t>Flexible key management: Clients can replace their keys whenever they want, without extra interactions with servers.</t>
          </li>
          <li>
            <t>Proxy support: DNSCrypt packets can securely be proxied without having to be decrypted, allowing client IP addresses to be hidden from resolvers ("Anonymized DNSCrypt").</t>
          </li>
          <li>
            <t>Shared infrastructure: Recursive DNS servers can accept DNSCrypt queries on the same IP address and port used for regular DNS traffic.</t>
          </li>
          <li>
            <t>Attack mitigation: DNSCrypt mitigates two common security vulnerabilities in regular DNS over UDP: amplification <xref target="RFC5358"/> and fragmentation attacks.</t>
          </li>
        </ul>
        <t>These key features enable DNSCrypt to provide robust security while maintaining practical deployability.</t>
        <t>The protocol's transport characteristics further support these goals.</t>
      </section>
      <section anchor="transport">
        <name>Transport</name>
        <t>The DNSCrypt protocol can use the UDP and TCP transport protocols.</t>
        <t>DNSCrypt clients and resolvers <bcp14>SHOULD</bcp14> support the protocol via UDP, and <bcp14>MUST</bcp14> support it over TCP.</t>
        <t>Both TCP and UDP connections using DNSCrypt <bcp14>SHOULD</bcp14> employ port 443 by default.</t>
        <t>The choice of port 443 helps DNSCrypt traffic blend with HTTPS traffic, providing some protection against traffic analysis.</t>
        <t>A complete encrypted <tt>&lt;dnscrypt-query&gt;</tt> packet <bcp14>MUST NOT</bcp14> exceed 4096 bytes, and resolvers <bcp14>MUST</bcp14> accept queries up to this size over both UDP and TCP.</t>
        <t>This bound matches deployed implementations: clients never send larger queries, and resolvers stop reading beyond a few kilobytes.</t>
        <t>Once transport is established, the next step is session establishment through certificate exchange.</t>
      </section>
      <section anchor="session-establishment">
        <name>Session Establishment</name>
        <t>From the client's perspective, a DNSCrypt session is initiated when the client sends an unauthenticated DNS query to a DNSCrypt-capable resolver.</t>
        <t>This DNS query contains encoded information about the certificate versions supported by the client and a public identifier of the desired provider.</t>
        <t>The resolver sends back a collection of signed certificates that the client <bcp14>MUST</bcp14> verify using the pre-distributed provider public key.</t>
        <t>Each certificate includes a validity period, a serial number, a version that defines a key exchange mechanism, an authenticated encryption algorithm and its parameters, as well as a short-term public key, known as the resolver public key.</t>
        <t>Resolvers have the ability to support various algorithms and can concurrently advertise multiple short-term public keys (resolver public keys).</t>
        <t>The client picks the one with the highest serial number among the currently valid ones that match a supported protocol version.</t>
        <t>Every certificate contains a unique magic number that the client <bcp14>MUST</bcp14> include at the beginning of their queries.</t>
        <t>This allows the resolver to identify which certificate the client selected for crafting a particular query.</t>
        <t>The encryption algorithm, resolver public key, and client magic number from the chosen certificate are then used by the client to send encrypted queries.</t>
        <t>These queries include the client public key.</t>
        <t>With the knowledge of the chosen certificate and corresponding secret key, along with the client's public key, the resolver is able to verify, decrypt the query, and then encrypt the response utilizing identical parameters.</t>
        <t>Once the session is established through certificate exchange, the ongoing query processing follows specific rules for different transport protocols and padding requirements.</t>
      </section>
      <section anchor="query-processing">
        <name>Query Processing</name>
        <section anchor="padding-for-client-queries-over-udp">
          <name>Padding For Client Queries Over UDP</name>
          <t>Before encryption takes place, queries are padded according to the ISO/IEC 7816-4 standard.</t>
          <t>Padding begins with a single byte holding the value <tt>0x80</tt>, followed by any number of <tt>NUL</tt> bytes.</t>
          <t>The padding length <bcp14>MUST</bcp14> be at least 1 byte, because ISO/IEC 7816-4 padding always appends the initial <tt>0x80</tt> delimiter.</t>
          <t>A resolver that has authenticated and decrypted a query <bcp14>MUST</bcp14> accept this padding format; it <bcp14>MUST NOT</bcp14> reject a query solely because the plaintext length is not a multiple of 64 bytes.</t>
          <t><tt>&lt;min-query-len&gt;</tt> is a variable target length for the complete encrypted <tt>&lt;dnscrypt-query&gt;</tt> packet, including <tt>&lt;client-magic&gt;</tt>, <tt>&lt;client-pk&gt;</tt>, <tt>&lt;client-nonce&gt;</tt>, the authentication tag, and the encrypted padded DNS query.</t>
          <t>It is initially 256 bytes, and implementations <bcp14>MAY</bcp14> use a larger initial value, such as 512 bytes.</t>
          <t>A client pads the plaintext so that the complete UDP DNSCrypt packet is at least <tt>&lt;min-query-len&gt;</tt> bytes; when practical, the padded plaintext <tt>&lt;client-query&gt; &lt;client-query-pad&gt;</tt> <bcp14>SHOULD</bcp14> be a multiple of 64 bytes.</t>
          <t>This target is a sender-side anti-amplification and privacy parameter, not an additional receiver-side validity check.</t>
        </section>
        <section anchor="client-queries-over-udp">
          <name>Client Queries Over UDP</name>
          <t>UDP-based client queries need to follow the padding guidelines outlined in the previous section.</t>
          <t>Each UDP packet <bcp14>MUST</bcp14> hold one query, with the complete content comprising the <tt>&lt;dnscrypt-query&gt;</tt> structure specified in the Protocol Components section.</t>
          <t>A DNSCrypt UDP datagram may be fragmented at the IP layer like any other UDP datagram, and a client <bcp14>MAY</bcp14> send multiple independent queries from the same source port.</t>
          <t>Upon receiving a query, the resolver may choose to either disregard it or send back a response encrypted using DNSCrypt.</t>
          <t>The client <bcp14>MUST</bcp14> authenticate and, if authentication succeeds, decrypt the response with the help of the resolver's public key, the shared secret, and the response nonce.</t>
          <t>The client <bcp14>MUST</bcp14> verify that the <tt>&lt;client-nonce&gt;</tt> prefix of the response nonce matches a currently outstanding query.</t>
          <t>In case the response fails verification, or the <tt>&lt;client-nonce&gt;</tt> does not match a currently outstanding query, it <bcp14>MUST</bcp14> be disregarded by the client.</t>
          <t>If the response has the TC flag set, the client <bcp14>MUST</bcp14>:</t>
          <ol spacing="normal" type="1"><li>
              <t>send the query again using TCP <xref target="RFC7766"/></t>
            </li>
            <li>
              <t>update its future UDP padding target if its local size estimator indicates that larger UDP queries would have avoided truncation</t>
            </li>
          </ol>
          <t><tt>&lt;min-query-len&gt;</tt> <bcp14>MUST</bcp14> be capped so that the full length of a DNSCrypt packet does not exceed the maximum size supported by the transport path.</t>
          <t>A client <bcp14>MAY</bcp14> increase or decrease this value over time.</t>
          <t>The adjustment algorithm is implementation-defined.</t>
          <t>While UDP queries require careful length management due to truncation concerns, TCP queries follow different padding rules due to the reliable nature of the transport.</t>
        </section>
        <section anchor="padding-for-client-queries-over-tcp">
          <name>Padding For Client Queries Over TCP</name>
          <t>Queries <bcp14>MUST</bcp14> undergo padding using the ISO/IEC 7816-4 format before being encrypted.</t>
          <t>The padding starts with a byte valued <tt>0x80</tt> followed by a variable number of NUL bytes.</t>
          <t>TCP has no UDP amplification constraint, but padding still hides the exact DNS query length.</t>
          <t>A client <bcp14>SHOULD</bcp14> add a random padding component and <bcp14>SHOULD</bcp14> avoid deterministic plaintext lengths for repeated queries.</t>
          <t>A resolver <bcp14>MUST</bcp14> accept any authenticated plaintext that is valid ISO/IEC 7816-4 padding and parses as a DNS message, whatever the padded length; deployed receivers already behave this way.</t>
          <t>For example, an originally unpadded 56-byte DNS query can be validly padded as:</t>
          <t><tt>&lt;56-bytes-query&gt; 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00</tt></t>
          <t>or</t>
          <t><tt>&lt;56-bytes-query&gt; 0x80 (0x00 * 71)</tt></t>
          <t>or</t>
          <t><tt>&lt;56-bytes-query&gt; 0x80 (0x00 * 135)</tt></t>
          <t>or</t>
          <t><tt>&lt;56-bytes-query&gt; 0x80 (0x00 * 199)</tt></t>
        </section>
        <section anchor="client-queries-over-tcp">
          <name>Client Queries Over TCP</name>
          <t>The sole differences between encrypted client queries transmitted via TCP and those sent using UDP lie in the padding length calculation and the inclusion of a two-byte big-endian length prefix for the encrypted DNSCrypt packet.</t>
          <t>Cleartext DNS query payloads are not prefixed by their length before encryption, even when the DNSCrypt packet is sent over TCP.</t>
          <t>The two-byte TCP length prefix is added after encryption and covers the complete <tt>&lt;dnscrypt-query&gt;</tt> packet.</t>
          <t>Unlike UDP queries, a query sent over TCP can be shorter than the response.</t>
          <t>After having received a response from the resolver, the client and the resolver <bcp14>MUST</bcp14> close the TCP connection to ensure security and comply with this revision of the protocol, which prohibits multiple transactions over the same TCP connection.</t>
        </section>
        <section anchor="padding-for-resolver-responses">
          <name>Padding For Resolver Responses</name>
          <t>Before encryption takes place, responses are padded according to the ISO/IEC 7816-4 format.</t>
          <t>Padding begins with a single byte holding the value <tt>0x80</tt>, followed by any number of <tt>NUL</tt> bytes.</t>
          <t>When the transport size budget permits, the resolver <bcp14>SHOULD</bcp14> pad <tt>&lt;resolver-response&gt;</tt> <tt>&lt;resolver-response-pad&gt;</tt> to a multiple of 64 bytes.</t>
          <t>The padding length <bcp14>SHOULD</bcp14> be between 1 and 256 bytes, including the initial <tt>0x80</tt> byte.</t>
          <t>The padding length <bcp14>SHOULD</bcp14> be computed as a deterministic function of either <tt>(&lt;resolver-sk&gt;, &lt;client-nonce&gt;)</tt> or <tt>(&lt;shared-key&gt;, &lt;client-nonce&gt;)</tt>, for example with a pseudorandom function, so that retransmitted queries receive identically padded responses.</t>
          <t>The requirement prevents response padding from becoming an extra source of linkable server behavior while still allowing stateless operation.</t>
          <t>If the preferred padding would make an encrypted UDP response exceed the triggering query size or the resolver's UDP maximum, the resolver <bcp14>MAY</bcp14> use a shorter valid ISO/IEC 7816-4 padding length, or truncate the DNS response and set the DNS <tt>TC</tt> flag before padding and encryption.</t>
          <t>A client <bcp14>MUST</bcp14> accept any authenticated response whose plaintext has valid ISO/IEC 7816-4 padding and parses as a DNS response; it <bcp14>MUST NOT</bcp14> reject a response solely because the plaintext length is not a multiple of 64 bytes or because the padding length is outside the preferred range above.</t>
        </section>
        <section anchor="resolver-responses-over-udp">
          <name>Resolver Responses Over UDP</name>
          <t>The resolver <bcp14>MUST</bcp14> authenticate and decrypt client queries before forwarding them to the upstream DNS resolution path.</t>
          <t>Queries that cannot be authenticated, decrypted, unpadded, or parsed as DNS messages <bcp14>MUST</bcp14> be ignored.</t>
          <t>Any client-supplied nonce value <bcp14>MUST</bcp14> be accepted for decryption.</t>
          <t>A resolver <bcp14>MAY</bcp14> ignore or refuse queries encrypted with client public keys that are not authorized by local policy, but a public resolver that accepts anonymous clients <bcp14>MUST</bcp14> accept arbitrary client public keys, subject only to the cryptographic checks of Appendix 2, such as low-order key rejection.</t>
          <t>Responses sent over UDP <bcp14>MUST</bcp14> be padded as described in "Padding For Resolver Responses" and encrypted as <tt>&lt;dnscrypt-response&gt;</tt>.</t>
          <t>As in standard DNS, the decrypted response <bcp14>MUST</bcp14> echo the transaction ID and question of the decrypted query; deployed clients discard responses that do not.</t>
          <t>The resolver <bcp14>MUST NOT</bcp14> send an encrypted DNSCrypt response over UDP that is larger than the encrypted DNSCrypt query packet that triggered it.</t>
          <t>If the full encrypted response packet would be larger than the query packet even with minimal padding, the resolver <bcp14>MUST</bcp14> truncate the DNS response and set the DNS <tt>TC</tt> flag before padding and encryption.</t>
          <t>A resolver <bcp14>MUST NOT</bcp14> stay silent instead: the query was authenticated, and a dropped response leaves the client waiting out a retransmission timeout, whereas a truncated response makes it retry over TCP immediately.</t>
          <t>If the resolver sends a truncated response, the encrypted truncated response <bcp14>MUST</bcp14> still be equal to or shorter than the encrypted query packet.</t>
        </section>
        <section anchor="resolver-responses-over-tcp">
          <name>Resolver Responses Over TCP</name>
          <t>The resolver <bcp14>MUST</bcp14> authenticate and decrypt client queries as described for UDP.</t>
          <t>Queries that cannot be authenticated, decrypted, unpadded, or parsed as DNS messages <bcp14>MUST</bcp14> be ignored.</t>
          <t>Responses sent over TCP <bcp14>MUST</bcp14> be padded as described in "Padding For Resolver Responses" and encrypted as <tt>&lt;dnscrypt-response&gt;</tt>.</t>
          <t>The complete encrypted response packet is then prefixed with a two-byte big-endian length.</t>
          <t>Cleartext DNS response payloads are not prefixed by their length before encryption, even when the DNSCrypt packet is sent over TCP.</t>
          <t>Unlike UDP responses, TCP responses <bcp14>MUST</bcp14> be sent unmodified even if their encrypted length exceeds the encrypted query length.</t>
          <t>The complete encrypted response <bcp14>MUST</bcp14> nevertheless be smaller than 4096 bytes, because deployed clients reject larger DNSCrypt packets; a resolver whose DNS response would exceed this limit truncates it and sets the TC flag before padding and encryption.</t>
          <t>The query and response processing rules described above depend on the certificate information obtained during session establishment.</t>
          <t>The certificate format and management procedures are critical to the protocol's security.</t>
        </section>
      </section>
      <section anchor="certificates">
        <name>Certificates</name>
        <t>The following diagram shows the structure of a DNSCrypt certificate:</t>
        <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Cert Magic                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          ES Version           |    Protocol Minor Version     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                         Signature                             +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                      Resolver Public Key                      +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Client Magic                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Serial                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          TS Start                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          TS End                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                        Extensions                             +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        <t>To initiate a DNSCrypt session, a client transmits an ordinary unencrypted <tt>TXT</tt> DNS query to the resolver's IP address and DNSCrypt port.</t>
        <t>A client <bcp14>MAY</bcp14> use UDP or TCP according to local policy.</t>
        <t>Clients <bcp14>SHOULD</bcp14> try UDP first and retry over TCP after failure, timeout, or truncation. A PQ-capable client uses the rollover-sized padding target defined in Certificate Retrieval Amplification; although this can cause IP fragmentation, fragmented UDP works on most paths. A client on a path already known to block fragmented UDP <bcp14>MAY</bcp14> use TCP immediately.</t>
        <t>A resolver <bcp14>MUST</bcp14> serve certificates over both UDP and TCP; the UDP response <bcp14>MAY</bcp14> be truncated, with the TC flag set, to direct the client to TCP. Deployed clients begin certificate retrieval over UDP and only retry over TCP after a truncated response.</t>
        <t>The standard name in the question (<tt>&lt;provider name&gt;</tt>) follows this scheme:</t>
        <t><tt>&lt;protocol-major-version&gt; . dnscrypt-cert . &lt;zone&gt;</tt></t>
        <t>A major protocol version has only one certificate format.</t>
        <t>A DNSCrypt client implementing the second version of the protocol <bcp14>SHOULD</bcp14> send a query with the <tt>TXT</tt> type and <tt>IN</tt> class, and a name of the form:</t>
        <t><tt>2.dnscrypt-cert.example.com</tt></t>
        <t>Clients <bcp14>MAY</bcp14> support explicitly configured provider names that do not follow this convention.</t>
        <t>Such names are non-standard and can fail through Anonymized DNSCrypt relays that only recognize the standard certificate prefix.</t>
        <t>The RD (Recursion Desired) bit <bcp14>MAY</bcp14> be set; a resolver serving a certificate for its own provider name ignores it.</t>
        <t>A certificate query sent over UDP <bcp14>MAY</bcp14> include an EDNS(0) <xref target="RFC6891"/> <tt>OPT</tt> pseudo-RR with an EDNS(0) Padding option <xref target="RFC7830"/>.</t>
        <t>This padding is part of the DNS request length used for UDP anti-amplification checks.</t>
        <t>The padding bytes are NUL bytes and carry no protocol data.</t>
        <t>A resolver <bcp14>MUST</bcp14> ignore the padding contents when matching the question name and <bcp14>MUST NOT</bcp14> use the advertised EDNS(0) UDP payload size as an amplification budget.</t>
        <t>The zone <bcp14>MUST</bcp14> be a valid DNS name, but <bcp14>MAY</bcp14> not be registered in the DNS hierarchy.</t>
        <t>A single provider name can be shared by multiple resolvers operated by the same entity, and a resolver can respond to multiple provider
names, especially to support multiple protocol versions simultaneously.</t>
        <t>In order to use a DNSCrypt-enabled resolver, a client must know the following information:</t>
        <ul spacing="normal">
          <li>
            <t>The resolver IP address and port</t>
          </li>
          <li>
            <t>The provider name</t>
          </li>
          <li>
            <t>The provider public key</t>
          </li>
        </ul>
        <t>The provider public key is a long-term key whose sole purpose is to verify the certificates.</t>
        <t>It is never used to encrypt or verify DNS queries.</t>
        <t>A single provider public key can be employed to sign multiple certificates.</t>
        <t>For example, an organization operating multiple resolvers can use a unique provider name and provider public key across all resolvers, and just provide a list of IP addresses and ports.</t>
        <t>Each resolver <bcp14>MAY</bcp14> have its unique set of certificates that can be signed with the same key.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> that certificates are signed using specialized hardware rather than directly on the resolvers themselves.</t>
        <t>Once signed, resolvers <bcp14>SHOULD</bcp14> make these certificates available to clients.</t>
        <t>Signing certificates on dedicated hardware helps ensure security and integrity, as it isolates the process from potential vulnerabilities present in the resolver's system.</t>
        <t>A successful response to a certificate request contains one or more <tt>TXT</tt> records, each record containing a certificate encoded as follows:</t>
        <ul spacing="normal">
          <li>
            <t><tt>&lt;cert&gt;</tt>: <tt>&lt;cert-magic&gt; &lt;es-version&gt; &lt;protocol-minor-version&gt; &lt;signature&gt; &lt;resolver-pk&gt; &lt;client-magic&gt; &lt;serial&gt; &lt;ts-start&gt; &lt;ts-end&gt; &lt;extensions&gt;</tt></t>
          </li>
          <li>
            <t><tt>&lt;cert-magic&gt;</tt>: <tt>0x44 0x4e 0x53 0x43</tt></t>
          </li>
          <li>
            <t><tt>&lt;es-version&gt;</tt>: the cryptographic construction to use with this certificate. For the <tt>Box-XChaChaPoly</tt> construction of Appendix 1, that is, the X25519 key exchange with the <tt>XChaCha20_DJB-Poly1305</tt> authenticated encryption algorithm, <tt>&lt;es-version&gt;</tt> <bcp14>MUST</bcp14> be <tt>0x00 0x02</tt>. PQDNSCrypt uses <tt>0x00 0x03</tt>; these values are summarized below.</t>
          </li>
          <li>
            <t><tt>&lt;protocol-minor-version&gt;</tt>: <tt>0x00 0x00</tt></t>
          </li>
          <li>
            <t><tt>&lt;signature&gt;</tt>: a 64-byte signature of <tt>(&lt;resolver-pk&gt; &lt;client-magic&gt; &lt;serial&gt; &lt;ts-start&gt; &lt;ts-end&gt; &lt;extensions&gt;)</tt> using the Ed25519 algorithm and the provider secret key. Ed25519 <bcp14>MUST</bcp14> be used in this version of the protocol.</t>
          </li>
          <li>
            <t><tt>&lt;resolver-pk&gt;</tt>: the resolver short-term public key, which is 32 bytes when using X25519.</t>
          </li>
          <li>
            <t><tt>&lt;client-magic&gt;</tt>: an 8-byte value identifying this certificate; the client copies it verbatim into the first 8 bytes of every query built from this certificate. It is an opaque identifier and <bcp14>MAY</bcp14> be a truncated resolver public key. A provider <bcp14>MUST NOT</bcp14> issue two concurrently valid certificates with the same <tt>&lt;client-magic&gt;</tt>, <bcp14>MUST NOT</bcp14> use a value starting with <tt>0x00 0x00 0x00 0x00 0x00 0x00 0x00</tt> (seven all-zero bytes) in order to avoid confusion with the QUIC protocol <xref target="RFC9000"/>, and <bcp14>MUST NOT</bcp14> use the reserved <tt>&lt;resume-magic&gt;</tt> value defined in Stateless Resumption.</t>
          </li>
          <li>
            <t><tt>&lt;serial&gt;</tt>: a 4-byte serial number in big-endian format. If more than one certificate is valid for the encryption system the client selected, the client <bcp14>MUST</bcp14> prefer the certificate with a higher serial number.</t>
          </li>
          <li>
            <t><tt>&lt;ts-start&gt;</tt>: the date the certificate is valid from, as a big-endian 4-byte unsigned Unix timestamp. It <bcp14>MUST</bcp14> be strictly earlier than <tt>&lt;ts-end&gt;</tt>; deployed clients reject certificates whose validity interval is empty or inverted.</t>
          </li>
          <li>
            <t><tt>&lt;ts-end&gt;</tt>: the date the certificate is valid until (inclusive), as a big-endian 4-byte unsigned Unix timestamp.</t>
          </li>
          <li>
            <t><tt>&lt;extensions&gt;</tt>: empty in the current protocol version, but may contain additional data in future revisions, including minor versions. The computation and verification of the signature <bcp14>MUST</bcp14> include the extensions. An implementation not supporting these extensions <bcp14>MUST</bcp14> ignore them.</t>
          </li>
        </ul>
        <t>Certificates made of this information, without extensions, are 116 bytes long.</t>
        <t>With the addition of <tt>&lt;cert-magic&gt;</tt>, <tt>&lt;es-version&gt;</tt>, and <tt>&lt;protocol-minor-version&gt;</tt>, the record is 124 bytes long.</t>
        <t>The following encryption systems are defined by this document:</t>
        <dl>
          <dt><tt>0x00 0x02</tt>, <tt>Box-XChaChaPoly</tt>:</dt>
          <dd>
            <t>The resolver public key is 32 bytes, and the client public key in queries is
32 bytes. The nonce is split into a 12-byte client nonce and a 12-byte
resolver nonce. The shared key is
<tt>HChaCha20(X25519(pk, sk), 16 NUL bytes)</tt>. The certificate extensions field
is empty in this revision; unknown extensions are ignored after signature
verification.</t>
          </dd>
          <dt><tt>0x00 0x03</tt>, X-Wing PQDNSCrypt:</dt>
          <dd>
            <t>The resolver public key is 1216 bytes, and the client key-exchange field
(<tt>&lt;client-kex&gt;</tt>) in queries is 1120 bytes. The nonce is split into a 12-byte client nonce and a
12-byte resolver nonce. The shared key is derived with HKDF-SHA256 as
defined in "PQ Key Derivation". The certificate extensions field contains
the required 12-byte PQ profile extension.</t>
          </dd>
        </dl>
        <t>Each <tt>TXT</tt> answer record carries exactly one certificate blob.</t>
        <t>A client reads <tt>&lt;cert-magic&gt;</tt>, <tt>&lt;es-version&gt;</tt>, and <tt>&lt;protocol-minor-version&gt;</tt> first.</t>
        <t>If <tt>&lt;es-version&gt;</tt> is not supported, the client <bcp14>MUST</bcp14> ignore that certificate blob as a whole.</t>
        <t>It <bcp14>MUST NOT</bcp14> try to guess the <tt>&lt;resolver-pk&gt;</tt> length.</t>
        <t>Within a <tt>TXT</tt> record, the certificate is carried in the record's RDATA, which is a sequence of length-prefixed character-strings <xref target="RFC1035"/>.</t>
        <t>A client reconstructs the certificate by concatenating these character-strings in order, after removing the single length octet that precedes each one.</t>
        <t>A 124-byte classical certificate fits in a single character-string, whereas a larger certificate spans several character-strings that <bcp14>MUST</bcp14> be concatenated in this way before the certificate is parsed.</t>
        <t>After receiving a set of certificates, the client checks their validity based on the current date and filters out certificates for unsupported encryption systems.</t>
        <t>The client then applies local policy for the resolver.</t>
        <t>If local policy or provisioning says that a resolver supports or requires a specific profile, such as PQDNSCrypt, the client <bcp14>MUST</bcp14> select only certificates for that profile and <bcp14>MUST NOT</bcp14> fall back to a different profile.</t>
        <t>Otherwise, if multiple supported profiles remain, the client chooses the most preferred supported profile according to local policy, and then chooses the valid certificate with the highest serial number within that profile.</t>
        <t>A client with no profile preference <bcp14>MAY</bcp14> treat all supported profiles as one set and choose the highest serial number among them, using local policy to break ties.</t>
        <t>DNSCrypt queries sent by the client <bcp14>MUST</bcp14> use the <tt>&lt;client-magic&gt;</tt> header of the chosen certificate, as well as the specified encryption system and public key.</t>
        <t>The client <bcp14>MUST</bcp14> refresh certificates periodically and early enough to avoid using expired certificates.</t>
        <t>An hourly refresh interval is suitable, but not required.</t>
        <t>After a refresh, the client switches to a new certificate if:</t>
        <ul spacing="normal">
          <li>
            <t>The current certificate is not present or not valid anymore,</t>
          </li>
        </ul>
        <t>or</t>
        <ul spacing="normal">
          <li>
            <t>A certificate with a higher serial number than the current one is available.</t>
          </li>
        </ul>
        <t>The certificate management system ensures that cryptographic keys remain fresh and that clients can smoothly transition to updated certificates.</t>
        <t>With the core protocol mechanics now established, we can examine implementation considerations.</t>
      </section>
    </section>
    <section anchor="conformance-checklist">
      <name>Conformance Checklist</name>
      <t>A conformant DNSCrypt v2 client implementation has enough information in this document to:</t>
      <ul spacing="normal">
        <li>
          <t>Build and parse DNS wire-format <tt>TXT</tt> certificate queries for the configured provider name, using UDP or TCP according to local policy and retrying over TCP when a direct TCP retry is appropriate.</t>
        </li>
        <li>
          <t>Reconstruct certificates from DNS <tt>TXT</tt> character-strings, verify the Ed25519 signature with the configured provider public key, reject unsupported or invalid certificates, and choose a valid certificate for a supported encryption system according to serial number and local profile policy.</t>
        </li>
        <li>
          <t>Generate a client key pair and a unique <tt>&lt;client-nonce&gt;</tt> for each newly encrypted query under the same client secret key and resolver public key.</t>
        </li>
        <li>
          <t>Pad DNS queries with ISO/IEC 7816-4 padding, encrypt them with the selected certificate parameters, and send exactly one <tt>&lt;dnscrypt-query&gt;</tt> per UDP datagram or one length-prefixed packet per TCP connection.</t>
        </li>
        <li>
          <t>Authenticate responses, verify that the returned nonce starts with an outstanding <tt>&lt;client-nonce&gt;</tt>, remove padding, and forward the unmodified DNS response to the caller.</t>
        </li>
        <li>
          <t>Retry over TCP when an authenticated UDP response carries the DNS <tt>TC</tt> flag, and maintain a UDP padding target that keeps later encrypted UDP responses within the query size when practical.</t>
        </li>
      </ul>
      <t>A conformant DNSCrypt v2 resolver implementation has enough information in this document to:</t>
      <ul spacing="normal">
        <li>
          <t>Generate, sign, serve, rotate, and retire resolver certificates without using the long-term provider key for query traffic.</t>
        </li>
        <li>
          <t>Select the certificate matching an incoming <tt>&lt;client-magic&gt;</tt>, derive the shared key from the client public key, authenticate and decrypt the query, reject bad padding or malformed DNS payloads silently, and pass the decrypted DNS query to the resolver path.</t>
        </li>
        <li>
          <t>Pad, encrypt, and frame responses using the nonce <tt>(&lt;client-nonce&gt; &lt;resolver-nonce&gt;)</tt>, respecting the UDP anti-amplification guidance and the TCP length-prefix rules.</t>
        </li>
        <li>
          <t>Serve classical certificate responses over UDP, and add larger PQ certificate records over UDP only when the complete response is no larger than the triggering request; otherwise set <tt>TC</tt> and rely on a padded UDP query or TCP as described below.</t>
        </li>
      </ul>
      <t>A conformant Anonymized DNSCrypt relay implementation has enough information in this document to:</t>
      <ul spacing="normal">
        <li>
          <t>Accept length-prefixed TCP and unframed UDP Anonymized DNSCrypt queries.</t>
        </li>
        <li>
          <t>Validate the target address, target port, and inner query prefix before forwarding.</t>
        </li>
        <li>
          <t>Forward the inner query to the target resolver over UDP without decrypting or modifying it.</t>
        </li>
        <li>
          <t>Forward only valid upstream responses that match the relayed query and do not violate the response-size rule, adding only TCP framing when returning a response to a TCP client.</t>
        </li>
      </ul>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>Note: This section is to be removed before publishing as an RFC.</em></t>
      <t>Multiple implementations of the protocol described in this document have been developed and verified for interoperability.</t>
      <t>A comprehensive list of known implementations can be found at <eref target="https://dnscrypt.info/implementations"/>.</t>
      <t>The successful deployment of multiple interoperable implementations demonstrates the protocol's maturity.</t>
      <t>However, proper implementation requires careful attention to security considerations.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This section discusses security considerations for the DNSCrypt protocol.</t>
      <section anchor="protocol-security">
        <name>Protocol Security</name>
        <t>The DNSCrypt protocol provides several security benefits:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Confidentiality</strong>: DNS queries and responses are encrypted with the authenticated-encryption construction selected by the certificate. The current classical and PQ constructions in this document use <tt>XChaCha20_DJB-Poly1305</tt> as defined in Appendix 1, preventing eavesdropping of DNS traffic. For example, a query for "example.com" would be encrypted and appear as random data to an observer.</t>
          </li>
          <li>
            <t><strong>Integrity</strong>: Message authentication using the Poly1305 tag in Appendix 1 ensures that responses cannot be tampered with in transit. Any modification to the encrypted response would be detected and rejected by the client.</t>
          </li>
          <li>
            <t><strong>Authentication</strong>: The use of Ed25519 for certificate signatures, together with the key-exchange mechanism selected by the certificate, provides strong authentication of resolvers. Clients can verify they are communicating with the intended resolver and not an impostor.</t>
          </li>
          <li>
            <t><strong>Short-Term Resolver Keys</strong>: Resolver certificates carry short-term public keys, limiting the impact of key compromise and enabling regular key rotation.</t>
          </li>
        </ol>
        <t>These fundamental security properties depend on correct implementation practices.</t>
        <t>Several implementation-specific security aspects require particular attention.</t>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <t>Implementations should consider the following security aspects:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Key Management</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>Resolvers <bcp14>MUST</bcp14> rotate their short-term key pairs at most every 24 hours</t>
              </li>
              <li>
                <t>Previous resolver secret keys <bcp14>MUST</bcp14> be retained while unexpired served certificates still refer to them, and <bcp14>MUST</bcp14> be discarded as soon as no such certificate remains, or immediately if the key is believed to be compromised; the full rule appears in Operational Considerations</t>
              </li>
              <li>
                <t>Provider secret keys used for certificate signing <bcp14>SHOULD</bcp14> be stored in hardware security modules (HSMs)</t>
              </li>
              <li>
                <t>Example: A resolver might generate new key pairs daily at midnight UTC</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Nonce Management</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>Nonces <bcp14>MUST NOT</bcp14> be reused for a given shared secret</t>
              </li>
              <li>
                <t>Clients <bcp14>SHOULD</bcp14> generate <tt>&lt;client-nonce&gt;</tt> values using either a cryptographically secure random number generator with enough entropy to make collisions negligible for the lifetime of the shared secret, or a secret-key pseudorandom construction, such as encrypting a timestamp and any counter or random bits needed for uniqueness using a block cipher. Such constructions <bcp14>MUST NOT</bcp14> expose wall-clock time or other stable client state to observers, and <bcp14>MUST</bcp14> still provide nonce uniqueness for the lifetime of the shared secret</t>
              </li>
              <li>
                <t>Clients <bcp14>SHOULD NOT</bcp14> include unencrypted timestamps in nonce values, especially when Anonymized DNSCrypt, Tor, SOCKS, or other proxying or anonymity systems are used</t>
              </li>
              <li>
                <t>Clients can quickly discard stale responses by keeping local state for outstanding queries, including their <tt>&lt;client-nonce&gt;</tt> values and expiration deadlines, and rejecting responses for nonces that are unknown, already answered, or expired</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Padding</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>Implementations <bcp14>MUST</bcp14> use the specified padding scheme to prevent traffic analysis</t>
              </li>
              <li>
                <t>The minimum query length <bcp14>SHOULD</bcp14> be adjusted based on network conditions</t>
              </li>
              <li>
                <t>Example: A 50-byte query might be padded to 256 bytes to prevent size-based fingerprinting</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Certificate Validation</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>Clients <bcp14>MUST</bcp14> verify certificate signatures using the provider's public key</t>
              </li>
              <li>
                <t>Certificates <bcp14>MUST</bcp14> be checked for validity periods</t>
              </li>
              <li>
                <t>Clients <bcp14>MUST</bcp14> prefer certificates with higher serial numbers within the selected encryption system</t>
              </li>
              <li>
                <t>Example: A client might cache valid certificates and check for updates hourly</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>Proper implementation of these security measures provides the foundation for the protocol's attack mitigation capabilities.</t>
      </section>
      <section anchor="attack-mitigation">
        <name>Attack Mitigation</name>
        <t>DNSCrypt provides protection against several types of attacks:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>DNS Spoofing</strong>: The use of authenticated encryption prevents spoofed responses. An attacker cannot forge responses without the server's secret key.</t>
          </li>
          <li>
            <t><strong>Amplification Attacks</strong>: UDP encrypted responses are limited by the size of the encrypted query that triggered them, and client padding targets help keep the amplification factor bounded <xref target="RFC5358"/>. Certificate retrieval has separate rules because it is unauthenticated and uses ordinary DNS <tt>TXT</tt> responses.</t>
          </li>
          <li>
            <t><strong>Fragmentation Attacks</strong>: The protocol mitigates fragmentation risks by padding queries, allowing truncated UDP responses, and retrying over TCP when necessary.</t>
          </li>
          <li>
            <t><strong>Replay Exposure Reduction</strong>: Nonces make responses query-specific. Clients can discard late, duplicate, or unrelated responses by checking the returned <tt>&lt;client-nonce&gt;</tt> against local outstanding-query state and request deadlines, without exposing timestamps in plaintext nonce values.</t>
          </li>
        </ol>
        <t>While DNSCrypt effectively mitigates these attacks, implementers should also be aware of privacy considerations that extend beyond basic protocol security.</t>
      </section>
      <section anchor="privacy-considerations">
        <name>Privacy Considerations</name>
        <t>While DNSCrypt encrypts DNS traffic, there are some privacy considerations:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Resolver Knowledge</strong>: Resolvers can still see the client's IP address unless Anonymized DNSCrypt is used. This can reveal the client's location and network.</t>
          </li>
          <li>
            <t><strong>Query Patterns</strong>: Even with encryption, the size and timing of queries may reveal information. Padding helps mitigate this but doesn't eliminate it completely.</t>
          </li>
          <li>
            <t><strong>Nonce Metadata</strong>: Client nonces are visible on the wire. Encoding unencrypted timestamps or other stable or linkable state in nonce values can disclose clock information or support client fingerprinting, particularly when relays or anonymity networks are used. Clients <bcp14>SHOULD</bcp14> prefer nonce constructions that reveal no wall-clock time to observers.</t>
          </li>
          <li>
            <t><strong>Certificate Requests</strong>: Initial certificate requests are unencrypted but only return public data. This is a one-time exposure per session.</t>
          </li>
        </ol>
        <t>These privacy considerations complement the security measures and should inform operational practices for DNSCrypt deployments.</t>
      </section>
      <section anchor="operational-security">
        <name>Operational Security</name>
        <t>Operators should consider:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Key Distribution</strong>: Provider public keys should be distributed securely to clients. This might involve:
            </t>
            <ul spacing="normal">
              <li>
                <t>Publishing keys on secure websites</t>
              </li>
              <li>
                <t>Using DNSSEC-signed records</t>
              </li>
              <li>
                <t>Including keys in software distributions</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Certificate Management</strong>: Certificates should be signed on dedicated hardware, not on resolvers. This provides:
            </t>
            <ul spacing="normal">
              <li>
                <t>Better key protection</t>
              </li>
              <li>
                <t>Centralized certificate management</t>
              </li>
              <li>
                <t>Reduced attack surface</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Access Control</strong>: Resolvers may implement access control based on client public keys. This can:
            </t>
            <ul spacing="normal">
              <li>
                <t>Prevent abuse</t>
              </li>
              <li>
                <t>Enable service differentiation</t>
              </li>
              <li>
                <t>Support business models</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Monitoring</strong>: Operators should monitor for unusual patterns that may indicate attacks:
            </t>
            <ul spacing="normal">
              <li>
                <t>High query rates from single clients</t>
              </li>
              <li>
                <t>Unusual query patterns</t>
              </li>
              <li>
                <t>Certificate request anomalies</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>These operational security practices work together with the technical security measures to provide comprehensive protection.</t>
        <t>Additional operational considerations extend beyond security to include practical deployment aspects.</t>
      </section>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>Special attention should be paid to the uniqueness of the generated secret keys.</t>
      <t>Client public keys can be used by resolvers to authenticate clients, link queries to customer accounts, and unlock business-specific features such as redirecting specific domain names to a sinkhole.</t>
      <t>A resolver that restricts service to known clients <bcp14>MAY</bcp14> respond only to an allowed set of client public keys.</t>
      <t>A resolver that serves arbitrary, anonymous clients <bcp14>MUST</bcp14> accept any client public key as a matter of policy; cryptographic checks, such as the rejection of low-order public keys in Appendix 2, still apply.</t>
      <t>In particular, an anonymous client can generate a new key pair for every session, or even for every query.</t>
      <t>This mitigates the ability for a resolver to group queries by client public keys and discover the set of IP addresses a user might have been operating.</t>
      <t>Resolvers <bcp14>MUST</bcp14> rotate each short-term key pair every 24 hours at most.</t>
      <t>After a key rotation, a resolver <bcp14>MUST</bcp14> continue accepting queries for every unexpired certificate it still serves, which requires retaining the corresponding resolver secret keys.</t>
      <t>Once all certificates for an old resolver key have expired or been withdrawn, the resolver <bcp14>MUST</bcp14> discard that old secret key.</t>
      <t>If an old resolver key is believed to be compromised, the resolver <bcp14>MUST</bcp14> withdraw the related certificates and discard the key instead of continuing to accept it.</t>
      <t>Provider public keys <bcp14>MAY</bcp14> be published as DNSSEC-signed <tt>TXT</tt> records <xref target="RFC1035"/>, in the same zone as the provider name.</t>
      <t>For example, a query for the <tt>TXT</tt> type on the name <tt>"2.pubkey.example.com"</tt> may return a signed record containing a hexadecimal-encoded provider public key for the provider name <tt>"2.dnscrypt-cert.example.com"</tt>.</t>
      <t>As a client is likely to reuse the same key pair many times, servers are encouraged to cache shared keys instead of performing the X25519 operation for each query.</t>
      <t>This makes the computational overhead of DNSCrypt negligible compared to plain DNS.</t>
      <t>While DNSCrypt provides strong encryption and authentication, some use cases require additional privacy protection.</t>
      <t>The Anonymized DNSCrypt extension addresses scenarios where hiding client IP addresses from resolvers is necessary.</t>
    </section>
    <section anchor="anonymized-dnscrypt">
      <name>Anonymized DNSCrypt</name>
      <t>While DNSCrypt encrypts DNS traffic, DNS server operators can still observe client IP addresses.</t>
      <t>Anonymized DNSCrypt is an extension to the DNSCrypt protocol that allows queries and responses to be relayed by an intermediate server, hiding the client's IP address from the resolver.</t>
      <t>This extension maintains all the security properties of standard DNSCrypt while adding an additional layer of privacy protection.</t>
      <section anchor="protocol-overview">
        <name>Protocol Overview</name>
        <t>Anonymized DNSCrypt works by having the client send encrypted queries to a relay server, which then forwards them to the actual DNSCrypt resolver.</t>
        <t>The relay server cannot decrypt the queries or responses, and the resolver only sees the relay's IP address.</t>
        <artwork><![CDATA[
[Client]----(encrypted query)--->[Relay]----(encrypted query)--->[Server]

[Client]<--(encrypted response)--[Relay]<--(encrypted response)--[Server]
]]></artwork>
        <t>Key properties of Anonymized DNSCrypt:</t>
        <ul spacing="normal">
          <li>
            <t>The relay cannot decrypt or modify queries and responses</t>
          </li>
          <li>
            <t>The resolver only sees the relay's IP address, not the client's</t>
          </li>
          <li>
            <t>A DNSCrypt server can simultaneously act as a relay</t>
          </li>
          <li>
            <t>The protocol works over both UDP and TCP</t>
          </li>
        </ul>
      </section>
      <section anchor="client-queries">
        <name>Client Queries</name>
        <t>The following diagram shows the structure of an Anonymized DNSCrypt query packet:</t>
        <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Anon Magic                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                        Server IP (IPv6)                       +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Server Port        |                                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                                   +
|                                                               |
+                     DNSCrypt Query                            +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        <t>An Anonymized DNSCrypt query is a standard DNSCrypt query prefixed with information about the target server:</t>
        <artwork><![CDATA[
<anondnscrypt-query> ::=
    <anon-magic> <server-ip> <server-port> <dnscrypt-query>
]]></artwork>
        <t>Where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>&lt;anon-magic&gt;</tt>: <tt>0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x00 0x00</tt></t>
          </li>
          <li>
            <t><tt>&lt;server-ip&gt;</tt>: 16 bytes encoded IPv6 address (IPv4 addresses are mapped to IPv6 using <tt>::ffff:&lt;ipv4 address&gt;</tt> <xref target="RFC4291"/>)</t>
          </li>
          <li>
            <t><tt>&lt;server-port&gt;</tt>: 2 bytes in big-endian format</t>
          </li>
          <li>
            <t><tt>&lt;dnscrypt-query&gt;</tt>: either a standard encrypted DNSCrypt query or the unencrypted <tt>TXT</tt> certificate query used to retrieve resolver certificates.</t>
          </li>
        </ul>
        <t>For example, a query for a server at 192.0.2.1:443 would be prefixed with:</t>
        <artwork><![CDATA[
0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0xff 0xff 0xc0 0x00 0x02 0x01 0x01 0xbb
]]></artwork>
        <t>An Anonymized DNSCrypt query sent over UDP is sent as this exact byte string.</t>
        <t>An Anonymized DNSCrypt query sent over TCP is prefixed with a two-byte big-endian length that covers the complete <tt>&lt;anondnscrypt-query&gt;</tt> byte string.</t>
        <t>The relay removes the TCP length prefix before validating the packet and adds a new TCP length prefix when returning the upstream response to a TCP client.</t>
      </section>
      <section anchor="relay-behavior">
        <name>Relay Behavior</name>
        <t>Relays <bcp14>MUST</bcp14>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Accept queries over both TCP and UDP</t>
          </li>
          <li>
            <t>Communicate with upstream servers over UDP, even if client queries were sent to the relay over TCP</t>
          </li>
          <li>
            <t>Validate incoming packets:  </t>
            <ul spacing="normal">
              <li>
                <t>Check that the target IP is not in a private, loopback, link-local, multicast, unspecified, or otherwise locally routed range</t>
              </li>
              <li>
                <t>Verify the port number is in an allowed range</t>
              </li>
              <li>
                <t>Ensure the inner <tt>&lt;dnscrypt-query&gt;</tt> doesn't start with <tt>&lt;anon-magic&gt;</tt></t>
              </li>
              <li>
                <t>Reject the inner <tt>&lt;dnscrypt-query&gt;</tt> if its first 8 bytes are <tt>0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01</tt>, to avoid protocol confusion with QUIC <xref target="RFC9000"/>; relays <bcp14>MAY</bcp14> reject broader reserved prefixes by local policy</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Forward the inner <tt>&lt;dnscrypt-query&gt;</tt> unmodified to the target server over UDP, without the Anonymized DNSCrypt prefix</t>
          </li>
          <li>
            <t>Verify server responses:  </t>
            <ul spacing="normal">
              <li>
                <t>For encrypted DNSCrypt responses, check that the response is no larger than the inner query packet forwarded upstream</t>
              </li>
              <li>
                <t>For certificate responses, check that the response transaction ID and query name match the relayed certificate query, and that the response is no larger than the inner query packet forwarded upstream</t>
              </li>
              <li>
                <t>Validate the response format (either starts with resolver magic or is a certificate response)</t>
              </li>
              <li>
                <t>Forward valid responses unmodified to the client, adding only the TCP length prefix when the client connection used TCP</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>A relay <bcp14>MAY</bcp14> briefly cache a validated certificate response and replay it for identical certificate queries, rewriting only the DNS transaction ID; deployed relays cache certificate responses for a few minutes.</t>
        <t>Address validation is performed after decoding <tt>&lt;server-ip&gt;</tt>.</t>
        <t>If the decoded address is an IPv4-mapped IPv6 address, the relay applies the IPv4 policy to the embedded IPv4 address.</t>
        <t>Relay operators <bcp14>SHOULD</bcp14> maintain an explicit allowlist or denylist of target ranges.</t>
        <t>At minimum, relays <bcp14>MUST</bcp14> reject targets that are not globally routable, including unspecified, loopback, link-local, multicast, private-use, unique-local, documentation, benchmarking, and other special-use addresses.</t>
        <t>These relay requirements ensure that anonymization does not compromise the security properties of the underlying DNSCrypt protocol.</t>
        <t>Proper deployment requires additional operational considerations.</t>
      </section>
      <section anchor="operational-considerations-1">
        <name>Operational Considerations</name>
        <t>When using Anonymized DNSCrypt:</t>
        <ol spacing="normal" type="1"><li>
            <t>Clients should choose relays and servers operated by different entities</t>
          </li>
          <li>
            <t>Having relays and servers on different networks is recommended</t>
          </li>
          <li>
            <t>Relay operators should:
            </t>
            <ul spacing="normal">
              <li>
                <t>Refuse forwarding to reserved IP ranges <xref target="RFC1918"/></t>
              </li>
              <li>
                <t>Restrict allowed server ports (typically only allowing port 443)</t>
              </li>
              <li>
                <t>Monitor for abuse</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>These operational guidelines help ensure that Anonymized DNSCrypt deployments provide the intended privacy benefits while maintaining security and preventing abuse.</t>
      </section>
    </section>
    <section anchor="post-quantum-key-exchange-pqdnscrypt">
      <name>Post-Quantum Key Exchange (PQDNSCrypt)</name>
      <t>The key exchange described so far relies on X25519 <xref target="RFC7748"/>, which a sufficiently capable quantum computer would be able to break.</t>
      <t>An attacker who records DNSCrypt traffic today could therefore decrypt it once such a computer exists.</t>
      <t>This section defines the PQ extension, which performs the key exchange with a hybrid post-quantum mechanism while leaving the rest of the protocol unchanged: the certificate system, the packet framing, the authenticated encryption, the nonces, the padding philosophy, and Anonymized DNSCrypt all carry over.</t>
      <t>A DNSCrypt deployment that uses this extension is referred to as PQDNSCrypt.</t>
      <t>PQ is introduced as a new encryption system version (<tt>&lt;es-version&gt;</tt> <tt>0x00 0x03</tt>) inside the existing version 2 certificate format.</t>
      <t>It is not a new major protocol version, and it does not change the certificate lookup name.</t>
      <t>A resolver <bcp14>MAY</bcp14> advertise a PQ certificate alongside a classical certificate under the same provider name, and a client that does not implement PQ ignores the <tt>&lt;es-version&gt;</tt> value it does not recognize, exactly as already required.</t>
      <t>The values that PQ introduces, namely the <tt>&lt;es-version&gt;</tt>, the resume magic, the ticket parameters, and the profile identifiers, are provisional assignments used by this document and by the test vectors in Appendix 3.</t>
      <t>They are expected to be confirmed before publication.</t>
      <section anchor="key-encapsulation-instead-of-key-agreement">
        <name>Key Encapsulation Instead of Key Agreement</name>
        <t>Classical DNSCrypt uses a non-interactive key agreement: the resolver publishes an X25519 public key in its certificate, the client places its own X25519 public key in <tt>&lt;client-pk&gt;</tt>, and both sides compute the same shared secret.</t>
        <t>A post-quantum key encapsulation mechanism (KEM) does not offer a non-interactive key agreement, but it fits the same single-message exchange.</t>
        <t>The resolver generates a KEM key pair and publishes the public (encapsulation) key in the <tt>&lt;resolver-pk&gt;</tt> field of its certificate.</t>
        <t>The client runs the KEM encapsulation against <tt>&lt;resolver-pk&gt;</tt>, obtaining a ciphertext and a shared secret, and places the ciphertext in the <tt>&lt;client-pk&gt;</tt> field.</t>
        <t>The resolver runs the KEM decapsulation on the received ciphertext using its secret key and recovers the same shared secret.</t>
        <t>The <tt>&lt;client-pk&gt;</tt> field therefore carries a KEM ciphertext rather than a client public key, and its length is determined by the <tt>&lt;es-version&gt;</tt> of the chosen certificate; the PQ text refers to the value carried in this field as <tt>&lt;client-kex&gt;</tt>.</t>
        <t>The resolver remains stateless: it derives the shared secret from a single client message, with no per-client state.</t>
        <t>Everything after the shared secret is shared with classical DNSCrypt, with the small additions described in this section.</t>
        <t>PQ uses X-Wing <xref target="I-D.connolly-cfrg-xwing-kem"/>, a hybrid KEM that combines ML-KEM-768 <xref target="FIPS203"/> with X25519 <xref target="RFC7748"/>.</t>
        <t>Being a hybrid, the shared secret remains secure as long as either ML-KEM-768 or X25519 is unbroken, which protects against both a future quantum break of X25519 and an unexpected weakness in ML-KEM-768.</t>
        <t>The X-Wing encapsulation key is 1216 bytes, the ciphertext is 1120 bytes, and the shared secret is 32 bytes.</t>
      </section>
      <section anchor="pq-certificates">
        <name>PQ Certificates</name>
        <t>A PQ certificate uses the version 2 certificate format without modification.</t>
        <t>The <tt>&lt;es-version&gt;</tt> field is <tt>0x00 0x03</tt>, and the <tt>&lt;resolver-pk&gt;</tt> field holds the 1216-byte X-Wing encapsulation key.</t>
        <t>The <tt>&lt;client-magic&gt;</tt> retains its role as a unique 8-byte certificate selector that <bcp14>MUST NOT</bcp14> begin with seven zero bytes; because a KEM ciphertext is freshly generated for every query, <tt>&lt;client-magic&gt;</tt> is an opaque identifier and is never a truncated public key.</t>
        <t>The Ed25519 signature input is unchanged.</t>
        <t>It <bcp14>MUST</bcp14> cover <tt>(&lt;resolver-pk&gt; &lt;client-magic&gt; &lt;serial&gt; &lt;ts-start&gt; &lt;ts-end&gt; &lt;extensions&gt;)</tt>, exactly as for classical certificates, so that provider signing procedures do not require a second code path.</t>
        <t>The PQ profile metadata is authenticated through the already-signed <tt>&lt;extensions&gt;</tt> field, which for a PQ certificate contains a profile extension:</t>
        <artwork><![CDATA[
<pq-profile-ext> ::= "PQD" <ext-version> <es-version> <kdf-id>
                      <aead-id> <resolver-pk-len> <client-kex-len>
]]></artwork>
        <t>where <tt>&lt;ext-version&gt;</tt> is <tt>0x01</tt>, <tt>&lt;kdf-id&gt;</tt> is <tt>0x01</tt> for HKDF-SHA256 <xref target="RFC5869"/>, <tt>&lt;aead-id&gt;</tt> is <tt>0x01</tt> for the <tt>XChaCha20_DJB-Poly1305</tt> construction of Appendix 1, and <tt>&lt;resolver-pk-len&gt;</tt> and <tt>&lt;client-kex-len&gt;</tt> are the encapsulation-key and ciphertext lengths as two-byte big-endian integers.</t>
        <t>A client implementing PQ <bcp14>MUST</bcp14> require this extension on a PQ certificate and <bcp14>MUST</bcp14> reject the certificate if the <tt>&lt;es-version&gt;</tt> on the wire or the field lengths disagree with the signed copies in the extension.</t>
        <t>The existing signature already provides implicit integrity for <tt>&lt;es-version&gt;</tt>, because <tt>&lt;resolver-pk&gt;</tt> is signed and its length follows from <tt>&lt;es-version&gt;</tt>: altering the version shifts the signed region and causes verification to fail, as long as distinct encryption systems use distinct <tt>&lt;resolver-pk&gt;</tt> lengths.</t>
        <t>The signed profile extension makes the binding explicit and preserves it should a future encryption system reuse an existing length.</t>
        <t>PQ certificates are approximately 1.3 KB before DNS <tt>TXT</tt> record framing.</t>
        <t>A single 1320-byte PQ certificate requires six <tt>TXT</tt> character-strings and therefore about 1338 bytes as one answer RR; a response containing one classical 124-byte certificate and one PQ certificate is typically about 1.5 KB, depending on the provider name.</t>
        <t>A response with two classical certificates and two PQ certificates is typically about 3.0 KB.</t>
        <t>A response with one classical certificate and three PQ certificates will normally exceed 4096 octets.</t>
        <t>A certificate response that contains a PQ certificate exceeds 512 bytes, so retrieval relies on a sufficiently padded UDP query, TCP <xref target="RFC7766"/>, or both.</t>
        <t>A 4096-octet DNS response is a useful upper bound for certificate responses, but it is not a fragmentation-avoidance target.</t>
        <t>Operators that need maximum UDP robustness <bcp14>SHOULD</bcp14> use a lower target; however, one PQ certificate already exceeds the common 1232-octet UDP payload target once DNS framing is included.</t>
      </section>
      <section anchor="certificate-retrieval-amplification">
        <name>Certificate Retrieval Amplification</name>
        <t>Certificate retrieval is an unauthenticated DNS query, and PQ certificates are much larger than classical ones, so a resolver that returns one or more PQ certificates over UDP could be abused as a traffic amplifier in response to queries with a spoofed source address.</t>
        <t>For compatibility with deployed DNSCrypt v2 clients and resolvers, a resolver <bcp14>MAY</bcp14> return the small classical certificate response to an ordinary UDP certificate query.</t>
        <t>A resolver <bcp14>MUST NOT</bcp14> add PQ certificates or other large certificate records to a UDP certificate response unless the complete response is no larger than the request that triggered it.</t>
        <t>A client retrieving PQ certificates over UDP therefore <bcp14>MUST</bcp14> pad its certificate query to at least the size of the expected response, exactly as a query that carries a ciphertext is already large enough to cover its response.</t>
        <t>The advertised EDNS(0) <xref target="RFC6891"/> UDP payload size is a fragmentation-avoidance hint and <bcp14>MUST NOT</bcp14> be used as the amplification limit, because a spoofed query can advertise an arbitrarily large buffer while remaining small.</t>
        <t>To let a client size that padding, a resolver <bcp14>SHOULD</bcp14> keep its UDP certificate set small and predictable.</t>
        <t>For relay-compatible PQ deployments, resolvers <bcp14>SHOULD</bcp14> use the following certificate sets:</t>
        <ul spacing="normal">
          <li>
            <t>Normal steady state: one classical certificate and one PQ certificate, typically about 1.5 KB.</t>
          </li>
          <li>
            <t>Rollover window: two classical certificates and two PQ certificates, typically about 3.0 KB.</t>
          </li>
        </ul>
        <t>Resolvers <bcp14>SHOULD NOT</bcp14> exceed the rollover certificate set over UDP, and <bcp14>SHOULD</bcp14> keep certificate responses below 4096 octets.</t>
        <t>A client cannot tell from outside whether a rotation is in progress. A client retrieving PQ certificates over UDP therefore <bcp14>MUST</bcp14> pad its certificate query to cover the rollover set rather than only the steady-state set; otherwise it silently drops to the classical certificate for the duration of every rollover window. This padding exceeds common fragmentation-avoidance targets, but clients <bcp14>SHOULD</bcp14> try UDP first because fragmented UDP works on most paths, and retry over TCP only after timeout or truncation.</t>
        <t>If the certificate response containing the PQ set would be larger than the request, the resolver <bcp14>MUST NOT</bcp14> return that oversized PQ response over UDP; it <bcp14>SHOULD</bcp14> instead return the classical certificate response with the TC flag set, so a classical-only client can proceed while a PQ-capable client learns that more certificates may be available.</t>
        <t>Operators <bcp14>MAY</bcp14> serve the classical certificate over UDP while requiring a padded query or TCP for larger PQ certificate sets.</t>
        <t>This affects neither the certificate format nor the lookup name.</t>
        <t>Because a resolver can withhold PQ certificates from a truncated UDP response, a PQ-capable client <bcp14>MUST</bcp14> honor the TC flag on a certificate response and retry the certificate query over TCP when TCP to the resolver is available.</t>
        <t>A client that ignores the TC flag would only ever observe the certificates present in the UDP response and could silently fail to use PQ even against a resolver that supports it.</t>
      </section>
      <section anchor="pq-key-derivation">
        <name>PQ Key Derivation</name>
        <t>For a PQ query, the shared secret is the 32-byte X-Wing shared secret.</t>
        <t>It is not used directly as the encryption key.</t>
        <t>Instead, both parties derive <tt>&lt;shared-key&gt;</tt> with HKDF-SHA256 <xref target="RFC5869"/>, binding the certificate context and the ciphertext:</t>
        <artwork><![CDATA[
cert-context ::= "DNSCrypt-PQ-v1" <es-version>
                 <protocol-minor-version> <resolver-pk>
                 <client-magic> <serial> <ts-start> <ts-end>
                 <extensions>

<shared-key> ::= HKDF-SHA256(IKM  = <kem-ss>,
                             salt = <es-version> <client-magic>,
                             info = cert-context <client-kex>,
                             L    = 32)
]]></artwork>
        <t>where <tt>&lt;kem-ss&gt;</tt> is the X-Wing shared secret and <tt>&lt;client-kex&gt;</tt> is the content of the <tt>&lt;client-pk&gt;</tt> field, that is, the X-Wing ciphertext.</t>
        <t>Binding <tt>&lt;es-version&gt;</tt> and <tt>&lt;client-magic&gt;</tt> separates keys across certificates and any future encryption system; binding <tt>&lt;resolver-pk&gt;</tt>, <tt>&lt;serial&gt;</tt>, and the validity timestamps ties the key to the exact signed certificate; binding <tt>&lt;client-kex&gt;</tt> ties it to the precise encapsulation.</t>
        <t>The derived <tt>&lt;shared-key&gt;</tt> is then used with the <tt>XChaCha20_DJB-Poly1305</tt> construction of Appendix 1 and the existing 24-byte nonce construction: 12 client-chosen bytes followed by 12 zero bytes for queries, and 12 client-chosen bytes followed by 12 resolver-chosen bytes for responses.</t>
      </section>
      <section anchor="pq-query-and-response-format">
        <name>PQ Query and Response Format</name>
        <t>A PQ query uses the <tt>&lt;dnscrypt-query&gt;</tt> structure without modification; only the length of <tt>&lt;client-pk&gt;</tt> changes, to the 1120-byte X-Wing ciphertext.</t>
        <t>A PQ response uses the <tt>&lt;dnscrypt-response&gt;</tt> structure without modification on the wire, but the decrypted payload begins with a short control block ahead of the unmodified DNS response:</t>
        <artwork><![CDATA[
<pq-response-plain> ::= <control-len> <control>
                         <resolver-response> <resolver-response-pad>
]]></artwork>
        <t><tt>&lt;control-len&gt;</tt> is a two-byte big-endian length.</t>
        <t>When it is zero, <tt>&lt;control&gt;</tt> is absent and the DNS response begins immediately after the length.</t>
        <t>When it is nonzero, <tt>&lt;control&gt;</tt> carries PQ control data, currently a stateless resumption ticket.</t>
        <t>The response padding is computed over the whole <tt>&lt;control-len&gt; &lt;control&gt; &lt;resolver-response&gt;</tt> plaintext, so the decrypted payload keeps the usual length alignment.</t>
        <t>Over UDP, the complete encrypted packet is subject to the response-size rule, so the <tt>&lt;control-len&gt;</tt> field, the <tt>&lt;control&gt;</tt> block, and the padding all count against the size of the query that triggered the response.</t>
        <t>When that budget is too tight to include a control block, the resolver <bcp14>MUST</bcp14> send the response with <tt>&lt;control-len&gt;</tt> zero, withholding ticket issuance or renewal, before resorting to DNS truncation: a withheld ticket costs at most one future key exchange, while a truncated response always costs the client a TCP round trip.</t>
        <t>A PQ client removes the control block after decryption and forwards the unmodified DNS response.</t>
        <t>Because the shared secret is symmetric, the resolver needs no additional KEM operation to encrypt a response.</t>
      </section>
      <section anchor="padding-and-transport">
        <name>Padding and Transport</name>
        <t>A PQ query that carries a ciphertext includes roughly 1.1 KB in <tt>&lt;client-pk&gt;</tt>, so it is always far larger than its response.</t>
        <t>The minimum query target defined for client queries over UDP exists to prevent amplification, and that concern does not apply to a query that is already this large.</t>
        <t>A PQ query that carries a ciphertext is therefore not subject to the 256-byte minimum target; it only needs valid ISO/IEC 7816-4 padding and should avoid unnecessary fragmentation.</t>
        <t>A resumed query, described below, carries a small ticket instead of a ciphertext, so it uses the regular UDP query-size target, initially 256 bytes for the complete DNSCrypt packet.</t>
        <t>PQ queries and responses <bcp14>MUST</bcp14> be supported over TCP <xref target="RFC7766"/>, and TCP is a first-class transport for PQ rather than only a fallback.</t>
        <t>A client <bcp14>SHOULD</bcp14> use a configurable UDP payload size target, 1232 bytes by default, and <bcp14>SHOULD</bcp14> use TCP when a query would exceed it.</t>
        <t>A PQ query that carries a ciphertext is approximately 1220 bytes, which fits within a single unfragmented datagram on common paths but can exceed 1232 bytes once the Anonymized DNSCrypt prefix is added; in that case the client <bcp14>SHOULD</bcp14> use TCP.</t>
      </section>
      <section anchor="stateless-resumption">
        <name>Stateless Resumption</name>
        <t>Performing a KEM decapsulation for every query is significantly more expensive than the classical X25519 operation, and because every ciphertext is distinct there is no shared-key cache to amortize it.</t>
        <t>To control this cost without keeping per-client state, PQ defines stateless resumption: after an initial query that carries a ciphertext, the resolver issues an opaque ticket that lets subsequent queries skip both the ciphertext and the decapsulation.</t>
        <t>A resolver maintains one or more server-wide ticket keys, denoted <tt>TK</tt>.</t>
        <t>A <tt>TK</tt> is shared by all processes answering for a given certificate and is rotated independently of client traffic.</t>
        <t>A resolver <bcp14>MAY</bcp14> retain a previous <tt>TK</tt> for a short overlap so that outstanding tickets continue to verify, but the overlap <bcp14>MUST NOT</bcp14> exceed the advertised ticket lifetime.</t>
        <section anchor="issuing-a-ticket">
          <name>Issuing a Ticket</name>
          <t>After a PQ query that carries a ciphertext has been decrypted, both parties hold <tt>&lt;shared-key&gt;</tt>.</t>
          <t>They derive a resumption secret:</t>
          <artwork><![CDATA[
resume-secret ::= HKDF-SHA256(IKM  = <shared-key>,
                              salt = <client-magic> <client-nonce>,
                              info = "DNSCrypt-PQ-resume-secret-v1",
                              L    = 32)
]]></artwork>
          <t>The resolver seals the resumption secret and the metadata needed to validate it later under <tt>TK</tt>:</t>
          <artwork><![CDATA[
ticket-plain ::= resume-secret <es-version> <client-magic>
                 <serial> <ts-end> <ticket-expiry>
                 <profile-extension-hash>

ticket ::= <ticket-key-id> <ticket-nonce>
           AE(TK, <ticket-nonce>, ticket-plain)
]]></artwork>
          <t>The fields used for ticket issuance are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>&lt;ticket-key-id&gt;</tt>: 4 bytes identifying the resolver ticket key <tt>TK</tt>.</t>
            </li>
            <li>
              <t><tt>&lt;ticket-nonce&gt;</tt>: 24 bytes used as the nonce for sealing <tt>ticket-plain</tt>.</t>
            </li>
            <li>
              <t><tt>&lt;ticket-expiry&gt;</tt>: 4-byte big-endian Unix timestamp.</t>
            </li>
            <li>
              <t><tt>&lt;profile-extension-hash&gt;</tt>: <tt>SHA-256(&lt;extensions&gt;)</tt>, 32 bytes.</t>
            </li>
          </ul>
          <t>The ticket is opaque, resolver-private state: its internal format and AEAD are an implementation choice and never need to interoperate between resolvers.</t>
          <t>This document's reference construction reuses the <tt>XChaCha20_DJB-Poly1305</tt> AEAD of Appendix 1 with no associated data; <tt>&lt;ticket-key-id&gt;</tt> selects the ticket key, so its integrity follows from decryption failing under the wrong key, and a dedicated <tt>TK</tt> keeps ticket sealing separate from query traffic.</t>
          <t>The client stores the ticket together with the <tt>resume-secret</tt> it derived and an expiry it computes locally from the advertised <tt>&lt;ticket-lifetime&gt;</tt> and the time the ticket was received, further capped by the certificate expiry and local policy; the <tt>&lt;ticket-expiry&gt;</tt> field itself is sealed inside the ticket and not readable by the client.</t>
          <t>The ticket is delivered in the response control block:</t>
          <artwork><![CDATA[
<control> ::= "PQDR" <control-version> <ticket-lifetime>
              <ticket-len> <ticket>
]]></artwork>
          <t>The control fields are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>"PQDR"</tt>: the four bytes <tt>0x50 0x51 0x44 0x52</tt>.</t>
            </li>
            <li>
              <t><tt>&lt;control-version&gt;</tt>: one byte. This revision uses <tt>0x01</tt>.</t>
            </li>
            <li>
              <t><tt>&lt;ticket-lifetime&gt;</tt>: 4-byte big-endian lifetime in seconds.</t>
            </li>
            <li>
              <t><tt>&lt;ticket-len&gt;</tt>: 2-byte big-endian length of <tt>&lt;ticket&gt;</tt> in bytes.</t>
            </li>
            <li>
              <t><tt>&lt;ticket&gt;</tt>: the opaque ticket bytes.</t>
            </li>
          </ul>
          <t>A resolver <bcp14>SHOULD</bcp14> issue a ticket in the first PQ response and <bcp14>MAY</bcp14> renew it on later responses; a client <bcp14>SHOULD</bcp14> adopt the most recent valid ticket it receives.</t>
          <t>A captured ticket is of no use on its own: deriving the per-query key requires either the <tt>resume-secret</tt>, which only the client holds, or <tt>TK</tt>, which only the resolver holds.</t>
        </section>
        <section anchor="resuming">
          <name>Resuming</name>
          <t>A resumed query uses a distinct packet form, with the resume magic in place of <tt>&lt;client-magic&gt;</tt> and the ticket in place of <tt>&lt;client-pk&gt;</tt>:</t>
          <artwork><![CDATA[
<pq-resume-query> ::= <resume-magic> <ticket-len> <ticket>
                       <client-nonce> <encrypted-query>
]]></artwork>
          <t><tt>&lt;resume-magic&gt;</tt> is the reserved 8-byte value <tt>0x50 0x51 0x52 0x65 0x73 0x75 0x6d 0x65</tt> (<tt>"PQResume"</tt>).</t>
          <t>It <bcp14>MUST NOT</bcp14> collide with any valid <tt>&lt;client-magic&gt;</tt>, with <tt>&lt;resolver-magic&gt;</tt>, with the Anonymized DNSCrypt <tt>&lt;anon-magic&gt;</tt>, or with seven leading zero bytes.</t>
          <t>The resumed-query <tt>&lt;ticket-len&gt;</tt> is a 2-byte big-endian length of <tt>&lt;ticket&gt;</tt> in bytes.</t>
          <t>On receiving a resumed query, the resolver locates the ticket key from <tt>&lt;ticket-key-id&gt;</tt>, opens the ticket, and rejects the query if the ticket cannot be opened, is expired, or if any sealed certificate-context field does not match an acceptable current certificate.</t>
          <t>The sealed certificate-context fields are <tt>&lt;es-version&gt;</tt>, <tt>&lt;client-magic&gt;</tt>, <tt>&lt;serial&gt;</tt>, <tt>&lt;ts-end&gt;</tt>, and <tt>&lt;profile-extension-hash&gt;</tt>; <tt>&lt;profile-extension-hash&gt;</tt> is compared to <tt>SHA-256(&lt;extensions&gt;)</tt> for the matched certificate.</t>
          <t>It then derives the per-query key:</t>
          <artwork><![CDATA[
<shared-key> ::= HKDF-SHA256(IKM  = resume-secret,
                             salt = <client-magic> <client-nonce>,
                             info = "DNSCrypt-PQ-resumed-query-v1"
                                    SHA-256(<ticket>),
                             L    = 32)
]]></artwork>
          <t>The client performs the same derivation.</t>
          <t>In this derivation, <tt>&lt;client-nonce&gt;</tt> is the fresh nonce carried in the resumed query itself, not the nonce of the query that produced the ticket, and <tt>&lt;client-magic&gt;</tt> is the value from the certificate under which the ticket was issued, which the client keeps together with the ticket and the <tt>resume-secret</tt>.</t>
          <t>The nonce construction is unchanged.</t>
          <t>Each resumed query thus uses a fresh key derived from its own <tt>&lt;client-nonce&gt;</tt>; clients <bcp14>MUST</bcp14> still use a distinct <tt>&lt;client-nonce&gt;</tt> for each resumed query, because repeating it would repeat both the key and the AEAD nonce.</t>
          <t>Responses to resumed queries reuse this per-query key, so the <tt>&lt;resolver-nonce&gt;</tt> <bcp14>MUST</bcp14> be unique per response and <bcp14>MUST NOT</bcp14> be all NUL bytes; a random 12-byte value satisfies this. A replayed resumed query re-derives the same key, and answering it twice with the same <tt>&lt;resolver-nonce&gt;</tt> but a different response plaintext would reuse a key and nonce pair.</t>
          <t>Responses to resumed queries use the <tt>&lt;pq-response-plain&gt;</tt> layout like any PQ response; a resolver that issues no new ticket sets <tt>&lt;control-len&gt;</tt> to zero.</t>
          <t>If a ticket cannot be opened or validated, the resolver <bcp14>MUST</bcp14> silently drop the query, with no response distinguishable from any other dropped query.</t>
          <t>A client that receives no response retries with a query that carries a ciphertext, obtaining a fresh ticket.</t>
        </section>
        <section anchor="resumption-considerations">
          <name>Resumption Considerations</name>
          <t>A ticket bounds forward secrecy for resumed traffic: an attacker who records resumed queries and later obtains a <tt>TK</tt> can open every ticket sealed under that <tt>TK</tt>, expired or not, and decrypt the recorded queries, but never the queries that carried a ciphertext. Destroying each <tt>TK</tt> when it is rotated out is what limits this exposure, so ticket keys <bcp14>MUST</bcp14> be erased promptly at rotation.</t>
          <t>The ticket lifetime <bcp14>SHOULD</bcp14> be short and <bcp14>MUST NOT</bcp14> exceed the resolver certificate lifetime or the ticket-key lifetime.</t>
          <t>A ticket is also a linkable handle for its lifetime; a client that prioritizes unlinkability, in particular over Anonymized DNSCrypt, <bcp14>SHOULD</bcp14> send queries that carry a ciphertext rather than resuming.</t>
          <t>Because a ticket is a stable identifier that a client reuses across queries, a resolver that observes the same ticket from more than one source address can link those addresses to a single client.</t>
          <t>A client <bcp14>SHOULD</bcp14> therefore treat a ticket as bound to the network on which it was obtained: when it moves to a new network, it <bcp14>SHOULD</bcp14> discard the stored ticket and <tt>resume-secret</tt> and start over with a query that carries a ciphertext, so the new network's address cannot be tied to the previous one through a reused ticket.</t>
          <t>Resumed queries are replayable to the same extent as any stateless DNSCrypt query, and clients discard stale or duplicate responses with outstanding-query nonce tracking as usual.</t>
          <t>A resolver implementing PQ <bcp14>SHOULD</bcp14> support ticket issuance and resumption, since high query volumes make per-query decapsulation costly.</t>
          <t>A resolver <bcp14>SHOULD</bcp14> rate-limit decapsulation of queries that carry a ciphertext and prioritize valid resumed traffic under load.</t>
        </section>
      </section>
      <section anchor="pq-and-anonymized-dnscrypt">
        <name>PQ and Anonymized DNSCrypt</name>
        <t>Anonymized DNSCrypt relays forward opaque DNSCrypt queries and require no changes for PQ.</t>
        <t>A query that carries a ciphertext keeps the classical query shape with a larger <tt>&lt;client-pk&gt;</tt> field, and a resumed query uses the resume shape above; both are opaque to a relay.</t>
        <t>The relay check that an encrypted response is no larger than the query is satisfied automatically for queries that carry a ciphertext, because they are large.</t>
        <t>A resumed query is small, so a client using Anonymized DNSCrypt <bcp14>MUST</bcp14> keep enough padding on the inner resumed query for the relay's encrypted-response size check to pass.</t>
        <t>If the client connects to the relay over TCP, the relay still forwards the inner query upstream over UDP, so the inner query size requirement remains.</t>
        <t>Certificate retrieval through a relay is different: the relay forwards the certificate query to the resolver over UDP and forwards a matching certificate response back to the client, and it applies the same response-size check, dropping any response larger than the query it relayed.</t>
        <t>A client retrieving a PQ certificate over UDP through a relay therefore <bcp14>MUST</bcp14> pad its certificate query to at least the size of the expected certificate response, as described in Certificate Retrieval Amplification, so the response passes both the resolver's and the relay's anti-amplification check.</t>
        <t>A client that does not, or cannot, pad far enough receives only the certificates that fit within the inner UDP query size, typically a classical certificate with the TC flag set; if even that response is larger than the inner query, the relay drops it.</t>
        <t>Retrying over TCP to an Anonymized DNSCrypt relay does not make the relay use TCP upstream: relays still forward the inner certificate query to the resolver over UDP.</t>
        <t>Nevertheless, carrying a rollover-sized inner certificate query over the client-to-relay TCP connection avoids IP fragmentation on that leg while giving the relay a large enough request to forward upstream and a sufficient anti-amplification budget for the response. The inner query remains EDNS(0)-padded to the expected UDP response size; only its transport to the relay changes.</t>
        <t>Therefore, after a rollover-sized UDP attempt times out or returns a truncated certificate response, a client retrieving certificates through a relay <bcp14>SHOULD</bcp14> retry over TCP to the relay with an inner query large enough for the expected UDP certificate response. Alternatively, it can retrieve certificates directly from the resolver over TCP before using the relay for encrypted queries, with the associated privacy tradeoff.</t>
      </section>
      <section anchor="pq-downgrade-protection">
        <name>PQ Downgrade Protection</name>
        <t>An on-path attacker cannot forge a certificate, but it can drop the PQ records from an unauthenticated certificate response, leaving only a classical certificate and pushing the client onto a quantum-vulnerable exchange.</t>
        <t>A signature cannot prevent deletion.</t>
        <t>A client that has been provisioned with the knowledge that a resolver supports PQ, for example through a flag in the DNS stamp that already carries the provider name and public key, <bcp14>MUST NOT</bcp14> fall back to a classical <tt>&lt;es-version&gt;</tt> for that resolver.</t>
        <t>A client without such provisioning <bcp14>MAY</bcp14> fall back, accepting the classical risk.</t>
      </section>
      <section anchor="pq-security-considerations">
        <name>PQ Security Considerations</name>
        <t>Confidentiality against a future quantum adversary holds as long as either ML-KEM-768 or X25519 is unbroken, because X-Wing is a hybrid.</t>
        <t>Resolver authentication is as in classical DNSCrypt: the client encapsulates to a signed encapsulation key, and only the holder of the corresponding secret key can recover the shared secret and produce an authenticated response.</t>
        <t>The KEM ciphertext is not separately authenticated and does not need to be.</t>
        <t>X-Wing, through ML-KEM-768, uses implicit rejection: a malformed but correctly sized ciphertext yields a pseudo-random shared secret rather than an error, so a tampered ciphertext produces a different key and authentication fails.</t>
        <t>A resolver <bcp14>MUST</bcp14> drop such a query exactly as it drops any query that fails authentication, and the outcome on the wire <bcp14>MUST NOT</bcp14> reveal, through a distinct response, error, or timing, whether decapsulation, key derivation, or authentication failed; otherwise the resolver becomes a decapsulation oracle.</t>
        <t>KEM and X25519 operations <bcp14>SHOULD</bcp14> be constant-time with respect to secret data.</t>
        <t>Forward secrecy for queries that carry a ciphertext has the same granularity as classical resolver-key rotation, since the resolver KEM key is short-term and the client's encapsulation randomness is fresh per query.</t>
        <t>For resumed queries, recorded traffic remains decryptable until every <tt>TK</tt> able to open its ticket has been destroyed, so their forward secrecy follows the ticket-key lifetime.</t>
        <t>Nonce uniqueness is required as in classical DNSCrypt.</t>
        <t>For queries that carry a ciphertext, each has an independent key, so cross-query collisions cannot occur; for resumed queries the per-query key derivation uses <tt>&lt;client-nonce&gt;</tt>, so clients <bcp14>MUST</bcp14> keep it unique for the lifetime of a ticket.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
    <section anchor="appendix-1-the-box-xchachapoly-algorithm">
      <name>Appendix 1: The Box-XChaChaPoly Algorithm</name>
      <t>The <tt>Box-XChaChaPoly</tt> algorithm combines the <tt>X25519</tt> <xref target="RFC7748"/> key exchange mechanism with a variant of the ChaCha20-Poly1305 construction specified in <xref target="RFC8439"/>.</t>
      <section anchor="conventions-and-definitions-1">
        <name>Conventions and Definitions</name>
        <ul spacing="normal">
          <li>
            <t><tt>x[a..]</tt>: the subarray of <tt>x</tt> starting at index <tt>a</tt>, and extending to the last index of <tt>x</tt></t>
          </li>
          <li>
            <t><tt>x[a..b]</tt>: the subarray of <tt>x</tt> starting at index <tt>a</tt> and ending immediately before index <tt>b</tt>.</t>
          </li>
          <li>
            <t><tt>LOAD32_LE(p)</tt>: returns a 32-bit unsigned integer from the 4-byte array <tt>p</tt></t>
          </li>
          <li>
            <t><tt>STORE32_LE(p, x)</tt>: stores the 32-bit unsigned integer <tt>x</tt> into the 4-byte array  <tt>p</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="hchacha20">
        <name>HChaCha20</name>
        <t><tt>HChaCha20</tt> is the subkey derivation step used by the extended-nonce ChaCha20 construction in this appendix.</t>
        <t>The <tt>HChaCha20</tt> function takes the following input parameters:</t>
        <ul spacing="normal">
          <li>
            <t><tt>&lt;k&gt;</tt>: secret key</t>
          </li>
          <li>
            <t><tt>&lt;in&gt;</tt>: a 128-bit input</t>
          </li>
        </ul>
        <t>and returns a 256-bit keyed hash.</t>
        <t>The function can be implemented using an existing IETF-compliant <tt>ChaCha20</tt> implementation as follows:</t>
        <artwork><![CDATA[
block_bytes = ChaCha20(msg={0}**64, nonce=in[4..16],
                       counter=LOAD32_LE(in[0..4]), key=k)

block_out[0] = LOAD32_LE(block_bytes[ 0..][0..4]) - 0x61707865
block_out[1] = LOAD32_LE(block_bytes[ 4..][0..4]) - 0x3320646e
block_out[2] = LOAD32_LE(block_bytes[ 8..][0..4]) - 0x79622d32
block_out[3] = LOAD32_LE(block_bytes[12..][0..4]) - 0x6b206574
block_out[4] =
   LOAD32_LE(block_bytes[48..][0..4]) - LOAD32_LE(in[ 0..][0..4])
block_out[5] =
   LOAD32_LE(block_bytes[52..][0..4]) - LOAD32_LE(in[ 4..][0..4])
block_out[6] =
   LOAD32_LE(block_bytes[56..][0..4]) - LOAD32_LE(in[ 8..][0..4])
block_out[7] =
   LOAD32_LE(block_bytes[60..][0..4]) - LOAD32_LE(in[12..][0..4])

for i in 0..8:
    STORE32_LE(out[i * 4..][0..4], block_out[i])

return out
]]></artwork>
      </section>
      <section anchor="test-vector-for-the-hchacha20-block-function">
        <name>Test Vector For The HChaCha20 Block Function</name>
        <sourcecode type="test-vectors"><![CDATA[
k:    000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f

in:   000102030405060708090a0b0c0d0e0f

out:  51e3ff45a895675c4b33b46c64f4a9ace110d34df6a2ceab486372bacbd3eff6
]]></sourcecode>
      </section>
      <section anchor="chacha20djb">
        <name>ChaCha20_DJB</name>
        <t>As opposed to the version standardized for IETF protocols, ChaCha20 was originally designed to have a 8 byte nonce.</t>
        <t>For the needs of TLS, <xref target="RFC8439"/> changed this by setting <tt>N_MIN</tt> and <tt>N_MAX</tt> to <tt>12</tt>, at the expense of a smaller internal counter.</t>
        <t>DNSCrypt uses ChaCha20 as originally specified, with <tt>N_MIN = N_MAX = 8</tt>.</t>
        <t>We refer to this variant as <tt>ChaCha20_DJB</tt>.</t>
        <t>The internal counter in <tt>ChaCha20_DJB</tt> is 4 bytes larger than <tt>ChaCha20</tt>.</t>
        <t>There are no other differences between <tt>ChaCha20_DJB</tt> and <tt>ChaCha20</tt>.</t>
      </section>
      <section anchor="xchacha20djb">
        <name>XChaCha20_DJB</name>
        <t>XChaCha20_DJB can be constructed from an existing ChaCha20 implementation and the HChaCha20 function.</t>
        <t>All that needs to be done is:</t>
        <ol spacing="normal" type="1"><li>
            <t>Pass the key and the first 16 bytes of the 24-byte nonce to <tt>HChaCha20</tt> to obtain the subkey.</t>
          </li>
          <li>
            <t>Use the subkey and remaining 8 byte nonce with <tt>ChaCha20_DJB</tt>.</t>
          </li>
        </ol>
      </section>
      <section anchor="xchacha20djb-poly1305">
        <name>XChaCha20_DJB-Poly1305</name>
        <t>XChaCha20 is a stream cipher and offers no integrity guarantees without being combined with a MAC algorithm (e.g. Poly1305).</t>
        <t><tt>XChaCha20_DJB-Poly1305</tt> adds an authentication tag to the ciphertext encrypted with <tt>XChaCha20_DJB</tt>.</t>
        <t>It is the combined mode used by the NaCl <tt>secretbox</tt> and <tt>crypto_box</tt> constructions, instantiated with <tt>XChaCha20_DJB</tt>.</t>
        <t>The one-time Poly1305 key is taken from the start of the keystream, and the message is encrypted with the keystream that immediately follows it.</t>
        <t>No separate keystream block is reserved for the Poly1305 key, so this layout differs from the AEAD of <xref target="RFC8439"/>, where the message starts at block counter 1 and the rest of the first keystream block is discarded.</t>
        <t>Concretely, for a key <tt>&lt;k&gt;</tt>, nonce <tt>&lt;n&gt;</tt>, and message <tt>&lt;m&gt;</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><tt>&lt;k&gt;</tt>: encryption key</t>
          </li>
          <li>
            <t><tt>&lt;n&gt;</tt>: 24-byte nonce</t>
          </li>
          <li>
            <t><tt>&lt;m&gt;</tt>: message to encrypt</t>
          </li>
          <li>
            <t><tt>&lt;keystream&gt;</tt>: the <tt>XChaCha20_DJB</tt> keystream produced from <tt>&lt;k&gt;</tt> and <tt>&lt;n&gt;</tt>, starting at block counter 0.</t>
          </li>
          <li>
            <t><tt>&lt;poly-key&gt;</tt>: <tt>&lt;keystream&gt;[0..32]</tt>, the one-time Poly1305 key. These bytes are not transmitted.</t>
          </li>
          <li>
            <t><tt>&lt;ct&gt;</tt>: <tt>&lt;m&gt;</tt> XOR <tt>&lt;keystream&gt;[32..32 + length(&lt;m&gt;)]</tt>, the ciphertext.</t>
          </li>
          <li>
            <t><tt>&lt;tag&gt;</tt>: <tt>Poly1305(&lt;poly-key&gt;, &lt;ct&gt;)</tt>, the 16-byte tag.</t>
          </li>
          <li>
            <t><tt>XChaCha20_DJB-Poly1305(&lt;k&gt;, &lt;n&gt;, &lt;m&gt;)</tt>: <tt>&lt;tag&gt; || &lt;ct&gt;</tt></t>
          </li>
        </ul>
        <t>Equivalently, <tt>XChaCha20_DJB</tt> is run over the buffer <tt>&lt;zero32&gt; || &lt;m&gt;</tt>, where <tt>&lt;zero32&gt;</tt> is 32 NUL bytes, starting at block counter 0; the first 32 output bytes are taken as <tt>&lt;poly-key&gt;</tt>, and the remaining <tt>length(&lt;m&gt;)</tt> bytes are <tt>&lt;ct&gt;</tt>.</t>
      </section>
      <section anchor="the-box-xchachapoly-algorithm">
        <name>The Box-XChaChaPoly Algorithm</name>
        <t>The Box-XChaChaPoly algorithm combines the key exchange mechanism X25519 defined <xref target="RFC7748"/> with the <tt>XChaCha20_DJB-Poly1305</tt> authenticated encryption algorithm.</t>
        <ul spacing="normal">
          <li>
            <t><tt>&lt;k&gt;</tt>: encryption key</t>
          </li>
          <li>
            <t><tt>&lt;m&gt;</tt>: message to encrypt</t>
          </li>
          <li>
            <t><tt>&lt;n&gt;</tt>: 24-byte nonce</t>
          </li>
          <li>
            <t><tt>&lt;pk&gt;</tt>: recipient's public key</t>
          </li>
          <li>
            <t><tt>&lt;sk&gt;</tt>: sender's secret key</t>
          </li>
          <li>
            <t><tt>&lt;zero16&gt;</tt>: 16 NUL bytes</t>
          </li>
          <li>
            <t><tt>&lt;sk'&gt;</tt>: <tt>HChaCha20(X25519(&lt;pk&gt;, &lt;sk&gt;), &lt;zero16&gt;)</tt>, the shared key</t>
          </li>
          <li>
            <t><tt>Box-XChaChaPoly(pk, sk, n, m)</tt>: <tt>XChaCha20_DJB-Poly1305(&lt;sk'&gt;, &lt;n&gt;, &lt;m&gt;)</tt></t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="appendix-2-dnscrypt-test-vectors">
      <name>Appendix 2: DNSCrypt Test Vectors</name>
      <t>This appendix provides complete, reproducible test vectors for the regular DNSCrypt protocol with the <tt>Box-XChaChaPoly</tt> encryption system of Appendix 1, that is, <tt>&lt;es-version&gt;</tt> <tt>0x00 0x02</tt>: X25519 key exchange, the <tt>XChaCha20_DJB-Poly1305</tt> AEAD, and Ed25519 certificate signatures.</t>
      <t>All randomness is pinned so the vectors are reproducible.</t>
      <t>Every value is given in full as a hexadecimal string, wrapped to 32 bytes per line.</t>
      <t>The field and byte order of each artifact matches the Protocol Components and Certificates sections.</t>
      <t>These vectors were cross-checked byte for byte against the <tt>dnscrypt-proxy</tt> reference implementation.</t>
      <section anchor="pinned-inputs">
        <name>Pinned Inputs</name>
        <t>The secret keys below are the raw 32-byte X25519 scalars as stored by an implementation; X25519 clamps them internally.</t>
        <t>The provider signing key is given as its 32-byte Ed25519 seed.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Input</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">provider Ed25519 signing seed</td>
              <td align="left">32</td>
              <td align="left">
                <tt>00 01 02 ... 1f</tt></td>
            </tr>
            <tr>
              <td align="left">resolver X25519 secret key</td>
              <td align="left">32</td>
              <td align="left">
                <tt>20 21 22 ... 3f</tt></td>
            </tr>
            <tr>
              <td align="left">client X25519 secret key</td>
              <td align="left">32</td>
              <td align="left">
                <tt>40 41 42 ... 5f</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;client-magic&gt;</tt></td>
              <td align="left">8</td>
              <td align="left">
                <tt>b1 b2 b3 b4 b5 b6 b7 b8</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;es-version&gt;</tt></td>
              <td align="left">2</td>
              <td align="left">
                <tt>00 02</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;protocol-minor-version&gt;</tt></td>
              <td align="left">2</td>
              <td align="left">
                <tt>00 00</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;serial&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>00 00 00 01</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ts-start&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>68 00 00 00</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ts-end&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>68 01 51 80</tt></td>
            </tr>
            <tr>
              <td align="left">query <tt>&lt;client-nonce&gt;</tt></td>
              <td align="left">12</td>
              <td align="left">
                <tt>a0 a1 a2 ... ab</tt></td>
            </tr>
            <tr>
              <td align="left">response <tt>&lt;resolver-nonce&gt;</tt></td>
              <td align="left">12</td>
              <td align="left">
                <tt>c0 c1 c2 ... cb</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;extensions&gt;</tt></td>
              <td align="left">0</td>
              <td align="left">empty</td>
            </tr>
          </tbody>
        </table>
        <t><tt>&lt;client-magic&gt;</tt> is chosen by the resolver and carried in the certificate; the client copies it verbatim into the first 8 bytes of every query.</t>
        <t><tt>&lt;ts-start&gt;</tt> and <tt>&lt;ts-end&gt;</tt> span exactly 86400 seconds (a one-day validity window).</t>
        <t>The fixed protocol constants are <tt>&lt;cert-magic&gt;</tt> = <tt>44 4e 53 43</tt>, <tt>&lt;es-version&gt;</tt> = <tt>00 02</tt>, and <tt>&lt;resolver-magic&gt;</tt> = <tt>72 36 66 6e 76 57 6a 38</tt>.</t>
        <t>The example DNS messages are a query and its answer for <tt>www.example.com</tt>:</t>
        <artwork><![CDATA[
dns-query (33 bytes), id 0x1234, RD set, A? www.example.com IN:
  12340100000100000000000003777777076578616d706c6503636f6d00000100
  01
dns-response (49 bytes), A 93.184.216.34, TTL 3600:
  12348180000100010000000003777777076578616d706c6503636f6d00000100
  01c00c0001000100000e1000045db8d822
]]></artwork>
      </section>
      <section anchor="public-keys-and-shared-key">
        <name>Public Keys and Shared Key</name>
        <artwork><![CDATA[
provider-ed25519-pk = Ed25519 public key for the signing seed:
  03a107bff3ce10be1d70dd18e74bc09967e4d6309ba50d5f1ddc8664125531b8
resolver-pk = X25519 base-point mult of the resolver secret key:
  358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254
client-pk = X25519 base-point mult of the client secret key:
  79a631eede1bf9c98f12032cdeadd0e7a079398fc786b88cc846ec89af85a51a

x25519-shared-point = X25519(client-sk, resolver-pk)
                    = X25519(resolver-sk, client-pk):
  04c304fb1ca83cee75e206344231f33797e07d9929db670994b7c6fbeb1dc255
shared-key = HChaCha20(key = x25519-shared-point, in = 16 NUL bytes):
  335d32f2d65e6623cbbd05b6539c9575fee16cb5405fe839ab4bd291fdf13262
]]></artwork>
        <t>The same <tt>shared-key</tt> is computed by the client from <tt>(client-sk, resolver-pk)</tt> and by the resolver from <tt>(resolver-sk, client-pk)</tt>.</t>
      </section>
      <section anchor="certificate">
        <name>Certificate</name>
        <t>The signature covers <tt>&lt;resolver-pk&gt; &lt;client-magic&gt; &lt;serial&gt; &lt;ts-start&gt; &lt;ts-end&gt; &lt;extensions&gt;</tt>, with <tt>&lt;extensions&gt;</tt> empty in this protocol version:</t>
        <artwork><![CDATA[
signed input (52 bytes):
  358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254
  b1b2b3b4b5b6b7b8000000016800000068015180
signature = Ed25519.Sign(provider signing seed, signed input) (64 bytes):
  3a570ea17f47b80217977fbb455840bfd50ab32f5fbf2aabc173a6a49b7a49ca
  55362a6c5dec47657cf515e9f99382a316dfecd964b94d1c4659cac45961400c
]]></artwork>
        <t>The full certificate, as carried in a <tt>TXT</tt> record, is 124 bytes:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Offset</th>
              <th align="left">Field</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">
                <tt>&lt;cert-magic&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>44 4e 53 43</tt></td>
            </tr>
            <tr>
              <td align="left">4</td>
              <td align="left">
                <tt>&lt;es-version&gt;</tt></td>
              <td align="left">2</td>
              <td align="left">
                <tt>00 02</tt></td>
            </tr>
            <tr>
              <td align="left">6</td>
              <td align="left">
                <tt>&lt;protocol-minor-version&gt;</tt></td>
              <td align="left">2</td>
              <td align="left">
                <tt>00 00</tt></td>
            </tr>
            <tr>
              <td align="left">8</td>
              <td align="left">
                <tt>&lt;signature&gt;</tt></td>
              <td align="left">64</td>
              <td align="left">
                <tt>3a 57 ... 40 0c</tt></td>
            </tr>
            <tr>
              <td align="left">72</td>
              <td align="left">
                <tt>&lt;resolver-pk&gt;</tt></td>
              <td align="left">32</td>
              <td align="left">
                <tt>35 80 ... 62 54</tt></td>
            </tr>
            <tr>
              <td align="left">104</td>
              <td align="left">
                <tt>&lt;client-magic&gt;</tt></td>
              <td align="left">8</td>
              <td align="left">
                <tt>b1 b2 b3 b4 b5 b6 b7 b8</tt></td>
            </tr>
            <tr>
              <td align="left">112</td>
              <td align="left">
                <tt>&lt;serial&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>00 00 00 01</tt></td>
            </tr>
            <tr>
              <td align="left">116</td>
              <td align="left">
                <tt>&lt;ts-start&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>68 00 00 00</tt></td>
            </tr>
            <tr>
              <td align="left">120</td>
              <td align="left">
                <tt>&lt;ts-end&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>68 01 51 80</tt></td>
            </tr>
          </tbody>
        </table>
        <artwork><![CDATA[
certificate (124 bytes):
  444e5343000200003a570ea17f47b80217977fbb455840bfd50ab32f5fbf2aab
  c173a6a49b7a49ca55362a6c5dec47657cf515e9f99382a316dfecd964b94d1c
  4659cac45961400c358072d6365880d1aeea329adf9121383851ed21a28e3b75
  e965d0d2cd166254b1b2b3b4b5b6b7b8000000016800000068015180
]]></artwork>
      </section>
      <section anchor="certificate-retrieval">
        <name>Certificate Retrieval</name>
        <t>The certificate lookup name is <tt>2.dnscrypt-cert.example.com</tt>.</t>
        <t>With DNS transaction ID <tt>0xabcd</tt>, RD set, one <tt>TXT</tt>/<tt>IN</tt> question, and no EDNS(0) padding, the DNS request is:</t>
        <artwork><![CDATA[
certificate query (45 bytes):
  abcd0100000100000000000001320d646e7363727970742d6365727407657861
  6d706c6503636f6d0000100001
]]></artwork>
        <t>The successful response carrying the 124-byte certificate above is 182 bytes.</t>
        <t>This is the classical certificate response used by deployed DNSCrypt v2 resolvers: the flags word <tt>0x8180</tt> sets QR and RA, echoes RD from the query, and leaves RCODE at 0. The TXT record TTL is an operational choice, 86400 seconds in this vector.</t>
        <t>If larger PQ certificate records are also available, a resolver can return this classical response with the TC flag set when the complete classical-plus-PQ response would exceed the triggering UDP request.</t>
        <artwork><![CDATA[
certificate response with one TXT answer (182 bytes):
  abcd8180000100010000000001320d646e7363727970742d6365727407657861
  6d706c6503636f6d0000100001c00c0010000100015180007d7c444e53430002
  00003a570ea17f47b80217977fbb455840bfd50ab32f5fbf2aabc173a6a49b7a
  49ca55362a6c5dec47657cf515e9f99382a316dfecd964b94d1c4659cac45961
  400c358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd
  166254b1b2b3b4b5b6b7b8000000016800000068015180
]]></artwork>
        <t>An EDNS(0)-padded UDP certificate query for the same question and transaction ID can be built by setting <tt>ARCOUNT = 1</tt> and appending one <tt>OPT</tt> pseudo-RR with UDP payload size 4096 and a Padding option.</t>
        <t>For a 512-byte request, the Padding option data is 452 NUL bytes:</t>
        <artwork><![CDATA[
base question length       = 45
OPT pseudo-RR fixed header = 11
Padding option header      = 4
Padding option data        = 452
total request length       = 512

OPT pseudo-RR:
  00002910000000000001c8000c01c4 || (452 * 00)
]]></artwork>
      </section>
      <section anchor="client-query-udp">
        <name>Client Query (UDP)</name>
        <t>For this fixed vector, the plaintext is the DNS query padded with ISO/IEC 7816-4 to 256 bytes: one <tt>0x80</tt> byte followed by NUL bytes.</t>
        <t>The complete encrypted DNSCrypt query is 324 bytes, which is above the initial 256-byte UDP query-size target.</t>
        <t>The 24-byte AEAD nonce is the 12-byte client nonce followed by 12 NUL bytes.</t>
        <artwork><![CDATA[
padded query plaintext (256 bytes):
  12340100000100000000000003777777076578616d706c6503636f6d00000100
  0180000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000000000000000000000
query AEAD nonce (24 bytes):
  a0a1a2a3a4a5a6a7a8a9aaab000000000000000000000000
encrypted-query = tag (16) || ciphertext (256) (272 bytes):
  2dae527c26386d5cd4e61152db6dd1812ff6aaf7644fc122afc70b1b580b18f1
  0fbc26577abc759152cde31cd0afc5c5f452f8654815469723300819bed5a120
  15c044b94d63ec1f79e48a23968e437feb8bb8720cf4e60a0499746190c8b3eb
  83aeb0d858df77794270b861f86644502be0d22d6f0b2b132e9ca68538300c8d
  68b8e3c48190cbbf96d602f38dfc3b4d642016ceeaf4bc2c2ded9483b9f9d4ee
  d703a0bebc252add8822d4b9152e30670bcde9ea75a0e3e67ea576e9b1262bb2
  b25b4f9432311b75a2238b34bf4f868da182b85dccb1762a703bba31d04d77b4
  c57ec9039663959793677588b3a74ae409b0f16374dd64cbd6d47d801725b014
  ce9ddaf6f1aa30688c8efcbfde1d5d1d
]]></artwork>
        <t>Query on the wire (324 bytes):</t>
        <table>
          <thead>
            <tr>
              <th align="left">Offset</th>
              <th align="left">Field</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">
                <tt>&lt;client-magic&gt;</tt></td>
              <td align="left">8</td>
              <td align="left">
                <tt>b1 b2 b3 b4 b5 b6 b7 b8</tt></td>
            </tr>
            <tr>
              <td align="left">8</td>
              <td align="left">
                <tt>&lt;client-pk&gt;</tt></td>
              <td align="left">32</td>
              <td align="left">
                <tt>79 a6 ... a5 1a</tt></td>
            </tr>
            <tr>
              <td align="left">40</td>
              <td align="left">
                <tt>&lt;client-nonce&gt;</tt></td>
              <td align="left">12</td>
              <td align="left">
                <tt>a0 a1 ... ab</tt></td>
            </tr>
            <tr>
              <td align="left">52</td>
              <td align="left">
                <tt>&lt;encrypted-query&gt;</tt></td>
              <td align="left">272</td>
              <td align="left">
                <tt>2d ae ... d5 1d</tt></td>
            </tr>
          </tbody>
        </table>
        <artwork><![CDATA[
full query wire (324 bytes):
  b1b2b3b4b5b6b7b879a631eede1bf9c98f12032cdeadd0e7a079398fc786b88c
  c846ec89af85a51aa0a1a2a3a4a5a6a7a8a9aaab2dae527c26386d5cd4e61152
  db6dd1812ff6aaf7644fc122afc70b1b580b18f10fbc26577abc759152cde31c
  d0afc5c5f452f8654815469723300819bed5a12015c044b94d63ec1f79e48a23
  968e437feb8bb8720cf4e60a0499746190c8b3eb83aeb0d858df77794270b861
  f86644502be0d22d6f0b2b132e9ca68538300c8d68b8e3c48190cbbf96d602f3
  8dfc3b4d642016ceeaf4bc2c2ded9483b9f9d4eed703a0bebc252add8822d4b9
  152e30670bcde9ea75a0e3e67ea576e9b1262bb2b25b4f9432311b75a2238b34
  bf4f868da182b85dccb1762a703bba31d04d77b4c57ec9039663959793677588
  b3a74ae409b0f16374dd64cbd6d47d801725b014ce9ddaf6f1aa30688c8efcbf
  de1d5d1d
]]></artwork>
      </section>
      <section anchor="server-response-udp">
        <name>Server Response (UDP)</name>
        <t>The plaintext is the DNS response padded with ISO/IEC 7816-4 to 64 bytes.</t>
        <t>The 24-byte AEAD nonce is the client nonce followed by the resolver nonce.</t>
        <artwork><![CDATA[
padded response plaintext (64 bytes):
  12348180000100010000000003777777076578616d706c6503636f6d00000100
  01c00c0001000100000e1000045db8d822800000000000000000000000000000
response AEAD nonce (24 bytes):
  a0a1a2a3a4a5a6a7a8a9aaabc0c1c2c3c4c5c6c7c8c9cacb
encrypted-response = tag (16) || ciphertext (64) (80 bytes):
  f2670995c6d37c2f8d2016029dd5970b893de83c02815ece9b48d9fd0b0dca87
  41674142fbd8e12c1120b111f366326aa71c89823a2931ac5c860dad49685ed6
  cc22cc13e829d2e51d1c00ea64d1d39d
]]></artwork>
        <t>Response on the wire (112 bytes):</t>
        <table>
          <thead>
            <tr>
              <th align="left">Offset</th>
              <th align="left">Field</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">
                <tt>&lt;resolver-magic&gt;</tt></td>
              <td align="left">8</td>
              <td align="left">
                <tt>72 36 66 6e 76 57 6a 38</tt></td>
            </tr>
            <tr>
              <td align="left">8</td>
              <td align="left">
                <tt>&lt;nonce&gt;</tt></td>
              <td align="left">24</td>
              <td align="left">
                <tt>a0..ab</tt> (client) <tt>c0..cb</tt> (resolver)</td>
            </tr>
            <tr>
              <td align="left">32</td>
              <td align="left">
                <tt>&lt;encrypted-response&gt;</tt></td>
              <td align="left">80</td>
              <td align="left">
                <tt>f2 67 ... d3 9d</tt></td>
            </tr>
          </tbody>
        </table>
        <artwork><![CDATA[
full response wire (112 bytes):
  7236666e76576a38a0a1a2a3a4a5a6a7a8a9aaabc0c1c2c3c4c5c6c7c8c9cacb
  f2670995c6d37c2f8d2016029dd5970b893de83c02815ece9b48d9fd0b0dca87
  41674142fbd8e12c1120b111f366326aa71c89823a2931ac5c860dad49685ed6
  cc22cc13e829d2e51d1c00ea64d1d39d
]]></artwork>
      </section>
      <section anchor="padding-and-transport-notes">
        <name>Padding and Transport Notes</name>
        <t>The vectors fix the padded plaintext lengths so they are reproducible:</t>
        <ul spacing="normal">
          <li>
            <t>The query plaintext is padded to 256 bytes for this vector. Production clients can choose larger targets for the complete encrypted DNSCrypt packet; for example, a client can target a 512-byte-or-larger UDP packet and compute the plaintext padding after subtracting DNSCrypt overhead.</t>
          </li>
          <li>
            <t>The response plaintext is padded to the smallest multiple of 64 that holds the response plus at least one padding byte, here 64 bytes. The exact response padding length is otherwise an implementation choice, subject to the encrypted UDP response being no larger than the encrypted query.</t>
          </li>
          <li>
            <t>Over TCP the encryption is identical, but each packet is prefixed with a two-byte big-endian length, and the query padding length is chosen at random as described in Query Processing. For the fixed packets above, the 324-byte query is prefixed with <tt>01 44</tt>, and the 112-byte response is prefixed with <tt>00 70</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="negative-cases">
        <name>Negative Cases</name>
        <t>These vectors pin the required failure behavior.</t>
        <t>None of them produce a distinguishable on-the-wire signal beyond "no response" or "certificate rejected".</t>
        <ol spacing="normal" type="1"><li>
            <t>Tampered ciphertext: flipping any byte of <tt>&lt;encrypted-query&gt;</tt> or <tt>&lt;encrypted-response&gt;</tt> makes Poly1305 verification fail. The receiver <bcp14>MUST</bcp14> drop the packet.</t>
          </li>
          <li>
            <t>Bad padding: after a successful decryption, the plaintext <bcp14>MUST</bcp14> end with a <tt>0x80</tt> byte followed by zero or more NUL bytes. A plaintext that does not <bcp14>MUST</bcp14> be rejected.</t>
          </li>
          <li>
            <t>Wrong <tt>&lt;client-magic&gt;</tt>: a query whose first 8 bytes do not match the <tt>&lt;client-magic&gt;</tt> of any certificate the resolver currently serves is not a DNSCrypt query for this resolver. The resolver <bcp14>MUST NOT</bcp14> treat it as one.</t>
          </li>
          <li>
            <t>Response nonce mismatch: the client <bcp14>MUST</bcp14> verify that the <tt>&lt;client-nonce&gt;</tt> prefix (first 12 bytes) of the response nonce matches an outstanding query, and otherwise drop the response.</t>
          </li>
          <li>
            <t>Weak public key: if the X25519 shared point is the all-zero value, the public key is of low order and the shared key <bcp14>MUST</bcp14> be rejected.</t>
          </li>
          <li>
            <t>Certificate outside its validity window: a certificate whose <tt>&lt;ts-start&gt;</tt>/<tt>&lt;ts-end&gt;</tt> does not include the current time <bcp14>MUST NOT</bcp14> be used, and among valid certificates the client picks the highest <tt>&lt;serial&gt;</tt>.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="appendix-3-pq-test-vector-structure">
      <name>Appendix 3: PQ Test Vector Structure</name>
      <t>This appendix fixes the exact field order and byte order for PQ.</t>
      <t>Long cryptographic outputs, namely KEM keys and ciphertexts, the Ed25519 signature, AEAD outputs, and HKDF outputs, are left as placeholders to be filled in by a reference implementation.</t>
      <t>Everything structural is pinned here, so that two implementations cannot disagree about layout even before the hex values exist.</t>
      <t>All integers are big-endian.</t>
      <t>Every AEAD operation is <tt>XChaCha20_DJB-Poly1305</tt> as defined in Appendix 1, with the 16-byte tag prepended to the ciphertext.</t>
      <t>Every key derivation is HKDF-SHA256 <xref target="RFC5869"/>.</t>
      <t>Placeholders are written <tt>[name: N bytes]</tt>; the concrete values they stand for appear in the Generated Values subsection at the end of this appendix.</t>
      <section anchor="provisional-assignments">
        <name>Provisional Assignments</name>
        <t>The following values are the provisional assignments used by these vectors.</t>
        <t>They are normative for the vectors but expected to be confirmed before publication.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Item</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>&lt;es-version&gt;</tt> (X-Wing)</td>
              <td align="left">
                <tt>0x00 0x03</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;resume-magic&gt;</tt></td>
              <td align="left">
                <tt>50 51 52 65 73 75 6d 65</tt> ("PQResume")</td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;kdf-id&gt;</tt></td>
              <td align="left">
                <tt>0x01</tt> (HKDF-SHA256)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;aead-id&gt;</tt></td>
              <td align="left">
                <tt>0x01</tt> (XChaCha20_DJB-Poly1305)</td>
            </tr>
            <tr>
              <td align="left">ticket AEAD</td>
              <td align="left">XChaCha20_DJB-Poly1305, 24-byte nonce</td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ticket-key-id&gt;</tt></td>
              <td align="left">4 bytes</td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ticket-nonce&gt;</tt></td>
              <td align="left">24 bytes</td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ticket-expiry&gt;</tt></td>
              <td align="left">4-byte Unix timestamp</td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ticket-lifetime&gt;</tt></td>
              <td align="left">4-byte seconds</td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;profile-extension-hash&gt;</tt></td>
              <td align="left">
                <tt>SHA-256(&lt;extensions&gt;)</tt>, 32 bytes</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="pinned-inputs-1">
        <name>Pinned Inputs</name>
        <t>All randomness is fixed so the vectors are reproducible.</t>
        <t>Short values are given concretely; values produced by a primitive are placeholders.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Input</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">provider Ed25519 signing seed</td>
              <td align="left">32</td>
              <td align="left">
                <tt>00 01 02 ... 1f</tt></td>
            </tr>
            <tr>
              <td align="left">provider Ed25519 public key</td>
              <td align="left">32</td>
              <td align="left">
                <tt>[provider-pk: 32 bytes]</tt></td>
            </tr>
            <tr>
              <td align="left">resolver X-Wing secret seed</td>
              <td align="left">32</td>
              <td align="left">
                <tt>20 21 22 ... 3f</tt></td>
            </tr>
            <tr>
              <td align="left">resolver X-Wing public key</td>
              <td align="left">1216</td>
              <td align="left">
                <tt>[resolver-pk: 1216 bytes]</tt></td>
            </tr>
            <tr>
              <td align="left">client X-Wing encapsulation seed</td>
              <td align="left">64</td>
              <td align="left">
                <tt>40 41 42 ... 7f</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;es-version&gt;</tt></td>
              <td align="left">2</td>
              <td align="left">
                <tt>00 03</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;protocol-minor-version&gt;</tt></td>
              <td align="left">2</td>
              <td align="left">
                <tt>00 00</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;client-magic&gt;</tt></td>
              <td align="left">8</td>
              <td align="left">
                <tt>a1 b2 c3 d4 e5 f6 07 18</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;serial&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>00 00 00 01</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ts-start&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>68 00 00 00</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ts-end&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>68 01 51 80</tt></td>
            </tr>
            <tr>
              <td align="left">query <tt>&lt;client-nonce&gt;</tt></td>
              <td align="left">12</td>
              <td align="left">
                <tt>b0 b1 b2 ... bb</tt></td>
            </tr>
            <tr>
              <td align="left">response <tt>&lt;resolver-nonce&gt;</tt></td>
              <td align="left">12</td>
              <td align="left">
                <tt>c0 c1 c2 ... cb</tt></td>
            </tr>
            <tr>
              <td align="left">ticket key <tt>TK</tt></td>
              <td align="left">32</td>
              <td align="left">
                <tt>80 81 82 ... 9f</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ticket-key-id&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>00 00 00 01</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ticket-nonce&gt;</tt></td>
              <td align="left">24</td>
              <td align="left">
                <tt>d0 d1 d2 ... e7</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ticket-expiry&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>68 00 02 58</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;ticket-lifetime&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>00 00 01 2c</tt></td>
            </tr>
            <tr>
              <td align="left">resumed <tt>&lt;client-nonce&gt;</tt></td>
              <td align="left">12</td>
              <td align="left">
                <tt>f0 f1 f2 ... fb</tt></td>
            </tr>
            <tr>
              <td align="left">resumed <tt>&lt;resolver-nonce&gt;</tt></td>
              <td align="left">12</td>
              <td align="left">
                <tt>10 11 12 ... 1b</tt></td>
            </tr>
            <tr>
              <td align="left">example DNS query (A? www.example.com)</td>
              <td align="left">33</td>
              <td align="left">
                <tt>[dns-query: 33 bytes]</tt></td>
            </tr>
            <tr>
              <td align="left">example DNS response</td>
              <td align="left">var</td>
              <td align="left">
                <tt>[dns-response]</tt></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="profile-extension-and-signature-input">
        <name>Profile Extension and Signature Input</name>
        <t>The PQ profile extension is the entire <tt>&lt;extensions&gt;</tt> field in this revision:</t>
        <artwork><![CDATA[
pq-profile-ext =
    "PQD"             50 51 44
    ext-version       01
    es-version        00 03
    kdf-id            01            (HKDF-SHA256)
    aead-id           01            (XChaCha20_DJB-Poly1305)
    resolver-pk-len   04 c0         (1216)
    client-kex-len    04 60         (1120)
                                    -> 12 bytes total
]]></artwork>
        <t>The Ed25519 signature is computed over the existing field set, unchanged:</t>
        <artwork><![CDATA[
sig-input = resolver-pk (1216) || client-magic (8) || serial (4)
            || ts-start (4) || ts-end (4) || extensions (12)
          -> 1248 bytes
signature = Ed25519.Sign(provider-seed, sig-input)  = [signature: 64 bytes]
]]></artwork>
        <t>The full certificate (92 fixed bytes + 1216-byte resolver key + 12-byte extensions = 1320 bytes):</t>
        <table>
          <thead>
            <tr>
              <th align="left">Offset</th>
              <th align="left">Field</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">
                <tt>&lt;cert-magic&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>44 4e 53 43</tt></td>
            </tr>
            <tr>
              <td align="left">4</td>
              <td align="left">
                <tt>&lt;es-version&gt;</tt></td>
              <td align="left">2</td>
              <td align="left">
                <tt>00 03</tt></td>
            </tr>
            <tr>
              <td align="left">6</td>
              <td align="left">
                <tt>&lt;protocol-minor-version&gt;</tt></td>
              <td align="left">2</td>
              <td align="left">
                <tt>00 00</tt></td>
            </tr>
            <tr>
              <td align="left">8</td>
              <td align="left">
                <tt>&lt;signature&gt;</tt></td>
              <td align="left">64</td>
              <td align="left">
                <tt>[signature: 64 bytes]</tt></td>
            </tr>
            <tr>
              <td align="left">72</td>
              <td align="left">
                <tt>&lt;resolver-pk&gt;</tt></td>
              <td align="left">1216</td>
              <td align="left">
                <tt>[resolver-pk: 1216 bytes]</tt></td>
            </tr>
            <tr>
              <td align="left">1288</td>
              <td align="left">
                <tt>&lt;client-magic&gt;</tt></td>
              <td align="left">8</td>
              <td align="left">
                <tt>a1 b2 c3 d4 e5 f6 07 18</tt></td>
            </tr>
            <tr>
              <td align="left">1296</td>
              <td align="left">
                <tt>&lt;serial&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>00 00 00 01</tt></td>
            </tr>
            <tr>
              <td align="left">1300</td>
              <td align="left">
                <tt>&lt;ts-start&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>68 00 00 00</tt></td>
            </tr>
            <tr>
              <td align="left">1304</td>
              <td align="left">
                <tt>&lt;ts-end&gt;</tt></td>
              <td align="left">4</td>
              <td align="left">
                <tt>68 01 51 80</tt></td>
            </tr>
            <tr>
              <td align="left">1308</td>
              <td align="left">
                <tt>&lt;extensions&gt;</tt></td>
              <td align="left">12</td>
              <td align="left">
                <tt>50 51 44 01 00 03 01 01 04 c0 04 60</tt></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="full-x-wing-query">
        <name>Full X-Wing Query</name>
        <artwork><![CDATA[
(resolver-pk, resolver-sk) = X-Wing.GenerateKeyPairDerand(resolver-seed)
(ct, kem-ss)               = X-Wing.EncapsulateDerand(resolver-pk, eseed)
    ct      = [ct: 1120 bytes]
    kem-ss  = [kem-ss: 32 bytes]

cert-context = "DNSCrypt-PQ-v1"            (14 bytes)
            || es-version (00 03) || protocol-minor-version (00 00)
            || resolver-pk (1216) || client-magic (8)
            || serial (4) || ts-start (4) || ts-end (4)
            || extensions (12)

shared-key = HKDF-SHA256(
                 IKM  = kem-ss,
                 salt = es-version || client-magic
                        (10 bytes: 00 03 a1 b2 c3 d4 e5 f6 07 18),
                 info = cert-context || ct,
                 L    = 32)                  = [shared-key: 32 bytes]

query-nonce = client-nonce || (12 * 00)      (24 bytes)
plaintext   = dns-query (33) || 80 || (30 * 00)
              (padded to 64; ISO/IEC 7816-4)
encrypted-query = tag (16) || ciphertext (64)     = [enc-query: 80 bytes]
]]></artwork>
        <t>Query on the wire (1220 bytes):</t>
        <table>
          <thead>
            <tr>
              <th align="left">Offset</th>
              <th align="left">Field</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">
                <tt>&lt;client-magic&gt;</tt></td>
              <td align="left">8</td>
              <td align="left">
                <tt>a1 b2 c3 d4 e5 f6 07 18</tt></td>
            </tr>
            <tr>
              <td align="left">8</td>
              <td align="left">
                <tt>&lt;client-pk&gt;</tt> = <tt>ct</tt></td>
              <td align="left">1120</td>
              <td align="left">
                <tt>[ct: 1120 bytes]</tt></td>
            </tr>
            <tr>
              <td align="left">1128</td>
              <td align="left">
                <tt>&lt;client-nonce&gt;</tt></td>
              <td align="left">12</td>
              <td align="left">
                <tt>b0 b1 ... bb</tt></td>
            </tr>
            <tr>
              <td align="left">1140</td>
              <td align="left">
                <tt>&lt;encrypted-query&gt;</tt></td>
              <td align="left">80</td>
              <td align="left">
                <tt>[enc-query: 80 bytes]</tt></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="full-response-and-ticket-issuance">
        <name>Full Response and Ticket Issuance</name>
        <artwork><![CDATA[
resume-secret = HKDF-SHA256(
                    IKM  = shared-key,
                    salt = client-magic || client-nonce  (20 bytes),
                    info = "DNSCrypt-PQ-resume-secret-v1",
                    L    = 32)               = [resume-secret: 32 bytes]

profile-extension-hash = SHA-256(extensions) = [peh: 32 bytes]

ticket-plain = resume-secret (32) || es-version (2) || client-magic (8)
            || serial (4) || ts-end (4) || ticket-expiry (4)
            || profile-extension-hash (32)   (86 bytes)

ticket = ticket-key-id (4) || ticket-nonce (24)
      || AE(TK, ticket-nonce, ticket-plain)
         where AE output = tag (16) || ciphertext (86)
      -> 4 + 24 + 102 = 130 bytes            = [ticket: 130 bytes]

control = "PQDR" (50 51 44 52) || control-version (01)
       || ticket-lifetime (00 00 01 2c) || ticket-len (00 82)
       || ticket (130)                       (141 bytes)

pq-response-plain = control-len (00 8d) || control (141)
                  || dns-response || pad-to-64

response-nonce = client-nonce || resolver-nonce   (24 bytes)
encrypted-response = tag (16) || ciphertext       = [enc-response]
]]></artwork>
        <t>Response on the wire:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>&lt;resolver-magic&gt;</tt></td>
              <td align="left">8</td>
              <td align="left">
                <tt>72 36 66 6e 76 57 6a 38</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;nonce&gt;</tt></td>
              <td align="left">24</td>
              <td align="left">
                <tt>b0..bb</tt> (client) <tt>c0..cb</tt> (resolver)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>&lt;encrypted-response&gt;</tt></td>
              <td align="left">var</td>
              <td align="left">
                <tt>[enc-response]</tt></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="resumed-query-and-response">
        <name>Resumed Query and Response</name>
        <artwork><![CDATA[
resumed shared-key = HKDF-SHA256(
                         IKM  = resume-secret,
                         salt = client-magic || resumed-client-nonce
                                (20 bytes),
                         info = "DNSCrypt-PQ-resumed-query-v1"
                                || SHA-256(ticket),
                         L    = 32)          = [resumed-shared-key: 32 bytes]

query-nonce = resumed-client-nonce || (12 * 00)   (24 bytes)
plaintext   = dns-query || 80 || pad        (padded to 256 for this vector)
encrypted-query = tag (16) || ciphertext (256)    = [enc-query: 272 bytes]
]]></artwork>
        <t>Resumed query on the wire (424 bytes):</t>
        <table>
          <thead>
            <tr>
              <th align="left">Offset</th>
              <th align="left">Field</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">
                <tt>&lt;resume-magic&gt;</tt></td>
              <td align="left">8</td>
              <td align="left">
                <tt>50 51 52 65 73 75 6d 65</tt></td>
            </tr>
            <tr>
              <td align="left">8</td>
              <td align="left">
                <tt>&lt;ticket-len&gt;</tt></td>
              <td align="left">2</td>
              <td align="left">
                <tt>00 82</tt> (130)</td>
            </tr>
            <tr>
              <td align="left">10</td>
              <td align="left">
                <tt>&lt;ticket&gt;</tt></td>
              <td align="left">130</td>
              <td align="left">
                <tt>[ticket: 130 bytes]</tt></td>
            </tr>
            <tr>
              <td align="left">140</td>
              <td align="left">
                <tt>&lt;client-nonce&gt;</tt></td>
              <td align="left">12</td>
              <td align="left">
                <tt>f0 f1 ... fb</tt></td>
            </tr>
            <tr>
              <td align="left">152</td>
              <td align="left">
                <tt>&lt;encrypted-query&gt;</tt></td>
              <td align="left">272</td>
              <td align="left">
                <tt>[enc-query: 272 bytes]</tt></td>
            </tr>
          </tbody>
        </table>
        <t>The resumed response reuses <tt>resumed shared-key</tt> with nonce <tt>resumed-client-nonce || resumed-resolver-nonce</tt>.</t>
        <t>If the resolver issues no new ticket, the control block is empty (<tt>control-len = 00 00</tt>).</t>
      </section>
      <section anchor="negative-cases-1">
        <name>Negative Cases</name>
        <t>These vectors pin the required failure behavior.</t>
        <t>None of them produce a distinguishable on-the-wire signal beyond "no response" or "certificate rejected".</t>
        <ol spacing="normal" type="1"><li>
            <t>Bad profile-extension length: <tt>resolver-pk-len</tt> or <tt>client-kex-len</tt> in the extension disagrees with the actual field length, or <tt>pq-profile-ext</tt> is not 12 bytes. The client <bcp14>MUST</bcp14> reject the certificate.</t>
          </li>
          <li>
            <t><tt>&lt;es-version&gt;</tt> mismatch: the on-the-wire <tt>&lt;es-version&gt;</tt> differs from the copy inside the signed extension. The client <bcp14>MUST</bcp14> reject the certificate.</t>
          </li>
          <li>
            <t>Corrupted ticket AEAD: one byte of the sealed region of <tt>&lt;ticket&gt;</tt> in a resumed query is flipped. AEAD opening fails, and the resolver <bcp14>MUST</bcp14> silently drop the query.</t>
          </li>
          <li>
            <t>Expired or rotated ticket: <tt>&lt;ticket-expiry&gt;</tt> is in the past, or <tt>&lt;ticket-key-id&gt;</tt> names a <tt>TK</tt> that has been rotated out. The resolver <bcp14>MUST</bcp14> silently drop the query; the client re-handshakes with a query that carries a ciphertext.</t>
          </li>
          <li>
            <t>Ticket context mismatch: any sealed certificate-context field in the ticket (<tt>&lt;es-version&gt;</tt>, <tt>&lt;client-magic&gt;</tt>, <tt>&lt;serial&gt;</tt>, <tt>&lt;ts-end&gt;</tt>, or <tt>&lt;profile-extension-hash&gt;</tt>) does not match the resumption context. The resolver <bcp14>MUST</bcp14> silently drop the query.</t>
          </li>
          <li>
            <t>Malformed KEM ciphertext: one byte of <tt>&lt;client-pk&gt;</tt> in a query that carries a ciphertext is flipped. X-Wing implicit rejection yields a different shared secret, authentication fails, and the resolver <bcp14>MUST</bcp14> silently drop the query, with no distinct error or timing.</t>
          </li>
          <li>
            <t>Repeated nonce (client obligation): reusing a <tt>&lt;client-nonce&gt;</tt> under one ticket reuses both the derived key and the AEAD nonce; this is a client <bcp14>MUST NOT</bcp14>. A stateless resolver cannot detect it, so there is no wire vector; it is listed to make the obligation explicit.</t>
          </li>
          <li>
            <t>Under-padded resumed query: a resumed UDP query whose complete packet is below the 256-byte query-size target decrypts correctly but violates the anti-amplification guidance, and an Anonymized DNSCrypt relay <bcp14>MAY</bcp14> drop its response on the response-size check.</t>
          </li>
        </ol>
      </section>
      <section anchor="generated-values">
        <name>Generated Values</name>
        <t>The values below were produced by a reference generator from the pinned inputs above, and are reproducible by any conformant implementation.</t>
        <t>Values up to 141 bytes are given in full; longer artifacts are pinned by their SHA-256 digest.</t>
        <t>The generator self-checks against the HChaCha20 known-answer test of Appendix 1 and the official X-Wing known-answer test, and verifies that X-Wing decapsulation recovers the encapsulated secret.</t>
        <artwork><![CDATA[
provider-ed25519-pk (32):
  03a107bff3ce10be1d70dd18e74bc09967e4d6309ba50d5f1ddc8664125531b8
resolver-pk (1216, SHA-256):
  a1f324bc0701f1234fbba7b11901023b3644f3bb8c6eb4ee4368d7e859eb6228
client-kex / ct (1120, SHA-256):
  f6bf3f238e83f24cd444f2887e8fd32d630e07dbe6ca2f2b403aaf5333030c48
kem-ss (32):
  8dac8602d4ce5e27e81335b54b25fdcaea86e56613214ee0522db4a5e0a38d50
shared-key (32):
  e6d4ab9cffc9b49e2a64d80d7eb2dde280f806b89e834d596ad385b1dd75e9ef
signature (64):
  811bab04e2e70c9d946296a93b4028d7c7bb84f32f597d3cf8aba29edc1b6b97
  4acc99dd00ec62cdcae477433d10bff20e1c432e1011ad8ad5324f68a294750c

dns-query (33):
  12340100000100000000000003777777076578616d706c6503636f6d00000100
  01
dns-response (49):
  12348180000100010000000003777777076578616d706c6503636f6d00000100
  01c00c0001000100000e1000045db8d822
padded query plaintext (64):
  12340100000100000000000003777777076578616d706c6503636f6d00000100
  0180000000000000000000000000000000000000000000000000000000000000
encrypted-query (80):
  c41764468cb42d3a837c51234c08be714af49e1a6830ea6da28178e9e280d76b
  ac1b87fd7f56515f2b2cc3d4715aaa42907c282db1edff0bc3b92cd535a710e2
  64859a5bdaf67c17ffa6e1c6f6e02a50
full query wire (1220, SHA-256):
  65c3421776283f503779916e7b5c32d0d41c885508ad892b349688db6c901233

resume-secret (32):
  df158804e3f8ddf383ff7c9d3128491b29437a894936ec72c68aed8a9553272b
profile-extension-hash = SHA-256(extensions) (32):
  fab3bf4996c5d2fdfc330ec958d0a5b63624bf3fbdc0fedfa9d94b0941a4060c
ticket-plain (86):
  df158804e3f8ddf383ff7c9d3128491b29437a894936ec72c68aed8a9553272b
  0003a1b2c3d4e5f60718000000016801518068000258fab3bf4996c5d2fdfc33
  0ec958d0a5b63624bf3fbdc0fedfa9d94b0941a4060c
ticket (130):
  00000001d0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e1d90c86
  474574e0e51e82d8a29938896b0999e827138f8f452f21e044d9809f65a013cf
  ad8981be94c1354178b3e03dd518c28bcbaab962aa45246e446de7763288aa4a
  01e207725a0ae7bc95452fef3743f6083deb10cd23e2881e8d9307fc2f43bce1
  a97e
control (141):
  50514452010000012c008200000001d0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0
  e1e2e3e4e5e6e7e1d90c86474574e0e51e82d8a29938896b0999e827138f8f45
  2f21e044d9809f65a013cfad8981be94c1354178b3e03dd518c28bcbaab962aa
  45246e446de7763288aa4a01e207725a0ae7bc95452fef3743f6083deb10cd23
  e2881e8d9307fc2f43bce1a97e
response plaintext, padded to 256 (256, SHA-256):
  a215df14b59d272b506224ed1f6ab5956be2bf189f847dfac4f8649c5f94d99e
full response wire (304, SHA-256):
  33c081503d5ead4061a30d3f095fc9f226b8c01c3bbffa8fc6f4d9b15087de5c

sha256(ticket) (32):
  fb196d81022c6b480f1340c80987088a85145194c18441928a4ae8e5a153536c
resumed shared-key (32):
  e61f03acb2ee2ef01b952a0c312c60653267d47a2766fcfd804747fdf2fe789f
resumed encrypted-query (272, SHA-256):
  60323805036492350ee442ee4dcb097597fb586e3f2c8a1f26feb9cdd0409b29
resume query wire (424, SHA-256):
  34be2e331b4d7c7e808e968c5efc9f25675a9de9064cb33f7c66950e0e4e6db7
resume response wire, no new ticket (112, SHA-256):
  2bf202dd3f33d38854450e70a02bd1a317a23bf6d79c5dae406787c9c5f34f52
]]></artwork>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="FIPS203" target="https://doi.org/10.6028/NIST.FIPS.203">
        <front>
          <title>Module-Lattice-Based Key-Encapsulation Mechanism Standard</title>
          <author>
            <organization>National Institute of Standards and Technology</organization>
          </author>
          <date year="2024" month="August"/>
        </front>
        <seriesInfo name="FIPS" value="203"/>
      </reference>
      <reference anchor="RFC1035" target="https://www.rfc-editor.org/info/rfc1035" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml">
        <front>
          <title>Domain names - implementation and specification</title>
          <author fullname="P. Mockapetris" initials="P." surname="Mockapetris"/>
          <date month="November" year="1987"/>
          <abstract>
            <t>This RFC is the revised specification of the protocol and format used in the implementation of the Domain Name System. It obsoletes RFC-883. This memo documents the details of the domain name client - server communication.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="13"/>
        <seriesInfo name="RFC" value="1035"/>
        <seriesInfo name="DOI" value="10.17487/RFC1035"/>
      </reference>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
        <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" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
        <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>
      <reference anchor="RFC8439" target="https://www.rfc-editor.org/info/rfc8439" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8439.xml">
        <front>
          <title>ChaCha20 and Poly1305 for IETF Protocols</title>
          <author fullname="Y. Nir" initials="Y." surname="Nir"/>
          <author fullname="A. Langley" initials="A." surname="Langley"/>
          <date month="June" year="2018"/>
          <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 "combined mode", 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>
      <reference anchor="RFC7766" target="https://www.rfc-editor.org/info/rfc7766" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7766.xml">
        <front>
          <title>DNS Transport over TCP - Implementation Requirements</title>
          <author fullname="J. Dickinson" initials="J." surname="Dickinson"/>
          <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
          <author fullname="R. Bellis" initials="R." surname="Bellis"/>
          <author fullname="A. Mankin" initials="A." surname="Mankin"/>
          <author fullname="D. Wessels" initials="D." surname="Wessels"/>
          <date month="March" year="2016"/>
          <abstract>
            <t>This document specifies the requirement for support of TCP as a transport protocol for DNS implementations and provides guidelines towards DNS-over-TCP performance on par with that of DNS-over-UDP. This document obsoletes RFC 5966 and therefore updates RFC 1035 and RFC 1123.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7766"/>
        <seriesInfo name="DOI" value="10.17487/RFC7766"/>
      </reference>
      <reference anchor="RFC5358" target="https://www.rfc-editor.org/info/rfc5358" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5358.xml">
        <front>
          <title>Preventing Use of Recursive Nameservers in Reflector Attacks</title>
          <author fullname="J. Damas" initials="J." surname="Damas"/>
          <author fullname="F. Neves" initials="F." surname="Neves"/>
          <date month="October" year="2008"/>
          <abstract>
            <t>This document describes ways to prevent the use of default configured recursive nameservers as reflectors in Denial of Service (DoS) attacks. It provides recommended configuration as measures to mitigate the attack. 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="140"/>
        <seriesInfo name="RFC" value="5358"/>
        <seriesInfo name="DOI" value="10.17487/RFC5358"/>
      </reference>
      <reference anchor="RFC6891" target="https://www.rfc-editor.org/info/rfc6891" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6891.xml">
        <front>
          <title>Extension Mechanisms for DNS (EDNS(0))</title>
          <author fullname="J. Damas" initials="J." surname="Damas"/>
          <author fullname="M. Graff" initials="M." surname="Graff"/>
          <author fullname="P. Vixie" initials="P." surname="Vixie"/>
          <date month="April" year="2013"/>
          <abstract>
            <t>The Domain Name System's wire protocol includes a number of fixed fields whose range has been or soon will be exhausted and does not allow requestors to advertise their capabilities to responders. This document describes backward-compatible mechanisms for allowing the protocol to grow.</t>
            <t>This document updates the Extension Mechanisms for DNS (EDNS(0)) specification (and obsoletes RFC 2671) based on feedback from deployment experience in several implementations. It also obsoletes RFC 2673 ("Binary Labels in the Domain Name System") and adds considerations on the use of extended labels in the DNS.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="75"/>
        <seriesInfo name="RFC" value="6891"/>
        <seriesInfo name="DOI" value="10.17487/RFC6891"/>
      </reference>
      <reference anchor="RFC7830" target="https://www.rfc-editor.org/info/rfc7830" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7830.xml">
        <front>
          <title>The EDNS(0) Padding Option</title>
          <author fullname="A. Mayrhofer" initials="A." surname="Mayrhofer"/>
          <date month="May" year="2016"/>
          <abstract>
            <t>This document specifies the EDNS(0) "Padding" option, which allows DNS clients and servers to pad request and response messages by a variable number of octets.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7830"/>
        <seriesInfo name="DOI" value="10.17487/RFC7830"/>
      </reference>
      <reference anchor="RFC9000" target="https://www.rfc-editor.org/info/rfc9000" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
        <front>
          <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
          <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
          <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
          <date month="May" year="2021"/>
          <abstract>
            <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9000"/>
        <seriesInfo name="DOI" value="10.17487/RFC9000"/>
      </reference>
      <reference anchor="RFC4291" target="https://www.rfc-editor.org/info/rfc4291" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4291.xml">
        <front>
          <title>IP Version 6 Addressing Architecture</title>
          <author fullname="R. Hinden" initials="R." surname="Hinden"/>
          <author fullname="S. Deering" initials="S." surname="Deering"/>
          <date month="February" year="2006"/>
          <abstract>
            <t>This specification defines the addressing architecture of the IP Version 6 (IPv6) protocol. The document includes the IPv6 addressing model, text representations of IPv6 addresses, definition of IPv6 unicast addresses, anycast addresses, and multicast addresses, and an IPv6 node's required addresses.</t>
            <t>This document obsoletes RFC 3513, "IP Version 6 Addressing Architecture". [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4291"/>
        <seriesInfo name="DOI" value="10.17487/RFC4291"/>
      </reference>
      <reference anchor="RFC1918" target="https://www.rfc-editor.org/info/rfc1918" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1918.xml">
        <front>
          <title>Address Allocation for Private Internets</title>
          <author fullname="Y. Rekhter" initials="Y." surname="Rekhter"/>
          <author fullname="B. Moskowitz" initials="B." surname="Moskowitz"/>
          <author fullname="D. Karrenberg" initials="D." surname="Karrenberg"/>
          <author fullname="G. J. de Groot" initials="G. J." surname="de Groot"/>
          <author fullname="E. Lear" initials="E." surname="Lear"/>
          <date month="February" year="1996"/>
          <abstract>
            <t>This document describes address allocation for private internets. 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="5"/>
        <seriesInfo name="RFC" value="1918"/>
        <seriesInfo name="DOI" value="10.17487/RFC1918"/>
      </reference>
      <reference anchor="RFC7748" target="https://www.rfc-editor.org/info/rfc7748" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7748.xml">
        <front>
          <title>Elliptic Curves for Security</title>
          <author fullname="A. Langley" initials="A." surname="Langley"/>
          <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
          <author fullname="S. Turner" initials="S." surname="Turner"/>
          <date month="January" year="2016"/>
          <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="I-D.connolly-cfrg-xwing-kem" target="https://datatracker.ietf.org/doc/html/draft-connolly-cfrg-xwing-kem-10" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.connolly-cfrg-xwing-kem.xml">
        <front>
          <title>X-Wing: general-purpose hybrid post-quantum KEM</title>
          <author fullname="Deirdre Connolly" initials="D." surname="Connolly">
            <organization>SandboxAQ</organization>
          </author>
          <author fullname="Peter Schwabe" initials="P." surname="Schwabe">
            <organization>MPI-SP &amp; Radboud University</organization>
          </author>
          <author fullname="Bas Westerbaan" initials="B." surname="Westerbaan">
            <organization>Cloudflare</organization>
          </author>
          <date day="2" month="March" year="2026"/>
          <abstract>
            <t>This memo defines X-Wing, a general-purpose post-quantum/traditional hybrid key encapsulation mechanism (PQ/T KEM) built on X25519 and ML- KEM-768.</t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-connolly-cfrg-xwing-kem-10"/>
      </reference>
      <reference anchor="RFC5869" target="https://www.rfc-editor.org/info/rfc5869" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5869.xml">
        <front>
          <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
          <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
          <author fullname="P. Eronen" initials="P." surname="Eronen"/>
          <date month="May" year="2010"/>
          <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>
    </references>
  </back>
  <!-- ##markdown-source:
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
VoedpF1JJqeo2yjnlpqrecTe0Ik3BvdrzimtzGc6KjYHp6VFhZnCXdP59nDM
/kJxhRmf/0jV0puL9HK7Gdzdde+dJBqaBOeL/9AMAmajsvDl3WElIcvBp98i
mLF0Lcad2AGPdyC7Nt5YP/jhr5I38jzGCok3SGLRya6HMgMIYzl0HlEmhudV
CalKncj0gv1jEPwCNjQTvQVn++rdd7959fJ5cj7tT7ojU9FhaDoCOoWVJnng
CGEPyV98U67UYMVRpxgWM+3NOpHxAM0rQv8YvfH6h29mGgXEorT0I45fYgRz
4gGrHJSdpE9Pd+CzRYqicG3E+nq6uk2BRaZbDgXBMWnCCY8KiI2MJ3Rz1sMt
bvBGiO4UZ3fAv4QcvGBHopx2z7c/BT6amLjL/xOz+vVd6I9VSZ5H7DcPsWrk
rA9XAazZZGQLNvt8XWwkZApe4UCr1LznArGhrand+qdIuR3hITipeuR5px4Z
UY9N6tRDSSQ6NQR7hhEIRZpMBbN7tQ+C3AqWajCO5Oua9Jt8e/XvEg0tMq9u
uIRAVwe8uKpkrOFqLPILW0yFSsIeVKW7lnTJUDivRzvjmit5NneEunrGUqhp
kbwyMufQ5ezBuNOZqlF4Jo6RBV2GsvdEEHhdYEQL6ropbEU31qqJIwlmg7HP
DpMe2rIscWiXL/Lio7ZkshxoJYsPZ8ypjnIn+Kc7J4iYWigQZl0h/2EuYQuD
FHd9KPCYovABMvTKR9W0JGaQ3Ikb5BU05Eok+8iFEm4o3VIUTSiRB1EsCpN1
W45E8NYq9IoNpyXvxY3sKtAMji9L9+wIxgQn2Eg1YiBnYXp79QYDsWHpVsUH
NkmzNc2/3VEzv4hMQP5xHpKzydlih1BttPlU5WGHAWlwQcEof4CByxaz6CNL
Fl3bOGQQDjAYHT1SBQ0LdIJdfo22XDQPiOYpuodd1uGsx4aBWGBlluoBcmCW
HTSQ1/gIHGdUu6tYbAgWXBN189VWpZrWHJCONxqzSBMYVBz01zJU0ZGMUzSi
OCV+qly2tGcqfeokbqB0y+IyVgiiWCq3hDWxJCciDUAWpZMIi2+MwmXnsfx+
T38du7bI6CxbWxdDcVS1Od2ksVejyveR7RzbZJcdEYiJeWyUEbKo29TR+3bY
ZqRH7tGKRgeQj7l4yITTMSzIqiScD7SpgKRXwHwR3AOm5xRduSCwEUvWIz8L
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
+TUNTIh76fX4Pfp5cAmH+1tUJNj1//lVsYnxUOnH3/0i8dM8tnjseaw4tElO
jdKhwb01fqfF/GnooWRLF234B+EFj7Pw8Nd4kBIVKTQwvsGk7abnl7bv8JOM
KQy1oTVYX7VSFzEHfNWv5SdURebZnpPtHWcHLVY8JFpPpSZf8/JZ0y+zOX3J
HOkzUqM7ttt13Rmp0asZ0ckhXTb+k5eO7ULv8Wd/TPmnyJAXJip1G6Z4RuwY
/rwDyWzjasGdVUfiG7BNdfbkAdYpf0N/607HO2J0OidfBU0MPsMZgKdeueSs
op8y27OC0qUBmQanZ0SmMSjFutph2PJk7Eka9nMC0ZBskAeiEc062oRYRW4S
kap/CGTiPI0jNQ+riRyTaHT0KsFATI6QtNgvuBVH1zSRkucmoHd0Xy84zP0o
RUU2pKfxje7OY37h4aSUke3paXzjskrsyST5/E9Si+hwDtaVEJwbo71L8PJV
GtaWRvg893N7R/+Spa7eQMxM2YvFnf3Fe/SrkLJFLjiWkHBUeJt96rLf+NOi
y3/MvGvKa55GkT75/ZqGN72IcJnW+ZXDPiStjY+HHMFjUjy7f/wCTXT3AiHz
HoXlVzj7kDgcLiJcenCa2+s6MKXOpSTtydFvnh+cDtjkh7PSJP39A1IeUnJs
oCe1Zuzh+a2Su+Jf7g+HL4RrSJKlHBtHyGmnd9j2llbAR6r7OqTrmxj+Dpnp
xEQdTI+3ZhfTJikFhWriphUh0szq442rbzGmKXushdoV73Cbgbc5B1e1NTb4
euE+9+YYpv2hRZYXysCfXkxjIuSRuAm/3Rd53e/wBtgpLGWAr7QzI0g+WNjt
3BlYD5+CpoUk91gN9Yben+Z6lruwWQ7HSaOaYIq7n4ZkEuO5U3IVaWPon6vS
1ezA4io5075KTov9kK1ldV2OOdVjWj5pgEPA+DY9Y+wo+/u7WCY6L1idq2N+
WkLKd2JcM3UMpcBnharH4tNjmeis8PTVYrXoZyrzVXAQY0VnquM8lnHeXdQI
JniwpIJ+1xtK3ne3Nx/p5ZfX5IUIfzJ3k1/uqLjCXdQE77G6e2/xKJPYZ+KH
9o+I3NcuzKI6Wqkd+f7ff0TIxxFXxy0m5KW0Y5R/bR/R0Nw8hpLD7i4WekuW
zXma1wicwNJLMAAuuEMcjDODsX+Ym0sTtLvQu+I/7iiTLOKcR1NzndieSOHj
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

-->

</rfc>
