<?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-09" category="info" submissionType="independent" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="DNSCrypt">The DNSCrypt Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-dprive-dnscrypt-09"/>
    <author fullname="Frank Denis">
      <organization>Individual Contributor</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2026" month="June" day="17"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 32?>

<t>The DNSCrypt protocol is designed to encrypt and authenticate DNS traffic between clients and resolvers. This document specifies the protocol and its implementation, providing a standardized approach to securing DNS communications. 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 36?>

<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. 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. 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. 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. 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.</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.</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.</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.</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.</t>
        </li>
        <li>
          <t><tt>AE</tt>: the authenticated encryption function.</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.</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. 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 adds padding to the unmodified response, encrypts the result using the shared key and a nonce made of the client's nonce followed by the resolver's nonce, and truncates the response if necessary. The resulting packet, truncated or not, 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 <bcp14>MAY</bcp14> adjust internal parameters and retry over TCP <xref target="RFC7766"/>. 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. 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.
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. 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. 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. 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). 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. 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. 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. Padding begins with a single byte holding the value <tt>0x80</tt>, followed by any number of <tt>NUL</tt> bytes.</t>
          <t><tt>&lt;client-query&gt;</tt> <tt>&lt;client-query-pad&gt;</tt> <bcp14>MUST</bcp14> be at least <tt>&lt;min-query-len&gt;</tt> bytes.
In this context, <tt>&lt;client-query&gt;</tt> represents the original client query, while <tt>&lt;client-query-pad&gt;</tt> denotes the added padding.</t>
          <t>Should the client query's length fall short of  <tt>&lt;min-query-len&gt;</tt> bytes, the padding length <bcp14>MUST</bcp14> be adjusted in order to satisfy the length requirement.</t>
          <t><tt>&lt;min-query-len&gt;</tt> is a variable length, initially set to 256 bytes, and <bcp14>MUST</bcp14> be a multiple of 64 bytes. It represents the minimum permitted length for a client query, inclusive of padding.</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>UDP packets employing the DNSCrypt protocol have the capability to be split into distinct IP packets sharing 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. The client <bcp14>MUST</bcp14> verify that the <tt>&lt;client-nonce&gt;</tt> prefix of the response nonce matches a currently outstanding query. 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>set the new minimum query length as:</t>
            </li>
          </ol>
          <t><tt>&lt;min-query-len&gt; ::= min(&lt;min-query-len&gt; + 64, &lt;max-query-len&gt;)</tt></t>
          <t><tt>&lt;min-query-len&gt;</tt> denotes the minimum permitted length for a client query, including padding. That value <bcp14>MUST</bcp14> be capped so that the full length of a DNSCrypt packet doesn't exceed the maximum size required by the transport layer.</t>
          <t>The client <bcp14>MAY</bcp14> decrease <tt>&lt;min-query-len&gt;</tt>, but the length <bcp14>MUST</bcp14> remain a multiple of 64 bytes.</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. The padding starts with a byte valued <tt>0x80</tt> followed by a variable number of NUL bytes.</t>
          <t>The length of <tt>&lt;client-query-pad&gt;</tt> is selected randomly, ranging from 1 to 256 bytes, including the initial byte valued at <tt>0x80</tt>. The total length of <tt>&lt;client-query&gt;</tt> <tt>&lt;client-query-pad&gt;</tt> <bcp14>MUST</bcp14> be a multiple of 64 bytes.</t>
          <t>For example, an originally unpadded 56-bytes DNS query can be 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>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>
          <t>The query processing rules described above depend on the certificate information obtained during session establishment. 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    |   Reserved    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                         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. The attempt is first made using UDP; if unsuccessful due to failure, timeout, or truncation, the client then proceeds with TCP.</t>
        <t>Resolvers are not required to serve certificates both on UDP and TCP.</t>
        <t>The name in the question (<tt>&lt;provider name&gt;</tt>) <bcp14>MUST</bcp14> follow 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>MUST</bcp14> send a query with the <tt>TXT</tt> type and a name of the form:</t>
        <t><tt>2.dnscrypt-cert.example.com</tt></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. It is never used to encrypt or verify DNS queries. 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. 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. Once signed, resolvers <bcp14>SHOULD</bcp14> make these certificates available to clients. 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 Box-XChaChaPoly, <tt>&lt;es-version&gt;</tt> <bcp14>MUST</bcp14> be <tt>0x00 0x02</tt>.</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>: The first 8 bytes of a client query that was built using the information from this certificate. It <bcp14>MAY</bcp14> be a truncated public key. Two valid certificates cannot share the same <tt>&lt;client-magic&gt;</tt>. <tt>&lt;client-magic&gt;</tt> <bcp14>MUST NOT</bcp14> start 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"/>.</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, 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.</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. 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>After receiving a set of certificates, the client checks their validity based on the current date, filters out the ones designed for encryption systems that are not supported by the client, and chooses the certificate with the higher serial number.</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> check for new certificates every hour and switch 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. With the core protocol mechanics now established, we can examine implementation considerations.</t>
      </section>
    </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. 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. 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 using XChaCha20-Poly1305 <xref target="RFC8439"/>, 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 Poly1305 <xref target="RFC8439"/> 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 X25519 <xref target="RFC7748"/> for key exchange and Ed25519 for certificate signatures 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. 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 secret keys <bcp14>MUST</bcp14> be discarded after rotation</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</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>: The padding requirements and minimum query length help prevent amplification attacks <xref target="RFC5358"/>. For example, a 256-byte minimum query size limits the amplification factor.</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. 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>Resolvers accessible from any client IP address can also opt for only responding to a set of whitelisted public keys.</t>
      <t>Resolvers accepting queries from any client <bcp14>MUST</bcp14> accept any client public key. In particular, an anonymous client can generate a new key pair for every session, or even for every query. 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 the short-term key pair every 24 hours at most, and <bcp14>MUST</bcp14> throw away the previous secret key. After a key rotation, a resolver <bcp14>MUST</bcp14> still accept all the previous keys that haven't expired.</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. 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. 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. 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. 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. 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>: standard DNSCrypt query</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>
      </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 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 range <xref target="RFC1918"/></t>
              </li>
              <li>
                <t>Verify the port number is in an allowed range</t>
              </li>
              <li>
                <t>Ensure the DNSCrypt query doesn't start with <tt>&lt;anon-magic&gt;</tt></t>
              </li>
              <li>
                <t>Verify the query doesn't start with 7 zero bytes (to avoid confusion with QUIC <xref target="RFC9000"/>)</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Forward valid queries unmodified to the server</t>
          </li>
          <li>
            <t>Verify server responses:  </t>
            <ul spacing="normal">
              <li>
                <t>For encrypted DNSCrypt responses, check that the response is smaller than the query</t>
              </li>
              <li>
                <t>For certificate responses, check that the response transaction ID and query name match the relayed certificate query</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</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>These relay requirements ensure that anonymization does not compromise the security properties of the underlying DNSCrypt protocol. 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. An attacker who records DNSCrypt traffic today could therefore decrypt it once such a computer exists. 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. 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. It is not a new major protocol version, and it does not change the certificate lookup name. 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. 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. A post-quantum key encapsulation mechanism (KEM) does not offer a non-interactive key agreement, but it fits the same single-message exchange. 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. 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. 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 resolver remains stateless: it derives the shared secret from a single client message, with no per-client state. 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"/>. 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. 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. 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. 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. 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. 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. 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. 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. 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. A response with two classical certificates and two PQ certificates is typically about 3.0 KB. 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 EDNS(0) <xref target="RFC6891"/>, TCP <xref target="RFC7766"/>, or both. A 4096-octet DNS response is a useful upper bound for certificate responses, but it is not a fragmentation-avoidance target. 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 can be abused as a traffic amplifier in response to queries with a spoofed source address. Resolvers <bcp14>MUST NOT</bcp14> send a UDP certificate response larger than the requestor's advertised EDNS(0) UDP payload size, or larger than 512 octets when no EDNS(0) UDP payload size is advertised, and <bcp14>SHOULD</bcp14> keep certificate responses below 4096 octets even when a larger value is advertised.</t>
        <t>Anonymized DNSCrypt relays forward certificate queries to upstream resolvers over UDP, even when the client-to-relay connection uses TCP. Therefore, a resolver that wants PQ certificate discovery to work reliably through existing relays <bcp14>SHOULD</bcp14> make the complete certificate set fit in a UDP response, instead of assuming that the client can obtain the PQ certificates through TCP fallback on the same relay path. For relay-compatible PQ deployments, resolvers <bcp14>SHOULD</bcp14> use the following UDP certificate sets:</t>
        <ul spacing="normal">
          <li>
            <t>Normal steady state: one classical certificate and one PQ certificate.</t>
          </li>
          <li>
            <t>Rollover window: two classical certificates and two PQ certificates.</t>
          </li>
        </ul>
        <t>Resolvers <bcp14>SHOULD NOT</bcp14> exceed the rollover certificate set over UDP.</t>
        <t>If the complete certificate response would exceed these limits, the resolver <bcp14>SHOULD</bcp14> set the TC flag and rely on the client retrying over TCP <xref target="RFC7766"/>. When it does so, the resolver <bcp14>SHOULD</bcp14> still include the smaller classical certificate in the truncated UDP response, so that a client that does not implement PQ can proceed without a second round trip while a PQ-capable client learns that more certificates may be available over TCP. Operators <bcp14>MAY</bcp14> serve a small classical certificate over UDP while requiring TCP for larger PQ certificate sets. 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. 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. It is not used directly as the encryption key. 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. 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. 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. When it is zero, <tt>&lt;control&gt;</tt> is absent and the DNS response begins immediately after the length. When it is nonzero, <tt>&lt;control&gt;</tt> carries PQ control data, currently a stateless resumption ticket. 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. A PQ client removes the control block after decryption and forwards the unmodified DNS response. 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. The minimum query length defined for client queries over UDP exists to prevent amplification, and that concern does not apply to a query that is already this large. A PQ query that carries a ciphertext is therefore NOT subject to the 256-byte minimum: it is padded only to the next multiple of 64 bytes. A resumed query, described below, carries a small ticket instead of a ciphertext, so it <bcp14>MUST</bcp14> use the regular minimum query length, initially 256 bytes, as in classical DNSCrypt.</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. 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. 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. 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>. A <tt>TK</tt> is shared by all processes answering for a given certificate and is rotated independently of client traffic. 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>. 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 ticket is opaque, resolver-private state: its internal format and AEAD are an implementation choice and never need to interoperate between resolvers. 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. The client stores the ticket together with the <tt>resume-secret</tt> it derived and the ticket expiry. The ticket is delivered in the response control block:</t>
          <artwork><![CDATA[
<control> ::= "PQDR" <control-version> <ticket-lifetime>
              <ticket-len> <ticket>
]]></artwork>
          <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. 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 a reserved 8-byte value that <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. 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. 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. 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. The nonce construction is unchanged. 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. 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. 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: compromise of <tt>TK</tt> exposes only the resumed queries whose tickets are still valid under that ticket-key epoch, and never the queries that carried a ciphertext. The ticket lifetime <bcp14>SHOULD</bcp14> be short and <bcp14>MUST NOT</bcp14> exceed the resolver certificate lifetime or the ticket-key lifetime. 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. 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. 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. 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. The relay check that an encrypted response is smaller than the query is satisfied automatically for queries that carry a ciphertext, because they are large. A resumed query is small, so a client using Anonymized DNSCrypt <bcp14>MUST</bcp14> keep enough padding on a resumed UDP query for the relay's encrypted-response size check to pass, or send it over TCP.</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. PQ-capable resolvers that want to be reachable through relays therefore <bcp14>SHOULD</bcp14> follow the UDP certificate response size recommendations in Certificate Retrieval Amplification.</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. A signature cannot prevent deletion. 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. 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. 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. 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. 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. Resumed queries inherit the shorter of the ticket lifetime and the ticket-key lifetime.</t>
        <t>Nonce uniqueness is required as in classical DNSCrypt. 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 at 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 based on the construction and security proof used to create XSalsa20, an extended-nonce variant of Salsa20.</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>. 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>. 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>. It is the combined mode used by the NaCl <tt>secretbox</tt> and <tt>crypto_box</tt> constructions, instantiated with <tt>XChaCha20_DJB</tt>. 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. 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> and a 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;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 the 24-byte nonce, 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;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;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, m)</tt>: <tt>XChaCha20_DJB-Poly1305(&lt;sk'&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. Every value is given in full as a hexadecimal string, wrapped to 32 bytes per line. The field and byte order of each artifact matches the Protocol Components and Certificates sections. 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. 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. <tt>&lt;ts-start&gt;</tt> and <tt>&lt;ts-end&gt;</tt> span exactly 86400 seconds (a one-day validity window). 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="client-query-udp">
        <name>Client Query (UDP)</name>
        <t>The plaintext is the DNS query padded with ISO/IEC 7816-4 to <tt>&lt;min-query-len&gt;</tt> = 256 bytes: one <tt>0x80</tt> byte followed by NUL bytes. 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. 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 <tt>&lt;min-query-len&gt;</tt> = 256 bytes, the minimum permitted length for a client query inclusive of padding and a multiple of 64. An implementation <bcp14>MAY</bcp14> use a larger <tt>&lt;min-query-len&gt;</tt> that is also a multiple of 64; <tt>dnscrypt-proxy</tt> defaults to 512.</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 response being no larger than the query over UDP.</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.</t>
          </li>
        </ul>
      </section>
      <section anchor="negative-cases">
        <name>Negative Cases</name>
        <t>These vectors pin the required failure behavior. 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. 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. 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. Every AEAD operation is <tt>XChaCha20_DJB-Poly1305</tt> as defined in Appendix 1, with the 16-byte tag prepended to the ciphertext. Every key derivation is HKDF-SHA256 <xref target="RFC5869"/>. 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. 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. 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: resumed floor)
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>. 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. 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 padded below the 256-byte floor decrypts correctly but violates the anti-amplification rule, and an Anonymized DNSCrypt relay <bcp14>MAY</bcp14> drop it 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. Values up to 141 bytes are given in full; longer artifacts are pinned by their SHA-256 digest. 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="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="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="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="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="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="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>
      <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>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+296XYbV5Iu+h9PkVf1o0gXgMoJEz2cK8vyKR3bsizJXdXL
y6uRw04yWyAShQRIsdruZ7nPcp/sxrSnzARJlV3V7nMuu1omgcw9xo4dwxcR
k8lkdKgPG3URPHl7pYIvXr55tr/bHYJX++bQFM3mySjL8726ge/1d09GZVNs
s2t4p9xn1WFSqm3dTsrdvr5Rk3LbFvjUJFyNiuygLpv93UVQb6tmVO/2F8Fh
f2wPcRiuwnjUHvPrum3rZnu42yl8qlQ7Bf9sD6N36u622ZcXwYvtQe236jD5
Ajsb3ajtUV2MgoBfefLnZv+u3l4G/3PfHHdP4PPL+nB1zJ3x/tEMaWcmFQQb
GFt7gMeuDodde/FH89SUG5jWTf/FPz4ZjbLj4arZwwgm0EoQVMfNhhfjy322
fRd8gYtB3zT7y2xb/y07wPxwGmV9U5fHbBM8g/nu6/x4aPb0oLrO6s1FUJXq
/w7DagpzHY22zf4a3ryhqX754tWbOEwu6Gm9Xd805XGjJl9nh0NdqMnnWavK
4Ct1N3m+LbJde9xQx8E3qriCYbTXwZtDti2zffmEm8n2l8qbf1NPYch/jMLp
PIyXf3z54s3bKfY8ha75HTN1+pngDC+Cl9QPTOvFtoWxHQ8qaCrTWRvAf4O3
MIhts2ku7+jdEtb+IojDOJ2ES/qkVftatUglunXsGUZHfY/wC7Meo8lkEmR5
e9hnBayUR7Z6o4K6DUpo8HILi3JoArWljaTB4CyAwmqkTnwTSDKrqroIcnW4
VWobFJsavueR71XbbG7Uvp0Gb6+w0aY4XsO3QbtTRV3BoANozfaL79Twbn29
2yh8kFZnjA/A7iOhZkEra1P/DQaX7eCrrLjCUbaqOO7xGRxV0VxfH7c4SmgA
ujdzhKahMei4aLZVjYelzjb14W4M5wfO255+lbHX2FehsHGgk6x4B7OqKlUc
sBcceLOvL2vcPezSzOL2qt6oAMgSxl9v8VkYzQ5GktfYU3ALRyRQ76F1PVrY
oX0GW3IsDse9mvImXddluVGj0e/wEO+BXguci2xZg80D9Vyr4M1de1DXwRk0
dB78x3/8X6+/fBaFyeznn3Ebs6CAKcE6bGgQzRZXHyhM84VO1+MADhZtgZka
E0JQ1mWwbfD5YnMslaw2zKZSGb7Z4irhEsDy0Np01pf3Vi8xDuGvRyJbvdgw
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
agEA

-->

</rfc>
