<?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 RFC9421 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9421.xml">
<!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 RFC8032 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8032.xml">
<!ENTITY RFC9530 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9530.xml">
<!ENTITY RFC8126 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml">
<!ENTITY RFC6234 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6234.xml">
<!ENTITY RFC1035 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1035.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-01" 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="24"/>

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

    <abstract>


<?line 47?>

<t>Domain-based Integrity Verification Enforcement (DIVE) is an application-layer protocol that provides cryptographic integrity and authenticity verification of HTTP response bodies by leveraging the Domain Name System Security Extensions (DNSSEC) as an out-of-band distribution channel for public keys.</t>

<t>DIVE has two independent components: (1) an object-security layer, which uses HTTP Message Signatures (RFC 9421) to carry per-resource signatures in HTTP response headers, and (2) a DNS key-distribution layer, which publishes public keys and policy in DNSSEC-protected TXT records. 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 to deliver a tampered resource to a DIVE-compliant client.</t>



    </abstract>



  </front>

  <middle>


<?line 53?>

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

<t>Transport-layer security protects data in transit but does not protect against a compromised origin server that serves malicious content over a legitimate TLS session. Subresource Integrity (SRI) embeds expected hashes in HTML markup, but because that markup is itself served by the potentially compromised host, it provides limited security during a full infrastructure breach.</t>

<t>DIVE addresses this threat by separating two concerns:</t>

<t><list style="symbols">
  <t><strong>Object security</strong>: HTTP Message Signatures <xref target="RFC9421"/> carry a cryptographic signature over the response body. The signature travels with the resource and can be verified at any point after receipt.</t>
  <t><strong>Key distribution</strong>: DNSSEC-protected DNS TXT records publish the authoritative public keys and policy. Because DNS is administered independently from the origin server, an attacker who controls only the origin cannot forge a valid DNS-published key.</t>
</list></t>

<t>DIVE is designed for non-browser automated clients such as package managers, CLI tools, and software-update agents. Browser clients MUST NOT implement or enforce DIVE.</t>

<t>DIVE is incrementally deployable: servers add DNS records and HTTP signatures; clients that do not implement DIVE are unaffected.</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>

<dl>
  <dt>DIVE client:</dt>
  <dd>
    <t>An HTTP client 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-conformant HTTP Message Signatures on covered resources.</t>
  </dd>
  <dt>Resource:</dt>
  <dd>
    <t>A single HTTP response body received with status code 200.</t>
  </dd>
  <dt>Scope:</dt>
  <dd>
    <t>A named category of resources subject to DIVE verification (<xref target="scopes"/>).</t>
  </dd>
  <dt>Key ID:</dt>
  <dd>
    <t>An operator-assigned label that names a specific DNS key record and is referenced in HTTP Message Signatures via the <spanx style="verb">keyid</spanx> parameter (<xref target="RFC9421"/> Section 2.3).</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 (<xref target="dive-record"/>).</t>
  </dd>
  <dt>Key record:</dt>
  <dd>
    <t>A DNS TXT record that publishes a public key, placed at <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;domain&gt;</spanx> (<xref target="key-records"/>).</t>
  </dd>
  <dt>Structured Field:</dt>
  <dd>
    <t>A value encoded per <xref target="RFC9651"/>.</t>
  </dd>
  <dt>Unix timestamp:</dt>
  <dd>
    <t>Seconds since 1970-01-01T00:00:00Z (UTC), excluding leap seconds, as a signed integer.</t>
  </dd>
</dl>

</section>
<section anchor="architecture"><name>Architecture</name>

<t>DIVE separates object security from key distribution:</t>

<figure title="DIVE Architecture and Verification Flow" anchor="architecture-diagram"><artwork><![CDATA[
  Origin Server                   DNS (DNSSEC)
  +---------------+               +-----------------------+
  | Body response |               | _dive TXT: policy     |
  | signed with   |               | <keyid>._divekey TXT: |
  | private key   |               |   public key, params  |
  +--------+------+               +-----------+-----------+
           |                                  |
           | HTTP response                    | DNS/DNSSEC query
           | (Signature: header)              |
           v                                  v
  +--------+----------------------------------+-----------+
  |                      DIVE Client                      |
  |  1. Discover policy via _dive DNS record              |
  |  2. Determine resource scope                          |
  |  3. Resolve public key from _divekey DNS record       |
  |  4. Verify HTTP Message Signature over response body  |
  +-------------------------------------------------------+
]]></artwork></figure>

<t>The Signature and Signature-Input headers are defined by <xref target="RFC9421"/>. The DNS records are defined by this document.</t>

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

<t>A scope identifies the category of resources to which DIVE verification applies.</t>

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

<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 policy record.</t>
  </dd>
</dl>

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

<t>Operators MAY define custom scopes for application-specific resource categories. Custom scope names MUST begin with <spanx style="verb">x-</spanx>, be entirely lowercase, and contain only <spanx style="verb">a-z</spanx> and <spanx style="verb">-</spanx> after the prefix.</t>

<t>Custom scopes are intended for closed environments where server and client are under the same operator's control. Detection logic for custom scopes is application-defined.</t>

<t>A DIVE client that does not recognise a custom scope MUST ignore it.</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 publishing DIVE records. If a client retrieves a <spanx style="verb">_dive</spanx> record without DNSSEC validation, it MUST treat DIVE as not supported for that domain.</t>

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

<t>All DIVE DNS records are DNS TXT records. Values MUST be formatted as Structured Field Values <xref target="RFC9651"/>. Parameter names and values MUST be lowercase unless otherwise stated. Timestamps are Unix timestamps represented as Structured Field Integers.</t>

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

<t>The <spanx style="verb">_dive</spanx> TXT record is placed at the <spanx style="verb">_dive</spanx> label of the domain or subdomain it governs (e.g., <spanx style="verb">_dive.example.com</spanx>). A record at a given level applies to all subordinate labels unless overridden by a more specific record.</t>

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

<figure title="Example of a DIVE Policy Record" anchor="dns-example-dive"><sourcecode type="dns-rr"><![CDATA[
_dive.example.com.  300  IN  TXT  (
  "v=\"dive-draft-01\", "
  "scopes=(\"strict\"), "
  "directives=(\"https-required\"), "
  "cache=300, "
  "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>Protocol version string. MUST be <spanx style="verb">"dive-draft-01"</spanx>. If absent, unrecognised, or unparseable, the client MUST treat DIVE as not supported for this domain.</t>
  </dd>
  <dt><spanx style="verb">scopes</spanx> (OPTIONAL):</dt>
  <dd>
    <t>Structured Field List of scope names (Strings). If absent or empty, no resource-level verification is performed, though other directives still apply.</t>
  </dd>
  <dt><spanx style="verb">directives</spanx> (OPTIONAL):</dt>
  <dd>
    <t>Structured Field List of behavioural directives (Strings):</t>
  </dd>
</dl>

<t><list style="symbols">
  <t><spanx style="verb">"https-required"</spanx>: the client MUST refuse or upgrade plain-HTTP requests for resources under the covered domain.</t>
  <t><spanx style="verb">"report-only"</spanx>: the client MUST NOT block resources that fail DIVE verification; it MUST report failures per <xref target="reporting"/> instead.</t>
</list></t>

<t>Unrecognised directive values MUST be ignored.</t>

<dl>
  <dt><spanx style="verb">cache</spanx> (OPTIONAL):</dt>
  <dd>
    <t>Structured Field Integer. Number of seconds the client MAY cache this record (default: 0). MUST NOT exceed 3600 (<xref target="cache-management"/>).</t>
  </dd>
  <dt><spanx style="verb">invalidate-keys-cache</spanx> (OPTIONAL):</dt>
  <dd>
    <t>Structured Field Integer (Unix timestamp). When present, the client MUST purge cached key records for the domain stored at or before this timestamp. If the timestamp is in the future, the client MUST issue a fresh DNS query on each verification attempt until the timestamp has passed.</t>
  </dd>
  <dt><spanx style="verb">report-to</spanx> (OPTIONAL):</dt>
  <dd>
    <t>Structured Field String. An absolute HTTPS URL to which failure reports MUST be sent (<xref target="reporting"/>). Plain HTTP URLs MUST be ignored.</t>
  </dd>
</dl>

<t>Unrecognised parameters MUST be ignored.</t>

<t><strong>Operational note:</strong> Operators SHOULD set the DNS TTL of <spanx style="verb">_dive</spanx> records to 300 seconds.</t>

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

<t>When one or more scopes are declared, 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 at <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;domain&gt;</spanx>. A Key ID MAY contain <spanx style="verb">A-Z</spanx>, <spanx style="verb">a-z</spanx>, <spanx style="verb">0-9</spanx>, and <spanx style="verb">_</spanx>; it MUST NOT contain other characters; it is case-sensitive.</t>

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

<figure title="Example of a DIVE Key Record" anchor="dns-example-key"><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>Signature algorithm. MUST be one of <spanx style="verb">"ed25519"</spanx> (<xref target="RFC8032"/> Section 5.1) or <spanx style="verb">"ed448"</spanx> (<xref target="RFC8032"/> Section 5.2). All other algorithms MUST be rejected.</t>
  </dd>
  <dt><spanx style="verb">key</spanx> (REQUIRED):</dt>
  <dd>
    <t>Structured Field Byte Sequence containing the raw public key bytes for the declared algorithm (32 bytes for Ed25519, 57 bytes for Ed448).</t>
  </dd>
  <dt><spanx style="verb">allowed-hash</spanx> (OPTIONAL):</dt>
  <dd>
    <t>Structured Field List of permitted hash algorithms (Strings). Permitted values: <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>. MD5, CRC32, and SHA-1 MUST NOT be listed and MUST be rejected. When present, the hash algorithm used in the corresponding signature MUST appear in this list; otherwise verification MUST be treated as failed.</t>
  </dd>
  <dt><spanx style="verb">cache</spanx> (OPTIONAL):</dt>
  <dd>
    <t>Structured Field Integer. Number of seconds the client MAY cache this record (default: 0). MUST NOT exceed 86400 (<xref target="cache-management"/>).</t>
  </dd>
</dl>

<t>Unrecognised parameters MUST be ignored.</t>

<t><strong>Operational note:</strong> Operators SHOULD set the DNS TTL of key records to 900 seconds and SHOULD perform regular key rotation (<xref target="key-rotation"/>). A Key ID SHOULD NOT be reused after its associated record has been removed.</t>

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

<t>Operators MAY publish policy and key records at any subdomain level. The most specific matching record takes precedence.</t>

</section>
</section>
<section anchor="http-signatures"><name>HTTP Signatures</name>

<t>DIVE uses HTTP Message Signatures <xref target="RFC9421"/> to carry per-resource signatures. A DIVE server MUST include <spanx style="verb">Signature</spanx> and <spanx style="verb">Signature-Input</spanx> response headers on all 200 responses for resources within a declared scope.</t>

<section anchor="signature-coverage"><name>Signature Coverage</name>

<t>Each DIVE signature MUST cover the <spanx style="verb">content-digest</spanx> derived component (<xref target="RFC9421"/> Section 2.4), which commits the signature to the response body. Servers MUST include a <spanx style="verb">Content-Digest</spanx> header <xref target="RFC9530"/> in each covered response.</t>

</section>
<section anchor="key-identification-and-multiple-signatures"><name>Key Identification and Multiple Signatures</name>

<t>The <spanx style="verb">keyid</spanx> parameter in <spanx style="verb">Signature-Input</spanx> MUST be set to the Key ID of the DNS key record used to create the signature. The <spanx style="verb">alg</spanx> parameter MUST be set to <spanx style="verb">"ed25519"</spanx> or <spanx style="verb">"ed448"</spanx> as appropriate.</t>

<t>To support key rotation (<xref target="key-rotation"/>), a server MAY include multiple signatures in a single response by providing multiple <spanx style="verb">Signature</spanx> and <spanx style="verb">Signature-Input</spanx> entries (<xref target="RFC9421"/> Section 4.2), each referencing a different Key ID.</t>

<t>A DIVE client MUST attempt verification using the available signature entries in order. The client MUST NOT assume prior knowledge of key ordering semantics beyond the order provided in the response. If the client has previously cached a public key matching a given <spanx style="verb">keyid</spanx>, it SHOULD prefer using the cached key for verification of the corresponding signature entry. Otherwise, the client MUST use the first available signature entry, and proceed to the next entry only if verification fails. The resource MUST be accepted as soon as one verification succeeds.</t>

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

<t>The following example illustrates two concurrent signatures for key rotation. <spanx style="verb">keyDEF</spanx> is the newly introduced signing key being rolled in, while <spanx style="verb">keyABC</spanx> is the previously active key.</t>

<figure title="Example of Concurrent Signatures for Key Rotation" anchor="http-example-rotation"><sourcecode type="http-message"><![CDATA[
Content-Digest: sha-256=:BASE64DIGEST:
Signature-Input: sigDEF=("content-digest");keyid="keyDEF"; \
                 alg="ed25519", \
                 sigABC=("content-digest");keyid="keyABC"; \
                 alg="ed25519"
Signature: sigDEF=:BASE64SIG2:, \
           sigABC=:BASE64SIG1:
]]></sourcecode></figure>

<t>Clients that have already cached <spanx style="verb">keyDEF</spanx> will verify using <spanx style="verb">sigDEF</spanx> directly. Clients that have not cached any key will attempt verification starting with the first signature entry (<spanx style="verb">sigDEF</spanx>), and will fall back to <spanx style="verb">sigABC</spanx> if needed. Clients that have cached <spanx style="verb">keyABC</spanx> MAY directly use <spanx style="verb">sigABC</spanx> for verification, but MUST still follow the ordered fallback behavior if verification fails.</t>

<t>The list of signatures SHOULD contain no more than three entries to maintain compatibility with HTTP implementations that impose header-length limits.</t>

</section>
</section>
<section anchor="hash-algorithm-binding"><name>Hash Algorithm Binding</name>

<t>The hash algorithm used to compute <spanx style="verb">Content-Digest</spanx> MUST be consistent with the <spanx style="verb">allowed-hash</spanx> parameter of the key record (<xref target="key-records"/>), when that parameter is present.</t>

<t>Permitted hash algorithms for <spanx style="verb">Content-Digest</spanx>: <spanx style="verb">sha-256</spanx>, <spanx style="verb">sha-384</spanx>, <spanx style="verb">sha-512</spanx>, <spanx style="verb">sha3-256</spanx>, <spanx style="verb">sha3-384</spanx>, <spanx style="verb">sha3-512</spanx>. MD5, CRC32, and SHA-1 MUST NOT be used and MUST be rejected by the client.</t>

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

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

<t>The client MUST locate the applicable <spanx style="verb">_dive</spanx> TXT record by querying from the resource's full FQDN upward, one label at a time, until a record is found or no labels remain. The most specific (deepest) record found applies.</t>

<t>If no record is found, DIVE is not supported.</t>

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

<t>If a valid cached copy of the policy record has not expired, the client MUST use it.</t>

<t>Upon retrieving the record, the client MUST verify the <spanx style="verb">v</spanx> parameter and parsability. It MUST apply <spanx style="verb">invalidate-keys-cache</spanx> and the <spanx style="verb">https-required</spanx> directive as specified in <xref target="dive-record"/>. It MUST cache the record per the <spanx style="verb">cache</spanx> parameter, subject to the 3600-second cap.</t>

<t>DIVE verification is based on the resource's own origin. If a resource is fetched from a third-party domain, the client MUST look up that domain's <spanx style="verb">_dive</spanx> record, not the referring domain's.</t>

<t>If DIVE is not supported, the client MAY choose to block the resource based on its own requirements.</t>

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

<t>If <spanx style="verb">scopes</spanx> is absent or empty, no resource-level verification is performed. Other directives (e.g., <spanx style="verb">https-required</spanx>) still apply.</t>

<t>If the resource falls within at least one declared scope, proceed to Step 3. Standard scope detection:</t>

<t><list style="symbols">
  <t><spanx style="verb">strict</spanx>: all resources under the covered domain are in scope.</t>
</list></t>

<t>Custom scope detection is application-defined.</t>

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

<t>The client MUST verify that <spanx style="verb">Signature</spanx> and <spanx style="verb">Signature-Input</spanx> headers are present and syntactically conformant per <xref target="RFC9421"/>. If either header is absent or invalid, the client MUST refuse the resource.</t>

<t>The client MUST also verify that a <spanx style="verb">Content-Digest</spanx> header is present and parseable per <xref target="RFC9530"/>.</t>

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

<t>For each signature entry in <spanx style="verb">Signature-Input</spanx>, the client resolves the key record as follows:</t>

<t>If <spanx style="verb">keyid</spanx> contains an <spanx style="verb">@</spanx>-qualified FQDN (e.g., <spanx style="verb">keyABC@example.com</spanx>), the client MUST verify that the specified FQDN is equal to or a parent of the resource's origin FQDN. If not, the entry MUST be treated as invalid. The client MUST query exactly <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;fqdn&gt;</spanx> and MUST NOT search at levels above the specified FQDN.</t>

<t>Otherwise, the client queries from the resource's FQDN upward, label by label, stopping at the level of the applicable policy record, querying <spanx style="verb">&lt;Key-ID&gt;._divekey.&lt;level&gt;</spanx> at each step. The first record found is used.</t>

<t>In all cases, the DNS query MUST be DNSSEC-validated. A record retrieved without DNSSEC validation MUST be treated as absent.</t>

<t>If no key record is found after cache eviction and a fresh DNS query, the Key ID is unresolvable and verification fails for that entry.</t>

<t>The client MUST cache a valid key record per its <spanx style="verb">cache</spanx> parameter, subject to the 86400-second cap and any <spanx style="verb">invalidate-keys-cache</spanx> constraint.</t>

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

<t>For each signature entry, the client MUST:</t>

<t><list style="numbers" type="1">
  <t>Recompute the <spanx style="verb">Content-Digest</spanx> over the received response body using the hash algorithm declared in the <spanx style="verb">Content-Digest</spanx> header and verify it matches.</t>
  <t>Reconstruct the signature base as defined by <xref target="RFC9421"/> Section 2.5 from the <spanx style="verb">Signature-Input</spanx> components.</t>
  <t>Retrieve the public key from the resolved key record.</t>
  <t>If <spanx style="verb">allowed-hash</spanx> is present in the key record, verify the hash algorithm in <spanx style="verb">Content-Digest</spanx> is listed; if not, fail this entry.</t>
  <t>Verify the decoded signature over the signature base using the algorithm declared in <spanx style="verb">sig</spanx> of the key record.</t>
</list></t>

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

<t>If all entries fail:</t>

<t><list style="symbols">
  <t>By default, the resource MUST be rejected.</t>
  <t>If <spanx style="verb">report-to</spanx> is present, a report MUST be sent per <xref target="reporting"/>.</t>
  <t>If <spanx style="verb">report-only</spanx> is present, the resource MUST be accepted.</t>
</list></t>

<t>The client MUST NOT act upon the resource body before completing verification. The body MAY be downloaded concurrently with DNS resolution, but MUST NOT be delivered to the application until verification is complete.</t>

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

<t>When a resource fails verification (whether blocked or allowed under <spanx style="verb">report-only</spanx>), and <spanx style="verb">report-to</spanx> is set, the client MUST POST to that URL with <spanx style="verb">Content-Type: application/json</spanx>:</t>

<figure title="Example of a DIVE Issue Report" anchor="report-example-json"><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/downloads/invalid.zip",
    "method": "GET",
    "status-code": 200,
    "scope": "strict"
  },
  "headers-received": {
    "signature-input":
      "sig1=(\"content-digest\");keyid=\"keyABC\";alg=\"ed25519\"",
    "signature": "sig1=:BASE64SIG:",
    "content-digest": "sha-256=:BASE64DIGEST:"
  },
  "key-resolution": [
    {
      "key-id": "keyABC",
      "fqdn-queried": "keyABC._divekey.sub.example.com",
      "found": true,
      "dnssec-validated": true,
      "sig-algorithm": "ed25519"
    }
  ],
  "validation": {
    "hash-algorithm": "sha-256",
    "hash-computed": "BASE64HASHVALUE",
    "signature-valid": false,
    "failure-reason": "signature-mismatch",
    "final-decision": "blocked"
  }
}
]]></sourcecode></figure>

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

<t><spanx style="verb">failure-reason</spanx> permitted values: <spanx style="verb">"missing-headers"</spanx>, <spanx style="verb">"key-not-found"</spanx>, <spanx style="verb">"key-invalid"</spanx>, <spanx style="verb">"dnssec-unavailable"</spanx>, <spanx style="verb">"hash-algorithm-not-allowed"</spanx>, <spanx style="verb">"signature-mismatch"</spanx>, <spanx style="verb">"no-valid-key"</spanx>.</t>

<t><spanx style="verb">final-decision</spanx> permitted values: <spanx style="verb">"blocked"</spanx>, <spanx style="verb">"allowed-report-only"</spanx>.</t>

<t>Failure to deliver a report MUST NOT affect the resource acceptance decision.</t>

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

<t>Clients MUST enforce an absolute maximum cache duration of 3600 seconds for all <spanx style="verb">_dive</spanx> records and 86400 seconds for all <spanx style="verb">_divekey</spanx> records, regardless of the <spanx style="verb">cache</spanx> parameter. When a key record cannot be resolved, the client MUST evict any cached entry and issue a fresh DNS query before failing.</t>

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

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

<t>To rotate a signing key without service disruption:</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.</t>
  <t>Wait for the new key record to propagate throughout the DNS.</t>
  <t>Begin including both the old and new signatures in HTTP responses (using multiple <spanx style="verb">Signature</spanx> entries per <xref target="http-signatures"/>).</t>
  <t>Once the new signature has been successfully validated across all resources (ensuring no service disruption), remove the old signature from HTTP responses.</t>
  <t>Remove the old key record from DNS.</t>
</list></t>

<t>Key IDs MUST NOT be reused after their associated key records have been removed from DNS.</t>

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

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

<t><list style="numbers" type="1">
  <t>Immediately begin key rotation (<xref target="key-rotation"/>).</t>
  <t>Set <spanx style="verb">invalidate-keys-cache</spanx> in all applicable <spanx style="verb">_dive</spanx> policy records to a timestamp at or after the time of compromise.</t>
  <t>Remove the compromised key record from DNS as soon as the new key is operational.</t>
  <t>Maintain the <spanx style="verb">invalidate-keys-cache</spanx> directive for at least 86400 seconds to ensure all clients have flushed the compromised key, then remove it from the policy record to restore normal caching behavior.</t>
</list></t>

<t>Operators MUST NOT set <spanx style="verb">report-only</spanx> as a temporary measure during key compromise remediation.</t>

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

<t>Operators SHOULD NOT store private signing keys on HTTP servers. Private keys SHOULD be stored in offline environments or within Hardware Security Modules (HSMs). However, the security of the signing path itself MUST also be enforced: HSM access interfaces and any remote signing services MUST be strongly authenticated, authorized, rate-limited, and audited, since an attacker who cannot retrieve the private key material may still obtain unauthorized signatures by abusing or compromising a signing endpoint. Signatures SHOULD be pre-computed where feasible 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 protects against an attacker who has compromised the origin web server but not the DNS infrastructure. Such an attacker cannot publish a forged DNSSEC-validated key record, so a DIVE-compliant client will reject any response not signed with a DNS-published key.</t>

<t>DIVE does NOT protect against simultaneous compromise of both the DNS infrastructure and the origin server, or against compromise of the private signing keys.</t>

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

<t>DNSSEC is the root of trust for DIVE. Clients MUST obtain DNSSEC validation status for all DNS records they retrieve. Two models are recognised:</t>

<t><list style="symbols">
  <t><strong>Stub validator</strong> (RECOMMENDED): the client performs DNSSEC verification itself.</t>
  <t><strong>Validating resolver</strong>: the client trusts the AD bit from a resolver. The connection to the resolver MUST be over DoH <xref target="RFC8484"/> or DoT <xref target="RFC7858"/>.</t>
</list></t>

<t>A record for which DNSSEC validation cannot be confirmed MUST be treated as absent.</t>

</section>
<section anchor="algorithm-restrictions"><name>Algorithm Restrictions</name>

<t>Only Ed25519 and Ed448 are permitted for signing. Only SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384, and SHA3-512 are permitted for hashing. Clients MUST reject records or responses referencing any other algorithm. This prevents downgrade attacks.</t>

</section>
<section anchor="cache-poisoning"><name>Cache Poisoning</name>

<t>Enforcing bounded cache lifetimes for <spanx style="verb">_dive</spanx> and <spanx style="verb">_divekey</spanx> records limits the impact of cache-poisoning attacks in which a malicious record with an artificially long <spanx style="verb">cache</spanx> value is injected. DNSSEC substantially mitigates this attack.</t>

</section>
<section anchor="privacy"><name>Privacy</name>

<t>DNS queries for <spanx style="verb">_dive</spanx> and <spanx style="verb">_divekey</spanx> records may reveal resource-access patterns to the resolver. Clients SHOULD use DoH or DoT.</t>

<t>Failure reports sent to <spanx style="verb">report-to</spanx> include the resource URL and User-Agent. Operators MUST handle report data in accordance with applicable privacy regulations.</t>

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

<t>DIVE verifies response body integrity and authenticity. It does not protect HTTP response headers other than those defined in <xref target="RFC9421"/> and <xref target="RFC9530"/>, nor request parameters or cookies.</t>

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

<t>The client MUST NOT hide, suppress, or otherwise obscure HTTP resources or HTTP header fields.</t>

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

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

<t>IANA is requested to create the registry "DIVE Scope Names" under a new registry group "Domain-based Integrity Verification Enforcement (DIVE)", with policy "Specification Required" <xref target="RFC8126"/>.</t>

<t>Initial contents:</t>

<texttable title="Initial Contents of the DIVE Scope Names Registry" anchor="iana-scope-registry">
      <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>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 the registry "DIVE Directive Names" under the same registry group, with policy "Specification Required" <xref target="RFC8126"/>.</t>

<t>Initial contents:</t>

<texttable title="Initial Contents of the DIVE Directive Names Registry" anchor="iana-directive-registry">
      <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>Client MUST NOT issue plain-HTTP requests; MUST upgrade or abort.</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 anchor="hash-algorithms-for-http-digest-fields"><name>Hash Algorithms for HTTP Digest Fields</name>

<t>DIVE requires hash algorithms beyond those currently registered in the IANA "Hash Algorithms for HTTP Digest Fields" registry <xref target="RFC9530"/>. IANA is requested to add the following entries to that registry:</t>

<texttable title="Additions to the Hash Algorithms for HTTP Digest Fields Registry" anchor="iana-digest-algorithms">
      <ttcol align='left'>Key</ttcol>
      <ttcol align='left'>Status</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c><spanx style="verb">sha-384</spanx></c>
      <c>Active</c>
      <c>SHA-384</c>
      <c><xref target="RFC6234"/></c>
      <c><spanx style="verb">sha3-256</spanx></c>
      <c>Active</c>
      <c>SHA3-256</c>
      <c><xref target="FIPS202"/></c>
      <c><spanx style="verb">sha3-384</spanx></c>
      <c>Active</c>
      <c>SHA3-384</c>
      <c><xref target="FIPS202"/></c>
      <c><spanx style="verb">sha3-512</spanx></c>
      <c>Active</c>
      <c>SHA3-512</c>
      <c><xref target="FIPS202"/></c>
</texttable>

<t>These algorithms are required to satisfy the cryptographic posture mandated by CNSA Suite 2.0 <xref target="CNSA2"/> and to provide algorithm diversity between the SHA-2 and SHA-3 families, ensuring continued integrity guarantees in the event of a weakness discovered in either family.</t>

<t>SHA-384 provides a stronger security margin than SHA-256 within the SHA-2 family at acceptable performance cost. The SHA-3 family (Keccak) has an entirely different internal construction from SHA-2, meaning a structural break in one family does not compromise the other. For high-assurance environments, the ability to mandate SHA-3 exclusively via the <spanx style="verb">allowed-hash</spanx> key record parameter is a deliberate design goal of DIVE.</t>

<t>MD5, CRC32, and SHA-1 MUST NOT be registered or used within DIVE.</t>

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

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

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

<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-client</eref></t>
  <t>Protocol information: <eref target="https://diveprotocol.org">https://diveprotocol.org</eref></t>
</list></t>

</section>


  </middle>

  <back>


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

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

&RFC9421;
&RFC2119;
&RFC8174;
&RFC9651;
&RFC4033;
&RFC8032;
&RFC9530;
&RFC8126;
&RFC6234;
&RFC1035;


    </references>

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

<reference anchor="FIPS202" >
  <front>
    <title>SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions</title>
    <author >
      <organization>National Institute of Standards and Technology</organization>
    </author>
    <date year="2015" month="August"/>
  </front>
  <seriesInfo name="DOI" value="10.6028/NIST.FIPS.202"/>
</reference>
<reference anchor="CNSA2" target="https://media.defense.gov/2025/May/30/2003728741/-1/-1/0/CSA_CNSA_2.0_ALGORITHMS.PDF">
  <front>
    <title>Commercial National Security Algorithm Suite 2.0</title>
    <author >
      <organization>National Security Agency</organization>
    </author>
    <date year="2022" month="September"/>
  </front>
</reference>
&RFC8484;
&RFC7858;


    </references>

</references>


<?line 533?>

<section numbered="false" anchor="Acknowledgements"><name>Acknowledgements</name>

<t>The author would like to thank Benjamin Schwartz for his review and constructive feedback on earlier versions of this document.</t>

</section>


  </back>

<!-- ##markdown-source:
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
S3PPnsC24F7b/wYf0UR+w2wAAA==

-->

</rfc>

