<?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.27 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-dprive-dnscrypt-06" category="info" submissionType="independent" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="DNSCrypt">The DNSCrypt Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-dprive-dnscrypt-06"/>
    <author fullname="Frank Denis">
      <organization>Individual Contributor</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2025" month="April" day="15"/>
    <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 document defines the DNSCrypt protocol, which encrypts and authenticates DNS queries and responses, improving confidentiality, integrity, and resistance to attacks affecting the original DNS protocol.</t>
      <t>The protocol is designed to be lightweight, extensible, and simple to implement securely on top of an existing DNS client, server or proxy. It provides a standardized approach to securing DNS communications while maintaining compatibility with existing DNS infrastructure.</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>Key characteristics of the ongoing communication phase:</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>
    </section>
    <section anchor="protocol-components">
      <name>Protocol Components</name>
      <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>: a 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>
    </section>
    <section anchor="protocol-description">
      <name>Protocol Description</name>
      <section anchor="overview">
        <name>Overview</name>
        <t>The DNSCrypt protocol operates through the following 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>
      </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>
      </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>
      </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>, succeeded 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 section 3.</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 section 2.</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>
        </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>
        </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>
      </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>
    </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>
      </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>
      </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>
      </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>
      </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>
      </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>
    </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>
      <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>
      </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>
      </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:
H4sIAAAAAAAAA+V963bbRpbufz5FHedHS26SIXW3xvEcRZYnOu1bW3YnvbKy
miBRJNEGAQwASmI67mc5r3BeYZ7s7FvdAFBWEiftNaOZdiSyUJddu3bty7c3
BoNBr07qVJ+qB2+XWj19eXVebopavS7zOp/l6YNeNJ2W+hq+N9896MX5LItW
8ExcRvN6EOssqQZxUSbXehBn1QxbDUZHvVlU60Vebk5Vks3zXlKUp6ou11W9
Nxo9Gu31qvV0lVRVkmf1ptDYKtaFhn+yuvdeb27yMj5Vl1mty0zXg6c4WO9a
Z2t92lOKH3nwbV6+T7KF+o8yXxcP4PNFUi/XU2++X9opFXZRSqUwt6qGZsu6
LqrTL22rIXcwTPL2g18+6PWidb3MS5jBAHpRar5OUybGszLK3qunSAz6Ji8X
UZb8GNWwPlxGnFwn8TpK1Tmst0ym6zovqaFeRUl6quax/t+j0XwIa+31srxc
wZPXsNQeEs/9NRgMVDSt6jKaQbtg08w0VVKpWFfJItOxqnOlM1qGirJY4fSB
vgnuDT4JGxLN58lMTXV9o3WmZmkC31fUuNRVnl7rshqqt0vsNJ+tV/Ctqgo9
S+aJrhT05sbFZxJ4NlkVqcaGtPg+NoC14zZFqqqhVVTGyY8wuaiAr6LZEmdZ
6dm6xDY4q1m+Wq0znCV0AMPbNULX0BkMPMuzeYKskkRpUm/6wD3AbSX9KnNP
cKyZxs6juo5m72FV87me1TgKTjwvk0WSwZbgkHYVN8sk1Qo2BeafZNgWZlPA
TKYJjqRugEGUvoXezWxhh8oItmQ9q9elHvImrZI4TnWv9wWycJnH8CWsRbYs
x+7VS2AcdbWpar1SO9DRrvrHP/7Xm2fn49H+4YcPuI2RmsGSgA4pTSLPkPr5
3J6KxtB9BWxFW2CXxoyg4iRWWY7tZ+k61kJtWM1cR/hkhVRCEgB5iDYN+vLe
GhLjFP5zrUvkACE2zK3SLUaJ9TzJhE1afNpHUsPmC39WLQatiLqdA/WFE3h7
fiNWGPJubTtXU63SZLGEc4P/9oEnap1VyTTVPG5F5wBb2gPBdNcpUDCDLwok
ZJSF3MQnsA9NSzh7MDOcwO1mqC5rOUlIjF90kD4Fb3+BAuwaqY0dnsE6n+Im
J/Q3EwyEt0LpXakHL95dvX3Q5/+ql6/o9zcXf353+ebiKf5+9c3Z8+f2l560
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
QDs0lgAA

-->

</rfc>
