<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.35 (Ruby 3.3.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC9651 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9651.xml">
<!ENTITY RFC4033 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4033.xml">
<!ENTITY RFC4034 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4034.xml">
<!ENTITY RFC4035 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4035.xml">
<!ENTITY RFC8032 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8032.xml">
<!ENTITY RFC6234 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6234.xml">
<!ENTITY RFC9110 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml">
<!ENTITY RFC9111 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9111.xml">
<!ENTITY RFC1035 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml">
<!ENTITY RFC8126 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml">
<!ENTITY RFC8484 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8484.xml">
<!ENTITY RFC7858 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7858.xml">
]>


<rfc ipr="trust200902" docName="draft-callec-dive-00" category="exp" submissionType="IETF">
  <front>
    <title abbrev="DIVE">Domain-based Integrity Verification Enforcement (DIVE) Version 0.1</title>

    <author initials="M. F." surname="Callec" fullname="Mateo Florian Callec">
      <organization>Independent</organization>
      <address>
        <postal>
          <country>France</country>
        </postal>
        <email>mateo@callec.net</email>
      </address>
    </author>

    <date year="2026" month="April" day="01"/>

    <area>Security</area>
    
    <keyword>integrity</keyword> <keyword>dns</keyword> <keyword>dnssec</keyword> <keyword>signature</keyword> <keyword>http</keyword>

    <abstract>


<?line 34?>

<t>Domain-based Integrity Verification Enforcement (DIVE) version 0.1 is an application-layer protocol that provides cryptographic integrity and authenticity verification of web resources by leveraging the Domain Name System Security Extensions (DNSSEC) as an independent verification channel.</t>

<t>DIVE operates as an additional security layer above HTTP and HTTPS. Public keys and policy configuration are published as DNS TXT records protected by DNSSEC, while HTTP response headers carry per-resource cryptographic signatures. A client implementing DIVE verifies each covered resource against the corresponding DNS-published public key before accepting it. An attacker must therefore compromise both the DNS infrastructure and the origin server simultaneously in order to deliver a tampered resource to a DIVE-compliant client.</t>

<t>This document defines the DNS record format, the HTTP header format, the client verification algorithm, the reporting mechanism, and the operational recommendations for the DIVE 0.1 protocol.</t>



    </abstract>



  </front>

  <middle>


<?line 42?>

<section anchor="introduction"><name>Introduction</name>

<t>Content-delivery infrastructures are a high-value target for attackers. When a web server is compromised, an attacker can silently replace or modify resources served to clients. Transport-layer security (TLS/HTTPS) protects the confidentiality and integrity of data in transit but does not protect against a compromised origin server that serves malicious content over a legitimate TLS session.</t>

<t>Existing mechanisms like Subresource Integrity (SRI) embed expected hashes directly into the HTML markup. However, because this markup is delivered by the primary host, it provides limited security during a full infrastructure breach. The compromised origin can simply alter the hashes to match malicious third-party scripts.</t>

<t>DIVE addresses this threat model by publishing the authoritative policy and public keys through DNSSEC-protected DNS records, which constitute an independent trust anchor. A resource is accepted by a DIVE client only when its signature, carried in HTTP response headers, can be successfully verified against a public key retrieved from DNSSEC-validated DNS. Because DNS and the origin server are typically administered independently, an attacker must control both simultaneously to bypass DIVE.</t>

<t>DIVE is designed to be:</t>

<t><list style="symbols">
  <t><strong>Incrementally deployable</strong>: DIVE adds optional DNS records and HTTP response headers; existing infrastructure that does not implement DIVE continues to function normally for non-DIVE clients.</t>
  <t><strong>Scope-limited</strong>: operators can restrict DIVE verification to specific categories of resources (scopes) rather than all resources.</t>
  <t><strong>Transparent on failure</strong>: a report-only mode allows operators to monitor verification failures before enforcing blocking.</t>
</list></t>

<t>This document is structured as follows. <xref target="terminology"/> defines terms used throughout the document. <xref target="scopes"/> defines the scope mechanism. <xref target="dns-configuration"/> specifies the DNS record format. <xref target="http-headers"/> specifies the HTTP response headers. <xref target="client-implementation"/> defines the client verification algorithm. <xref target="security-considerations"/> discusses security properties and threats. <xref target="iana-considerations"/> addresses IANA registration requirements.</t>

</section>
<section anchor="terminology"><name>Terminology</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" 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>

<t>The following terms are used in this document:</t>

<dl>
  <dt>DIVE client:</dt>
  <dd>
    <t>Any HTTP client (library, tool, or automated agent) that implements the verification algorithm defined in this document.</t>
  </dd>
  <dt>DIVE server:</dt>
  <dd>
    <t>An HTTP origin server that publishes DIVE DNS records and includes DIVE HTTP response headers on covered resources.</t>
  </dd>
  <dt>Resource:</dt>
  <dd>
    <t>A single HTTP response body identified by its request URL and received with HTTP status code 200.</t>
  </dd>
  <dt>Scope:</dt>
  <dd>
    <t>A named category of resources subject to DIVE verification, as defined in <xref target="scopes"/>.</t>
  </dd>
  <dt>Key record:</dt>
  <dd>
    <t>A DNS TXT record that publishes a public key under the naming convention defined in <xref target="key-records"/>.</t>
  </dd>
  <dt>Policy record:</dt>
  <dd>
    <t>The <spanx style="verb">_dive</spanx> DNS TXT record that publishes the DIVE configuration for a domain or subdomain, as defined in <xref target="dive-record"/>.</t>
  </dd>
  <dt>Key ID:</dt>
  <dd>
    <t>An operator-assigned identifier that names a specific key record and is referenced in HTTP response headers.</t>
  </dd>
  <dt>FQDN:</dt>
  <dd>
    <t>Fully Qualified Domain Name.</t>
  </dd>
  <dt>Structured Field:</dt>
  <dd>
    <t>A value encoded according to the Structured Field Values for HTTP specification <xref target="RFC9651"/>.</t>
  </dd>
  <dt>DNSSEC:</dt>
  <dd>
    <t>DNS Security Extensions <xref target="RFC4033"/> <xref target="RFC4034"/> <xref target="RFC4035"/>.</t>
  </dd>
  <dt>Unix timestamp:</dt>
  <dd>
    <t>The number of seconds elapsed since 1970-01-01T00:00:00Z (UTC), excluding leap seconds, represented as a signed integer.</t>
  </dd>
</dl>

</section>
<section anchor="scopes"><name>Scopes</name>

<t>A scope identifies a category of resources to which DIVE verification applies. Scopes are declared in the <spanx style="verb">scopes</spanx> parameter of the policy record (<xref target="dive-record"/>).</t>

<section anchor="standard-scopes"><name>Standard Scopes</name>

<t>This document defines the following standard scope:</t>

<dl>
  <dt><spanx style="verb">strict</spanx>:</dt>
  <dd>
    <t>DIVE verification MUST be applied to ALL resources served under the domain covered by the applicable policy record, regardless of content type or response headers.</t>
  </dd>
</dl>

</section>
<section anchor="custom-scopes"><name>Custom Scopes</name>

<t>Operators MAY define custom scopes to accommodate application-specific resource categories. Custom scope names:</t>

<t><list style="symbols">
  <t>MUST begin with the prefix <spanx style="verb">x-</spanx> (e.g., <spanx style="verb">x-myscope</spanx>);</t>
  <t>MUST be entirely lowercase;</t>
  <t>MUST contain only the characters <spanx style="verb">a-z</spanx> and <spanx style="verb">-</spanx>;</t>
  <t>MUST NOT begin or end with <spanx style="verb">-</spanx> after the mandatory <spanx style="verb">x-</spanx> prefix.</t>
</list></t>

<t>Custom scopes are intended for use in closed environments where both the server and the client are controlled by the same operator. The detection logic for custom scopes (i.e., how a client determines whether a given resource falls within a custom scope) is application-defined. Interoperability between different client implementations for custom scopes is explicitly out of scope of this specification.</t>

<t>Custom scopes are intended to cover downloaded artifacts, such as packages, binaries, or other files fetched by a purpose-built client.</t>

<t>A DIVE client that does not recognise a custom scope MUST ignore it and MUST NOT apply DIVE verification to resources solely on the basis of an unrecognised scope.</t>

</section>
</section>
<section anchor="dns-configuration"><name>DNS Configuration</name>

<section anchor="dnssec-requirement"><name>DNSSEC Requirement</name>

<t>A DIVE server SHOULD enable DNSSEC <xref target="RFC4033"/> for all zones that publish DIVE DNS records to ensure record integrity. If a DIVE client retrieves a <spanx style="verb">_dive</spanx> policy record without DNSSEC validation, it MAY still process the record and perform DIVE verification, though it SHOULD treat the policy as unauthenticated.</t>

</section>
<section anchor="record-format"><name>Record Format</name>

<t>All DIVE DNS records are DNS TXT records. Their values MUST be formatted as Structured Field Values as defined in <xref target="RFC9651"/>. Specifically, list values use the Structured Field List syntax and string values use the Structured Field String syntax.</t>

<t>All timestamps used in DIVE DNS records are Unix timestamps represented as Structured Field Integers.</t>

<t>Parameter names and their values, unless otherwise stated, MUST be lowercase.</t>

</section>
<section anchor="dive-record"><name>The Policy Record (<spanx style="verb">_dive</spanx>)</name>

<t>The <spanx style="verb">_dive</spanx> TXT record publishes the DIVE policy for a domain or subdomain. It MUST be placed at the <spanx style="verb">_dive</spanx> label of the zone or subdomain it governs (e.g., <spanx style="verb">_dive.example.com</spanx> or <spanx style="verb">_dive.sub.example.com</spanx>).</t>

<t>A policy record applies to the label at which it is placed and to all subordinate labels, unless a more specific policy record exists at a deeper level. A more specific record always takes precedence over a less specific one.</t>

<section anchor="example"><name>Example</name>

<figure title="Example of the `_dive` DNS record" anchor="dns-example-dive"><sourcecode type="dns-rr"><![CDATA[
_dive.example.com.  900   IN  TXT  (
  "v=\"dive-draft-00\", "
  "scopes=(\"strict\"), "
  "directives=(\"https-required\"), "
  "cache=900, "
  "invalidate-keys-cache=1700000000, "
  "report-to=\"https://reports.example.com/dive\""
)
]]></sourcecode></figure>

</section>
<section anchor="parameters"><name>Parameters</name>

<dl>
  <dt><spanx style="verb">v</spanx> (REQUIRED):</dt>
  <dd>
    <t>A Structured Field String identifying the protocol version. For this specification the value MUST be <spanx style="verb">"dive-draft-00"</spanx>. Both the parameter name and its value MUST be lowercase. If the <spanx style="verb">v</spanx> parameter is absent, its value is not <spanx style="verb">"dive-draft-00"</spanx>, or the record cannot be parsed as valid Structured Field syntax, the client MUST treat DIVE as not supported for this domain and MUST NOT attempt to interpret any other parameter in the record.</t>
  </dd>
  <dt><spanx style="verb">scopes</spanx> (OPTIONAL):</dt>
  <dd>
    <t>A Structured Field List of Structured Field Strings naming the scopes for which DIVE verification is enforced (see <xref target="scopes"/>). Both the parameter name and all list values MUST be lowercase. If this parameter is absent, no resource scope is enforced; the <spanx style="verb">directives</spanx> parameter (see below) MAY still apply, but no resource integrity verification will be performed. Operators SHOULD include at least one scope when deploying DIVE.</t>
  </dd>
  <dt><spanx style="verb">directives</spanx> (OPTIONAL):</dt>
  <dd>
    <t>A Structured Field List of Structured Field Strings conveying behavioural directives to clients. Both the parameter name and all list values MUST be lowercase. Defined directive values are:</t>
  </dd>
</dl>

<t><list style="symbols">
  <t><spanx style="verb">"https-required"</spanx>: the client MUST refuse to load any resource under the covered domain over plain HTTP and MUST upgrade or block such requests.</t>
  <t><spanx style="verb">"report-only"</spanx>: the client MUST NOT block resources that fail DIVE verification; instead it MUST report the failure as defined in <xref target="reporting"/> if a <spanx style="verb">report-to</spanx> URL is present. Verification is still performed; only the enforcement action is suppressed.</t>
</list></t>

<t>A client that encounters an unrecognised directive value MUST ignore that value and continue processing.</t>

<dl>
  <dt><spanx style="verb">cache</spanx> (OPTIONAL):</dt>
  <dd>
    <t>A Structured Field Integer specifying, in seconds, how long the client MAY cache the policy record, measured from the moment the client stores the record. The value MUST be a non-negative integer. The default value when the parameter is absent is <spanx style="verb">0</spanx> (no caching). Clients MUST NOT cache the policy record for longer than 86400 seconds (24 hours), regardless of the value specified (see <xref target="cache-management"/>).</t>
  </dd>
  <dt><spanx style="verb">invalidate-keys-cache</spanx> (OPTIONAL):</dt>
  <dd>
    <t>A Structured Field Integer carrying a Unix timestamp. When present, the client MUST purge from its local cache all key records for the domain and all subordinate domains covered by this policy record whose cache-storage timestamp is less than or equal to the specified value. If the specified timestamp is in the future, the client MUST NOT serve key records from its cache until that timestamp has passed; it MUST instead issue a fresh DNS query on each verification attempt until the timestamp is reached. The parameter name MUST be lowercase.</t>
  </dd>
  <dt><spanx style="verb">report-to</spanx> (OPTIONAL):</dt>
  <dd>
    <t>A Structured Field String containing an absolute URL to which the client MUST send verification failure reports as defined in <xref target="reporting"/>. The parameter name MUST be lowercase. The URL MAY refer to a third-party domain. The URL MUST use HTTPS. A plain HTTP URL MUST be ignored by the client.</t>
  </dd>
</dl>

<t>Unrecognised parameters MUST be ignored by the client.</t>

</section>
<section anchor="operational-recommendations"><name>Operational Recommendations</name>

<t>Operators SHOULD set the DNS TTL of the <spanx style="verb">_dive</spanx> record to 900 seconds to balance caching performance with the ability to propagate <spanx style="verb">invalidate-keys-cache</spanx> updates in a timely manner.</t>

</section>
</section>
<section anchor="key-records"><name>Key Records</name>

<t>When one or more scopes are declared in the policy record, at least one key record MUST be present and valid. If no valid key record is reachable, the client MUST refuse all resources in the declared scopes.</t>

<t>Key records are DNS TXT records placed at the label <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;domain&gt;</spanx>, where <spanx style="verb">&lt;domain&gt;</spanx> is the domain or subdomain to which the key applies. The <spanx style="verb">_divekey</spanx> label is distinct from the <spanx style="verb">_dive</spanx> label used for policy records and MUST NOT be used interchangeably with it.</t>

<t>A Key ID:</t>

<t><list style="symbols">
  <t>MAY contain uppercase letters (<spanx style="verb">A-Z</spanx>), lowercase letters (<spanx style="verb">a-z</spanx>), decimal digits (<spanx style="verb">0-9</spanx>), and underscores (<spanx style="verb">_</spanx>);</t>
  <t>MUST NOT contain any other character;</t>
  <t>is case-sensitive.</t>
</list></t>

<t>A key record at a given subdomain level applies only to that level and its subordinate labels. Its Key ID MUST NOT collide with a Key ID used by a parent domain's key record in a manner that would create ambiguity during hierarchical resolution (see <xref target="key-resolution"/>).</t>

<section anchor="example-1"><name>Example</name>

<figure title="Example of the `_divekey` DNS record" anchor="dns-example-divekey"><sourcecode type="dns-rr"><![CDATA[
keyABC._divekey.example.com.  900  IN  TXT  (
  "sig=\"ed25519\", "
  "key=:BASE64RAWKEY:, "
  "allowed-hash=(\"sha256\" \"sha384\" \"sha3-256\"), "
  "cache=900"
)
]]></sourcecode></figure>

</section>
<section anchor="parameters-1"><name>Parameters</name>

<dl>
  <dt><spanx style="verb">sig</spanx> (REQUIRED):</dt>
  <dd>
    <t>A Structured Field String identifying the digital signature algorithm corresponding to the published public key. Both the parameter name and its value MUST be lowercase. Permitted values are:</t>
  </dd>
</dl>

<t><list style="symbols">
  <t><spanx style="verb">"ed25519"</spanx>: Edwards-curve Digital Signature Algorithm over Curve25519 <xref target="RFC8032"/>;</t>
  <t><spanx style="verb">"ed448"</spanx>: Edwards-curve Digital Signature Algorithm over Curve448 <xref target="RFC8032"/>.</t>
</list></t>

<t>Algorithms including but not limited to DSA, ECDSA (any curve), and RSA MUST NOT be used. A client that encounters a <spanx style="verb">sig</spanx> value other than the permitted values MUST treat the key record as invalid.</t>

<dl>
  <dt><spanx style="verb">key</spanx> (REQUIRED):</dt>
  <dd>
    <t>A Structured Field Byte Sequence (encoded as base64 within colons as per <xref target="RFC9651"/> Section 3.3.5) containing the raw public key bytes for the algorithm identified by <spanx style="verb">sig</spanx>. For Ed25519, this is the 32-byte public key encoding defined in <xref target="RFC8032"/> Section 5.1.5. For Ed448, this is the 57-byte public key encoding defined in <xref target="RFC8032"/> Section 5.2.5.</t>
  </dd>
  <dt><spanx style="verb">allowed-hash</spanx> (OPTIONAL):</dt>
  <dd>
    <t>A Structured Field List of Structured Field Strings enumerating the hash algorithms that the server is permitted to use when computing the digest for this key. Both the parameter name and all list values MUST be lowercase. Permitted values are:</t>
  </dd>
</dl>

<t><list style="symbols">
  <t><spanx style="verb">"sha256"</spanx>: Secure Hash Algorithm 2 (SHA-2) with a 256-bit output, as defined in <eref target="https://csrc.nist.gov/pubs/fips/180-4/upd1/final">FIPS 180-4</eref> and widely used in IETF protocols such as <xref target="RFC6234"/>;</t>
  <t><spanx style="verb">"sha384"</spanx>: Secure Hash Algorithm 2 (SHA-2) with a 384-bit output, as defined in <eref target="https://csrc.nist.gov/pubs/fips/180-4/upd1/final">FIPS 180-4</eref> and widely used in IETF protocols such as <xref target="RFC6234"/>;</t>
  <t><spanx style="verb">"sha512"</spanx>: Secure Hash Algorithm 2 (SHA-2) with a 512-bit output, as defined in <eref target="https://csrc.nist.gov/pubs/fips/180-4/upd1/final">FIPS 180-4</eref> and widely used in IETF protocols such as <xref target="RFC6234"/>;</t>
  <t><spanx style="verb">"sha3-256"</spanx>: Secure Hash Algorithm 3 (SHA-3) with a 256-bit output, as defined in <eref target="https://csrc.nist.gov/pubs/fips/202/final">FIPS 202</eref>;</t>
  <t><spanx style="verb">"sha3-384"</spanx>: Secure Hash Algorithm 3 (SHA-3) with a 384-bit output, as defined in <eref target="https://csrc.nist.gov/pubs/fips/202/final">FIPS 202</eref>;</t>
  <t><spanx style="verb">"sha3-512"</spanx>: Secure Hash Algorithm 3 (SHA-3) with a 512-bit output, as defined in <eref target="https://csrc.nist.gov/pubs/fips/202/final">FIPS 202</eref>.</t>
</list></t>

<t>Algorithms including but not limited to MD5, CRC32, and SHA-1 MUST NOT be listed and MUST be rejected by the client. When this parameter is present, the hash algorithm indicated in the <spanx style="verb">DIVE-Sig</spanx> response header for this Key ID MUST appear in the list; if it does not, the client MUST treat verification as failed for that key. When this parameter is absent, any permitted hash algorithm MAY be used.</t>

<dl>
  <dt><spanx style="verb">cache</spanx> (OPTIONAL):</dt>
  <dd>
    <t>A Structured Field Integer specifying, in seconds, how long the client MAY cache this key record, measured from the moment the client stores the record. The value MUST be a non-negative integer. The default value when the parameter is absent is <spanx style="verb">0</spanx> (no caching). Clients MUST NOT cache key records for longer than 86400 seconds (24 hours) (see <xref target="cache-management"/>).</t>
  </dd>
</dl>

<t>Unrecognised parameters MUST be ignored by the client.</t>

</section>
<section anchor="operational-recommendations-1"><name>Operational Recommendations</name>

<t>Operators SHOULD set the DNS TTL of key records to 900 seconds to allow rapid removal of a compromised key from resolver caches.</t>

<t>Operators SHOULD perform regular key rotation following the procedure described in <xref target="key-rotation"/>. A Key ID SHOULD NOT be reused once its associated key record has been removed, to avoid cache-based confusion on clients that still hold the old record.</t>

</section>
</section>
<section anchor="subdomain-specific-records"><name>Subdomain-Specific Records</name>

<t>Operators MAY publish policy records and key records at any subdomain level. For policy records, the record at the most specific <spanx style="verb">_dive</spanx> label that matches the resource's FQDN takes precedence. For key records, the record at the most specific <spanx style="verb">_divekey</spanx> label applicable to the resource's FQDN takes precedence. This allows per-subdomain policy and key overrides without affecting the parent domain.</t>

</section>
</section>
<section anchor="http-headers"><name>HTTP Response Headers</name>

<t>A DIVE server MUST include the <spanx style="verb">DIVE-Sig</spanx> HTTP response header on all responses with status code 200 for resources that fall within a declared scope.</t>

<section anchor="dive-sig"><name><spanx style="verb">DIVE-Sig</spanx></name>

<t>A comma-separated list of entries, each encoding a Key ID, an optional FQDN qualifier, a hash algorithm, and a Base64-encoded signature. Two forms are defined:</t>

<t><list style="symbols">
  <t>Without FQDN qualifier: <spanx style="verb">keyID:hash-algorithm:BASE64SIG</spanx></t>
  <t>With FQDN qualifier: <spanx style="verb">keyID@fqdn:hash-algorithm:BASE64SIG</spanx></t>
</list></t>

<t>Example:</t>

<figure title="Example of the `DIVE-Sig` HTTP header" anchor="header-example-divesig"><sourcecode type="http-message"><![CDATA[
DIVE-Sig: keyABC:sha256:BASE64SIG1, \
          keyDEF@sub.example.com:sha384:BASE64SIG2
]]></sourcecode></figure>

<t>The Key ID identifies the key record used to produce the signature. Key IDs are case-sensitive. Each Key ID MUST appear at most once. The list SHOULD contain no more than three entries to ensure compatibility with HTTP implementations that impose limits on header length.</t>

<t>The <spanx style="verb">@fqdn</spanx> qualifier, when present, instructs the client to resolve the key record for this Key ID starting at <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;fqdn&gt;</spanx> rather than at the resource's own FQDN level. The FQDN MUST be the same domain as the resource's origin or a parent domain thereof. The client MUST reject any FQDN that is not equal to or a strict parent of the resource's origin (i.e., child subdomains are not permitted).</t>

<t>The hash algorithm field identifies the algorithm used to compute the digest that was signed. Permitted values are: <spanx style="verb">sha256</spanx>, <spanx style="verb">sha384</spanx>, <spanx style="verb">sha512</spanx>, <spanx style="verb">sha3-256</spanx>, <spanx style="verb">sha3-384</spanx>, <spanx style="verb">sha3-512</spanx>. Algorithms including but not limited to MD5, CRC32, and SHA-1 MUST NOT be used and MUST be rejected by the client.</t>

<t>At least one entry MUST be present.</t>

<t>The signature input is constructed as defined in <xref target="signature-input"/>.</t>

</section>
<section anchor="duplicate-headers"><name>Duplicate Headers</name>

<t>When a client receives duplicate instances of <spanx style="verb">DIVE-Sig</spanx> (i.e., multiple headers with the same field name), it MUST concatenate their values with a comma separator, as permitted by <xref target="RFC9110"/> Section 5.2, and treat the result as a single header value. If a Key ID appears more than once across the combined value, the client MUST use the first occurrence and MUST ignore all subsequent occurrences of the same Key ID.</t>

</section>
</section>
<section anchor="client-implementation"><name>Client Implementation</name>

<section anchor="overview"><name>Overview</name>

<t>A DIVE client MUST implement the verification algorithm described in this section for all resources it downloads over HTTP or HTTPS. DIVE is exclusively intended for non-browser clients such as package managers, CLI tools, or automated agents. Browser clients MUST NOT implement or enforce DIVE. Implementors SHOULD support all scopes declared in the applicable policy record.</t>

<t>DIVE verification applies based on the origin of the resource being fetched. If a resource is fetched from a third-party domain, the client MUST look up the DIVE policy record of that third-party domain, not the policy of the domain that triggered the request. A domain that does not publish a valid <spanx style="verb">_dive</spanx> record is treated as not supporting DIVE, regardless of whether the referring domain supports it.</t>

</section>
<section anchor="policy-discovery"><name>Step 1: Policy Discovery</name>

<t>The client MUST attempt to locate the applicable <spanx style="verb">_dive</spanx> policy record for the resource's FQDN using the following procedure:</t>

<t><list style="numbers" type="1">
  <t>Starting from the full FQDN of the resource (e.g., <spanx style="verb">_dive.a.b.example.com</spanx>), query for a <spanx style="verb">_dive</spanx> TXT record.</t>
  <t>If no record is found, remove the leftmost label of the domain and repeat the query (e.g., <spanx style="verb">_dive.b.example.com</spanx>, then <spanx style="verb">_dive.example.com</spanx>).</t>
  <t>Continue until a record is found or no more labels remain.</t>
  <t>The first (most specific) record found is the applicable policy record.</t>
</list></t>

<t>If no <spanx style="verb">_dive</spanx> record is found at any level, DIVE is not supported for this resource. The client MUST proceed as if DIVE does not exist and MUST NOT block the resource on DIVE grounds.</t>

<t>If the policy record was retrieved without successful DNSSEC validation, the client MUST treat DIVE as not supported.</t>

<t>If the client holds a cached copy of the policy record that has not expired, it MUST use the cached copy and MUST NOT issue a DNS query.</t>

<t>Upon retrieving the record, the client MUST verify:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">v</spanx> parameter is present and its value is exactly <spanx style="verb">"dive-draft-00"</spanx>.</t>
  <t>The record is parseable as valid Structured Field syntax.</t>
</list></t>

<t>If either condition is not met, the client MUST treat DIVE as not supported for this domain. Unrecognised parameters MUST be ignored.</t>

<t>The client MUST then apply the <spanx style="verb">invalidate-keys-cache</spanx> directive if present, as described in <xref target="dive-record"/>.</t>

<t>The client MUST apply the <spanx style="verb">directives</spanx>, including <spanx style="verb">https-required</spanx>, as described in <xref target="dive-record"/>.</t>

<t>The client MUST cache the policy record for the duration indicated by the <spanx style="verb">cache</spanx> parameter, subject to the 86400-second maximum defined in <xref target="cache-management"/>.</t>

</section>
<section anchor="scope-determination"><name>Step 2: Scope Determination</name>

<t>The client MUST determine whether the resource falls within any scope listed in the <spanx style="verb">scopes</spanx> parameter of the applicable policy record.</t>

<t>If the <spanx style="verb">scopes</spanx> parameter is absent or empty, no resource-level verification is performed for this domain. The client MUST NOT block the resource on DIVE grounds (though other directives such as <spanx style="verb">https-required</spanx> continue to apply).</t>

<t>If the resource falls within at least one declared scope, the client MUST proceed to Step 3. If the resource does not fall within any declared scope, the client MUST proceed as if DIVE does not apply to this resource.</t>

<t>For standard scope detection:</t>

<t><list style="symbols">
  <t><spanx style="verb">strict</spanx>: every resource served under the covered domain is in scope.</t>
</list></t>

<t>For custom scopes, detection logic is application-defined (see <xref target="custom-scopes"/>).</t>

</section>
<section anchor="step-3-header-validation"><name>Step 3: Header Validation</name>

<t>For any resource that falls within a declared scope, the client MUST verify that a <spanx style="verb">DIVE-Sig</spanx> header is present in the HTTP response and syntactically conformant. If the header is absent or invalid, the client MUST refuse the resource.</t>

<t>Duplicate headers MUST be consolidated as described in <xref target="http-headers"/>.</t>

<t>If the header is absent or syntactically invalid, the client MUST refuse the resource.</t>

</section>
<section anchor="key-resolution"><name>Step 4: Key Resolution</name>

<t>For each entry listed in <spanx style="verb">DIVE-Sig</spanx>, the client MUST attempt to resolve the corresponding key record as follows:</t>

<t><list style="numbers" type="1">
  <t>Determine the starting FQDN for resolution:  <list style="symbols">
      <t>If the entry includes an explicit FQDN qualifier (<spanx style="verb">keyID@fqdn</spanx>), the client MUST verify that the specified FQDN is the same domain as the resource's origin or a parent domain thereof. If this condition is not satisfied, the client MUST treat this Key ID as invalid. The client MUST then query for <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;fqdn&gt;</spanx>. If the key record is not found at that exact level, the client MUST NOT search at levels above the specified FQDN. The client MAY search at more specific levels below the specified FQDN that are still applicable to the resource.</t>
      <t>If no FQDN qualifier is present, the client begins resolution at the most specific subdomain applicable to the resource (the level of the resource's FQDN) and works upward, label by label, until reaching the domain covered by the applicable policy record. At each level, the client queries for <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;level&gt;</spanx>.</t>
    </list></t>
  <t>Issue a DNSSEC-validated DNS TXT query for <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;level&gt;</spanx> at each level in the resolution order. The first record found is used.</t>
  <t>If no key record is found at any level, the client MUST treat this Key ID as unresolvable. It MUST remove any cached entry for this Key ID and issue a fresh DNS query. If the fresh query also yields no result, the client MUST consider verification as failed for this Key ID.</t>
  <t>If a key record is found but its content is not conformant with the format defined in <xref target="key-records"/>, the client MUST treat this Key ID as invalid. Unrecognised parameters MUST be ignored.</t>
  <t>If the key record was retrieved without successful DNSSEC validation, the client MUST treat this Key ID as invalid.</t>
</list></t>

<t>The client MUST cache a successfully retrieved and valid key record for the duration indicated by the <spanx style="verb">cache</spanx> parameter of the key record, subject to the 86400-second maximum, UNLESS the <spanx style="verb">invalidate-keys-cache</spanx> directive requires otherwise.</t>

</section>
<section anchor="signature-verification"><name>Step 5: Signature Verification</name>

<section anchor="signature-input"><name>Signature Input Construction</name>

<t>For each Key ID being verified, the client MUST construct the signature input as follows:</t>

<t><list style="numbers" type="1">
  <t>Obtain the raw bytes of the downloaded file as written to disk or delivered to the application layer.</t>
  <t>Compute the digest of that content using the hash algorithm declared for this Key ID in <spanx style="verb">DIVE-Sig</spanx>.</t>
  <t>Construct the byte string to be verified:  <vspace blankLines='1'/>
    <figure title="Construction of the verification input" anchor="input-construction"><sourcecode type="pseudocode"><![CDATA[
input = hash_algorithm_name || ":" || hash_bytes_raw
]]></sourcecode></figure>
  <vspace blankLines='1'/>
where <spanx style="verb">hash_algorithm_name</spanx> is the ASCII encoding of the algorithm name (e.g., <spanx style="verb">sha256</spanx>), <spanx style="verb">":"</spanx> is the ASCII colon character (0x3A), and <spanx style="verb">hash_bytes_raw</spanx> is the raw (binary, not hex or base64) digest output.  <vspace blankLines='1'/>
Example for SHA-256:  <vspace blankLines='1'/>
    <figure title="SHA-256 Input Example" anchor="input-example"><sourcecode type="pseudocode"><![CDATA[
input = "sha256:" || <32 raw bytes of SHA-256 digest>
]]></sourcecode></figure>
  </t>
</list></t>

</section>
<section anchor="verification-procedure"><name>Verification Procedure</name>

<t><list style="numbers" type="1">
  <t>Retrieve the Base64-encoded signature for this Key ID from <spanx style="verb">DIVE-Sig</spanx> and decode it.</t>
  <t>Retrieve the public key from the resolved key record.</t>
  <t>Verify the decoded signature over the <spanx style="verb">input</spanx> byte string using the algorithm declared in the <spanx style="verb">sig</spanx> parameter of the key record.</t>
  <t>If the <spanx style="verb">allowed-hash</spanx> parameter is present in the key record, verify that the hash algorithm declared in <spanx style="verb">DIVE-Sig</spanx> for this Key ID is listed in <spanx style="verb">allowed-hash</spanx>. If it is not, the verification MUST be treated as failed for this Key ID.</t>
  <t>If signature verification succeeds and the hash algorithm is permitted, the resource is considered authentic. The client MUST accept the resource.</t>
  <t>If verification fails for this Key ID, the client MUST proceed to the next entry listed in <spanx style="verb">DIVE-Sig</spanx> (if any) and repeat Steps 4-5 of this section. The reason for failure (invalid signature, unresolvable key, etc.) does not affect this fallback behaviour.</t>
</list></t>

<t>If at least one Key ID produces a successful verification, the resource MUST be accepted. If all Key IDs have been tried and none produced a successful verification, the client MUST refuse the resource, subject to the <spanx style="verb">report-only</spanx> directive.</t>

<t>If at least one Key ID successfully verifies the signature, the resource MUST be accepted.</t>

<t>If all Key IDs fail verification:</t>

<t><list style="symbols">
  <t>By default, the resource MUST be rejected.</t>
  <t>If the <spanx style="verb">report-only</spanx> directive is present, the resource MUST still be accepted, and a report MUST be sent to the URL specified in the <spanx style="verb">report-to</spanx> field of the corresponding <spanx style="verb">_dive</spanx> record (if present).</t>
</list></t>

<t>The client MUST NOT process (execute, render, or pass to the application layer) the resource body before completing signature verification. The body MAY be downloaded concurrently with DNS resolution (see <xref target="parallelism"/>), but MUST NOT be acted upon until verification is complete.</t>

</section>
</section>
<section anchor="reporting"><name>Step 6: Enforcement and Reporting</name>

<t>If the resource is refused and the <spanx style="verb">report-only</spanx> directive is present in the applicable policy record, the client MUST allow the resource to be used as if DIVE were not in effect, and MUST send a report as described below.</t>

<t>If the resource is refused and the <spanx style="verb">report-only</spanx> directive is absent, the client MUST block the resource.</t>

<t>In either case (blocked or blocked-but-allowed-by-report-only), if the <spanx style="verb">report-to</spanx> parameter is present in the applicable policy record, the client MUST send an HTTP POST request to the specified URL with <spanx style="verb">Content-Type: application/json</spanx> and the following JSON body:</t>

<figure title="Example of a DIVE Report JSON body" anchor="example-report-body"><sourcecode type="json"><![CDATA[
{
  "report-version": "0.1",
  "timestamp": 1700000000,
  "client": {
    "user-agent": "ExampleClient/1.0"
  },
  "policy": {
    "domain": "example.com",
    "fqdn": "sub.example.com",
    "dnssec-validated": true
  },
  "resource": {
    "url": "https://sub.example.com/static/app.js",
    "method": "GET",
    "status-code": 200,
    "scope": "strict"
  },
  "headers-received": {
    "dive-sig": "key1:sha256:BASE64SIG1,key2:sha384:BASE64SIG2"
  },
  "key-resolution": [
    {
      "key-id": "key1",
      "fqdn-queried": "key1._divekey.sub.example.com",
      "found": true,
      "dnssec-validated": true,
      "sig-algorithm": "ed25519"
    }
  ],
  "validation": {
    "hash-algorithm": "sha256",
    "hash-computed": "BASE64HASHVALUE",
    "signature-valid": false,
    "failure-reason": "signature-mismatch",
    "final-decision": "blocked"
  }
}
]]></sourcecode></figure>

<t>Fields that are absent, unavailable, or not applicable MUST be set to the JSON <spanx style="verb">null</spanx> value.</t>

<section anchor="report-field-definitions"><name>Report Field Definitions</name>

<dl>
  <dt><spanx style="verb">report-version</spanx>:</dt>
  <dd>
    <t>The version of the report format. For this specification the value MUST be <spanx style="verb">"0.1"</spanx>.</t>
  </dd>
  <dt><spanx style="verb">timestamp</spanx>:</dt>
  <dd>
    <t>Unix timestamp of the moment the report is generated.</t>
  </dd>
  <dt><spanx style="verb">client.user-agent</spanx>:</dt>
  <dd>
    <t>The User-Agent string of the DIVE client.</t>
  </dd>
  <dt><spanx style="verb">policy.domain</spanx>:</dt>
  <dd>
    <t>The apex domain of the applicable <spanx style="verb">_dive</spanx> policy record.</t>
  </dd>
  <dt><spanx style="verb">policy.fqdn</spanx>:</dt>
  <dd>
    <t>The FQDN of the resource being verified.</t>
  </dd>
  <dt><spanx style="verb">policy.dnssec-validated</spanx>:</dt>
  <dd>
    <t>Boolean. <spanx style="verb">true</spanx> if the policy record was retrieved with successful DNSSEC validation.</t>
  </dd>
  <dt><spanx style="verb">resource.url</spanx>:</dt>
  <dd>
    <t>The absolute URL of the resource that failed verification.</t>
  </dd>
  <dt><spanx style="verb">resource.method</spanx>:</dt>
  <dd>
    <t>The HTTP method used to retrieve the resource.</t>
  </dd>
  <dt><spanx style="verb">resource.status-code</spanx>:</dt>
  <dd>
    <t>The HTTP status code of the response.</t>
  </dd>
  <dt><spanx style="verb">resource.scope</spanx>:</dt>
  <dd>
    <t>The scope under which the resource was evaluated.</t>
  </dd>
  <dt><spanx style="verb">headers-received</spanx>:</dt>
  <dd>
    <t>The raw value of the <spanx style="verb">DIVE-Sig</spanx> response header as received, after duplicate consolidation.</t>
  </dd>
  <dt><spanx style="verb">key-resolution</spanx>:</dt>
  <dd>
    <t>An array containing one object per Key ID attempted, in the order they were tried. Each object contains:</t>
  </dd>
</dl>

<t><list style="symbols">
  <t><spanx style="verb">key-id</spanx>: the Key ID string;</t>
  <t><spanx style="verb">fqdn-queried</spanx>: the FQDN at which the DNS query was issued (of the form <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;domain&gt;</spanx>);</t>
  <t><spanx style="verb">found</spanx>: boolean, <spanx style="verb">true</spanx> if a key record was retrieved;</t>
  <t><spanx style="verb">dnssec-validated</spanx>: boolean, <spanx style="verb">true</spanx> if the key record was DNSSEC-validated;</t>
  <t><spanx style="verb">sig-algorithm</spanx>: the value of the <spanx style="verb">sig</spanx> parameter of the key record, or <spanx style="verb">null</spanx> if the record was not found or not conformant.</t>
</list></t>

<dl>
  <dt><spanx style="verb">validation.hash-algorithm</spanx>:</dt>
  <dd>
    <t>The hash algorithm used for the final verification attempt.</t>
  </dd>
  <dt><spanx style="verb">validation.hash-computed</spanx>:</dt>
  <dd>
    <t>The Base64 encoding of the computed digest.</t>
  </dd>
  <dt><spanx style="verb">validation.signature-valid</spanx>:</dt>
  <dd>
    <t>Boolean. <spanx style="verb">true</spanx> if at least one signature verification succeeded.</t>
  </dd>
  <dt><spanx style="verb">validation.failure-reason</spanx>:</dt>
  <dd>
    <t>A string identifying the reason for the verification failure. Permitted values are:</t>
  </dd>
</dl>

<t><list style="symbols">
  <t><spanx style="verb">"missing-headers"</spanx>: the <spanx style="verb">DIVE-Sig</spanx> response header is absent or syntactically invalid;</t>
  <t><spanx style="verb">"key-not-found"</spanx>: no key record was found in DNS for any listed Key ID;</t>
  <t><spanx style="verb">"key-invalid"</spanx>: a key record was found but is not conformant with this specification;</t>
  <t><spanx style="verb">"dnssec-unavailable"</spanx>: DNSSEC validation could not be performed or failed;</t>
  <t><spanx style="verb">"hash-algorithm-not-allowed"</spanx>: the hash algorithm declared in <spanx style="verb">DIVE-Sig</spanx> is not listed in the <spanx style="verb">allowed-hash</spanx> parameter of the key record;</t>
  <t><spanx style="verb">"signature-mismatch"</spanx>: the signature did not verify against the computed digest;</t>
  <t><spanx style="verb">"no-valid-key"</spanx>: all listed Key IDs were attempted and none produced a successful verification.</t>
</list></t>

<dl>
  <dt><spanx style="verb">validation.final-decision</spanx>:</dt>
  <dd>
    <t>A string indicating the enforcement outcome. Permitted values are:</t>
  </dd>
</dl>

<t><list style="symbols">
  <t><spanx style="verb">"blocked"</spanx>: the resource was refused;</t>
  <t><spanx style="verb">"allowed-report-only"</spanx>: the resource was refused by DIVE but allowed due to the <spanx style="verb">report-only</spanx> directive.</t>
</list></t>

<t>If the <spanx style="verb">report-to</spanx> URL is unreachable or the POST request fails, the client MUST NOT treat this as a DIVE verification error. The failure to deliver the report has no effect on the acceptance or refusal of the resource.</t>

<t>The <spanx style="verb">report-to</spanx> URL MAY be on a third-party domain.</t>

</section>
</section>
<section anchor="cache-management"><name>Cache Management</name>

<t>Clients MUST enforce an absolute maximum cache duration of 86400 seconds (24 hours) for all DIVE records (both policy records and key records), regardless of the value of the <spanx style="verb">cache</spanx> parameter. This limit mitigates denial-of-service attacks in which an attacker publishes a malicious record with an artificially long cache duration.</t>

<t>When a key record cannot be resolved (e.g., the record has been removed from DNS), the client MUST evict any cached entry for that Key ID and issue a fresh DNS query. If the fresh query yields a different valid record, the client MUST restart the verification procedure from Step 4 using the new record. If the new record produces a different verification outcome than the cached record would have, the process continues with the new result.</t>

</section>
<section anchor="parallelism"><name>Parallelism</name>

<t>To minimise latency, a client MAY initiate DNS resolution for key records concurrently with the download of the resource body. However, the client MUST NOT deliver or act upon the resource body until all required DNS queries have completed and the verification procedure defined in <xref target="signature-verification"/> has concluded.</t>

</section>
</section>
<section anchor="operational-security"><name>Operational Security Recommendations</name>

<section anchor="key-rotation"><name>Key Rotation</name>

<t>To rotate a signing key without service disruption, operators SHOULD follow this procedure:</t>

<t><list style="numbers" type="1">
  <t>Generate a new key pair and publish the new public key under a new Key ID in DNS at the appropriate <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;domain&gt;</spanx> label.</t>
  <t>Wait for the DNS TTL of the old key record to expire, so that all resolver caches have had the opportunity to observe both the old and the new key records.</t>
  <t>Update all resources to carry signatures and headers referencing the new Key ID.</t>
  <t>Remove the old key record from DNS only after all affected resources have been updated.</t>
</list></t>

<t>Operators MUST NOT reuse a Key ID after its associated key record has been removed from DNS. Reuse of Key IDs may cause stale cached records on clients to be applied to the wrong key material.</t>

</section>
<section anchor="response-to-key-compromise"><name>Response to Key Compromise</name>

<t>Upon discovering that a private key has been compromised, the operator MUST:</t>

<t><list style="numbers" type="1">
  <t>Immediately begin the key rotation procedure (<xref target="key-rotation"/>).</t>
  <t>Set the <spanx style="verb">invalidate-keys-cache</spanx> parameter in ALL applicable <spanx style="verb">_dive</spanx> policy records to a Unix timestamp greater than or equal to the moment at which the key is considered compromised, accounting for DNS TTL propagation delay.</t>
  <t>Remove the compromised key record from DNS (i.e., remove the <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;domain&gt;</spanx> TXT record) as soon as the new key is operational. Until the compromised key record is removed, DIVE clients will continue to accept resources signed with the compromised key. CDN or cache purges of signed resources do not substitute for key record removal.</t>
</list></t>

<t>Operators MUST NOT set the <spanx style="verb">report-only</spanx> directive as a temporary measure during key compromise remediation. Doing so would disable enforcement and allow an attacker in possession of the compromised private key to serve malicious resources to DIVE clients without triggering a block.</t>

</section>
<section anchor="private-key-storage"><name>Private Key Storage</name>

<t>Operators SHOULD NOT store private signing keys on servers that generate or serve HTTP responses. Keys SHOULD be kept in dedicated offline or hardware security module (HSM) environments, with signatures pre-computed and injected at deployment time.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="threat-model"><name>Threat Model</name>

<t>DIVE is designed to protect against an attacker who has compromised the origin web server but not the DNS infrastructure. Such an attacker can serve arbitrary HTTP response bodies and headers but cannot forge DNSSEC-validated DNS records. Consequently, the attacker cannot publish a new public key or modify the DIVE policy, and a DIVE-compliant client will reject any resource that is not signed with a key whose public counterpart is published in DNSSEC-validated DNS under the <spanx style="verb">_divekey</spanx> label.</t>

<t>DIVE does NOT protect against an attacker who controls both the DNS infrastructure and the origin server, nor does it protect against the compromise of the private keys or the discovery of a vulnerability in the underlying cryptographic algorithms.</t>

</section>
<section anchor="dnssec-as-a-trust-anchor"><name>DNSSEC as a Trust Anchor</name>

<t>The primary security model of DIVE leverages DNSSEC for maximum integrity. If DNSSEC validation is absent or bypassed, a client SHOULD still perform DIVE verification using the available DNS records, although it MUST treat the policy and public keys as unauthenticated (see <xref target="policy-discovery"/> and <xref target="key-resolution"/>). Operators MUST ensure that DNSSEC is correctly deployed and maintained for all zones publishing DIVE records, including both <spanx style="verb">_dive</spanx> policy records and <spanx style="verb">_divekey</spanx> key records.</t>

<t>A DIVE client MUST obtain DNSSEC validation status for all DNS records it retrieves. Two deployment models are recognised:</t>

<t><list style="symbols">
  <t><strong>Stub validator</strong>: the client performs DNSSEC signature verification itself, independently of the resolver. This model provides the strongest guarantees and is RECOMMENDED for all DIVE client implementations.</t>
  <t><strong>Validating resolver</strong>: the client delegates DNSSEC validation to a resolver that sets the Authenticated Data (AD) bit in its responses <xref target="RFC4035"/>. This model is tolerated for implementations where stub validation is impractical. When relying on a validating resolver, the client MUST communicate with the resolver over an encrypted channel (DoH <xref target="RFC8484"/> or DoT <xref target="RFC7858"/>). The client MUST NOT trust the AD bit over an unencrypted connection or when the resolver is not under the client's control.</t>
</list></t>

<t>In both cases, a record for which DNSSEC validation cannot be confirmed MUST be treated as absent.</t>

</section>
<section anchor="algorithm-agility-and-prohibited-algorithms"><name>Algorithm Agility and Prohibited Algorithms</name>

<t>DIVE explicitly prohibits weak or legacy algorithms. Signature algorithms other than Ed25519 and Ed448 MUST NOT be accepted. Hash algorithms other than SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384 and SHA3-512 MUST NOT be accepted. Clients MUST reject resources or key records that reference prohibited algorithms. This prevents downgrade attacks where an attacker replaces headers to reference a weaker algorithm.</t>

</section>
<section anchor="cache-poisoning-and-denial-of-service"><name>Cache Poisoning and Denial of Service</name>

<t>An attacker who can inject or modify DNS responses may attempt to poison the client's DIVE record cache with a record that has a very long <spanx style="verb">cache</spanx> value, causing the client to use stale or malicious configuration for an extended period. The 86400-second cache cap defined in <xref target="cache-management"/> limits the window of such an attack.</t>

<t>This attack is substantially mitigated by the DNSSEC requirement: an attacker without control of the DNS signing key cannot inject DNSSEC-validated records.</t>

</section>
<section anchor="privacy-considerations"><name>Privacy Considerations</name>

<t>The client sends DNS queries for <spanx style="verb">_dive</spanx> policy records and <spanx style="verb">_divekey</spanx> key records, which may reveal browsing activity to the DNS resolver. Operators and implementors SHOULD consider using DNS-over-HTTPS (DoH) <xref target="RFC8484"/> or DNS-over-TLS (DoT) <xref target="RFC7858"/> to protect the confidentiality of these queries.</t>

<t>The verification failure report sent to the <spanx style="verb">report-to</spanx> endpoint includes the resource URL, the client User-Agent, and other request metadata. Operators MUST ensure that the report endpoint is operated in accordance with applicable privacy regulations.</t>

</section>
<section anchor="scope-of-protection"><name>Scope of Protection</name>

<t>DIVE verifies the integrity and authenticity of resource bodies. It does not protect HTTP response headers other than the <spanx style="verb">DIVE-Sig</spanx> header defined in this document, nor does it protect HTTP request parameters, cookies, or any content rendered inside the resource body (e.g., URLs embedded in HTML).</t>

</section>
<section anchor="interaction-with-http-caches"><name>Interaction with HTTP Caches</name>

<t>If an HTTP cache returns a cached response, the DIVE headers in that cached response MUST be verified against the DNS records at the time the cached response is used. If the DNS records have changed (e.g., the key has been rotated), the cached response may fail verification and be refused.</t>

<t>DIVE clients MUST NOT bypass intermediate HTTP caches solely for the purpose of retrieving fresh DIVE headers. Standard HTTP cache semantics <xref target="RFC9111"/> apply to DIVE-protected responses.</t>

<t>Operators MUST be aware that intermediate caches (proxies, CDNs) may serve stale DIVE headers after a key rotation or key revocation. Operators SHOULD purge affected cache entries as part of the key rotation procedure (<xref target="key-rotation"/>) to prevent verification failures on clients that receive cached responses signed with a key that is no longer present in DNS.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="http-response-header-fields"><name>HTTP Response Header Fields</name>

<t>IANA is requested to register the following header field names in the "Hypertext Transfer Protocol (HTTP) Field Name Registry" maintained at <eref target="https://www.iana.org/assignments/http-fields/">https://www.iana.org/assignments/http-fields/</eref>:</t>

<texttable>
      <ttcol align='left'>Header Field Name</ttcol>
      <ttcol align='left'>Status</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c><spanx style="verb">DIVE-Sig</spanx></c>
      <c>provisional</c>
      <c>This document</c>
</texttable>

</section>
<section anchor="dns-resource-record-types"><name>DNS Resource Record Types</name>

<t>No new DNS resource record types are defined by this document. DIVE uses existing DNS TXT records (type 16) <xref target="RFC1035"/>.</t>

</section>
<section anchor="dive-scope-registry"><name>DIVE Scope Registry</name>

<t>IANA is requested to create a new registry named "DIVE Scope Names" under a new registry group "Domain-based Integrity Verification Enforcement (DIVE)".</t>

<t>The policy for registration in this registry is "Specification Required" as defined in <xref target="RFC8126"/>.</t>

<t>The initial contents of the registry are:</t>

<texttable>
      <ttcol align='left'>Scope Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Detection Criterion</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c><spanx style="verb">strict</spanx></c>
      <c>All resources in the covered domain</c>
      <c>No additional criterion; applies to all resources.</c>
      <c>This document</c>
</texttable>

<t>Custom scopes using the <spanx style="verb">x-</spanx> prefix are not subject to IANA registration.</t>

</section>
<section anchor="dive-directive-registry"><name>DIVE Directive Registry</name>

<t>IANA is requested to create a new registry named "DIVE Directive Names" under the "Domain-based Integrity Verification Enforcement (DIVE)" registry group.</t>

<t>The policy for registration in this registry is "Specification Required" as defined in <xref target="RFC8126"/>.</t>

<t>The initial contents of the registry are:</t>

<texttable>
      <ttcol align='left'>Directive Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c><spanx style="verb">https-required</spanx></c>
      <c>The client MUST NOT issue plain-HTTP requests for resources covered by a policy containing the https-required directive. If a request is attempted over plain-HTTP, the client MUST either upgrade the request to HTTPS or abort it.</c>
      <c>This document</c>
      <c><spanx style="verb">report-only</spanx></c>
      <c>Client MUST NOT block failures; MUST report them instead.</c>
      <c>This document</c>
</texttable>

</section>
</section>
<section anchor="implementation-status"><name>Implementation Status</name>

<t>This section is provided for informational purposes only and is not normative.</t>

<t>An experimental implementation of the DIVE protocol is available:</t>

<t><list style="symbols">
  <t>OpenDIVE Client: <eref target="https://github.com/diveprotocol/opendive-client">https://github.com/diveprotocol/opendive</eref></t>
</list></t>

<t>Additional information about the protocol is available at:</t>

<t><list style="symbols">
  <t><eref target="https://diveprotocol.org">https://diveprotocol.org</eref></t>
</list></t>

<t>{backmatter}</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">

&RFC2119;
&RFC8174;
&RFC9651;
&RFC4033;
&RFC4034;
&RFC4035;
&RFC8032;
&RFC6234;
&RFC9110;
&RFC9111;
&RFC1035;
&RFC8126;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

&RFC8484;
&RFC7858;


    </references>

</references>



  </back>

<!-- ##markdown-source:
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
gnqUX0r7F5jzE7ZZWCGmVV8G/xfT11WV2qoAAA==

-->

</rfc>

