<?xml version="1.0" encoding="UTF-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="info" docName="draft-litzki-sovp-01" ipr="trust200902" submissionType="independent" xml:lang="en">

  <front>
    <title abbrev="SOVP">Sovereign Validation Protocol (SOVP)</title>
    
    <author fullname="Thorsten Litzki" initials="T." surname="Litzki">
      <organization>Litzki Systems LLC</organization>
      <address>
        <postal>
          <street>7901 4th St N, #32272</street>
          <city>St. Petersburg</city>
          <region>FL</region>
          <code>33702</code>
          <country>USA</country>
        </postal>
        <email>ietf@litzki-systems.com</email>
      </address>
    </author>

    <date year="2026" month="May" day="14"/>

    <keyword>Validation</keyword>
    <keyword>Cryptography</keyword>
    <keyword>Agentic Commerce</keyword>
    <keyword>Layer 0</keyword>

    <abstract>
      <t>This document specifies the Sovereign Validation Protocol (SOVP), a protocol for cryptographic verification of publisher-provided identity metadata bound to DNS-anchored public keys. SOVP enables consuming agents and gateways to verify the origin and integrity of machine-readable data published at a domain prior to ingestion, allowing early rejection of unauthenticated data before body parsing occurs. The protocol defines data structures, cryptographic procedures, operational modes, and associated DNS and HTTP mechanisms.</t>
    </abstract>

    <note title="Note">
      <t>This document describes work by Litzki Systems LLC.</t>
    </note>
  </front>

  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>The increasing deployment of autonomous agents and large language model (LLM) pipelines that consume web-published data creates a need for infrastructure-level verification of data origin and integrity. Existing mechanisms such as TLS operate at the transport layer and do not verify the integrity of application-layer data after delivery. Application-level validation typically occurs after data has been parsed and partially processed, consuming resources before unauthenticated content can be rejected.</t>
      <t>SOVP addresses this by enabling a publisher to bind machine-readable identity metadata to an Ed25519 signature, with the corresponding public key anchored in DNS. A consuming agent or gateway (referred to as a Validating Agent or SOVP Gateway) can verify this binding without prior relationship or shared secret, and reject non-conformant data at the ingestion boundary before body parsing occurs.</t>
      <t>Layer 0, as used in this document, refers to the ingestion boundary: the point at which a consuming system decides whether to accept or reject data from an external source, prior to any application-level processing.</t>
      <t>This document specifies the protocol data structures, cryptographic procedures, and operational modes constituting SOVP. It is published as an Informational document describing the current protocol specification.</t>
      <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>
    </section>

    <section anchor="non-goals">
      <name>Non-Goals</name>
      <t>SOVP enables verification of origin and integrity for publisher-provided identity metadata. Specifically, a successful verification (Psi_core = 1) indicates that the sovp-identity.json retrieved from a domain was signed by the holder of the private key corresponding to the DNS-published public key, and that the signed content has not been modified since signing. SOVP does not validate the semantic accuracy or truthfulness of the content. It does not replace downstream fact-checking or content analysis. SOVP provides origin binding, not content truth.</t>
    </section>

    <section anchor="resonance">
      <name>Validation Function: Psi_core</name>
      <t>The core of the protocol is the validation function Psi_core. It produces a binary result indicating whether the identity metadata retrieved from a domain was signed by the holder of the corresponding DNS-published public key. The identity metadata (M) MUST be canonicalized using the JSON Canonicalization Scheme (JCS) as defined in <xref target="RFC8785"/> before signature verification, to ensure consistent byte representation across implementations.</t>
      <t>The implementation uses Ed25519 in pure mode per <xref target="RFC8032"/>. The canonicalized identity metadata is passed directly to the Ed25519 sign and verify functions. No external pre-hash is applied.</t>
      
      <artwork><![CDATA[
Psi_core = Verify(K_pub, sigma, JCS(M))
      ]]></artwork>

      <t>Where:</t>
      <ul>
        <li>K_pub is the public key, retrieved via a DNS TXT record or the SOVP-Identity header.</li>
        <li>sigma is the digital signature provided within the integrity_proof.</li>
        <li>JCS(M) is the canonicalized identity metadata per <xref target="RFC8785"/>, passed directly to the Ed25519 verify function.</li>
        <li>Verify is the Ed25519 verification function, returning 1 if the signature is valid for the given key and message, or 0 otherwise.</li>
      </ul>
    </section>

    <section anchor="tech-spec">
      <name>Technical Specification: The sovp-identity.json Structure</name>
      <t>The implementation relies on a signed JSON object located at the well-known path of the host (/.well-known/sovp-identity.json, per <xref target="RFC8615"/>). This object serves as the primary data carrier for the publisher identity declaration.</t>
      <t>The signature covers the fields outside the integrity_proof object. The integrity_proof object itself, including the signature field, is excluded from the signed scope. Implementations MUST canonicalize only the non-proof fields of M when computing or verifying JCS(M).</t>
      <t>Proposed Schema for sovp-identity.json:</t>
      
      <sourcecode type="json"><![CDATA[
{
  "@context": "https://litzki-systems.com/protocol/v1.4",
  "@type": "SovereignIdentity",
  "entity": {
    "uid": "urn:sovp:litzki-systems-llc",
    "canonical_url": "https://litzki.systems",
    "verification_method": "Ed25519"
  },
  "integrity_proof": {
    "signature": "z58D...v9A",
    "created": "2026-03-14T17:00:00Z",
    "public_key_ref": "dns:txt:_sovp.litzki.systems",
    "nonce": "optional-unique-string-123"
  },
  "parameters": {
    "entropy_threshold": 0.12,
    "determinism_score": 0.98
  }
}
      ]]></sourcecode>
      
      <t>The parameters object and its attributes entropy_threshold and determinism_score are non-normative and optional. They represent publisher-supplied advisory values and are not cryptographically bound by the Ed25519 signature. Validating Agents MUST NOT use these values as a basis for trust decisions. They MAY be used for informational or monitoring purposes only.</t>
    </section>

    <section anchor="atomic-drift">
      <name>Signature Mismatch and Verification Failure</name>
      <t>A verification failure (Psi_core = 0) occurs when the sovp-identity.json retrieved from a domain does not produce a valid signature verification result. This may indicate that the identity declaration has been modified since signing, that the wrong key was used, or that the document is malformed. A Validating Agent or SOVP Gateway MUST treat Psi_core = 0 as a rejection condition and MUST NOT proceed with ingestion of data from the non-conformant source.</t>
    </section>

    <section anchor="execution-sequence">
      <name>Protocol Execution Sequence</name>
      <t>The protocol execution follows a non-interactive sequence to compute Psi_core. SOVP defines two primary operational modes:</t>
      
      <table>
        <thead>
          <tr>
            <th>Mode</th>
            <th>Actor</th>
            <th>Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>Mode A</td>
            <td>Validating Agent (Client)</td>
            <td>The agent performs verification locally before committing data to memory.</td>
          </tr>
          <tr>
            <td>Mode B</td>
            <td>SOVP Gateway (Server)</td>
            <td>An infrastructure-level gateway validates requests on behalf of a protected cluster.</td>
          </tr>
        </tbody>
      </table>
      
      <t>Execution Sequence:</t>
      <ol>
        <li>Public Key Exposure: The entity publishes its Ed25519 public key via a DNS TXT record (typically at _sovp.yourdomain.tld) or via the SOVP-Identity HTTP header.</li>
        <li>Artifact Retrieval: The Validating Agent or Gateway retrieves the sovp-identity.json from the host's well-known path (/.well-known/sovp-identity.json).</li>
        <li>Integrity Verification: The actor canonicalizes the payload according to <xref target="RFC8785"/> and executes the Verify function using Ed25519 pure mode per <xref target="RFC8032"/>.</li>
        <li>Verification Result: Ingestion proceeds if Psi_core = 1. If Psi_core = 0, the Validating Agent or SOVP Gateway MUST reject the data and MUST NOT commit it to the processing pipeline.</li>
      </ol>

      <section anchor="fallback-logic">
        <name>Mode B Rejection Policy</name>
        <t>If a source does not provide a valid sovp-identity.json, or if Psi_core = 0, the SOVP Gateway MUST reject the request. The RECOMMENDED HTTP status code for rejection is 403 (Forbidden). Implementations MAY use 422 (Unprocessable Content) where the rejection is specifically due to a malformed or invalid SOVP identity document. Rejection SHOULD occur before body parsing to avoid unnecessary resource consumption.</t>
        <ul>
          <li>Exception: Local allow-lists MAY be defined for legacy systems, though these bypass the Layer 0 integrity guarantee.</li>
        </ul>
      </section>
    </section>

    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This section addresses security considerations per <xref target="RFC3552"/>.</t>
      <section anchor="key-revocation">
        <name>Key Revocation and DNS TTL</name>
        <t>To minimize the window of vulnerability during a key compromise, SOVP records in DNS SHOULD use a low Time-To-Live (TTL), with a recommended value of 300 seconds. Revocation is achieved by updating or removing the _sovp TXT record.</t>
      </section>
      
      <section anchor="replay-protection">
        <name>Replay Protection</name>
        <t>All integrity_proof objects MUST contain a created timestamp. Validating Agents SHOULD reject signatures with a timestamp older than 600 seconds. For high-frequency pipelines, agents SHOULD implement nonce-based deduplication within the validity window to prevent replayed requests. Note: timestamp and nonce validation are not yet implemented in the reference implementation and are planned for a future release.</t>
      </section>
      
      <section anchor="non-repudiation">
        <name>Origin Binding</name>
        <t>SOVP binds the signed identity metadata to the Ed25519 key pair whose public component is published in DNS. A successful verification (Psi_core = 1) demonstrates that the holder of the private key signed the identity document. This enables attribution of the signed content to the DNS-identified publisher. SOVP does not provide legal non-repudiation and does not establish the real-world identity of the key holder beyond DNS control.</t>
      </section>
      
      <section anchor="dnssec">
        <name>DNS Security (DNSSEC)</name>
        <t>Since the trust anchor relies on DNS TXT records, protection against DNS spoofing is critical. The use of DNSSEC is RECOMMENDED for the zone hosting the _sovp record to ensure the authenticity of the public key.</t>
      </section>
    </section>

    <section anchor="infra-layering-2">
      <name>Deployment Architecture: Ingestion Boundary Positioning</name>
      <t>SOVP is designed to operate at the ingestion boundary (Layer 0), prior to application-level processing. In Mode B, the SOVP Gateway intercepts incoming data requests and performs verification before forwarding to backend systems. This positions verification upstream of resource-intensive processing, allowing unauthenticated data to be rejected early. DNS serves as the trust anchor for public key distribution, with DNSSEC recommended to protect against DNS-based attacks on key material.</t>
    </section>

    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="dns-node-names">
        <name>Underscored and Globally Scoped DNS Node Names</name>
        <t>Per <xref target="RFC8552"/>, the following entry is to be added to the IANA registry:</t>
        <ul>
          <li>Label: _sovp</li>
          <li>Protocol: SOVP</li>
          <li>Reference: This document (Section 9.1)</li>
        </ul>
      </section>
      
      <section anchor="message-headers">
        <name>Permanent Message Header Field Names</name>
        <t>Per <xref target="RFC3864"/> and <xref target="RFC6648"/>, the following header is to be registered. The SOVP-Identity header name does not use the deprecated "X-" prefix per <xref target="RFC6648"/>:</t>
        <ul>
          <li>Header field name: SOVP-Identity</li>
          <li>Applicable protocol: HTTP</li>
          <li>Status: Experimental</li>
          <li>Author/Change controller: Litzki Systems LLC</li>
          <li>Specification document: This document (Section 9.2)</li>
        </ul>
      </section>
    </section>
  </middle>

  <back>
    <references>
      <name>Normative References</name>

            <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner"><organization/></author>
          <date year="1997" month="March"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba"><organization/></author>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
      </reference>
      <reference anchor="RFC8552" target="https://www.rfc-editor.org/info/rfc8552">
        <front>
          <title>Scoped DNS Node Names</title>
          <author initials="S." surname="Crocker"><organization/></author>
          <date year="2019" month="March"/>
        </front>
        <seriesInfo name="RFC" value="8552"/>
      </reference>
      <reference anchor="RFC3864" target="https://www.rfc-editor.org/info/rfc3864">
        <front>
          <title>Registration Procedures for Message Header Fields</title>
          <author initials="G." surname="Klyne"><organization/></author>
          <date year="2004" month="September"/>
        </front>
        <seriesInfo name="RFC" value="3864"/>
      </reference>
      <reference anchor="RFC8785" target="https://www.rfc-editor.org/info/rfc8785">
        <front>
          <title>JSON Canonicalization Scheme (JCS)</title>
          <author initials="A." surname="Rundgren"><organization/></author>
          <date year="2020" month="June"/>
        </front>
        <seriesInfo name="RFC" value="8785"/>
      </reference>
      <reference anchor="RFC8615" target="https://www.rfc-editor.org/info/rfc8615">
        <front>
          <title>Well-Known Uniform Resource Identifiers (URIs)</title>
          <author initials="M." surname="Nottingham"><organization/></author>
          <date year="2019" month="May"/>
        </front>
        <seriesInfo name="RFC" value="8615"/>
      </reference>
      <reference anchor="RFC8032" target="https://www.rfc-editor.org/info/rfc8032">
        <front>
          <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
          <author initials="S." surname="Josefsson"><organization/></author>
          <author initials="I." surname="Liusvaara"><organization/></author>
          <date year="2017" month="January"/>
        </front>
        <seriesInfo name="RFC" value="8032"/>
      </reference>
      <reference anchor="RFC6648" target="https://www.rfc-editor.org/info/rfc6648">
        <front>
          <title>Deprecating the "X-" Prefix and Similar Constructs in Application Protocols</title>
          <author initials="P." surname="Saint-Andre"><organization/></author>
          <author initials="D." surname="Crocker"><organization/></author>
          <author initials="M." surname="Nottingham"><organization/></author>
          <date year="2012" month="June"/>
        </front>
        <seriesInfo name="BCP" value="178"/>
        <seriesInfo name="RFC" value="6648"/>
      </reference>
      <reference anchor="RFC3552" target="https://www.rfc-editor.org/info/rfc3552">
        <front>
          <title>Guidelines for Writing RFC Text on Security Considerations</title>
          <author initials="E." surname="Rescorla"><organization/></author>
          <date year="2003" month="July"/>
        </front>
        <seriesInfo name="RFC" value="3552"/>
      </reference>
    </references>
  </back>
</rfc>