<?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-10" category="info" submissionType="independent" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="DNSCrypt">The DNSCrypt Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-dprive-dnscrypt-10"/>
    <author fullname="Frank Denis">
      <organization>Individual Contributor</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2026" month="June" day="20"/>
    <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. For the encryption systems defined in this document, it is the <tt>XChaCha20_DJB-Poly1305</tt> construction of Appendix 1, whose output is the 16-byte authentication tag followed by the ciphertext. This is the NaCl <tt>secretbox</tt> layout, in which the one-time Poly1305 key is taken from the start of the keystream; it is not the AEAD of <xref target="RFC8439"/>, and the two are not interchangeable. See Appendix 1 for details.</t>
        </li>
        <li>
          <t><tt>&lt;encrypted-query&gt;</tt>: <tt>AE(&lt;shared-key&gt; &lt;client-nonce&gt; &lt;client-nonce-pad&gt;, &lt;client-query&gt; &lt;client-query-pad&gt;)</tt></t>
        </li>
        <li>
          <t><tt>&lt;shared-key&gt;</tt>: the shared key derived from <tt>&lt;resolver-pk&gt;</tt> and <tt>&lt;client-sk&gt;</tt>, using the key exchange algorithm defined in the chosen certificate.</t>
        </li>
        <li>
          <t><tt>&lt;client-query&gt;</tt>: the unencrypted client query. The query is not modified; in particular, the query flags are not altered.</t>
        </li>
        <li>
          <t><tt>&lt;client-nonce-pad&gt;</tt>: <tt>&lt;client-nonce&gt;</tt> length is half the nonce length required by the encryption algorithm. In client queries, the other half, <tt>&lt;client-nonce-pad&gt;</tt> is filled with NUL bytes. For <tt>&lt;es-version&gt;</tt> <tt>0x00 0x02</tt>, the encryption algorithm uses a 24-byte nonce, so <tt>&lt;client-nonce&gt;</tt> is 12 bytes and <tt>&lt;client-nonce-pad&gt;</tt> is the remaining 12 NUL bytes.</t>
        </li>
        <li>
          <t><tt>&lt;client-query-pad&gt;</tt>: the variable-length padding.</t>
        </li>
      </ul>
      <t>Definitions for server responses:</t>
      <ul spacing="normal">
        <li>
          <t><tt>&lt;dnscrypt-response&gt;</tt>: <tt>&lt;resolver-magic&gt;</tt> <tt>&lt;nonce&gt;</tt> <tt>&lt;encrypted-response&gt;</tt></t>
        </li>
        <li>
          <t><tt>&lt;resolver-magic&gt;</tt>: the <tt>0x72 0x36 0x66 0x6e 0x76 0x57 0x6a 0x38</tt> byte sequence</t>
        </li>
        <li>
          <t><tt>&lt;nonce&gt;</tt>: <tt>&lt;client-nonce&gt;</tt> <tt>&lt;resolver-nonce&gt;</tt></t>
        </li>
        <li>
          <t><tt>&lt;client-nonce&gt;</tt>: the nonce sent by the client in the related query.</t>
        </li>
        <li>
          <t><tt>&lt;client-pk&gt;</tt>: the client's public key.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-sk&gt;</tt>: the resolver's secret key.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-nonce&gt;</tt>: a unique response identifier for a given <tt>(&lt;client-pk&gt;, &lt;resolver-sk&gt;)</tt> tuple. The length of <tt>&lt;resolver-nonce&gt;</tt> depends on the chosen encryption algorithm.</t>
        </li>
        <li>
          <t><tt>AE</tt>: the authenticated encryption function. For the encryption systems defined in this document, it is the <tt>XChaCha20_DJB-Poly1305</tt> construction of Appendix 1, whose output is the 16-byte authentication tag followed by the ciphertext. This is the NaCl <tt>secretbox</tt> layout, in which the one-time Poly1305 key is taken from the start of the keystream; it is not the AEAD of <xref target="RFC8439"/>, and the two are not interchangeable. See Appendix 1 for details.</t>
        </li>
        <li>
          <t><tt>&lt;encrypted-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 <tt>IN</tt> class, and a name of the form:</t>
        <t><tt>2.dnscrypt-cert.example.com</tt></t>
        <t>The RD (Recursion Desired) bit <bcp14>MAY</bcp14> be set; a resolver serving a certificate for its own provider name ignores it.</t>
        <t>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 the <tt>Box-XChaChaPoly</tt> construction of Appendix 1, that is, the X25519 key exchange with the <tt>XChaCha20_DJB-Poly1305</tt> authenticated encryption algorithm, <tt>&lt;es-version&gt;</tt> <bcp14>MUST</bcp14> be <tt>0x00 0x02</tt>.</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>Within a <tt>TXT</tt> record, the certificate is carried in the record's RDATA, which is a sequence of length-prefixed character-strings <xref target="RFC1035"/>. A client reconstructs the certificate by concatenating these character-strings in order, after removing the single length octet that precedes each one. A 124-byte classical certificate fits in a single character-string, whereas a larger certificate spans several character-strings that <bcp14>MUST</bcp14> be concatenated in this way before the certificate is parsed.</t>
        <t>After receiving a set of certificates, the client checks their validity based on the current date, 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 a sufficiently padded UDP query, 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 could be abused as a traffic amplifier in response to queries with a spoofed source address. The anti-amplification rule is the same one classical DNSCrypt already applies to its traffic: over UDP, a certificate response <bcp14>MUST NOT</bcp14> be larger than the request that triggered it. A client that wants a PQ certificate over UDP therefore pads its certificate query to at least the size of the expected response, exactly as a query that carries a ciphertext is already large enough to cover its response. The advertised EDNS(0) <xref target="RFC6891"/> UDP payload size is a fragmentation-avoidance hint and <bcp14>MUST NOT</bcp14> be used as the amplification limit, because a spoofed query can advertise an arbitrarily large buffer while remaining small.</t>
        <t>To let a client size that padding, a resolver <bcp14>SHOULD</bcp14> keep its UDP certificate set small and predictable. For relay-compatible PQ deployments, resolvers <bcp14>SHOULD</bcp14> use the following certificate sets:</t>
        <ul spacing="normal">
          <li>
            <t>Normal steady state: one classical certificate and one PQ certificate, typically about 1.5 KB.</t>
          </li>
          <li>
            <t>Rollover window: two classical certificates and two PQ certificates, typically about 3.0 KB.</t>
          </li>
        </ul>
        <t>Resolvers <bcp14>SHOULD NOT</bcp14> exceed the rollover certificate set over UDP, and <bcp14>SHOULD</bcp14> keep certificate responses below 4096 octets.</t>
        <t>A client cannot tell from outside whether a rotation is in progress, so a client that wants PQ certificates over UDP across rotations <bcp14>SHOULD</bcp14> pad its certificate query to cover the rollover set rather than only the steady-state set; otherwise it silently drops to the classical certificate for the duration of every rollover window.</t>
        <t>If the certificate response would be larger than the request, the resolver <bcp14>MUST NOT</bcp14> return the oversized response over UDP; it <bcp14>SHOULD</bcp14> instead 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 a padded query or 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, and it applies the same response-size check, dropping any response larger than the query it relayed. A client that wants a PQ certificate over UDP through a relay therefore pads its certificate query to at least the size of the expected certificate response, as described in Certificate Retrieval Amplification, so the response passes both the resolver's and the relay's anti-amplification check. A client that does not, or cannot, pad far enough receives the classical certificate with the TC flag set and retries over TCP.</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="RFC8439" target="https://www.rfc-editor.org/info/rfc8439" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8439.xml">
        <front>
          <title>ChaCha20 and Poly1305 for IETF Protocols</title>
          <author fullname="Y. Nir" initials="Y." surname="Nir"/>
          <author fullname="A. Langley" initials="A." surname="Langley"/>
          <date month="June" year="2018"/>
          <abstract>
            <t>This document defines the ChaCha20 stream cipher as well as the use of the Poly1305 authenticator, both as stand-alone algorithms and as a "combined mode", or Authenticated Encryption with Associated Data (AEAD) algorithm.</t>
            <t>RFC 7539, the predecessor of this document, was meant to serve as a stable reference and an implementation guide. It was a product of the Crypto Forum Research Group (CFRG). This document merges the errata filed against RFC 7539 and adds a little text to the Security Considerations section.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8439"/>
        <seriesInfo name="DOI" value="10.17487/RFC8439"/>
      </reference>
      <reference anchor="RFC7766" target="https://www.rfc-editor.org/info/rfc7766" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7766.xml">
        <front>
          <title>DNS Transport over TCP - Implementation Requirements</title>
          <author fullname="J. Dickinson" initials="J." surname="Dickinson"/>
          <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
          <author fullname="R. Bellis" initials="R." surname="Bellis"/>
          <author fullname="A. Mankin" initials="A." surname="Mankin"/>
          <author fullname="D. Wessels" initials="D." surname="Wessels"/>
          <date month="March" year="2016"/>
          <abstract>
            <t>This document specifies the requirement for support of TCP as a transport protocol for DNS implementations and provides guidelines towards DNS-over-TCP performance on par with that of DNS-over-UDP. This document obsoletes RFC 5966 and therefore updates RFC 1035 and RFC 1123.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7766"/>
        <seriesInfo name="DOI" value="10.17487/RFC7766"/>
      </reference>
      <reference anchor="RFC5358" target="https://www.rfc-editor.org/info/rfc5358" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5358.xml">
        <front>
          <title>Preventing Use of Recursive Nameservers in Reflector Attacks</title>
          <author fullname="J. Damas" initials="J." surname="Damas"/>
          <author fullname="F. Neves" initials="F." surname="Neves"/>
          <date month="October" year="2008"/>
          <abstract>
            <t>This document describes ways to prevent the use of default configured recursive nameservers as reflectors in Denial of Service (DoS) attacks. It provides recommended configuration as measures to mitigate the attack. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="140"/>
        <seriesInfo name="RFC" value="5358"/>
        <seriesInfo name="DOI" value="10.17487/RFC5358"/>
      </reference>
      <reference anchor="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="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:
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
sfejQTTt2NWR0J+io5pqFyTUEsWG8baKZpAXCbsWSLmHv6VKh7IjCfYiwxKX
BXHyRdoN76vmZBzAhYt8NiawMF1zKM6wU4NiKLkyokvgfrjYP4fi7Pe2OY5T
BIebCTpdXzrRnzsuoUXmGO+mOREzKBZ0y0/gLVDDN147723qN6MGH/UrpHCV
GIxDg872AIYst5h8cWmSTM5fYF0b1OsLbk9H+6Uwac7BcBZ2K0YhafI9kvbc
reItbukeEG/2e+w5TWIE3iWynjtjCozYsKolJlXBbp08ehQa35uKN4xonBQJ
ZJbkZMuhHEzZL8g4HZmRxup0ClGGARctq6+9Voluqgr2DRw6VMNYG5yEPd43
XuiKi/xpgpEnlg+ttUP+rjsIj0vFUAib2+NJJCnW4GQA+gI/6C2YFoDYhftq
Ryk0jpJKJhu419x1UMu47iSwSE6WuhRScH5HZ79Ps7hKHAEHGNwW1UoiL41L
odT+67cjYhXJ27MW+SIvvumNZKLqtXOIf9MZXbmMj1R4ob6KYihpK6LVFlZf
iUyDk1ia0Nb2fUu+r6gPBi/bjeEr04MmPx3SRLmE9wr0ZMm6Io3YDUMwrjoK
9RYVkszxZDpVRltnwAUee1YXO2PbD2ORlIlJ27LG87kGOcmg1LI9KvRb84a1
l1GZ0xdPXj7pMCTPIUpbBXWQnuTaxtw7zvo4uRPyF/WHkfhF0SEaPNlcolp7
dS1lyVrfr4G7ywO2shU7V+nWrL0aVn79UKdIKKuUN4DaiQ3vV++s8cz6BlLb
Lh7wgGdZTiern3+WHPN6S/Vg8dQQzZ5hJI/0ecdy7R9+SMbjH9fM+ZpjCjiS
UAzK+sOayzKT1nAg7PgQrBOxy3O/PqnCS6eC8js/xG+b0dOPGp5H56Ht5+ka
E0zXX3/75Nkk/vPXz8925zCoJqYnlMhDmCI8Wsq72IY/ElvP8693tLo3b799
/VyGGwYfzqlUvfECnxoSV15tZdfesDQuAv0PemaDwdr8Tk4J08uSRQPnHBO3
7SFwNYAR5RhgSicIjhjS/ibZNDDQMNC2SjkovNo71+CMPKUF9Jz5y+OW5zqY
SiY2ZZgrRdmam9LB4B0V8DdSC31WcR2XIIqXBCJ6dTAQzUROhCJJK3qpwGak
zZWsyKxC2iXaztS5WAjcoigvnr/9kpKhN7S/tQNNP2Ii0VyGRtwy5Er/M8cM
fmZu0dl1c/nZf4Q/f/LJfDpkC91n1faH6XgczX886dugZozF/jOLf/BOOB5P
fzwnDvzZu/OBTAis/4fwR5jRPuus5IcA3vpRXg1GQfhhHi3CxXI+c16P7nh9
2np9MonD+XReOK/Hd7y+bL2+WM3jOJ/EzuuT069HcXvxKcw+W0yd16fwOoKx
f4SpvwAPni5onAFndw44i+8YcNo74PzuAed3DLjsHXBx54Dz8PSALkAHA7K3
IxmHD5ZU9TxwSBTOVAWfOJsaBnYNFQ4gSdDwt2k/8RZLUvwr17ZDiQBvoCEJ
wReUH/Cl3Ei6N1QQdyQFcQfvLnAVYRhGYRxOwmk4C+fhIlyGqzAJ0zAL87AI
yyiMoiiOJtE0mkWA0NEyWkVJlEZZlEdFVA4G1fbiAeMMBrB0eHAWFZOynM6S
5Wo2X8yyaTqZpNN5Np+W02SVZEUUhflkmpfzJM6KJJ0u55NFDOprmk+Kspyb
3buRTdT+sN6h48f0AzDlp6RDCWkseAxIdkwV6GZoBgreY7GjfXVZbclqmhfC
HWBA6sqZBFwVSXx6nIt6oHB5TIoA+vz26zdDj1GLcTrnoNwU3fUHon3rl3/+
5sVLScqD35/8aU3O7ChGJnwwFrJtI7KQWn1NsJnQLViGX1rYbMffjZElNKSC
FgDkgCaH/y7X4+CPBQeVMQxhxcp7YKy1C/C1EPz2aigdw3sQOaMkD3g2SUvt
yf6NkXJszhdPpSh8GRVt4FC41sAEOjsKIcWffKzw/lSmZFiz+pBdnmSg12ZB
Isbb+6W8Dl0+G2l0yIjAhaRzDECuGm7F8IqSBVr+YQ69Mk1/RCb0UwURJxw2
T93nKUJYhC4qEBmPg+81kYc+Ekui1jpx0VZOv32YbdgZidQBonZqosY0rGmw
dQSPimRvG/l3eQRpA/4SDxpap1Iq7ioidK4S8TdPnjoC9lkxvgRoydznsLCT
IYxJnjct8wnLP0ZsdZRM60nh7f/J37+kg7PgJuvDNuFOifEieJk83QRrlpfS
+oMgII1b/5k+cIW+ZkgZLwk1Iz85L94hwBPWrY0SIOorinJbK+ZyYxvBEgxf
p4OwhgkthF017e16LzCmuhl4GqWJeQQvaxtVaV/hXDPSTSW0SxU2d81if6e0
pVs8cb7ETmtODTt1SeRQ+qK6W5CeMRhYQTMrdbGZtXunxQLfo57VioOXanKB
soQHB/sdSjQ9QpmEYHHm6eTrT68psM6IyH4xAPocnzAv2Iw3fkcX8rnoRq1T
d1a60+YIEjv2zgn98+jA0FOofKCEpD59uoOT4JD5C28RKE9M4h+lIn8vshEe
oivqVkuJUR0czG26rg4HhB/OkB14bNhY8KdvX/uzTGKcJvidZGmdwVPnOqmb
qYsDwR2lkXQNZ3bxwwCnOZcXtUIwvEBv9tOCM4AbvAcT0vJw9OCnn2gg0Nme
/+VY3SQcQDPsnAXi9HFr8z2lWtT6U4wNnMQ80DXFG0qCv3yxlgLML7//2hTg
O31Ejx1EhZfgcqBGZuHNVx25rHOObmdVJeVrB7xrZwA+HSbkDzBytL8+YeI4
YcwQc6FmSHr2j/vz5k91M7GLGP/tl4+CYtH2Xu3E0Ge9LtzyTrReDFX4bdNW
f/Fwo7n04jNHKy/+lpDWcOMzBsMZzgnoBwODwqgjKAbbztk4SAvsZ7t3gDXw
/9eEuaewG2cW/PbsWfGF9bI7uoAaxhJ9ztSEJV27OFA6A5MeKkLmtcmw7ndO
wey2dLYn3LGUdUuhtioCm9IVpzq9xAAIQS8X+YZ3oxTyFb4tWibbKxSkTsRG
ZDXf2rurtluqRyhqA8NBYo0MlKQov/ZSaST1CySx8ojl3sg/ZXu8B1xfFcjG
3rRoNGmOaFnGRlLM/zlMl9uWoMd9Lx4mst8iRSmxEAaHsUoTIz2Kp3CgQNHJ
cw/vu+XftaR/o8RdN0aNAtn2Sw7uQubFg2eDl7j1COKmfAJmg96unZwTX0AW
7yGD8gUajaRZsL1gWn1Nyzzvk/e2SI8UN88SwDly4pG1zvQD9+Z6rI9nG64e
gv2tVRPZSDxNpwC5CFV8bAlHLOj0prh6QbLCT7yDk4GwPwVfc474T9gCD9Ch
9yEYZnTXT6DfB3c8SMOYvbhF4NnlCCD6CRGLl7XGSxQFYRyMx+MgKtfeaoyL
RKFtHZb0th0GZP04CmIeZtIaRnyovYP4w0zDYBoFUx5m1hqmk/PQAvFSf1mn
UZDC1ZkEKSiSsyAFhWkRpMu1DOMRks5JxWYYhE3cecKs5kR1pHXfMOHpYTTc
vecBeHvqD0P/i/xneRhTW6lnIHeY+VKHaa3JDEMB9/etBoeJglkULHuGYT9P
J1raDBOZA0/CIAEZnQ88SdfeMCYqx8nmsGO5w2RhkEVBxsNkrWFaZf07mwr1
l+J6d+hvkPwTVT3pdGgwdXF8hyKXKefoXlG8vXJETlyBlm1HdrpPgVhdW3cC
C39Lq+w7meVj/8Q5OcKcXbMjCwX7rZfzKZw21/ZrgrOEJHpslWfqKnEtxnNl
Lh+44DkzDHXmGqERq18pCD6DGzsNpkUwmwTTybrDpD/TO9Sp7O+MsIiDyTyY
w/+KYDEPZotgngSTpRqMNKwGA2hEhJMi6IJmWm5eKo5Tzfr379+P5cUxyDCa
9QS8SXyQZ5MJwxUksCoHOSKKJ9Nh8Bqjjw/D4Mm/BK0hghcv0QiLj4VRGJLx
0v2ZLOgnXMxni+U8mueLcJ7NZ+FkPpmX81zfgCHCiNZhkPtsujJLeRKsJuNo
OR3H0XyMC3r79muAThjq3MtoqXNHf9PcWRhm3gAF/Wc6y9NlvoxjYy19xVLw
V4W073zDcin8zbBUFjMqmMWMdu/gNJXfOM3CVD50WRBuJ5wkUbhIy3KSwRrS
IoJl53m0LBbTNAtXq/mimObzSbhKk1mYz8ooz7PlfD6NYIZJlC4HTukwmFm4
C/rURrsaawZjORLV+J30Z+U+uIbJbBkuYphlPlsuwzxKiiKZxKskL1dowl5O
lrMI9hcl8bKYpItZsZrP8jCPszyaz+PZdGACfe9dgWaWevMvVsl8EmGSdZSW
q2y1LKM4nMDwRZLnYbFIwsVqAp9mcK7pcplly+m8yJarpFzOklmUDAYfGPiS
dcTT6lLOZHWoMDjAOu91bJmXzJP4mtnfOR3ZNJuE0zKNsmQJp1YAQOJwPplO
40lUTiaL1aIIF/lqFa/ydL6AM5ymi2xepkUa5RmMPnCqUnxmLaNn/HfPVih3
4DNPtaKFTCazfBKXcHKzAg5ikqVpHs7S+WwCQJwtZmVRRPMsnU1D+HU5WSXp
NM3jVVTmZTSJ57FNR6IgkrVdl8kWOx6sIU/Ojm0up6C6DpxGggbf5J0TQF13
ar/LqmwUI/dFW/86fXlseqTHEpnxaWuvdr9LIZ7G842C7tksdo/jl16jIEij
NE4ncExwiukiXQppi+byG/w3mgHxG1jQGGozfgOfnXXkdyQ0w8Bd9nlwpnWJ
eN3JbBEWSbQopzhlHAEGL8o0nc5my2mYlvksTFLAs1mZlnGSpFm0mCTzZLpK
F/BPlsAQQIvmcTLPZqDGTZEAZ+Usgg2Wq9VkGScToMZlkeWr+TRdTfMom85n
8GI2na3mEfDlzGIiaYVe6C3GM1kxIvHaegy5I5js5gJVkG/LEmOCfwq+JP2w
X5D5OEXkLkXjI9QRI2G15Ad/ZVa4dIWKzsrsY6cF+QdL8XM72Elx/sGyvFVA
PjVY2lVT5lN9apKgtIMiK+g9Ybb2BlsY4bbVn8YbzKpOkxmI4jTYPA5mU3+w
KJzqYCd1qAcrUBHL3XfqLg9WXKJoroOd1GAerL5gCzw7WL8e80AlxhTQVZvQ
mblsRDqm02kxm0wnQJpiksE+kpTAEG1q8rGkBFfRoiYfS4hhiDYtfjAhNm51
Zo5cAPTs+2evpHe4KWqojjLTkEQLyBErevHm29+/eP40WCyj+WhK7stP4QZK
ZjJXmPzM1m3jJgXr8AMemZihbNFSIyWwLqMeEZtXq2uJxI4jnJ2/a5U/tYOJ
xOsWG7e7OzNrO//VNIRl+Et+BhRc8X+G+CcagpHGwcMzj5okYQJ3Mpkk02QG
JGGRLJNVAlTi5Hit6hpwQ9CNfRbNz9H/5PixETtB7IkXrrwW50kxixdZPJ8s
5/ksy6fFPIpmMUjtqIFFcVnOk6RczKfTMoviOAEFJATCANQljUBHQYiUKbw+
WyxAKlrMVvAyKC2TKMtDeHiWzcrpLC6X8xlorLPpfLWIJ0Aql9EqLfJZAnQa
b8osC6dEy+aTIovKxaqYLpN4spovi+lkURbpMk2XizjMSlhfmITT1WoxnUer
MFumkwJJ6HKSFGmYL2fLvIS7tZrGsE64XCUqitNZGKcFkDYgiGUIVA1E/wLI
5Xw5A0oI1HKZwxDzZQq0MIN1wrgpaGHzfB7G5QRGzIAM5vNpDMQPlJ2kBL00
zmKgAavpcpICXQa4FTAE3ORJAhosfD2LgUgsQY/OYWMAlGISgiKUAmxWRbKY
JWExKUCxBWYxL1ZpBKpImsYo/sazdFquphPQpCIgzEkcT2CT07Scwl6WeRIt
43Q5y7MsjRbAJWDGNAWWkIfTfLFIUYLOZosiW4UAvvlkNVuB4jhfLIANpJNk
MU2KKSjSYRnNJ4tpDpvK0nyeTxc5UPMFzB1GNESxyvOknJdRksDCQeFcFmUG
zAuU81ke5UzzmdK72QxnEweb75NEfxUR9G+TPTuiz4NlnmVnFEcWc8WwxSpI
5mzNnAVRsvZ2NA3bozim0a5ZtG0TlVFmVjJsF9khYXWh4lmcB0lBo+Swltxd
C50kaRxS9bNzjF2V7GONFYhQLXvFKTp3iiDh5XogTTpFkHCIB9KkUwQJhngo
TTpFkGCIh9KkUwQJyd0DadIpgkRE92E06RRBQrx4IE06RZBwiAfSpFMECQ/V
o0lYsJVKdtry8/eJol4579PSqC1kfLdEeVKS9MxBGgjqyJN2HVak9KwU/xC7
790S58As8qNFmCzMIkBRQGi4gvNskS0zVFnSQU+a/mkpZj4FIWYZOvOVMVkY
Ycx8AoSjXOZ4J8IYEAZwDS7dapIXy0kWxnDbC0CkdLrMV2UewvXMkuUCtado
vphG07hM82URxRk2DEijKCongLExUJtFBLRrGU+SeDWJElj/ch7mST4FajAr
8jkSuCyOsyyaFEuYOC5mUY6QLpI5KGj5ZCXYaXDSY5pRFD+YaT6Ub34MD30o
G72LpXYcOm2uesq701mpw2Fb/kL9IjaGkyQcj5Exiin2HB2A4zH6/Yyh9ZwG
nfSxSqfw/k9oM5EnyjiYszUmnwSrvDV9D+c0aNs9ziAA5jKHnwLv5jyZLD/6
evz3wvBTtfqDlzWGQxEVNgFD1QfOCGT6Z8meNrnmwJrbTkQNhVi+NaUpPKou
g91nPuCwIK0Svyv2HK5oe1XvbYUSKYCBbQSoWHddmkokEv/p1bsfB086lVsx
m156zGppmPbibBV/Smv2x3zcjaeRQu4UND6L4rGApIeLeFAhDxxlBDSdQv1c
B4ES7w/+UMfGluNAu4vuH2E5DCi+0eeP3IOn0ylDwIsVO03e8ak6t8N2GwKn
FwiOta1PlCrRyiMIkm+1LD+lRdggM+zCmHMs4YZrW1DQlFTfJOdHwR5wiTY/
3dfEBltao5a/VwkPwBIMnNzeLlHCmtQrLhaOBazoIr0sLgEegHBPk0bujhON
tatsC0RK+sWMbnSHpMVVclPVewzJ3mrRlGtbN6BT6q3ejuCJEVEvsldvYIxb
7AD4yCno9giTyB/55Tz+neqwPBpTpsLbbiL+RVBuKltihqPUyl59hTvM99Fm
7rBuoo69hu+4Z62CRJVT3Ox9pi2cCByPgy+SXM/GVKfHDH+EOTajtlWGmTjY
C0RDYokgwYVTVkeqCqqV4x0T5BNnLL8Zo/aRUFCOB5Nx8EeqaNxWUy9sZwYq
Q+dHheS1U6mT4u/aWm7NVT/dA/QkUtsCRxvWa7ttvxKa+PE5pF/qibx1BzIl
DTC+m2rGcCv48WA6tlI5i47XVUNL9mps0ABce57B5e1HhQJp6nAmuTDKcx1H
vzeRBEEmW6/qvVPbzRIkgzy2osYMM5ySd044w4VWXdVoNg6LYMe7qAJAZUeE
ExT6KVhlAyK4bjEGNnLkppIRG/nbgx/zsVfQSBvNYuBLK47notUiktHGda/8
3nGP2P6gTh9SLfJKcf/ttstSyuwakZWrunnN35wD3VXZO/4AS9Ih47EeIz/R
fnKBdWTc9MQ32nGrHZuM1FlaLhKv4WBYC0knJFbru32NS+W0m8t9sruCc+B4
ehAHsNYO4L7UgOBQF0vIRF5woyjJqzeUxBQdBd/CQq/OJ1gPrSjpElAlZi4E
o7leZbXZMA/AeNXTQbIcQ3ygWkjahIw7vksQMvJg2/sVmyj7I5jyDED9k8t9
UUgnZUm4oerGKZflooMqPjDWNpzhJvHPku7OgVeWE2qIMwPDNHSC1Z2O5W9M
FgBs3o30NlHiTg4H3naqQpF3U7R08lY5CZj8VCvNcfDKPQncy/s9yn/bYP0D
IsJF8JLJyY/rx5qUTzlAChMSS4mKsKgIy0/2GuP3v4otVeLPWT+TTiWS0C8J
mlvp7uZgtARCaxEmrFHWNNLUSyRnm5gv69CI6J3zVmLfcrPQrOggjTE4Wwf7
DqCModFZKl6QSKSF1hhXqd0Ql/SR+m1EyzSK+6fgBcbtn9BBH6ir3hP8/FD1
dNQX4XvGpYzORc/TxIFWaEHPejrFyt19rWcheo5noDXOgsUkWMyCeQ6/w3yP
Xn3H9V8encs47/KSGyF04YPrieAlB2nPT64nKZK8dyA7Tv/FO3fHkYozdGs7
4/S/P2xlmWq0cKvPgzOOpvDe8+ON01X8Set/yEDeONIjxF8PL//7LWqf2kj0
nnFMF4V1ZxyNp717PSdLkv90qgr50CZ9yDg9aRLdlBTWWe7NSHlD9YMdIiLt
iEyq42P90iQaEn/a7bEILPXT2RceP3tA8oNzCA+yYN2bB9ElC3fThwekRDhr
fEBuRNA/oiPjBf0j/mCiZnfvLsxJ/7gOTMC75FtID2AOFvVX6I94MvGif8T+
JZLviQJxcI1OuNEFf66rdJM5eDy/KJazUDfOycvqWHTWeHdChrNGPwzrBP2+
Pzfj5Ii9gV064l25J86I1oyZkD8xmwT5NChmQTkPwkUQkeXz/sQPZ8QHBFIZ
snVHDkjviCejqZwRT6aDnByxN6QqeEBmiDOi9YWmYcCuWcSeNF23Rrw7SaR3
xJPZIh57pGxvrA9/ctf2Fi7DYAlb5hFXPRh+klH6I37MWZ9imf6I1mieh0Ee
BTmvsVicXGOXeZ5ao2BPHMyW7afvYaP37BoIWtZ+Vs6a6srdgz/uWZdhUEZB
ybsu0/au7Yh3IY83YhQGUYR/E1fojOjmq0iuSTeb5ByxZ6Ij/mDyUi4CzUv5
cd07osH2PjjegC7ijKjP/ujt5SdVN1AwCZ6r7ME5Hia2+gVX8ULlAxRzEWMC
I6mopQMtqdzVxQ0nZ5Vcw8mxLaETRr77y8iRirhWEvWzeuTthqXr6ZS+hgeV
hMvXYcRfNK3PCX0m9B3L3O6YgFfOjydx0xsiXZ9+44RsTS87XBMt+/jyNMhC
+zJyUn7UNqGXJ/HRuftoFIf9WRrtn9HnxgQG2toh2dh48o7Ror9ftSlkw6dG
6U+myYoN/R9x3P9n7j5lT+SrdbhjcLakz5i/BWdTfyvwjfIp/E7+Rs1Y/rK4
hBO4L9Nup2L7vD8TYGQyAEYS/g9P/mBeuzC+ix9PR+EHZ6tYpGuG8u9IJGIl
wEhXyCt+Z4JKnQ18FkSTOPwYNy+B6O/g6v0IebklOf9q0fvtFf8tkfx3a+0y
8K8W1d8e+GMj/HuRrT3Rw6P9HySk+wNH8XIpAz8o8v8OqbU98GquoPhFWQCd
gSdhKAP/soyAnoGnduBfkB3QM7DC+GSmsStBKG8j7RJxmn6JhGEQL1gLn/4S
yZHoWuQtZIJ85hy/k4XWvDvHPD56fKzmyK+K21dJtX9WoMXASUQD2ng+OMsO
WLPyetQ0bauTGei5rX3eHgRnL3gkfCU76Ks/ZIcLTBQJlcDixzwPfc2/Oirw
gJItTMu4Vruym8iTDs4ijTxqcxZHIDgj0BJH6ScC/ETYGeNhHK79luV2d3O4
zopb3K6VI+l0j+sKBNJPjoHZU69Umsc5QGlt5KSMcRaFmm/BGHqCLvR1gJN+
c9554rx9re5sh7juGpBXG1h4qMLxE2yJ/CxwdQGcCMAYfIIHK1sxYWoD647F
0b1scDolUOPw/Ulo3j+zERQYjeGHB55/RBg+BrDJpuAllfaXoSeA9ERWR/HH
iA+/Tnrfg8SE+4OrH8ZX7oiu/gxU9QNy6ogTu5DvtejK2t0UfN7ida4u17Up
dA0KMsxUGVA3XsELGes9ynUQuMTbeL4pLopNCy+kgVdfI/L77nxgrr29HP2l
iuX2e4TL3n+x458Z9Oof5Bc0JD95t+EOeEN4d7vfZA7vqL3cEkxkdj/siivv
fa8LebsH+RkupsUm4r+NvDsKi2c46aPxJ/Z0xqA5W2r+mGlV/lngGYxaE5nw
W50IvpJ25e4T7WblZkVcmO7Jc60qd5pqLef6GqheU1BxYvwnCmNSbMKuZwYO
hCe9sN8jb5eO1qZz9ZmRgWYCf7+TNfDmyKzY7txU+z9zLEUuaFCfxu+Wcfdt
2OEk7POt4Q+IFJE5BW6OzI2zFJF0gWaG3F03vd+nssMjXrUPxIYkHx3q0Xw6
MGHVJ3mZb5UKPG72MQHU5nSQYhnD0OnoZOI1v34g8q+jkP6aYccPiDZOw/E4
TR8QbXwyyNgxzHnwb01q1zXQzqcgenxnqtzoQblsIw8+Ql7Un4/sQ3yCkcgC
Rh7O3sdP6OdBHYlxCqX5fIHvGrKP2Rg+k48eJEj2bqglUD5AmjSCJDZ50x9H
kIQNXRjDc7mp6/3HCJIaH+ALkia/095ppwOjJ1FO/1vk6nUjL9zrfTL2oiVN
Og3s1/qpZ/ZZxusetsAlE1qj+OEEyN346x6Gt7ajTE1Fgrsz/thP0XVS8Cgz
U3Hh7oy/fpRYE0mRYE1CC8Mw9gW33+kSk7X2isZLsD51NfRzn0+tqX21F2aK
PWu5U/S2eG/62kuMFXFQU4SZq9GcrV2O+5kYeM7/W4ZIUwhyWwaUQPELAq7r
OuCgaN9JsNYgM/u6BvQ1NnIuyQ5HWCJb8jVKHQfznS5rjfFV1wFH8rphuLyB
duk6iqduGWv9UF4XYK0HO7W9s3qH6RUUx6oFworc7vDhq5qMg6f1fn+kAuZO
dBMXi9Dwc5qjSDaE/5fSxti53ZXbXta0rqVIdup+KkGOFDRCHd/ccssP6L5O
gdDPUUngDu7UlMws+KLHA1s1euy7pOEGol1XMgYuNlQd6CvJJjEtLXUGkPP7
grVPrNMrULgvRtgAHO7Duwc3dae4aVF11QBk0YTabfMxOIdoLEWO89D0Rjvz
UWnYMTcMHSv00LHvCshOhWGd2/BnG0G/tx3nZU0fATsK1P7G9ED0mzH66Ojb
Ogj57mtD7aKjtrnsdGG0nRVtD0Svq+KwtxXiRyLzUNmD7VdIXQptk8LxYIFx
/7uCUFCkQ+3lmm6qS5r8/IJ4EKWKdJkk9wdHqAkmCL8y/Xkp8FeC5nX9NkX1
MXugqQuFS0defvuWesWapu82G0KCpQvslxtUB+0QzN5T2C1RNmY0jzHHAXsX
AABYsqM260QGzf4wmJYOaDxYjoPvtxT7ZRJ/Lam56G1tLU9yGWQcmBppUf4J
yo2au9I4jTYxgBd43MYE4/f0Kd4fN4WE8W97W3Bzx2bMXqNTxxbZylI7/aSZ
I7eDnyXlj4MJef1UR9qPK7Rx75f8fu10aZMId3LdNtwVXRbdimvkms+3FKiM
gc2YidEKo5eI7OMOj8mo+k4IpJTlfkx9ZzGVQMpo8zOyFI6orvaqlwDuXxaN
0Ae7g6bYlFwqu/FqY9tWMNhWeDuSiqUH6Uxhg+Ft69ASzgztTnLbO+8xQDg3
Sls7yrN+A09pLqthG8ajo0RhfLqqJ5qpfvWCneRYGSogOYM8KicxDrUIoxKT
3ss0TRZpFK2wUdQknWDph0maLrN5kU6LYjqZL/NFsZytinQex8uBFZmC36Mv
iuIo/DnKeVpOyniyLJbwn2mWT2HMeLmEYcp8gpWzQixhmRbzLInLOJ3CppNy
NplMwkmYTZcD8WEpTJZ5gimzcT7NilkRwzDRZDJLZ9M0npV5lhTJcl7M5vNo
Ekew5HAWx3k6TWZFmEyW+Sx0vT06ZjHPp0m6ysoyW6XTVRFjru0yhK2mMZCD
eBmWy3CeLlewh2k+W82TfLKcpQBurKxYlE5gBLodaJlRlCZpOC3iYhFmq3w1
ncfw3moCG4wBiNkCwArAjcvZapFPsnKZpEm8KvIsSufpilKJkyxbrfI8DIts
Hme4t+liMZ1McsCFsozDIsqmk7jA9l9JvkzyGRxmOV/CMNPFLMwGfvXdX69W
Vqea7j+uaMLJkmAC9n+GWmBty8LZMqS1ZdMIa6nMl1k6jfNJspwsshkuOAuX
abGIpkkJuBcl8+UEs73zJF5GiyXgV4yoOMcE9QSwY7ko80U5m8+iGVyXOMsm
+XQRzZIkmcarcJHFS0D4qMjLMkyzSboCzJlNZskiCgus7jKfwvVNZikW+Vhk
0aIskzkgEgChCGMgI90aNegQ8+/0fJZNpnG0WMxjuNQzBO5qFc2LRQpfxHmY
T6NsuZzNQkDK5SpOJ5jdvszTeQaEJZ5MBi0PjN7DvIywit60mJTLPC8nMHi5
gMszieLldBWlgNiTRbJcTVeTeZEt4gyQvQDMXwG5A+U7/ThXhs5aJukkBdCv
sBBgXGLFFziAbDVb5iEAChAEaCTQsDTPwhLgmuBtTsPVNEqm4RzumecAQQv+
r7IXqoEGDACOGE64mJXzcBG5xQGpKCAVCYxny75N4BAfvw+2zlzYGmwRHGiU
A8bmQPtyuDn5Ml/lSQ7j5HgZywJuKdC5SQGrLAALgE9hdR6sZTBdTGeLKTww
iwrAS6RNq8lyuZrDvCsgp/EimizLJdUJiqMinE7z1TJclfNZEkZAFRHnAYWW
UVqsplk0mcEdwrI/4STPYfuA7GmWJkC75zHg/yyezgu4YXkBqDkBJgOfJXSl
izhcLGIYNAEkBZDgfEU5AWoKYF1O8iKNwiyPJ3DXlrDSfDUJF2UWl9NJCqwX
V7FaFAPP9YAQmoWzaApjKcmJgXgt44fDDXlPL+geDjcsLtcLuofDDc+pF3QP
hxtupBd0BLduqYRh4Flnycjakk3iaAZ3aJrOVjneh1kIEse0yKNynsBns3la
xGkZLVflcroAZM6wRNJ0lc3KFQBiVfRWDJmEU3+WyQSIbwQULJ8VSQ7XIEom
YT4pw9UMZIEyjoHrZ8CWQAgCQrksgU7C6Cm8sVzkxSyj4BHHXm6JShqt5vkS
xCi42ekUJIgIOFMGB7RchADdJSAOSHtwNsvpNFrFSwB3sSxmSQTEejLP+pwN
VlyJSqAMWRoXgDtlGKWrWZyEGZCWbB7OgX7MF8ATkngxn5dZCZIMoBNwjRLO
bgEAM2N3OBUAukXpwwmIbiHyyekqnsxCEAKnMO00zwATFyC7lOkMBC4Q7bIl
iJPxvCxAkAKhBStNxSuZyuMn07h9CNMU7wBIrFMUjIplCFwP2OSsoDPAHqRA
q4pViAWrJhMgo/P5CpYSwq2Z5+lCJ/EOe+hbPkk09acF9IlBjoTTBpEKLtcM
a4WBtJaEcZoDHkQAQaCpcHEBq3KsnTVfLIGEA4qBpDzjkub/P8XeZwiEdAEA

-->

</rfc>
