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

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

<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>Multiple Responses</strong>: A single query may result in multiple responses, and responses can be received without sending new queries. For example, a server might send additional responses for a query that has multiple answers or requires additional processing.</t>
        </li>
        <li>
          <t><strong>Asynchronous Communication</strong>: The protocol does not require strict request-response pairing. A client can send multiple queries before receiving responses, and responses can be processed 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. The same query sent twice for the same (<tt>&lt;client-sk&gt;</tt>, <tt>&lt;resolver-pk&gt;</tt>) tuple <bcp14>MUST</bcp14> use two distinct <tt>&lt;client-nonce&gt;</tt> values. The length of <tt>&lt;client-nonce&gt;</tt> is determined by the chosen encryption algorithm.</t>
        </li>
        <li>
          <t><tt>AE</tt>: the authenticated encryption function.</t>
        </li>
        <li>
          <t><tt>&lt;encrypted-query&gt;</tt>: <tt>AE(&lt;shared-key&gt; &lt;client-nonce&gt; &lt;client-nonce-pad&gt;, &lt;client-query&gt; &lt;client-query-pad&gt;)</tt></t>
        </li>
        <li>
          <t><tt>&lt;shared-key&gt;</tt>: the shared key derived from <tt>&lt;resolver-pk&gt;</tt> and <tt>&lt;client-sk&gt;</tt>, using the key exchange algorithm defined in the chosen certificate.</t>
        </li>
        <li>
          <t><tt>&lt;client-query&gt;</tt>: the unencrypted client query. The query is not modified; in particular, the query flags are not altered and the query length <bcp14>MUST</bcp14> be kept in queries prepared to be sent over TCP <xref target="RFC7766"/>.</t>
        </li>
        <li>
          <t><tt>&lt;client-nonce-pad&gt;</tt>: <tt>&lt;client-nonce&gt;</tt> length is half the nonce length required by the encryption algorithm. In client queries, the other half, <tt>&lt;client-nonce-pad&gt;</tt> is filled with NUL bytes.</t>
        </li>
        <li>
          <t><tt>&lt;client-query-pad&gt;</tt>: the variable-length padding.</t>
        </li>
      </ul>
      <t>Definitions for server responses:</t>
      <ul spacing="normal">
        <li>
          <t><tt>&lt;dnscrypt-response&gt;</tt>: <tt>&lt;resolver-magic&gt;</tt> <tt>&lt;nonce&gt;</tt> <tt>&lt;encrypted-response&gt;</tt></t>
        </li>
        <li>
          <t><tt>&lt;resolver-magic&gt;</tt>: the <tt>0x72 0x36 0x66 0x6e 0x76 0x57 0x6a 0x38</tt> byte sequence</t>
        </li>
        <li>
          <t><tt>&lt;nonce&gt;</tt>: <tt>&lt;client-nonce&gt;</tt> <tt>&lt;resolver-nonce&gt;</tt></t>
        </li>
        <li>
          <t><tt>&lt;client-nonce&gt;</tt>: the nonce sent by the client in the related query.</t>
        </li>
        <li>
          <t><tt>&lt;client-pk&gt;</tt>: the client's public key.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-sk&gt;</tt>: the resolver's secret key.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-nonce&gt;</tt>: a unique response identifier for a given <tt>(&lt;client-pk&gt;, &lt;resolver-sk&gt;)</tt> tuple. The length of <tt>&lt;resolver-nonce&gt;</tt> depends on the chosen encryption algorithm.</t>
        </li>
        <li>
          <t><tt>DE</tt>: the authenticated decryption function.</t>
        </li>
        <li>
          <t><tt>&lt;encrypted-response&gt;</tt>: <tt>DE(&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 and the response length <bcp14>MUST</bcp14> be kept in responses prepared to be sent over TCP <xref target="RFC7766"/>.</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 client's public key and the client'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 its secret key, the server's public key, the client's nonce included in the response, and the client's original nonce. 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 obtained nonce. In case the response fails verification, 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 length prefix, represented as two big-endian bytes.</t>
          <t>In contrast, cleartext DNS query payloads do not necessitate a length prefix, regardless of whether they are transmitted via TCP.</t>
          <t>Unlike UDP queries, a query sent over TCP can be shorter than the response.</t>
          <t>After having received a response from the resolver, the client and the resolver <bcp14>MUST</bcp14> close the TCP connection to ensure security and comply with this revision of the protocol, which prohibits multiple transactions over the same TCP connection.</t>
          <t>The query processing rules described above depend on the certificate information obtained during session establishment. The certificate format and management procedures are critical to the protocol's security.</t>
        </section>
      </section>
      <section anchor="certificates">
        <name>Certificates</name>
        <t>The following diagram shows the structure of a DNSCrypt certificate:</t>
        <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Cert Magic                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    ES Version    |  Protocol Minor Version    |   Reserved    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                         Signature                             +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                      Resolver Public Key                      +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Client Magic                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Serial                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          TS Start                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          TS End                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                        Extensions                             +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        <t>To initiate a DNSCrypt session, a client transmits an ordinary unencrypted <tt>TXT</tt> DNS query to the resolver's IP address and DNSCrypt port. The attempt is first made using UDP; if unsuccessful due to failure, timeout, or truncation, the client then proceeds with TCP.</t>
        <t>Resolvers are not required to serve certificates both on UDP and TCP.</t>
        <t>The name in the question (<tt>&lt;provider name&gt;</tt>) <bcp14>MUST</bcp14> follow this scheme:</t>
        <t><tt>&lt;protocol-major-version&gt; . dnscrypt-cert . &lt;zone&gt;</tt></t>
        <t>A major protocol version has only one certificate format.</t>
        <t>A DNSCrypt client implementing the second version of the protocol <bcp14>MUST</bcp14> send a query with the <tt>TXT</tt> type and a name of the form:</t>
        <t><tt>2.dnscrypt-cert.example.com</tt></t>
        <t>The zone <bcp14>MUST</bcp14> be a valid DNS name, but <bcp14>MAY</bcp14> not be registered in the DNS hierarchy.</t>
        <t>A single provider name can be shared by multiple resolvers operated by the same entity, and a resolver can respond to multiple provider
names, especially to support multiple protocol versions simultaneously.</t>
        <t>In order to use a DNSCrypt-enabled resolver, a client must know the following information:</t>
        <ul spacing="normal">
          <li>
            <t>The resolver IP address and port</t>
          </li>
          <li>
            <t>The provider name</t>
          </li>
          <li>
            <t>The provider public key</t>
          </li>
        </ul>
        <t>The provider public key is a long-term key whose sole purpose is to verify the certificates. It is never used to encrypt or verify DNS queries. A single provider public key can be employed to sign multiple certificates.</t>
        <t>For example, an organization operating multiple resolvers can use a unique provider name and provider public key across all resolvers,
and just provide a list of IP addresses and ports. Each resolver <bcp14>MAY</bcp14> have its unique set of certificates that can be signed with the
same key.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> that certificates are signed using specialized hardware rather than directly on the resolvers themselves. Once signed, resolvers <bcp14>SHOULD</bcp14> make these certificates available to clients. Signing certificates on dedicated hardware helps ensure security and integrity, as it isolates the process from potential vulnerabilities present in the resolver's system.</t>
        <t>A successful response to a certificate request contains one or more <tt>TXT</tt> records, each record containing a certificate encoded as follows:</t>
        <ul spacing="normal">
          <li>
            <t><tt>&lt;cert&gt;</tt>: <tt>&lt;cert-magic&gt; &lt;es-version&gt; &lt;protocol-minor-version&gt; &lt;signature&gt; &lt;resolver-pk&gt; &lt;client-magic&gt; &lt;serial&gt; &lt;ts-start&gt; &lt;ts-end&gt; &lt;extensions&gt;</tt></t>
          </li>
          <li>
            <t><tt>&lt;cert-magic&gt;</tt>: <tt>0x44 0x4e 0x53 0x43</tt></t>
          </li>
          <li>
            <t><tt>&lt;es-version&gt;</tt>: the cryptographic construction to use with this certificate. For Box-XChaChaPoly, <tt>&lt;es-version&gt;</tt> <bcp14>MUST</bcp14> be <tt>0x00 0x02</tt>.</t>
          </li>
          <li>
            <t><tt>&lt;protocol-minor-version&gt;</tt>: <tt>0x00 0x00</tt></t>
          </li>
          <li>
            <t><tt>&lt;signature&gt;</tt>: a 64-byte signature of <tt>(&lt;resolver-pk&gt; &lt;client-magic&gt; &lt;serial&gt; &lt;ts-start&gt; &lt;ts-end&gt; &lt;extensions&gt;)</tt> using the Ed25519 algorithm and the provider secret key. Ed25519 <bcp14>MUST</bcp14> be used in this version of the protocol.</t>
          </li>
          <li>
            <t><tt>&lt;resolver-pk&gt;</tt>: the resolver short-term public key, which is 32 bytes when using X25519.</t>
          </li>
          <li>
            <t><tt>&lt;client-magic&gt;</tt>: The first 8 bytes of a client query that was built using the information from this certificate. It <bcp14>MAY</bcp14> be a truncated public key. Two valid certificates cannot share the same <tt>&lt;client-magic&gt;</tt>. <tt>&lt;client-magic&gt;</tt> <bcp14>MUST NOT</bcp14> start with <tt>0x00 0x00 0x00 0x00 0x00 0x00 0x00</tt> (seven all-zero bytes) in order to avoid confusion with the QUIC protocol <xref target="RFC9000"/>.</t>
          </li>
          <li>
            <t><tt>&lt;serial&gt;</tt>: a 4-byte serial number in big-endian format. If more than one certificate is valid, the client <bcp14>MUST</bcp14> prefer the certificate with a higher serial number.</t>
          </li>
          <li>
            <t><tt>&lt;ts-start&gt;</tt>: the date the certificate is valid from, as a big-endian 4-byte unsigned Unix timestamp.</t>
          </li>
          <li>
            <t><tt>&lt;ts-end&gt;</tt>: the date the certificate is valid until (inclusive), as a big-endian 4-byte unsigned Unix timestamp.</t>
          </li>
          <li>
            <t><tt>&lt;extensions&gt;</tt>: empty in the current protocol version, but may contain additional data in future revisions, including minor versions. The computation and verification of the signature <bcp14>MUST</bcp14> include the extensions. An implementation not supporting these extensions <bcp14>MUST</bcp14> ignore them.</t>
          </li>
        </ul>
        <t>Certificates made of this information, without extensions, are 116 bytes long. With the addition of <tt>&lt;cert-magic&gt;</tt>, <tt>&lt;es-version&gt;</tt>, and <tt>&lt;protocol-minor-version&gt;</tt>, the record is 124 bytes long.</t>
        <t>After receiving a set of certificates, the client checks their validity based on the current date, filters out the ones designed for encryption systems that are not supported by the client, and chooses the certificate with the higher serial number.</t>
        <t>DNSCrypt queries sent by the client <bcp14>MUST</bcp14> use the <tt>&lt;client-magic&gt;</tt> header of the chosen certificate, as well as the specified encryption system and public key.</t>
        <t>The client <bcp14>MUST</bcp14> check for new certificates every hour and switch to a new certificate if:</t>
        <ul spacing="normal">
          <li>
            <t>The current certificate is not present or not valid anymore,</t>
          </li>
        </ul>
        <t>or</t>
        <ul spacing="normal">
          <li>
            <t>A certificate with a higher serial number than the current one is available.</t>
          </li>
        </ul>
        <t>The certificate management system ensures that cryptographic keys remain fresh and that clients can smoothly transition to updated certificates. With the core protocol mechanics now established, we can examine implementation considerations.</t>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>Note: This section is to be removed before publishing as an RFC.</em></t>
      <t>Multiple implementations of the protocol described in this document have been developed and verified for interoperability. A comprehensive list of known implementations can be found at <eref target="https://dnscrypt.info/implementations"/>.</t>
      <t>The successful deployment of multiple interoperable implementations demonstrates the protocol's maturity. However, proper implementation requires careful attention to security considerations.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This section discusses security considerations for the DNSCrypt protocol.</t>
      <section anchor="protocol-security">
        <name>Protocol Security</name>
        <t>The DNSCrypt protocol provides several security benefits:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Confidentiality</strong>: DNS queries and responses are encrypted using XChaCha20-Poly1305 <xref target="RFC8439"/>, preventing eavesdropping of DNS traffic. For example, a query for "example.com" would be encrypted and appear as random data to an observer.</t>
          </li>
          <li>
            <t><strong>Integrity</strong>: Message authentication using Poly1305 <xref target="RFC8439"/> ensures that responses cannot be tampered with in transit. Any modification to the encrypted response would be detected and rejected by the client.</t>
          </li>
          <li>
            <t><strong>Authentication</strong>: The use of X25519 <xref target="RFC7748"/> for key exchange and Ed25519 for certificate signatures provides strong authentication of resolvers. Clients can verify they are communicating with the intended resolver and not an impostor.</t>
          </li>
          <li>
            <t><strong>Forward Secrecy</strong>: Short-term key pairs are used for each session, providing forward secrecy. Even if a long-term key is compromised, past communications remain secure.</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 least every 24 hours</t>
              </li>
              <li>
                <t>Previous secret keys <bcp14>MUST</bcp14> be securely erased 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> include timestamps in their nonces to prevent replay attacks</t>
              </li>
              <li>
                <t>Resolvers <bcp14>SHOULD</bcp14> verify that nonces are within a reasonable time window (e.g., ±5 minutes)</t>
              </li>
              <li>
                <t>Example: A nonce might be constructed as: <tt>timestamp || random_bytes</tt></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 handles fragmentation in a way that prevents certain types of attacks. Large responses are properly fragmented and reassembled.</t>
          </li>
          <li>
            <t><strong>Replay Attacks</strong>: The use of nonces and timestamps helps prevent replay attacks. A replayed query would be detected due to nonce reuse.</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>Certificate Requests</strong>: Initial certificate requests are unencrypted and may reveal client capabilities. 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>Check that the response is smaller than the 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="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 paramters:</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], blocks_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>.</t>
        <t>The Poly1305 key is computed as in <xref target="RFC8439"/>, by encrypting an empty block.</t>
        <t>Finally, the output of the Poly1305 function is prepended to the ciphertext:</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;ct&gt;</tt>: <tt>XChaCha20_DJB(&lt;k&gt;, &lt;m&gt;)</tt></t>
          </li>
          <li>
            <t><tt>XChaCha20_DJB-Poly1305(&lt;k&gt;, &lt;m&gt;)</tt>: <tt>Poly1305(&lt;ct&gt;) || &lt;ct&gt;</tt></t>
          </li>
        </ul>
      </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>: recipent's public key</t>
          </li>
          <li>
            <t><tt>&lt;sk&gt;</tt>: sender's secret key</t>
          </li>
          <li>
            <t><tt>&lt;sk'&gt;</tt>: <tt>HChaCha20(X25519(&lt;pk&gt;, &lt;sk&gt;))</tt></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>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC1035" target="https://www.rfc-editor.org/info/rfc1035" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml">
        <front>
          <title>Domain names - implementation and specification</title>
          <author fullname="P. Mockapetris" initials="P." surname="Mockapetris"/>
          <date month="November" year="1987"/>
          <abstract>
            <t>This RFC is the revised specification of the protocol and format used in the implementation of the Domain Name System. It obsoletes RFC-883. This memo documents the details of the domain name client - server communication.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="13"/>
        <seriesInfo name="RFC" value="1035"/>
        <seriesInfo name="DOI" value="10.17487/RFC1035"/>
      </reference>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC7766" target="https://www.rfc-editor.org/info/rfc7766" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7766.xml">
        <front>
          <title>DNS Transport over TCP - Implementation Requirements</title>
          <author fullname="J. Dickinson" initials="J." surname="Dickinson"/>
          <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
          <author fullname="R. Bellis" initials="R." surname="Bellis"/>
          <author fullname="A. Mankin" initials="A." surname="Mankin"/>
          <author fullname="D. Wessels" initials="D." surname="Wessels"/>
          <date month="March" year="2016"/>
          <abstract>
            <t>This document specifies the requirement for support of TCP as a transport protocol for DNS implementations and provides guidelines towards DNS-over-TCP performance on par with that of DNS-over-UDP. This document obsoletes RFC 5966 and therefore updates RFC 1035 and RFC 1123.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7766"/>
        <seriesInfo name="DOI" value="10.17487/RFC7766"/>
      </reference>
      <reference anchor="RFC5358" target="https://www.rfc-editor.org/info/rfc5358" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5358.xml">
        <front>
          <title>Preventing Use of Recursive Nameservers in Reflector Attacks</title>
          <author fullname="J. Damas" initials="J." surname="Damas"/>
          <author fullname="F. Neves" initials="F." surname="Neves"/>
          <date month="October" year="2008"/>
          <abstract>
            <t>This document describes ways to prevent the use of default configured recursive nameservers as reflectors in Denial of Service (DoS) attacks. It provides recommended configuration as measures to mitigate the attack. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="140"/>
        <seriesInfo name="RFC" value="5358"/>
        <seriesInfo name="DOI" value="10.17487/RFC5358"/>
      </reference>
      <reference anchor="RFC9000" target="https://www.rfc-editor.org/info/rfc9000" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
        <front>
          <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
          <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
          <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
          <date month="May" year="2021"/>
          <abstract>
            <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9000"/>
        <seriesInfo name="DOI" value="10.17487/RFC9000"/>
      </reference>
      <reference anchor="RFC8439" target="https://www.rfc-editor.org/info/rfc8439" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8439.xml">
        <front>
          <title>ChaCha20 and Poly1305 for IETF Protocols</title>
          <author fullname="Y. Nir" initials="Y." surname="Nir"/>
          <author fullname="A. Langley" initials="A." surname="Langley"/>
          <date month="June" year="2018"/>
          <abstract>
            <t>This document defines the ChaCha20 stream cipher as well as the use of the Poly1305 authenticator, both as stand-alone algorithms and as a "combined mode", or Authenticated Encryption with Associated Data (AEAD) algorithm.</t>
            <t>RFC 7539, the predecessor of this document, was meant to serve as a stable reference and an implementation guide. It was a product of the Crypto Forum Research Group (CFRG). This document merges the errata filed against RFC 7539 and adds a little text to the Security Considerations section.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8439"/>
        <seriesInfo name="DOI" value="10.17487/RFC8439"/>
      </reference>
      <reference anchor="RFC7748" target="https://www.rfc-editor.org/info/rfc7748" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7748.xml">
        <front>
          <title>Elliptic Curves for Security</title>
          <author fullname="A. Langley" initials="A." surname="Langley"/>
          <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
          <author fullname="S. Turner" initials="S." surname="Turner"/>
          <date month="January" year="2016"/>
          <abstract>
            <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7748"/>
        <seriesInfo name="DOI" value="10.17487/RFC7748"/>
      </reference>
      <reference anchor="RFC4291" target="https://www.rfc-editor.org/info/rfc4291" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4291.xml">
        <front>
          <title>IP Version 6 Addressing Architecture</title>
          <author fullname="R. Hinden" initials="R." surname="Hinden"/>
          <author fullname="S. Deering" initials="S." surname="Deering"/>
          <date month="February" year="2006"/>
          <abstract>
            <t>This specification defines the addressing architecture of the IP Version 6 (IPv6) protocol. The document includes the IPv6 addressing model, text representations of IPv6 addresses, definition of IPv6 unicast addresses, anycast addresses, and multicast addresses, and an IPv6 node's required addresses.</t>
            <t>This document obsoletes RFC 3513, "IP Version 6 Addressing Architecture". [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4291"/>
        <seriesInfo name="DOI" value="10.17487/RFC4291"/>
      </reference>
      <reference anchor="RFC1918" target="https://www.rfc-editor.org/info/rfc1918" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1918.xml">
        <front>
          <title>Address Allocation for Private Internets</title>
          <author fullname="Y. Rekhter" initials="Y." surname="Rekhter"/>
          <author fullname="B. Moskowitz" initials="B." surname="Moskowitz"/>
          <author fullname="D. Karrenberg" initials="D." surname="Karrenberg"/>
          <author fullname="G. J. de Groot" initials="G. J." surname="de Groot"/>
          <author fullname="E. Lear" initials="E." surname="Lear"/>
          <date month="February" year="1996"/>
          <abstract>
            <t>This document describes address allocation for private internets. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="5"/>
        <seriesInfo name="RFC" value="1918"/>
        <seriesInfo name="DOI" value="10.17487/RFC1918"/>
      </reference>
    </references>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
