<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-dns-stamps-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title abbrev="DNS Stamps">The DNS Stamps Specification</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-dns-stamps-00"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Individual Contributor</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2025" month="July" day="21"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 42?>

<t>This document specifies DNS Stamps, a compact format that encodes the information needed to connect to DNS resolvers. DNS Stamps encode all necessary parameters including addresses, hostnames, cryptographic keys, and protocol-specific configuration into a single string using a standard URI format. The specification supports multiple secure DNS protocols including DNSCrypt, DNS-over-HTTPS (DoH), DNS-over-TLS (DoT), DNS-over-QUIC (DoQ), and Oblivious DoH.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Domain Name System Working Group mailing list (namedroppers@nic.ddn.mil),
    which is archived at <eref target="nicfs.nic.ddn.mil:~/namedroppers/*.Z"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/DNSCrypt/draft-denis-dns-stamps"/>.</t>
    </note>
  </front>
  <middle>
    <?line 46?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Domain Name System (DNS) has evolved significantly from its original design as specified in <xref target="RFC1035"/>. While traditional DNS operates over unencrypted UDP and TCP connections on port <tt>53</tt>, modern DNS deployments increasingly use encrypted transports to provide confidentiality and integrity. These secure protocols include DNSCrypt <xref target="I-D.draft-denis-dprive-dnscrypt"/>, DNS-over-TLS (DoT) <xref target="RFC7858"/>, DNS-over-HTTPS (DoH) <xref target="RFC8484"/>, DNS-over-QUIC (DoQ) <xref target="RFC9250"/>, and Oblivious DNS-over-HTTPS <xref target="ODOH"/>.</t>
      <t>Each secure DNS protocol requires different configuration parameters. DNSCrypt needs a provider public key and provider name in addition to server addresses. DoH requires HTTPS endpoints and paths. DoT and DoQ need TLS configuration including certificate validation parameters. This diversity in configuration requirements creates significant challenges for both users and applications attempting to configure secure DNS resolvers.</t>
      <t>Current approaches to DNS configuration suffer from several limitations. Operating system interfaces typically support only IP addresses for DNS servers, providing no mechanism to specify encryption protocols or authentication parameters. Application-specific configuration files lack standardization, making it difficult to share configurations across different DNS client implementations. Manual configuration is error-prone, particularly when dealing with cryptographic parameters like public keys or certificate hashes. There is no standard way to distribute complete resolver configurations that would enable users to easily switch between different secure DNS providers.</t>
      <t>DNS Stamps address these challenges by encoding all parameters required to connect to a DNS resolver into a single, compact string using a URI format. This approach enables simple sharing of resolver configurations through copy-paste, QR codes, or URLs. It provides a consistent format across different client implementations, reduces configuration errors through format validation, and supports multiple protocols through a unified specification. DNS Stamps have been implemented in numerous DNS client applications and are used by several public DNS resolver operators to publish their server configurations.</t>
      <t>The remainder of this document is organized as follows. Section 2 establishes conventions and defines the encoding primitives used throughout the specification. Section 3 provides a high-level overview of the DNS Stamps format. Section 4 details the specific format for each supported protocol. Section 5 covers operational aspects including generation, parsing, and validation. Section 6 analyzes security considerations. Section 7 discusses implementation considerations. Section 8 specifies IANA registrations. The appendices provide test vectors and examples.</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 anchor="terminology">
        <name>Terminology</name>
        <t>This document uses the following terminology:</t>
        <dl>
          <dt>DNS Stamp</dt>
          <dd>
            <t>A URI-formatted string that encodes all parameters needed to connect to a DNS resolver.</t>
          </dd>
          <dt>Protocol Identifier</dt>
          <dd>
            <t>A single byte value that identifies the DNS protocol type encoded in the stamp.</t>
          </dd>
          <dt>Properties</dt>
          <dd>
            <t>A 64-bit little-endian integer encoding informal properties about the DNS resolver.</t>
          </dd>
        </dl>
      </section>
      <section anchor="encoding-primitives">
        <name>Encoding Primitives</name>
        <t>The following encoding primitives are used throughout this specification:</t>
        <dl>
          <dt><tt>‖</tt></dt>
          <dd>
            <t>Denotes concatenation of byte sequences.</t>
          </dd>
          <dt><tt>|</tt></dt>
          <dd>
            <t>Denotes the bitwise OR operation.</t>
          </dd>
          <dt><tt>len(x)</tt></dt>
          <dd>
            <t>A single byte (unsigned 8-bit integer) representing the length of <tt>x</tt> in bytes, where <tt>x</tt> is a byte sequence of maximum length 255.</t>
          </dd>
          <dt><tt>vlen(x)</tt></dt>
          <dd>
            <t>Variable length encoding. Equal to <tt>len(x)</tt> if <tt>x</tt> is the last element of a set. Otherwise equal to <tt>(0x80 | len(x))</tt>, indicating more elements follow.</t>
          </dd>
          <dt><tt>LP(x)</tt></dt>
          <dd>
            <t>Length-prefixed encoding, defined as <tt>len(x) ‖ x</tt>.</t>
          </dd>
          <dt><tt>VLP(x1, x2, ...xn)</tt></dt>
          <dd>
            <t>Variable-length-prefixed set encoding, defined as <tt>vlen(x1) ‖ x1 ‖ vlen(x2) ‖ x2 ... ‖ vlen(xn) ‖ xn</tt>. For a single-element set, <tt>VLP(x) == LP(x)</tt>.</t>
          </dd>
          <dt><tt>[x]</tt></dt>
          <dd>
            <t>Denotes that <tt>x</tt> is optional and may be omitted.</t>
          </dd>
          <dt><tt>base64url(x)</tt></dt>
          <dd>
            <t>The URL-safe base64 encoding of <tt>x</tt> as specified in Section 5 of <xref target="RFC4648"/>, without padding characters.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="dns-stamps-format-overview">
      <name>DNS Stamps Format Overview</name>
      <t>This section provides a high-level overview of the DNS Stamps format before detailing specific protocol encodings.</t>
      <section anchor="uri-structure">
        <name>URI Structure</name>
        <t>A DNS Stamp is a URI <xref target="RFC3986"/> with the following format:</t>
        <artwork><![CDATA[
sdns://base64url(payload)
]]></artwork>
        <t>The stamp begins with the scheme <tt>sdns://</tt> followed by a base64url-encoded payload. The payload is a byte sequence that encodes all parameters needed to connect to the DNS resolver.</t>
      </section>
      <section anchor="payload-structure">
        <name>Payload Structure</name>
        <t>The general structure of the payload is:</t>
        <artwork><![CDATA[
protocol_identifier ‖ protocol_specific_data
]]></artwork>
        <t>The payload always begins with a single-byte protocol identifier that determines how to interpret the remaining bytes. The base64url encoding is applied to the entire payload as a single operation after concatenating all components.</t>
      </section>
      <section anchor="protocol-identifiers">
        <name>Protocol Identifiers</name>
        <t>The following protocol identifiers are defined:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Protocol</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x00</td>
              <td align="left">Plain DNS</td>
              <td align="left">Traditional unencrypted DNS</td>
            </tr>
            <tr>
              <td align="left">0x01</td>
              <td align="left">DNSCrypt</td>
              <td align="left">DNSCrypt protocol</td>
            </tr>
            <tr>
              <td align="left">0x02</td>
              <td align="left">DNS-over-HTTPS</td>
              <td align="left">DNS queries over HTTPS</td>
            </tr>
            <tr>
              <td align="left">0x03</td>
              <td align="left">DNS-over-TLS</td>
              <td align="left">DNS queries over TLS</td>
            </tr>
            <tr>
              <td align="left">0x04</td>
              <td align="left">DNS-over-QUIC</td>
              <td align="left">DNS queries over QUIC</td>
            </tr>
            <tr>
              <td align="left">0x05</td>
              <td align="left">Oblivious DoH Target</td>
              <td align="left">Target server for Oblivious DoH</td>
            </tr>
            <tr>
              <td align="left">0x81</td>
              <td align="left">Anonymized DNSCrypt Relay</td>
              <td align="left">Relay for DNSCrypt anonymization</td>
            </tr>
            <tr>
              <td align="left">0x85</td>
              <td align="left">Oblivious DoH Relay</td>
              <td align="left">Relay for Oblivious DoH</td>
            </tr>
          </tbody>
        </table>
        <t>Protocol identifiers in the range 0x80-0xFF are reserved for relay/proxy protocols that forward queries to other servers.</t>
      </section>
      <section anchor="properties-field">
        <name>Properties Field</name>
        <t>Several stamp types include a properties field, which is a 64-bit little-endian integer. Each bit in this field represents a property of the resolver:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Bit</th>
              <th align="left">Property</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">DNSSEC</td>
              <td align="left">The server validates DNSSEC signatures</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">No Logs</td>
              <td align="left">The server does not keep query logs</td>
            </tr>
            <tr>
              <td align="left">2</td>
              <td align="left">No Filter</td>
              <td align="left">The server does not filter or block domains</td>
            </tr>
            <tr>
              <td align="left">3-63</td>
              <td align="left">Reserved</td>
              <td align="left">Must be set to zero</td>
            </tr>
          </tbody>
        </table>
        <t>When encoding, undefined property bits <bcp14>MUST</bcp14> be set to zero. When decoding, undefined property bits <bcp14>MUST</bcp14> be ignored to allow future extensions.</t>
      </section>
    </section>
    <section anchor="protocol-specific-stamp-formats">
      <name>Protocol-Specific Stamp Formats</name>
      <t>This section specifies the exact format for each supported protocol type. Each format is presented with its structure, field descriptions, and encoding requirements.</t>
      <section anchor="plain-dns-stamps">
        <name>Plain DNS Stamps</name>
        <t>Plain DNS stamps encode parameters for traditional unencrypted DNS resolvers.</t>
        <section anchor="format">
          <name>Format</name>
          <artwork><![CDATA[
payload = 0x00 ‖ props ‖ LP(addr)
]]></artwork>
        </section>
        <section anchor="fields">
          <name>Fields</name>
          <dl>
            <dt><tt>0x00</tt></dt>
            <dd>
              <t>Protocol identifier for plain DNS.</t>
            </dd>
            <dt><tt>props</tt></dt>
            <dd>
              <t>Properties field (8 bytes, little-endian).</t>
            </dd>
            <dt><tt>addr</tt></dt>
            <dd>
              <t>IP address and optional port as a string. IPv6 addresses <bcp14>MUST</bcp14> be enclosed in square brackets. Default port is <tt>53</tt>.</t>
            </dd>
          </dl>
        </section>
        <section anchor="address-format">
          <name>Address Format</name>
          <ul spacing="normal">
            <li>
              <t>IPv4: <tt>192.0.2.1</tt> or <tt>192.0.2.1:5353</tt></t>
            </li>
            <li>
              <t>IPv6: <tt>[2001:db8::1]</tt> or <tt>[2001:db8::1]:5353</tt></t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="dnscrypt-stamps">
        <name>DNSCrypt Stamps</name>
        <t>DNSCrypt stamps encode parameters for DNSCrypt servers.</t>
        <section anchor="format-1">
          <name>Format</name>
          <artwork><![CDATA[
payload = 0x01 ‖ props ‖ LP(addr) ‖ LP(pk) ‖ LP(provider_name)
]]></artwork>
        </section>
        <section anchor="fields-1">
          <name>Fields</name>
          <dl>
            <dt><tt>0x01</tt></dt>
            <dd>
              <t>Protocol identifier for DNSCrypt.</t>
            </dd>
            <dt><tt>props</tt></dt>
            <dd>
              <t>Properties field (8 bytes, little-endian).</t>
            </dd>
            <dt><tt>addr</tt></dt>
            <dd>
              <t>IP address and optional port. IPv6 addresses <bcp14>MUST</bcp14> be enclosed in square brackets. Default port is <tt>443</tt>.</t>
            </dd>
            <dt><tt>pk</tt></dt>
            <dd>
              <t>Provider’s Ed25519 public key (exactly 32 bytes, raw binary format).</t>
            </dd>
            <dt><tt>provider_name</tt></dt>
            <dd>
              <t>DNSCrypt provider name (e.g., <tt>2.dnscrypt-cert.example.com</tt>).</t>
            </dd>
          </dl>
        </section>
        <section anchor="requirements">
          <name>Requirements</name>
          <ul spacing="normal">
            <li>
              <t>The public key <bcp14>MUST</bcp14> be exactly 32 bytes.</t>
            </li>
            <li>
              <t>The provider name <bcp14>MUST</bcp14> be a valid DNS name.</t>
            </li>
            <li>
              <t>The provider name <bcp14>MUST NOT</bcp14> include a terminating period.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="dns-over-https-stamps">
        <name>DNS-over-HTTPS Stamps</name>
        <t>DoH stamps encode parameters for DNS-over-HTTPS servers.</t>
        <section anchor="format-2">
          <name>Format</name>
          <artwork><![CDATA[
payload = 0x02 ‖ props ‖ LP(addr) ‖ VLP(hash1, ..., hashn) ‖
          LP(hostname) ‖ LP(path) [ ‖ VLP(bootstrap1, ..., bootstrapn) ]
]]></artwork>
        </section>
        <section anchor="fields-2">
          <name>Fields</name>
          <dl>
            <dt><tt>0x02</tt></dt>
            <dd>
              <t>Protocol identifier for DNS-over-HTTPS.</t>
            </dd>
            <dt><tt>props</tt></dt>
            <dd>
              <t>Properties field (8 bytes, little-endian).</t>
            </dd>
            <dt><tt>addr</tt></dt>
            <dd>
              <t>IP address of the server. May be empty string if hostname resolution is required.</t>
            </dd>
            <dt><tt>hashi</tt></dt>
            <dd>
              <t>SHA256 digests of certificates in the validation chain (each exactly 32 bytes).</t>
            </dd>
            <dt><tt>hostname</tt></dt>
            <dd>
              <t>Server hostname with optional port. Default port is <tt>443</tt>.</t>
            </dd>
            <dt><tt>path</tt></dt>
            <dd>
              <t>Absolute URI path (e.g., <tt>/dns-query</tt>).</t>
            </dd>
            <dt><tt>bootstrapi</tt></dt>
            <dd>
              <t>Optional IP addresses for resolving hostname.</t>
            </dd>
          </dl>
        </section>
        <section anchor="requirements-1">
          <name>Requirements</name>
          <ul spacing="normal">
            <li>
              <t>Certificate hashes <bcp14>MUST</bcp14> be exactly 32 bytes each.</t>
            </li>
            <li>
              <t>The hostname <bcp14>MUST NOT</bcp14> be percent-encoded or punycode-encoded.</t>
            </li>
            <li>
              <t>The path <bcp14>MUST</bcp14> start with “/”.</t>
            </li>
            <li>
              <t>Bootstrap addresses follow the same format as <tt>addr</tt>.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="dns-over-tls-stamps">
        <name>DNS-over-TLS Stamps</name>
        <t>DoT stamps encode parameters for DNS-over-TLS servers.</t>
        <section anchor="format-3">
          <name>Format</name>
          <artwork><![CDATA[
payload = 0x03 ‖ props ‖ LP(addr) ‖ VLP(hash1, ..., hashn) ‖
          LP(hostname) [ ‖ VLP(bootstrap1, ..., bootstrapn) ]
]]></artwork>
        </section>
        <section anchor="fields-3">
          <name>Fields</name>
          <dl>
            <dt><tt>0x03</tt></dt>
            <dd>
              <t>Protocol identifier for DNS-over-TLS.</t>
            </dd>
          </dl>
          <t>Other fields have the same meaning as DoH stamps, except:</t>
          <ul spacing="normal">
            <li>
              <t>Default port is <tt>853</tt>.</t>
            </li>
            <li>
              <t>No path field is included.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="dns-over-quic-stamps">
        <name>DNS-over-QUIC Stamps</name>
        <t>DoQ stamps encode parameters for DNS-over-QUIC servers.</t>
        <section anchor="format-4">
          <name>Format</name>
          <artwork><![CDATA[
payload = 0x04 ‖ props ‖ LP(addr) ‖ VLP(hash1, ..., hashn) ‖
          LP(hostname) [ ‖ VLP(bootstrap1, ..., bootstrapn) ]
]]></artwork>
        </section>
        <section anchor="fields-4">
          <name>Fields</name>
          <dl>
            <dt><tt>0x04</tt></dt>
            <dd>
              <t>Protocol identifier for DNS-over-QUIC.</t>
            </dd>
          </dl>
          <t>Other fields have the same meaning as DoT stamps.</t>
        </section>
      </section>
      <section anchor="oblivious-doh-target-stamps">
        <name>Oblivious DoH Target Stamps</name>
        <t>ODoH target stamps encode parameters for Oblivious DoH target servers.</t>
        <section anchor="format-5">
          <name>Format</name>
          <artwork><![CDATA[
payload = 0x05 ‖ props ‖ LP(hostname) ‖ LP(path)
]]></artwork>
        </section>
        <section anchor="fields-5">
          <name>Fields</name>
          <dl>
            <dt><tt>0x05</tt></dt>
            <dd>
              <t>Protocol identifier for Oblivious DoH targets.</t>
            </dd>
            <dt><tt>props</tt></dt>
            <dd>
              <t>Properties field (8 bytes, little-endian).</t>
            </dd>
            <dt><tt>hostname</tt></dt>
            <dd>
              <t>Server hostname with optional port. Default port is <tt>443</tt>.</t>
            </dd>
            <dt><tt>path</tt></dt>
            <dd>
              <t>Absolute URI path.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="anonymized-dnscrypt-relay-stamps">
        <name>Anonymized DNSCrypt Relay Stamps</name>
        <t>DNSCrypt relay stamps encode parameters for anonymization relays.</t>
        <section anchor="format-6">
          <name>Format</name>
          <artwork><![CDATA[
payload = 0x81 ‖ LP(addr)
]]></artwork>
        </section>
        <section anchor="fields-6">
          <name>Fields</name>
          <dl>
            <dt><tt>0x81</tt></dt>
            <dd>
              <t>Protocol identifier for DNSCrypt relays.</t>
            </dd>
            <dt><tt>addr</tt></dt>
            <dd>
              <t>IP address and port. Port specification is mandatory.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="oblivious-doh-relay-stamps">
        <name>Oblivious DoH Relay Stamps</name>
        <t>ODoH relay stamps encode parameters for Oblivious DoH relays.</t>
        <section anchor="format-7">
          <name>Format</name>
          <artwork><![CDATA[
payload = 0x85 ‖ props ‖ LP(addr) ‖ VLP(hash1, ..., hashn) ‖
          LP(hostname) ‖ LP(path) [ ‖ VLP(bootstrap1, ..., bootstrapn) ]
]]></artwork>
        </section>
        <section anchor="fields-7">
          <name>Fields</name>
          <dl>
            <dt><tt>0x85</tt></dt>
            <dd>
              <t>Protocol identifier for ODoH relays.</t>
            </dd>
          </dl>
          <t>Other fields have the same meaning as DoH stamps.</t>
        </section>
      </section>
    </section>
    <section anchor="usage-and-operations">
      <name>Usage and Operations</name>
      <t>This section describes how to generate, parse, and validate DNS stamps in practice.</t>
      <section anchor="generating-dns-stamps">
        <name>Generating DNS Stamps</name>
        <t>To generate a DNS stamp:</t>
        <ol spacing="normal" type="1"><li>
            <t>Select the appropriate protocol identifier.</t>
          </li>
          <li>
            <t>Encode the properties field as 8 bytes in little-endian format.</t>
          </li>
          <li>
            <t>Encode each parameter using the specified length-prefixing.</t>
          </li>
          <li>
            <t>Concatenate all components in the specified order.</t>
          </li>
          <li>
            <t>Apply base64url encoding to the complete payload.</t>
          </li>
          <li>
            <t>Prepend <tt>"sdns://"</tt> to create the final stamp.</t>
          </li>
        </ol>
        <section anchor="implementation-requirements">
          <name>Implementation Requirements</name>
          <t>Implementations generating DNS stamps <bcp14>MUST</bcp14>:</t>
          <ul spacing="normal">
            <li>
              <t>Validate that all parameters meet format requirements.</t>
            </li>
            <li>
              <t>Ensure strings are valid UTF-8.</t>
            </li>
            <li>
              <t>Set undefined property bits to zero.</t>
            </li>
            <li>
              <t>Include all mandatory fields for the protocol type.</t>
            </li>
            <li>
              <t>Generate stamps that can be parsed by compliant implementations.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="parsing-dns-stamps">
        <name>Parsing DNS Stamps</name>
        <t>To parse a DNS stamp:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify the stamp begins with <tt>"sdns://"</tt>.</t>
          </li>
          <li>
            <t>Extract and base64url-decode the payload.</t>
          </li>
          <li>
            <t>Read the first byte as the protocol identifier.</t>
          </li>
          <li>
            <t>Parse remaining fields according to the protocol format.</t>
          </li>
          <li>
            <t>Validate all fields meet requirements.</t>
          </li>
        </ol>
        <section anchor="error-handling">
          <name>Error Handling</name>
          <t>Implementations <bcp14>MUST</bcp14> detect and handle these error conditions:</t>
          <ul spacing="normal">
            <li>
              <t>Invalid base64url encoding</t>
            </li>
            <li>
              <t>Unknown protocol identifier</t>
            </li>
            <li>
              <t>Truncated payload</t>
            </li>
            <li>
              <t>Invalid length prefixes</t>
            </li>
            <li>
              <t>Malformed fields</t>
            </li>
          </ul>
          <t>Implementations <bcp14>SHOULD</bcp14> provide descriptive error messages indicating the specific validation failure.</t>
        </section>
      </section>
      <section anchor="validation-requirements">
        <name>Validation Requirements</name>
        <section anchor="length-validation">
          <name>Length Validation</name>
          <ul spacing="normal">
            <li>
              <t>Length prefixes <bcp14>MUST NOT</bcp14> exceed remaining payload size.</t>
            </li>
            <li>
              <t>Certificate hashes <bcp14>MUST</bcp14> be exactly 32 bytes.</t>
            </li>
            <li>
              <t>Ed25519 public keys <bcp14>MUST</bcp14> be exactly 32 bytes.</t>
            </li>
            <li>
              <t>Properties field <bcp14>MUST</bcp14> be exactly 8 bytes.</t>
            </li>
          </ul>
        </section>
        <section anchor="format-validation">
          <name>Format Validation</name>
          <ul spacing="normal">
            <li>
              <t>IP addresses <bcp14>MUST</bcp14> be valid IPv4 or IPv6 addresses.</t>
            </li>
            <li>
              <t>Hostnames <bcp14>MUST</bcp14> be valid DNS names.</t>
            </li>
            <li>
              <t>Ports <bcp14>MUST</bcp14> be in the range <tt>1-65535</tt>.</t>
            </li>
            <li>
              <t>Paths <bcp14>MUST</bcp14> begin with <tt>/</tt>.</t>
            </li>
          </ul>
        </section>
        <section anchor="semantic-validation">
          <name>Semantic Validation</name>
          <ul spacing="normal">
            <li>
              <t>Certificate hashes <bcp14>SHOULD</bcp14> be validated against actual certificates.</t>
            </li>
            <li>
              <t>Provider names <bcp14>SHOULD</bcp14> be verified to exist in DNS.</t>
            </li>
            <li>
              <t>Bootstrap resolvers <bcp14>SHOULD</bcp14> be reachable.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="internationalization">
        <name>Internationalization</name>
        <t>Hostnames in DNS stamps <bcp14>MUST</bcp14> be represented in their Unicode form within the stamp payload. Implementations <bcp14>MUST NOT</bcp14> apply punycode encoding before storing hostnames in stamps. When using the hostname for actual DNS queries or TLS connections, implementations <bcp14>MUST</bcp14> apply the appropriate encoding for the protocol being used.</t>
        <t>This approach:</t>
        <ul spacing="normal">
          <li>
            <t>Preserves readability when stamps are decoded for display</t>
          </li>
          <li>
            <t>Avoids double-encoding issues</t>
          </li>
          <li>
            <t>Allows implementations to apply protocol-specific encoding rules</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="stamp-integrity">
        <name>Stamp Integrity</name>
        <t>DNS stamps contain security-critical configuration including server addresses, cryptographic keys, and certificate hashes. The integrity of stamps is essential - a modified stamp could redirect users to malicious resolvers.</t>
        <section anchor="threats">
          <name>Threats</name>
          <ul spacing="normal">
            <li>
              <t><strong>Substitution</strong>: Replacing legitimate stamps with malicious ones</t>
            </li>
            <li>
              <t><strong>Modification</strong>: Altering addresses, keys, or certificate hashes</t>
            </li>
            <li>
              <t><strong>Downgrade</strong>: Replacing secure protocol stamps with insecure ones</t>
            </li>
          </ul>
        </section>
        <section anchor="mitigations">
          <name>Mitigations</name>
          <t>Implementations <bcp14>SHOULD</bcp14>:</t>
          <ul spacing="normal">
            <li>
              <t>Obtain stamps over authenticated channels (HTTPS with certificate validation)</t>
            </li>
            <li>
              <t>Verify stamps against known-good values when available</t>
            </li>
            <li>
              <t>Warn users when importing stamps from untrusted sources</t>
            </li>
            <li>
              <t>Validate all cryptographic parameters before use</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="certificate-validation">
        <name>Certificate Validation</name>
        <t>For protocols using TLS (DoH, DoT, DoQ), stamps may include SHA256 hashes of certificates in the validation chain. These provide certificate pinning but require careful management.</t>
        <section anchor="security-requirements">
          <name>Security Requirements</name>
          <t>Implementations <bcp14>MUST</bcp14>:</t>
          <ul spacing="normal">
            <li>
              <t>Verify at least one certificate in the chain matches a provided hash</t>
            </li>
            <li>
              <t>Follow standard certificate validation per <xref target="RFC5280"/></t>
            </li>
            <li>
              <t>Check certificate validity periods and signatures</t>
            </li>
            <li>
              <t>Verify the certificate matches the specified hostname</t>
            </li>
          </ul>
        </section>
        <section anchor="operational-considerations">
          <name>Operational Considerations</name>
          <t>Implementations <bcp14>SHOULD</bcp14>:</t>
          <ul spacing="normal">
            <li>
              <t>Support multiple certificate hashes to enable rotation</t>
            </li>
            <li>
              <t>Provide clear errors for validation failures</t>
            </li>
            <li>
              <t>Allow optional fallback to standard WebPKI validation</t>
            </li>
            <li>
              <t>Cache certificate validation results appropriately</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="privacy-considerations">
        <name>Privacy Considerations</name>
        <t>DNS stamps may reveal information about resolver configuration:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Server Locations</strong>: IP addresses indicate geographic regions</t>
          </li>
          <li>
            <t><strong>Logging Policies</strong>: Properties flags indicate data retention</t>
          </li>
          <li>
            <t><strong>Query Privacy</strong>: Bootstrap resolvers may see some queries</t>
          </li>
        </ul>
        <t>Users should understand the privacy implications of their chosen resolvers. Applications <bcp14>SHOULD</bcp14> display relevant properties clearly.</t>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <section anchor="parsing-safety">
          <name>Parsing Safety</name>
          <t>Malformed stamps could trigger implementation vulnerabilities:</t>
          <ul spacing="normal">
            <li>
              <t><strong>Buffer Overflows</strong>: Validate all lengths before allocation</t>
            </li>
            <li>
              <t><strong>Integer Overflows</strong>: Check length calculations</t>
            </li>
            <li>
              <t><strong>Resource Exhaustion</strong>: Limit maximum stamp size</t>
            </li>
          </ul>
        </section>
        <section anchor="cryptographic-safety">
          <name>Cryptographic Safety</name>
          <ul spacing="normal">
            <li>
              <t>Validate Ed25519 public keys are valid points</t>
            </li>
            <li>
              <t>Ensure certificate hashes are compared in constant time</t>
            </li>
            <li>
              <t>Use cryptographically secure random numbers where needed</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="downgrade-prevention">
        <name>Downgrade Prevention</name>
        <t>Applications supporting multiple protocols <bcp14>MUST NOT</bcp14> automatically downgrade from secure to less secure protocols. For example:</t>
        <ul spacing="normal">
          <li>
            <t>Never downgrade from DoH to plain DNS</t>
          </li>
          <li>
            <t>Never ignore certificate validation failures</t>
          </li>
          <li>
            <t>Never bypass authentication requirements</t>
          </li>
        </ul>
        <t>If a secure connection fails, the implementation <bcp14>SHOULD</bcp14> report the error rather than attempting insecure alternatives.</t>
      </section>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <section anchor="platform-integration">
        <name>Platform Integration</name>
        <t>DNS stamp support can be integrated at various levels:</t>
        <section anchor="operating-system-level">
          <name>Operating System Level</name>
          <ul spacing="normal">
            <li>
              <t>System resolver configuration</t>
            </li>
            <li>
              <t>Network configuration tools</t>
            </li>
            <li>
              <t>VPN client integration</t>
            </li>
          </ul>
        </section>
        <section anchor="application-level">
          <name>Application Level</name>
          <ul spacing="normal">
            <li>
              <t>Web browsers</t>
            </li>
            <li>
              <t>DNS proxy software</t>
            </li>
            <li>
              <t>Network diagnostic tools</t>
            </li>
          </ul>
        </section>
        <section anchor="library-level">
          <name>Library Level</name>
          <ul spacing="normal">
            <li>
              <t>DNS client libraries</t>
            </li>
            <li>
              <t>HTTP client libraries</t>
            </li>
            <li>
              <t>Security frameworks</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="performance-optimization">
        <name>Performance Optimization</name>
        <section anchor="caching">
          <name>Caching</name>
          <t>Implementations <bcp14>SHOULD</bcp14> cache:
- Decoded stamp data structures
- Certificate validation results
- Bootstrap resolver results
- Connection state for persistent protocols</t>
        </section>
        <section anchor="connection-management">
          <name>Connection Management</name>
          <ul spacing="normal">
            <li>
              <t>Reuse connections for multiple queries</t>
            </li>
            <li>
              <t>Implement appropriate timeout strategies</t>
            </li>
            <li>
              <t>Handle connection failures gracefully</t>
            </li>
            <li>
              <t>Support connection pooling for concurrent queries</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="user-interface-considerations">
        <name>User Interface Considerations</name>
        <t>Applications <bcp14>SHOULD</bcp14>:</t>
        <ul spacing="normal">
          <li>
            <t>Display decoded stamp contents clearly</t>
          </li>
          <li>
            <t>Allow copying stamps to clipboard</t>
          </li>
          <li>
            <t>Support QR code generation/scanning</t>
          </li>
          <li>
            <t>Provide stamp validation feedback</t>
          </li>
          <li>
            <t>Show security properties prominently</t>
          </li>
        </ul>
      </section>
      <section anchor="debugging-support">
        <name>Debugging Support</name>
        <t>Implementations <bcp14>SHOULD</bcp14> provide:</t>
        <ul spacing="normal">
          <li>
            <t>Detailed logging of stamp parsing</t>
          </li>
          <li>
            <t>Connection attempt diagnostics</t>
          </li>
          <li>
            <t>Certificate validation details</t>
          </li>
          <li>
            <t>Performance metrics</t>
          </li>
          <li>
            <t>Error context for troubleshooting</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="dns-stamps-uri-scheme-registration">
        <name>DNS Stamps URI Scheme Registration</name>
        <t>IANA is requested to register the “sdns” URI scheme in the “Uniform Resource Identifier (URI) Schemes” registry:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Scheme name</strong>: sdns</t>
          </li>
          <li>
            <t><strong>Status</strong>: Permanent</t>
          </li>
          <li>
            <t><strong>Applications/protocols</strong>: DNS client applications using DNS Stamps</t>
          </li>
          <li>
            <t><strong>References</strong>: This document
       |</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC1035">
          <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="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5280">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
            <author fullname="D. Cooper" initials="D." surname="Cooper"/>
            <author fullname="S. Santesson" initials="S." surname="Santesson"/>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="S. Boeyen" initials="S." surname="Boeyen"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="W. Polk" initials="W." surname="Polk"/>
            <date month="May" year="2008"/>
            <abstract>
              <t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet. An overview of this approach and model is provided as an introduction. The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms. Standard certificate extensions are described and two Internet-specific extensions are defined. A set of required certificate extensions is specified. The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions. An algorithm for X.509 certification path validation is described. An ASN.1 module and examples are provided in the appendices. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5280"/>
          <seriesInfo name="DOI" value="10.17487/RFC5280"/>
        </reference>
        <reference anchor="RFC6125">
          <front>
            <title>Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)</title>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <author fullname="J. Hodges" initials="J." surname="Hodges"/>
            <date month="March" year="2011"/>
            <abstract>
              <t>Many application technologies enable secure communication between two entities by means of Internet Public Key Infrastructure Using X.509 (PKIX) certificates in the context of Transport Layer Security (TLS). This document specifies procedures for representing and verifying the identity of application services in such interactions. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6125"/>
          <seriesInfo name="DOI" value="10.17487/RFC6125"/>
        </reference>
        <reference anchor="RFC7858">
          <front>
            <title>Specification for DNS over Transport Layer Security (TLS)</title>
            <author fullname="Z. Hu" initials="Z." surname="Hu"/>
            <author fullname="L. Zhu" initials="L." surname="Zhu"/>
            <author fullname="J. Heidemann" initials="J." surname="Heidemann"/>
            <author fullname="A. Mankin" initials="A." surname="Mankin"/>
            <author fullname="D. Wessels" initials="D." surname="Wessels"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="May" year="2016"/>
            <abstract>
              <t>This document describes the use of Transport Layer Security (TLS) to provide privacy for DNS. Encryption provided by TLS eliminates opportunities for eavesdropping and on-path tampering with DNS queries in the network, such as discussed in RFC 7626. In addition, this document specifies two usage profiles for DNS over TLS and provides advice on performance considerations to minimize overhead from using TCP and TLS with DNS.</t>
              <t>This document focuses on securing stub-to-recursive traffic, as per the charter of the DPRIVE Working Group. It does not prevent future applications of the protocol to recursive-to-authoritative traffic.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7858"/>
          <seriesInfo name="DOI" value="10.17487/RFC7858"/>
        </reference>
        <reference anchor="RFC8484">
          <front>
            <title>DNS Queries over HTTPS (DoH)</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="P. McManus" initials="P." surname="McManus"/>
            <date month="October" year="2018"/>
            <abstract>
              <t>This document defines a protocol for sending DNS queries and getting DNS responses over HTTPS. Each DNS query-response pair is mapped into an HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8484"/>
          <seriesInfo name="DOI" value="10.17487/RFC8484"/>
        </reference>
        <reference anchor="RFC9250">
          <front>
            <title>DNS over Dedicated QUIC Connections</title>
            <author fullname="C. Huitema" initials="C." surname="Huitema"/>
            <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
            <author fullname="A. Mankin" initials="A." surname="Mankin"/>
            <date month="May" year="2022"/>
            <abstract>
              <t>This document describes the use of QUIC to provide transport confidentiality for DNS. The encryption provided by QUIC has similar properties to those provided by TLS, while QUIC transport eliminates the head-of-line blocking issues inherent with TCP and provides more efficient packet-loss recovery than UDP. DNS over QUIC (DoQ) has privacy properties similar to DNS over TLS (DoT) specified in RFC 7858, and latency characteristics similar to classic DNS over UDP. This specification describes the use of DoQ as a general-purpose transport for DNS and includes the use of DoQ for stub to recursive, recursive to authoritative, and zone transfer scenarios.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9250"/>
          <seriesInfo name="DOI" value="10.17487/RFC9250"/>
        </reference>
        <reference anchor="I-D.draft-denis-dprive-dnscrypt">
          <front>
            <title>The DNSCrypt Protocol</title>
            <author fullname="Frank Denis" initials="F." surname="Denis">
              <organization>Individual Contributor</organization>
            </author>
            <date day="15" month="April" year="2025"/>
            <abstract>
              <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>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-denis-dprive-dnscrypt-06"/>
        </reference>
        <reference anchor="RFC2119">
          <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">
          <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC3552">
          <front>
            <title>Guidelines for Writing RFC Text on Security Considerations</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="B. Korver" initials="B." surname="Korver"/>
            <date month="July" year="2003"/>
            <abstract>
              <t>All RFCs are required to have a Security Considerations section. Historically, such sections have been relatively weak. This document provides guidelines to RFC authors on how to write a good Security Considerations section. 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="72"/>
          <seriesInfo name="RFC" value="3552"/>
          <seriesInfo name="DOI" value="10.17487/RFC3552"/>
        </reference>
        <reference anchor="RFC5116">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
        <reference anchor="RFC8310">
          <front>
            <title>Usage Profiles for DNS over TLS and DNS over DTLS</title>
            <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
            <author fullname="D. Gillmor" initials="D." surname="Gillmor"/>
            <author fullname="T. Reddy" initials="T." surname="Reddy"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document discusses usage profiles, based on one or more authentication mechanisms, which can be used for DNS over Transport Layer Security (TLS) or Datagram TLS (DTLS). These profiles can increase the privacy of DNS transactions compared to using only cleartext DNS. This document also specifies new authentication mechanisms -- it describes several ways that a DNS client can use an authentication domain name to authenticate a (D)TLS connection to a DNS server. Additionally, it defines (D)TLS protocol profiles for DNS clients and servers implementing DNS over (D)TLS. This document updates RFC 7858.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8310"/>
          <seriesInfo name="DOI" value="10.17487/RFC8310"/>
        </reference>
        <reference anchor="RFC9230">
          <front>
            <title>Oblivious DNS over HTTPS</title>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear"/>
            <author fullname="P. McManus" initials="P." surname="McManus"/>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="T. Verma" initials="T." surname="Verma"/>
            <author fullname="C.A. Wood" initials="C.A." surname="Wood"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This document describes a protocol that allows clients to hide their IP addresses from DNS resolvers via proxying encrypted DNS over HTTPS (DoH) messages. This improves privacy of DNS operations by not allowing any one server entity to be aware of both the client IP address and the content of DNS queries and answers.</t>
              <t>This experimental protocol has been developed outside the IETF and is published here to guide implementation, ensure interoperability among implementations, and enable wide-scale experimentation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9230"/>
          <seriesInfo name="DOI" value="10.17487/RFC9230"/>
        </reference>
        <reference anchor="ODOH" target="https://datatracker.ietf.org/doc/draft-pauly-dprive-oblivious-doh/">
          <front>
            <title>Oblivious DNS over HTTPS</title>
            <author>
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 610?>

<section anchor="complete-examples">
      <name>Complete Examples</name>
      <t>This appendix provides complete examples of DNS stamp encoding with step-by-step explanations.</t>
      <section anchor="example-1-plain-dns">
        <name>Example 1: Plain DNS</name>
        <t>Configuration:</t>
        <ul spacing="normal">
          <li>
            <t>Server: <tt>192.0.2.53</tt></t>
          </li>
          <li>
            <t>Port: <tt>53</tt> (default)</t>
          </li>
          <li>
            <t>Properties: DNSSEC (bit 0 set)</t>
          </li>
        </ul>
        <t>Step-by-step encoding:</t>
        <ol spacing="normal" type="1"><li>
            <t>Protocol identifier: <tt>0x00</tt></t>
          </li>
          <li>
            <t>Properties: <tt>0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00</tt> (bit 0 set, little-endian)</t>
          </li>
          <li>
            <t>LP(“192.0.2.53”): 0x0A ‖ “192.0.2.53” = 0x0A 0x31 0x39 0x32 0x2E 0x30 0x2E 0x32 0x2E 0x35 0x33</t>
          </li>
          <li>
            <t>Concatenate: <tt>0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x0A 0x31 0x39 0x32 0x2E 0x30 0x2E 0x32 0x2E 0x35 0x33</tt></t>
          </li>
          <li>
            <t>Base64url encode: <tt>AAEAAAAAAAAACjE5Mi4wLjIuNTM</tt></t>
          </li>
          <li>
            <t>Final stamp: <tt>sdns://AAEAAAAAAAAACjE5Mi4wLjIuNTM</tt></t>
          </li>
        </ol>
      </section>
      <section anchor="example-2-dnscrypt">
        <name>Example 2: DNSCrypt</name>
        <t>Configuration:</t>
        <ul spacing="normal">
          <li>
            <t>Server: <tt>198.51.100.1</tt></t>
          </li>
          <li>
            <t>Port: <tt>5553</tt></t>
          </li>
          <li>
            <t>Provider public key: <tt>e801...bf82</tt> (32 bytes)</t>
          </li>
          <li>
            <t>Provider name: <tt>2.dnscrypt-cert.example.com</tt></t>
          </li>
          <li>
            <t>Properties: DNSSEC, No logs, No filter (bits 0, 1, 2 set)</t>
          </li>
        </ul>
        <t>Step-by-step encoding:</t>
        <ol spacing="normal" type="1"><li>
            <t>Protocol identifier: <tt>0x01</tt></t>
          </li>
          <li>
            <t>Properties: <tt>0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x00</tt></t>
          </li>
          <li>
            <t>LP(“198.51.100.1:5553”): 0x11 ‖ address</t>
          </li>
          <li>
            <t>LP(public key): 0x20 ‖ 32 bytes of key</t>
          </li>
          <li>
            <t>LP(“2.dnscrypt-cert.example.com”): 0x1B ‖ provider name</t>
          </li>
          <li>
            <t>Concatenate all components</t>
          </li>
          <li>
            <t>Base64url encode</t>
          </li>
          <li>
            <t>Final stamp: <tt>sdns://AQcAAAAAAAAAETE5OC41MS4xMDAuMTo1NTUzIOgBsd...</tt></t>
          </li>
        </ol>
      </section>
      <section anchor="example-3-dns-over-https">
        <name>Example 3: DNS-over-HTTPS</name>
        <t>Configuration:</t>
        <ul spacing="normal">
          <li>
            <t>Hostname: <tt>dns.example.com</tt></t>
          </li>
          <li>
            <t>Path: <tt>/dns-query</tt></t>
          </li>
          <li>
            <t>No specific IP address</t>
          </li>
          <li>
            <t>Certificate hash: <tt>3b7f...b663</tt> (32 bytes)</t>
          </li>
          <li>
            <t>Properties: No logs (bit 1 set)</t>
          </li>
        </ul>
        <t>Step-by-step encoding:</t>
        <ol spacing="normal" type="1"><li>
            <t>Protocol identifier: <tt>0x02</tt></t>
          </li>
          <li>
            <t>Properties: <tt>0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00</tt></t>
          </li>
          <li>
            <t>LP(“”): 0x00 (empty address)</t>
          </li>
          <li>
            <t>VLP(cert hash): Since it’s the only hash, same as LP: 0x20 ‖ 32 bytes</t>
          </li>
          <li>
            <t>LP(“dns.example.com”): 0x0F ‖ hostname</t>
          </li>
          <li>
            <t>LP(“/dns-query”): 0x0A ‖ path</t>
          </li>
          <li>
            <t>No bootstrap IPs</t>
          </li>
          <li>
            <t>Concatenate, base64url encode</t>
          </li>
          <li>
            <t>Final stamp: <tt>sdns://AgIAAAAAAAAAAAAAD2Rucy5leGFtcGxlLmNvbQovZG5zLXF1ZXJ5</tt></t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This appendix provides test vectors for validating DNS stamp implementations.</t>
      <section anchor="test-vector-1-plain-dns-with-ipv6">
        <name>Test Vector 1: Plain DNS with IPv6</name>
        <artwork><![CDATA[
Input:
  Protocol: Plain DNS
  Address: [2001:db8::1]:53
  Properties: DNSSEC

Encoded stamp:
  sdns://AAEAAAAAAAAADlsyMDAxOmRiODo6MV0

Decoded:
  Protocol ID: 0x00
  Properties: 0x0100000000000000
  Address: "[2001:db8::1]"
]]></artwork>
      </section>
      <section anchor="test-vector-2-doh-with-multiple-certificate-hashes">
        <name>Test Vector 2: DoH with Multiple Certificate Hashes</name>
        <artwork><![CDATA[
Input:
  Protocol: DNS-over-HTTPS
  Hostname: dns.example.com
  Path: /dns-query
  Cert Hash 1: 1111111111111111111111111111111111111111111111111111111111111111
  Cert Hash 2: 2222222222222222222222222222222222222222222222222222222222222222
  Properties: None

Encoded stamp:
  sdns://AgAAAAAAAAAAACCRERERERERERERERERERERERERERERERERERERERERESAiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiD2Rucy5leGFtcGxlLmNvbQovZG5zLXF1ZXJ5

Decoded:
  Protocol ID: 0x02
  Properties: 0x0000000000000000
  Address: ""
  Hash count: 2
  Hash 1: 1111111111111111111111111111111111111111111111111111111111111111
  Hash 2: 2222222222222222222222222222222222222222222222222222222222222222
  Hostname: "dns.example.com"
  Path: "/dns-query"
]]></artwork>
      </section>
      <section anchor="test-vector-3-dot-with-bootstrap">
        <name>Test Vector 3: DoT with Bootstrap</name>
        <artwork><![CDATA[
Input:
  Protocol: DNS-over-TLS
  Hostname: dot.example.com:853
  Address: 192.0.2.1
  Bootstrap: 198.51.100.1, 203.0.113.1
  Properties: No logs, No filter

Encoded stamp:
  sdns://AwYAAAAAAAAACTE5Mi4wLjIuMQAPZG90LmV4YW1wbGUuY29tCwwxOTguNTEuMTAwLjELMjAzLjAuMTEzLjE

Decoded:
  Protocol ID: 0x03
  Properties: 0x0600000000000000
  Address: "192.0.2.1"
  No certificate hashes
  Hostname: "dot.example.com:853"
  Bootstrap count: 2
  Bootstrap 1: "198.51.100.1"
  Bootstrap 2: "203.0.113.1"
]]></artwork>
      </section>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author would like to thank the DNSCrypt community for their extensive feedback and implementation experience. Special recognition goes to the developers of the various DNS stamp implementations who helped refine the format through practical deployment.</t>
      <t>Thanks also to the teams behind secure DNS protocols - DNSCrypt, Anonymized DNSCrypt, DoH, DoT, and DoQ - whose work made DNS stamps both necessary and useful. Their efforts to improve DNS privacy and security provided the foundation for this specification.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
Qpma3BRxrf4ipHbw/11a4DCUXAAA

-->

</rfc>
