<?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.34 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-dprive-dnscrypt-08" category="info" submissionType="independent" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="DNSCrypt">The DNSCrypt Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-dprive-dnscrypt-08"/>
    <author fullname="Frank Denis">
      <organization>Individual Contributor</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2026" month="March" day="29"/>
    <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>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. 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.</t>
        </li>
        <li>
          <t><tt>&lt;client-nonce-pad&gt;</tt>: <tt>&lt;client-nonce&gt;</tt> length is half the nonce length required by the encryption algorithm. In client queries, the other half, <tt>&lt;client-nonce-pad&gt;</tt> is filled with NUL bytes.</t>
        </li>
        <li>
          <t><tt>&lt;client-query-pad&gt;</tt>: the variable-length padding.</t>
        </li>
      </ul>
      <t>Definitions for server responses:</t>
      <ul spacing="normal">
        <li>
          <t><tt>&lt;dnscrypt-response&gt;</tt>: <tt>&lt;resolver-magic&gt;</tt> <tt>&lt;nonce&gt;</tt> <tt>&lt;encrypted-response&gt;</tt></t>
        </li>
        <li>
          <t><tt>&lt;resolver-magic&gt;</tt>: the <tt>0x72 0x36 0x66 0x6e 0x76 0x57 0x6a 0x38</tt> byte sequence</t>
        </li>
        <li>
          <t><tt>&lt;nonce&gt;</tt>: <tt>&lt;client-nonce&gt;</tt> <tt>&lt;resolver-nonce&gt;</tt></t>
        </li>
        <li>
          <t><tt>&lt;client-nonce&gt;</tt>: the nonce sent by the client in the related query.</t>
        </li>
        <li>
          <t><tt>&lt;client-pk&gt;</tt>: the client's public key.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-sk&gt;</tt>: the resolver's secret key.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-nonce&gt;</tt>: a unique response identifier for a given <tt>(&lt;client-pk&gt;, &lt;resolver-sk&gt;)</tt> tuple. The length of <tt>&lt;resolver-nonce&gt;</tt> depends on the chosen encryption algorithm.</t>
        </li>
        <li>
          <t><tt>AE</tt>: the authenticated encryption function.</t>
        </li>
        <li>
          <t><tt>&lt;encrypted-response&gt;</tt>: <tt>AE(&lt;shared-key&gt;, &lt;nonce&gt;, &lt;resolver-response&gt; &lt;resolver-response-pad&gt;)</tt></t>
        </li>
        <li>
          <t><tt>&lt;shared-key&gt;</tt>: the shared key derived from <tt>&lt;resolver-sk&gt;</tt> and <tt>&lt;client-pk&gt;</tt>, using the key exchange algorithm defined in the chosen certificate.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-response&gt;</tt>: the unencrypted resolver response. The response is not modified; in particular, the query flags are not altered.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-response-pad&gt;</tt>: the variable-length padding.</t>
        </li>
      </ul>
      <t>The following diagram shows the structure of a DNSCrypt query packet:</t>
      <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Client Magic                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                      Client Public Key                        +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                        Client Nonce                           +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                       Encrypted Query                         +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      <t>The following diagram shows the structure of a DNSCrypt response packet:</t>
      <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Resolver Magic                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                          Nonce                                +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                      Encrypted Response                       +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      <t>These packet structures form the foundation for the protocol operations described in the next section, which details how clients and servers use these components to establish secure communications.</t>
    </section>
    <section anchor="protocol-description">
      <name>Protocol Description</name>
      <section anchor="overview">
        <name>Overview</name>
        <t>Building on the protocol flow and components described earlier, this section provides a detailed examination of how the DNSCrypt protocol operates. The protocol follows a well-defined sequence of steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>The DNSCrypt client sends a DNS query to a DNSCrypt server to retrieve the server's public keys.</t>
          </li>
          <li>
            <t>The client generates its own key pair.</t>
          </li>
          <li>
            <t>The client encrypts unmodified DNS queries using a server's public key, padding them as necessary, and concatenates them to a nonce and a copy of the client's public key. The resulting output is transmitted to the server via standard DNS transport mechanisms <xref target="RFC1035"/>.</t>
          </li>
          <li>
            <t>Encrypted queries are decrypted by the server using the attached client public key and the server's own secret key. The output is a regular DNS packet that doesn't require any special processing.</t>
          </li>
          <li>
            <t>To send an encrypted response, the server adds padding to the unmodified response, encrypts the result using the shared key and a nonce made of the client's nonce followed by the resolver's nonce, and truncates the response if necessary. The resulting packet, truncated or not, is sent to the client using standard DNS mechanisms.</t>
          </li>
          <li>
            <t>The client authenticates and decrypts the response using the shared key and the nonce included in the response. If the response was truncated, the client <bcp14>MAY</bcp14> adjust internal parameters and retry over TCP <xref target="RFC7766"/>. If not, the output is a regular DNS response that can be directly forwarded to applications and stub resolvers.</t>
          </li>
        </ol>
        <t>Key features of the DNSCrypt protocol include:</t>
        <ul spacing="normal">
          <li>
            <t>Stateless operation: Every query can be processed independently from other queries, with no session identifiers required.</t>
          </li>
          <li>
            <t>Flexible key management: Clients can replace their keys whenever they want, without extra interactions with servers.</t>
          </li>
          <li>
            <t>Proxy support: DNSCrypt packets can securely be proxied without having to be decrypted, allowing client IP addresses to be hidden from resolvers ("Anonymized DNSCrypt").</t>
          </li>
          <li>
            <t>Shared infrastructure: Recursive DNS servers can accept DNSCrypt queries on the same IP address and port used for regular DNS traffic.</t>
          </li>
          <li>
            <t>Attack mitigation: DNSCrypt mitigates two common security vulnerabilities in regular DNS over UDP: amplification <xref target="RFC5358"/> and fragmentation attacks.</t>
          </li>
        </ul>
        <t>These key features enable DNSCrypt to provide robust security while maintaining practical deployability. The protocol's transport characteristics further support these goals.</t>
      </section>
      <section anchor="transport">
        <name>Transport</name>
        <t>The DNSCrypt protocol can use the UDP and TCP transport protocols.
DNSCrypt clients and resolvers <bcp14>SHOULD</bcp14> support the protocol via UDP, and <bcp14>MUST</bcp14> support it over TCP.</t>
        <t>Both TCP and UDP connections using DNSCrypt <bcp14>SHOULD</bcp14> employ port 443 by default.</t>
        <t>The choice of port 443 helps DNSCrypt traffic blend with HTTPS traffic, providing some protection against traffic analysis. Once transport is established, the next step is session establishment through certificate exchange.</t>
      </section>
      <section anchor="session-establishment">
        <name>Session Establishment</name>
        <t>From the client's perspective, a DNSCrypt session is initiated when the client sends an unauthenticated DNS query to a DNSCrypt-capable resolver. This DNS query contains encoded information about the certificate versions supported by the client and a public identifier of the desired provider.</t>
        <t>The resolver sends back a collection of signed certificates that the client <bcp14>MUST</bcp14> verify using the pre-distributed provider public key. Each certificate includes a validity period, a serial number, a version that defines a key exchange mechanism, an authenticated encryption algorithm and its parameters, as well as a short-term public key, known as the resolver public key.</t>
        <t>Resolvers have the ability to support various algorithms and can concurrently advertise multiple short-term public keys (resolver public keys). The client picks the one with the highest serial number among the currently valid ones that match a supported protocol version.</t>
        <t>Every certificate contains a unique magic number that the client <bcp14>MUST</bcp14> include at the beginning of their queries. This allows the resolver to identify which certificate the client selected for crafting a particular query.</t>
        <t>The encryption algorithm, resolver public key, and client magic number from the chosen certificate are then used by the client to send encrypted queries. These queries include the client public key.</t>
        <t>With the knowledge of the chosen certificate and corresponding secret key, along with the client's public key, the resolver is able to verify, decrypt the query, and then encrypt the response utilizing identical parameters.</t>
        <t>Once the session is established through certificate exchange, the ongoing query processing follows specific rules for different transport protocols and padding requirements.</t>
      </section>
      <section anchor="query-processing">
        <name>Query Processing</name>
        <section anchor="padding-for-client-queries-over-udp">
          <name>Padding For Client Queries Over UDP</name>
          <t>Before encryption takes place, queries are padded according to the ISO/IEC 7816-4 standard. Padding begins with a single byte holding the value <tt>0x80</tt>, followed by any number of <tt>NUL</tt> bytes.</t>
          <t><tt>&lt;client-query&gt;</tt> <tt>&lt;client-query-pad&gt;</tt> <bcp14>MUST</bcp14> be at least <tt>&lt;min-query-len&gt;</tt> bytes.
In this context, <tt>&lt;client-query&gt;</tt> represents the original client query, while <tt>&lt;client-query-pad&gt;</tt> denotes the added padding.</t>
          <t>Should the client query's length fall short of  <tt>&lt;min-query-len&gt;</tt> bytes, the padding length <bcp14>MUST</bcp14> be adjusted in order to satisfy the length requirement.</t>
          <t><tt>&lt;min-query-len&gt;</tt> is a variable length, initially set to 256 bytes, and <bcp14>MUST</bcp14> be a multiple of 64 bytes. It represents the minimum permitted length for a client query, inclusive of padding.</t>
        </section>
        <section anchor="client-queries-over-udp">
          <name>Client Queries Over UDP</name>
          <t>UDP-based client queries need to follow the padding guidelines outlined in the previous section.</t>
          <t>Each UDP packet <bcp14>MUST</bcp14> hold one query, with the complete content comprising the <tt>&lt;dnscrypt-query&gt;</tt> structure specified in the Protocol Components section.</t>
          <t>UDP packets employing the DNSCrypt protocol have the capability to be split into distinct IP packets sharing the same source port.</t>
          <t>Upon receiving a query, the resolver may choose to either disregard it or send back a response encrypted using DNSCrypt.</t>
          <t>The client <bcp14>MUST</bcp14> authenticate and, if authentication succeeds, decrypt the response with the help of the resolver's public key, the shared secret, and the 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 two-byte big-endian length prefix for the encrypted DNSCrypt packet.</t>
          <t>Unlike UDP queries, a query sent over TCP can be shorter than the response.</t>
          <t>After having received a response from the resolver, the client and the resolver <bcp14>MUST</bcp14> close the TCP connection to ensure security and comply with this revision of the protocol, which prohibits multiple transactions over the same TCP connection.</t>
          <t>The query processing rules described above depend on the certificate information obtained during session establishment. The certificate format and management procedures are critical to the protocol's security.</t>
        </section>
      </section>
      <section anchor="certificates">
        <name>Certificates</name>
        <t>The following diagram shows the structure of a DNSCrypt certificate:</t>
        <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Cert Magic                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    ES Version    |  Protocol Minor Version    |   Reserved    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                         Signature                             +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                      Resolver Public Key                      +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Client Magic                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Serial                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          TS Start                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          TS End                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                        Extensions                             +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        <t>To initiate a DNSCrypt session, a client transmits an ordinary unencrypted <tt>TXT</tt> DNS query to the resolver's IP address and DNSCrypt port. The attempt is first made using UDP; if unsuccessful due to failure, timeout, or truncation, the client then proceeds with TCP.</t>
        <t>Resolvers are not required to serve certificates both on UDP and TCP.</t>
        <t>The name in the question (<tt>&lt;provider name&gt;</tt>) <bcp14>MUST</bcp14> follow this scheme:</t>
        <t><tt>&lt;protocol-major-version&gt; . dnscrypt-cert . &lt;zone&gt;</tt></t>
        <t>A major protocol version has only one certificate format.</t>
        <t>A DNSCrypt client implementing the second version of the protocol <bcp14>MUST</bcp14> send a query with the <tt>TXT</tt> type and a name of the form:</t>
        <t><tt>2.dnscrypt-cert.example.com</tt></t>
        <t>The zone <bcp14>MUST</bcp14> be a valid DNS name, but <bcp14>MAY</bcp14> not be registered in the DNS hierarchy.</t>
        <t>A single provider name can be shared by multiple resolvers operated by the same entity, and a resolver can respond to multiple provider
names, especially to support multiple protocol versions simultaneously.</t>
        <t>In order to use a DNSCrypt-enabled resolver, a client must know the following information:</t>
        <ul spacing="normal">
          <li>
            <t>The resolver IP address and port</t>
          </li>
          <li>
            <t>The provider name</t>
          </li>
          <li>
            <t>The provider public key</t>
          </li>
        </ul>
        <t>The provider public key is a long-term key whose sole purpose is to verify the certificates. It is never used to encrypt or verify DNS queries. A single provider public key can be employed to sign multiple certificates.</t>
        <t>For example, an organization operating multiple resolvers can use a unique provider name and provider public key across all resolvers,
and just provide a list of IP addresses and ports. Each resolver <bcp14>MAY</bcp14> have its unique set of certificates that can be signed with the
same key.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> that certificates are signed using specialized hardware rather than directly on the resolvers themselves. Once signed, resolvers <bcp14>SHOULD</bcp14> make these certificates available to clients. Signing certificates on dedicated hardware helps ensure security and integrity, as it isolates the process from potential vulnerabilities present in the resolver's system.</t>
        <t>A successful response to a certificate request contains one or more <tt>TXT</tt> records, each record containing a certificate encoded as follows:</t>
        <ul spacing="normal">
          <li>
            <t><tt>&lt;cert&gt;</tt>: <tt>&lt;cert-magic&gt; &lt;es-version&gt; &lt;protocol-minor-version&gt; &lt;signature&gt; &lt;resolver-pk&gt; &lt;client-magic&gt; &lt;serial&gt; &lt;ts-start&gt; &lt;ts-end&gt; &lt;extensions&gt;</tt></t>
          </li>
          <li>
            <t><tt>&lt;cert-magic&gt;</tt>: <tt>0x44 0x4e 0x53 0x43</tt></t>
          </li>
          <li>
            <t><tt>&lt;es-version&gt;</tt>: the cryptographic construction to use with this certificate. For Box-XChaChaPoly, <tt>&lt;es-version&gt;</tt> <bcp14>MUST</bcp14> be <tt>0x00 0x02</tt>.</t>
          </li>
          <li>
            <t><tt>&lt;protocol-minor-version&gt;</tt>: <tt>0x00 0x00</tt></t>
          </li>
          <li>
            <t><tt>&lt;signature&gt;</tt>: a 64-byte signature of <tt>(&lt;resolver-pk&gt; &lt;client-magic&gt; &lt;serial&gt; &lt;ts-start&gt; &lt;ts-end&gt; &lt;extensions&gt;)</tt> using the Ed25519 algorithm and the provider secret key. Ed25519 <bcp14>MUST</bcp14> be used in this version of the protocol.</t>
          </li>
          <li>
            <t><tt>&lt;resolver-pk&gt;</tt>: the resolver short-term public key, which is 32 bytes when using X25519.</t>
          </li>
          <li>
            <t><tt>&lt;client-magic&gt;</tt>: The first 8 bytes of a client query that was built using the information from this certificate. It <bcp14>MAY</bcp14> be a truncated public key. Two valid certificates cannot share the same <tt>&lt;client-magic&gt;</tt>. <tt>&lt;client-magic&gt;</tt> <bcp14>MUST NOT</bcp14> start with <tt>0x00 0x00 0x00 0x00 0x00 0x00 0x00</tt> (seven all-zero bytes) in order to avoid confusion with the QUIC protocol <xref target="RFC9000"/>.</t>
          </li>
          <li>
            <t><tt>&lt;serial&gt;</tt>: a 4-byte serial number in big-endian format. If more than one certificate is valid, the client <bcp14>MUST</bcp14> prefer the certificate with a higher serial number.</t>
          </li>
          <li>
            <t><tt>&lt;ts-start&gt;</tt>: the date the certificate is valid from, as a big-endian 4-byte unsigned Unix timestamp.</t>
          </li>
          <li>
            <t><tt>&lt;ts-end&gt;</tt>: the date the certificate is valid until (inclusive), as a big-endian 4-byte unsigned Unix timestamp.</t>
          </li>
          <li>
            <t><tt>&lt;extensions&gt;</tt>: empty in the current protocol version, but may contain additional data in future revisions, including minor versions. The computation and verification of the signature <bcp14>MUST</bcp14> include the extensions. An implementation not supporting these extensions <bcp14>MUST</bcp14> ignore them.</t>
          </li>
        </ul>
        <t>Certificates made of this information, without extensions, are 116 bytes long. With the addition of <tt>&lt;cert-magic&gt;</tt>, <tt>&lt;es-version&gt;</tt>, and <tt>&lt;protocol-minor-version&gt;</tt>, the record is 124 bytes long.</t>
        <t>After receiving a set of certificates, the client checks their validity based on the current date, filters out the ones designed for encryption systems that are not supported by the client, and chooses the certificate with the higher serial number.</t>
        <t>DNSCrypt queries sent by the client <bcp14>MUST</bcp14> use the <tt>&lt;client-magic&gt;</tt> header of the chosen certificate, as well as the specified encryption system and public key.</t>
        <t>The client <bcp14>MUST</bcp14> check for new certificates every hour and switch to a new certificate if:</t>
        <ul spacing="normal">
          <li>
            <t>The current certificate is not present or not valid anymore,</t>
          </li>
        </ul>
        <t>or</t>
        <ul spacing="normal">
          <li>
            <t>A certificate with a higher serial number than the current one is available.</t>
          </li>
        </ul>
        <t>The certificate management system ensures that cryptographic keys remain fresh and that clients can smoothly transition to updated certificates. With the core protocol mechanics now established, we can examine implementation considerations.</t>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>Note: This section is to be removed before publishing as an RFC.</em></t>
      <t>Multiple implementations of the protocol described in this document have been developed and verified for interoperability. A comprehensive list of known implementations can be found at <eref target="https://dnscrypt.info/implementations"/>.</t>
      <t>The successful deployment of multiple interoperable implementations demonstrates the protocol's maturity. However, proper implementation requires careful attention to security considerations.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This section discusses security considerations for the DNSCrypt protocol.</t>
      <section anchor="protocol-security">
        <name>Protocol Security</name>
        <t>The DNSCrypt protocol provides several security benefits:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Confidentiality</strong>: DNS queries and responses are encrypted using XChaCha20-Poly1305 <xref target="RFC8439"/>, preventing eavesdropping of DNS traffic. For example, a query for "example.com" would be encrypted and appear as random data to an observer.</t>
          </li>
          <li>
            <t><strong>Integrity</strong>: Message authentication using Poly1305 <xref target="RFC8439"/> ensures that responses cannot be tampered with in transit. Any modification to the encrypted response would be detected and rejected by the client.</t>
          </li>
          <li>
            <t><strong>Authentication</strong>: The use of X25519 <xref target="RFC7748"/> for key exchange and Ed25519 for certificate signatures provides strong authentication of resolvers. Clients can verify they are communicating with the intended resolver and not an impostor.</t>
          </li>
          <li>
            <t><strong>Short-Term Resolver Keys</strong>: Resolver certificates carry short-term public keys, limiting the impact of key compromise and enabling regular key rotation.</t>
          </li>
        </ol>
        <t>These fundamental security properties depend on correct implementation practices. Several implementation-specific security aspects require particular attention.</t>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <t>Implementations should consider the following security aspects:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Key Management</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>Resolvers <bcp14>MUST</bcp14> rotate their short-term key pairs at most every 24 hours</t>
              </li>
              <li>
                <t>Previous secret keys <bcp14>MUST</bcp14> be discarded after rotation</t>
              </li>
              <li>
                <t>Provider secret keys used for certificate signing <bcp14>SHOULD</bcp14> be stored in hardware security modules (HSMs)</t>
              </li>
              <li>
                <t>Example: A resolver might generate new key pairs daily at midnight UTC</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Nonce Management</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>Nonces <bcp14>MUST NOT</bcp14> be reused for a given shared secret</t>
              </li>
              <li>
                <t>Clients can include timestamps in their nonces in order to quickly discard stale responses</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 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, and clients can use timestamps in client nonces to quickly discard stale responses.</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 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>.</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>: recipient'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:
H4sIAAAAAAAAA+V96XYbR5LufzxFXfmHSTUAA+Aqtqy5NEWNOa2FLVJt9/Hx
aRRQCaBahSp0ZYEk3FY/yzzLfbIbW25VBYpeW2eGMy2TQFUukZGRsXwR2ev1
OlVaZeokenS9UNHz11dn5WZVRZdlURXTInvUiSeTUt3A9+a7R52kmObxEt5J
ynhW9RKVp7qXrMr0RvWSXE/xqd7guDONKzUvys1JlOazopOuypOoKte6Gg0G
Twajjl5PlqnWaZFXm5XCpxK1UvBPXnXeq81tUSYn0UVeqTJXVe85dta5Ufla
nXSiiF959E1Rvk/zefSfZbFePYLP52m1WE+88X5hh7Syk4qiDMamK3hsUVUr
ffKFfarPDfTTovniF486nXhdLYoSRtCDVqJots4yJsaLMs7fR8+RGPRNUc7j
PP0hrmB+OI0kvUmTdZxFZzDfMp2sq6KkB9UyTrOTaJao/zsYzPow104nL8ol
vHkDU+0g8dxfvV4viie6KuMpPBcsmhlmlOooUTqd5yqJqiJSOU0jivMkwuED
fVNcG3wTFiSezdJpNFHVrVJ5NM1S+F7Tw6XSRXajSt2PrhfYaDFdL+HbSK/U
NJ2lSkfQmusX30nh3XS5yhQ+SJPv4gMwd1ymONIVPBWXSfoDDC5ewVfxdIGj
1Gq6LvEZHNW0WC7XOY4SGoDu7RyhaWgMOp4W+SxFVknjLK02XeAe4LaSfpWx
p9jXVGHjcVXF0/cwq9lMTSvsBQdelOk8zWFJsEs7i9tFmqkIFgXGn+b4LIxm
BSOZpNhTdAsMEqk7aN2MFlaojGFJ1tNqXao+L9IyTZJMdTqfIQuXRQJfwlxk
yQpsPnoNjBNdbXSlltEONLQb/fOf/+fti7PhYO/gwwdcxjiawpSADhkNosiR
+sXM7opa190I2IqWwE6NGSFK0iTKC3x+mq0TJdSG2cxUjG9qpBKSAMhDtKnR
l9fWkBiH8I+1KpEDhNgwNq0Mo8zWsMbEAJnraR6vgGyrAh4LOA85NIYlTcpi
tQKSdqMqXq5USb9i6zdxmRZrbRexWsRVNI1zIklZgAxR0VqrMkIRFE95rEAc
ECDvbfewKtfAB0kCYyW2hZdu1lmuypjWFaYCHQdcnqhZmguPNzZZF/kEOFc2
l27sLp5kK5X8HQFrVxCL/UbsjCuitoqGiYqydL6ArY//dmF9KpXrdJIp7lbT
VsYn7Z5miqoMmCCHL1bIC/fshi58P6PFBGZeodQibgbBssb9EIFsu2/r024r
gKlL9Y91Sg/h6EH4AAMAFyzifM7MC02UNDzaT7rPO21WZFlxS6+pKbeYKNjX
WSC5PjdU6aJ8KmkqtM2ByUDalDepusV50s4C1qSxEYFwvbGZObIVLwScRPMF
NQ+baZHzdFlgmknlSiWwADj3UFb2UV7AAXGDnIBPnkIfz5EPU/qbJwWHY4Sn
o44evXp3df2oy/+NXr+h39+e//ndxdvz5/j71denL1/aXzryxNXXb969fO5+
c2+evXn16vz1c34ZPo2CjzqPXp3+9RGzxqM3l9cXb16fvnwEK17bOXGphLuQ
jctVqSqU9roDVAaBNlEoS6Kvzi7/338P90XojYbDJyD0+I/j4dE+/HEL1OXe
ihwYjv8Eym46cHKouMRW4gxkY7xKQdbAxop1pBfFbR4tFEnix98hZb4/iZ5O
pqvh/jP5ACccfGhoFnxINGt+0niZidjyUUs3lprB5zVKh+M9/Wvwt6G79+HT
/8hAUkW94fF/POsgCxn9LXoB3L9NTQCZg0JFI2eDsIQzAjcxyP/VIgYpBcrG
sB89fnyBvAc8fKWq9Sq6xO8eP4524CzqVelS7aI2FvVIzLDyQHtVYcO4CUAw
ww6CHTZVsLFoDyj3Bn8rojHh7U7bzHsaB2qO4tV6ksGZATsA9sIIh/cmnxf4
zZkvN9wwS1ApY+Y+2XYtA9YK+xZRDs96kvsjQw3fsRK+LnySNJ6X8TJKs2yN
ulslxwqeYBlsDrcoM3gDKP+vf/2r84ee/Pwhavlx33Z+NJ/92Pag+xYePOMJ
b3nwiqf448NbfPAYtzbmWpVngOneMgNFZx4T+M/07vl59uNP6As4yO/jrayf
/8zT+zr7KX3t9aNzyy1/Bu7aNJ751ea1/zv2deD3FVDw16fh4e/Y19HvSMPj
33Fe9z+DgoeEVypiX5PYpyMh2gHVaqWjYW+0GxVT0Li0O5jRNo1OjUSdpSXs
X1KmNCjnrP7ZI4hFaceXwXhAgCUI0/clP9gLKQjV4ElU4ECXI+PIe5T1tWgB
iqxClbLEwefr5QQ66pzOQA0hiRtMq8tCmJslfZcFoMrn8VyxXgN6tZwwgWYa
UmSvd7yLFgEoHd6R0Kr8k3Kk7lhz9Y4lMZ24WbRuQHuyhxe6RkgJRL17Dboh
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
Rhr+t9xtLK+3hNi+Wen/DxbTXMxBowAA

-->

</rfc>
