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

<t>The DNSCrypt protocol is designed to encrypt and authenticate DNS traffic between clients and resolvers. This document specifies the protocol and its implementation.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        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 33?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The document defines the DNSCrypt protocol, which encrypts and authenticates DNS <xref target="RFC1035"/> 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.</t>
      <t>DNS packets do not need to be parsed or rewritten. DNSCrypt simply wraps them in a secure, encrypted container. Encrypted packets are then exchanged the same way as regular packets, using the standard DNS transport mechanisms. Queries and responses are sent over UDP, falling back to TCP for large responses only if necessary.</t>
      <t>DNSCrypt is stateless. Every query can be processed independently from other queries. There are no session identifiers. In order to better defend against fingerprinting, clients can replace their keys whenever they want, without extra interactions with servers.</t>
      <t>DNSCrypt packets can securely be proxied without having to be decrypted, allowing client IP addresses to be hidden from resolvers ("Anonymized DNSCrypt").</t>
      <t>Recursive DNS servers can accept DNSCrypt queries on the same IP address and port used for regular DNS traffic. Similarly, DNSCrypt and DoH can also share the same IP address and TCP port.</t>
      <t>Lastly, DNSCrypt mitigates two common security vulnerabilities in regular DNS over UDP: amplification and fragmentation attacks.</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?>

<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.
-<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.</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.</t>
        </li>
        <li>
          <t><tt>&lt;resolver-response-pad&gt;</tt>: the variable-length padding.</t>
        </li>
      </ul>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol 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.</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. If not, the output is a regular DNS response that can be directly forwarded to applications and stub resolvers.</t>
        </li>
      </ol>
    </section>
    <section anchor="key-management">
      <name>Key Management</name>
      <t>Both clients and resolvers generate short-term key pairs for each encryption system they support.</t>
      <t>Clients generate unique key pairs for each resolver they communicate with, while resolvers create individual key pairs for every client they interact with. Additionally, the resolver creates a public key for each encryption system it supports.</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="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="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</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 anchor="authenticated-encryption-and-key-exchange-algorithm">
      <name>Authenticated Encryption And Key Exchange Algorithm</name>
      <t>The <tt>Box-XChaChaPoly</tt> construction, and the way to use it described in this section, <bcp14>MUST</bcp14> be referenced in certificates as version <tt>2</tt> of the public-key authenticated encryption system.</t>
      <t>The construction, originally implemented in the libsodium cryptographic library and exposed under the name "crypto_box_curve25519xchacha20poly1305", uses the Curve25119 elliptic curve in Montgomery form and the <tt>hchacha20</tt> hash function for key exchange, the <tt>XChaCha20</tt> stream cipher, and <tt>Poly1305</tt> for message authentication.</t>
      <t>The public and secret keys are 32 bytes long in storage. The MAC is 16 bytes long, and is prepended to the ciphertext.</t>
      <t>When using <tt>Box-XChaChaPoly</tt>, this construction necessitates the use of a 24 bytes nonce, that <bcp14>MUST NOT</bcp14> be reused for a given shared secret.</t>
      <t>With a 24 bytes nonce, a question sent by a DNSCrypt client must be encrypted using the shared secret, and a nonce constructed as follows: 12 bytes chosen by the client followed by 12 NUL (<tt>0x00</tt>) bytes.</t>
      <t>A response to this question <bcp14>MUST</bcp14> be encrypted using the shared secret, and a nonce constructed as follows: the bytes originally chosen by the client, followed by bytes chosen by the resolver.</t>
      <t>Randomly selecting the resolver's portion of the nonce is <bcp14>RECOMMENDED</bcp14>.</t>
      <t>The client's half of the nonce <bcp14>MAY</bcp14> include a timestamp in addition to a counter or to random bytes. Incorporating a timestamp allows for prompt elimination of responses to queries that were sent too long ago or are dated in the future. This practice enhances security and prevents potential replay attacks.</t>
    </section>
    <section anchor="certificates">
      <name>Certificates</name>
      <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</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.</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 anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>This note 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.</t>
      <t>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>DNSCrypt does not protect against attacks on DNS infrastructure.</t>
    </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, 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="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="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="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>
    </references>
  </back>
  <!-- ##markdown-source:
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
G1AQ13eE5nev47XC3v8BRIam9uZfAAA=

-->

</rfc>
