<?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.18 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-dprive-dnscrypt-04" category="info" submissionType="independent" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="DNSCrypt">The DNSCrypt protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-dprive-dnscrypt-04"/>
    <author fullname="Frank Denis">
      <organization>Individual Contributor</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2024" month="August" day="04"/>
    <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="hchacha20">
        <name>HChaCha20</name>
        <t><tt>HChaCha20</tt> is an intermediate step based on the construction and security proof used to create <tt>XSalsa20</tt>, an extended-nonce Salsa20 variant.</t>
        <t><tt>HChaCha20</tt> is initialized in the same way as the ChaCha20 cipher defined in <xref target="RFC8439"/>, except that <tt>HChaCha20</tt> uses a 128-bit nonce and has no counter. Instead, the block counter is replaced by the first 32 bits of the nonce.</t>
        <t>Consider the two figures below, where each non-whitespace character represents one nibble of information about the ChaCha states (all numbers little-endian):</t>
        <artwork><![CDATA[
                  cccccccc  cccccccc  cccccccc  cccccccc
                  kkkkkkkk  kkkkkkkk  kkkkkkkk  kkkkkkkk
                  kkkkkkkk  kkkkkkkk  kkkkkkkk  kkkkkkkk
                  bbbbbbbb  nnnnnnnn  nnnnnnnn  nnnnnnnn

           ChaCha20 State: c=constant k=key b=blockcount n=nonce


                  cccccccc  cccccccc  cccccccc  cccccccc
                  kkkkkkkk  kkkkkkkk  kkkkkkkk  kkkkkkkk
                  kkkkkkkk  kkkkkkkk  kkkkkkkk  kkkkkkkk
                  nnnnnnnn  nnnnnnnn  nnnnnnnn  nnnnnnnn

                 HChaCha20 State: c=constant k=key n=nonce
]]></artwork>
        <t>After initialization, proceed through the ChaCha rounds as usual. Once the 20 ChaCha rounds have been completed, the first 128 bits and last 128 bits of the ChaCha state (both little-endian) are concatenated, and this 256-bit subkey is returned.</t>
      </section>
      <section anchor="test-vector-for-the-hchacha20-block-function">
        <name>Test Vector For The HChaCha20 Block Function</name>
        <artwork><![CDATA[
   o  Key = 00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:
      14:15:16:17:18:19:1a:1b:1c:1d:1e:1f.  The key is a sequence of
      octets with no particular structure before we copy it into the
      HChaCha state.

   o  Nonce = (00:00:00:09:00:00:00:4a:00:00:00:00:31:41:59:27)

   After setting up the HChaCha state, it looks like this:

                    61707865 3320646e 79622d32 6b206574
                    03020100 07060504 0b0a0908 0f0e0d0c
                    13121110 17161514 1b1a1918 1f1e1d1c
                    09000000 4a000000 00000000 27594131

                     ChaCha state with the key setup.

   After running 20 rounds (10 column rounds interleaved with 10
   "diagonal rounds"), the HChaCha state looks like this:

                    423b4182 fe7bb227 50420ed3 737d878a
                    0aa76448 7954cdf3 846acd37 7b3c58ad
                    77e35583 83e77c12 e0076a2d bc6cd0e5
                    d5e4f9a0 53a8748a 13c42ec1 dcecd326

                       HChaCha state after 20 rounds

   HChaCha20 will then return only the first and last rows, in little
   endian, resulting in the following 256-bit key:

                    82413b42 27b27bfe d30e4250 8a877d73
                    a0f9e4d5 8a74a853 c12ec413 26d3ecdc

                        Resultant HChaCha20 subkey
]]></artwork>
      </section>
      <section anchor="chacha20djb">
        <name>ChaCha20_DJB</name>
        <t>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>Common implementations may just refer to it as <tt>ChaCha20</tt>, and the IETF version as <tt>ChaCha20-IETF</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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
pOdjAAA=

-->

</rfc>
