<?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.30 (Ruby 3.4.7) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-dns-stamps-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="DNS Stamps">The DNS Stamps Specification</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-dns-stamps-01"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Individual Contributor</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2026" month="January" day="11"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 38?>

<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 42?>

<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.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="RFC9230"/>.</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>hash1, ..., hashn</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>bootstrap1, ..., bootstrapn</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>Substitution: Replacing legitimate stamps with malicious ones</t>
            </li>
            <li>
              <t>Modification: Altering addresses, keys, or certificate hashes</t>
            </li>
            <li>
              <t>Downgrade: 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>Server Locations: IP addresses indicate geographic regions</t>
          </li>
          <li>
            <t>Logging Policies: Properties flags indicate data retention</t>
          </li>
          <li>
            <t>Query Privacy: 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>Buffer Overflows: Validate all lengths before allocation</t>
            </li>
            <li>
              <t>Integer Overflows: Check length calculations</t>
            </li>
            <li>
              <t>Resource Exhaustion: 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:</t>
          <ul spacing="normal">
            <li>
              <t>Decoded stamp data structures</t>
            </li>
            <li>
              <t>Certificate validation results</t>
            </li>
            <li>
              <t>Bootstrap resolver results</t>
            </li>
            <li>
              <t>Connection state for persistent protocols</t>
            </li>
          </ul>
        </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>Scheme name: sdns</t>
          </li>
          <li>
            <t>Status: Permanent</t>
          </li>
          <li>
            <t>Applications/protocols: DNS client applications using DNS Stamps</t>
          </li>
          <li>
            <t>Reference: 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.denis-dprive-dnscrypt">
          <front>
            <title>The DNSCrypt Protocol</title>
            <author fullname="Frank Denis" initials="F." surname="Denis">
              <organization>Individual Contributor</organization>
            </author>
            <date day="5" month="October" 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-07"/>
        </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>
      </references>
    </references>
    <?line 607?>

<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, 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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
z7k+6N72vH1EuONoMUrJ8fEgN33dXkPsq5yEMZHYoPW5ZCtfUZFehjuFlZDg
cH2xniGmj2hdwJtURIHrUSnOiNn8c9FBw4ToiEHawHgy9s5q+3brrGT0lidx
GzjVdBvjoJ7I0P0mk2mnNpha6KfClF1yEIE8m7RgIfpCWnbXqD6vx4dbdaRL
5sbr7aXzY66pwNF8CyMySfuvlvgIx7i3eAXTZ2OuEVvvk4g1q/MEquYLtU3j
d8yWNNs0FC/FnZRl5MVPWB3PiAAlfEMNHECw2jW/65UTxuGzffBlM64P0eTO
/7Eeqlr7qLysh/mHW5VNkubUNDBX8R+kmZ6qniqXzrGtzmCGypi4qAxfqQmF
i/Zo2cb/NIFEJ/ETEWYz1RtWRbit1vEz3rdXBCoVnwiCDrl4VG2HktDeqUVu
h7Y2fBvV8F3URe+0Wrc1oAy8kutYk6+kDaTutt+prcylmFLAu/HXvbd5M3OP
JMjF9fZWdaytnSFmHXHq1X8uFQlH9GsPu+69xq8+/eqf4lPXfaqeDfBrr5HY
M8dRL4T+H9z0HvmWr+qZDmx9dHR6ZH+OfzwdXEb7jxc/npdv7y7vkRY8q5J+
Q9fMtnGSz0b9qtjzM1x02Bn0Or1ut9Pz+Whg2Gr1jUL0rT7s9jqdzmhy2CeS
ukK6Zph7uLmidC177qLMCI0H/MF0EmxzwrC7q3q7qv8rOLe3lnO/fAnnVuxZ
4WsILAmX9qQUw9yCwWcoHXA44zF9KW93pXakK+grcAcW3oAps8VXtr6hwjD4
5PlMdevLVcZrHT7HWe/GjrNO704HV8f7vcvb/afLk6Py8i7tvb17/9P51fSr
PCTK13ltb9goJV3HcTYRQTvShiuMQK7+sFYbKQVnLsJdhRjWpGRo5t7oywlY
8uBgb5UlHbkNb4ka6v0KTuqv5aT+L+Eko966alvKYs3xdsA8KDQBF/DpaNxt
BEcgKn4nITB+cQS+2pXKkCCnFdewmOWtBsLNzmc81gXRDmRsRYKa/kUZDPiJ
MOgKXogoOfjJ48DdZk5Xt14/x3DT8yP/56R/U46Xg1h/fVaMv36KL+ZvH0bv
0oe/fD346eLPZ72//PnfB+A7dYcXjXyQF408a5prbyPxo3J+EcT6kgBv/Zo1
FjOOJKUUH50ni7LAyxwtl/iWW9nujaFqtlzIjIbea7VOE8+NxrJrVP5JnC9J
IJ+u5jfR1Ul6cPmhS7dX8b99SNT5iTBXYy/owG7txwd0qwbplq1lqiEEdiV9
I6i4tHcaXx7fSJLjOQw1FIXy9EKDSzGNtULFkfQIW/EeIE3vV/7U1qOT9X/l
TwPbb0kNb6Dr1GP+4+Ob05f+uz2Kzl/87yVStZGFmocCV21goS2QFOgcp2VC
nkTf/v3bkOs3pFTFeCv60bGerw3XigNMX3on4uCiC59n/ruLBuunNYM/PGQt
4bDqGrzoodsFjytfhByj7h4N6vX2eNgaq+d5VBu48vHbiinvKgfz8t3R9V++
ft29mH/Y//ab3uPo6/flt/3XxfHj49PV3ZQc0FNyE45o7OnF5Y9HP138CLfh
lP4/3cheTW1Ijw42sJfDBGhEx1mTXq1TdhWxWz4SfTatHvZ4pwq59SnEflse
si1jqKMxsqCxDqcmEMovyuIXHpvX/PEbBrkqC683Nm+HkAJcAm5eJhw8k0qE
KLNtpg/ahTfk7aj1KCddJRHKIQehIy+NDvAa0XE6lddrqWkqGSxsFyKyB2S7
Dh0b03zWJqrHWapmOl5wARIK+cxLO8yrh+WVdqZClN9Ia18Gy3UTdFC8KyNP
LQiFDubIOMwi5P7WvJ+3urggE2tzsvY9o4/IxygOYs6DsFaoyq/7rF5ajBll
jtAYZ2CBz8nEvn2WDkmegt1ZEkCBBcjEjSQLKoctExtoYuo032fUaf0fT4Ll
FMpbAAA=

-->

</rfc>
