<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-lkspa-wimse-verifiable-geo-fence-04" submissionType="IETF" category="info" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="V-GAP">Privacy Preserving Verifiable Geofencing with Residency Proofs for Sovereign Workloads</title><seriesInfo value="draft-lkspa-wimse-verifiable-geo-fence-04" stream="IETF" status="informational" name="Internet-Draft"></seriesInfo>
<author initials="R." surname="Krishnan" fullname="Ram Krishnan"><organization>JPMorgan Chase &amp; Co.</organization><address><postal><street></street>
</postal><email>ramkri123@gmail.com</email>
</address></author><author initials="N." surname="Smith" fullname="Ned Smith"><organization>Intel</organization><address><postal><street></street>
</postal><email>ned.smith@intel.com</email>
</address></author><author initials="D." surname="Lopez" fullname="Diego R. Lopez"><organization>Telefonica</organization><address><postal><street></street>
</postal><email>diego.r.lopez@telefonica.com</email>
</address></author><author initials="A." surname="Prasad" fullname="A Prasad"><organization>Oracle</organization><address><postal><street></street>
</postal><email>a.prasad@oracle.com</email>
</address></author><author initials="S." surname="Addepalli" fullname="Srinivasa Addepalli"><organization>Aryaka</organization><address><postal><street></street>
</postal><email>srinivasa.addepalli@aryaka.com</email>
</address></author><date/>
<area>Security</area>
<workgroup>RATS</workgroup>
<keyword>geofencing</keyword>
<keyword>attestation</keyword>
<keyword>workload identity</keyword>
<keyword>residency</keyword>
<keyword>TPM</keyword>
<keyword>GNSS</keyword>

<abstract>
<t>Modern cloud and distributed computing rely heavily on software-only identities and bearer tokens that are easily stolen, replayed, or used from unauthorized locations. Furthermore, traditional methods of location verification - such as IP-address-based geolocation - are easily spoofed via VPNs or proxies and significantly compromise infrastructure security and privacy for <strong>Sovereign Workloads</strong> and high-assurance environments. This document defines a <strong>High-Assurance Profile</strong> designed to solve these challenges through hardware-rooted cryptographic verifiability.</t>
<t>A host machine runs a workload identity agent for managing the workload identities on that platform. This proposal replaces implicit trust and spoofable indicators with cryptographically verifiable hardware-rooted evidence of integrity and location for this agent. Critically, this framework prioritizes <strong>Location Privacy</strong> by utilizing Zero-Knowledge Proofs (ZKP), allowing a workload to prove it is within a compliant &quot;Sovereign Zone&quot; without disclosing precise coordinates that could be used for tracking or exploitation.</t>
<t>By binding software identities to persistent silicon identities and verified physical residency, this solution establishes a &quot;Silicon-to-Workload&quot; chain of trust. It ensures that sensitive operations are only performed by authorized workloads running on untampered hardware in cryptographically verified, privacy-preserving geographic boundaries, fulfilling the high-assurance requirements of the <strong>WIMSE Architecture</strong> [[I-D.ietf-wimse-architecture]].</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>The <strong>Workload Identity Agent</strong> (e.g., SPIRE Agent) acts as the local-on-host intermediary responsible for managing and issuing identities to workloads. It serves as a vetting mechanism, ensuring that a workload's execution environment meets required security and residency policies before granting it the cryptographic credentials necessary for network communication. This High-Assurance Profile (a specialized RATS Profile) provides the technical mechanics to cryptographically bind this agent to the underlying hardware-verified platform and its privacy-preserving physical location.</t>
<t>The architecture follows the RATS Architecture [[RFC9334]], defining the interactions between Provers, Verifiers, and Relying Parties to generate and validate high-confidence evidence regarding the Workload Identity Agent's status. It provides the hardware-rooted evidence layer required by the WIMSE Architecture [[I-D.ietf-wimse-architecture]], establishing a &quot;Silicon-to-Workload&quot; chain of trust that ensures sensitive data is only processed by authorized workloads in approved, measured environments.</t>
<t>To maintain location privacy while providing cryptographic verifiability, this profile leverages Transparent Zero-Knowledge Proofs (ZKPs). Unlike traditional ZKP systems, transparent ZKPs require no trusted third party or complex trusted setup phase. They achieve mathematical transparency through non-interactive, hash-based protocols, allowing a platform to prove it is resident within an approved geographic boundary without disclosing the exact coordinates of the underlying hardware.</t>
</section>

<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as described in BCP 14 [[RFC2119]] [[RFC8174]] when, and only when, they appear in all capitals, as shown here.</t>

<section anchor="abbreviations"><name>Abbreviations</name>

<ul spacing="compact">
<li><strong>AK</strong>: Attestation Key</li>
<li><strong>BMC</strong>: Baseboard Management Controller</li>
<li><strong>DAA</strong>: Direct Anonymous Attestation</li>
<li><strong>EAT</strong>: Entity Attestation Token</li>
<li><strong>EK</strong>: Endorsement Key</li>
<li><strong>GNSS</strong>: Global Navigation Satellite System</li>
<li><strong>IMA</strong>: Integrity Measurement Architecture</li>
<li><strong>IMEI</strong>: International Mobile Equipment Identity</li>
<li><strong>IMSI</strong>: International Mobile Subscriber Identity</li>
<li><strong>LAH</strong>: Location Anchor Host</li>
<li><strong>OOB</strong>: Out-of-Band</li>
<li><strong>PCR</strong>: Platform Configuration Register</li>
<li><strong>PoR</strong>: Proof of Residency</li>
<li><strong>SPDM</strong>: Security Protocol and Data Model</li>
<li><strong>STARK</strong>: Scalable Transparent ARgument of Knowledge</li>
<li><strong>SVID</strong>: SPIFFE Verifiable Identity Document</li>
<li><strong>TEE</strong>: Trusted Execution Environment</li>
<li><strong>TPM</strong>: Trusted Platform Module</li>
<li><strong>V-GAP</strong>: Verifiable Geofencing Attestation Profile</li>
<li><strong>ZKP</strong>: Zero-Knowledge Proof</li>
</ul>
</section>
</section>

<section anchor="key-terms"><name>Key Terms</name>

<dl spacing="compact">
<dt>Data Residency:</dt>
<dd>Requirement that data processing and storage remain within an approved geographic boundary.</dd>
<dt>Geofencing:</dt>
<dd>Enforcement that workloads execute only on approved hosts within an approved geographic boundary.</dd>
<dt>Workload Identity Agent:</dt>
<dd>On-host component that issues workload identities (for example, SVIDs) to local workloads, subject to verifier-approved evidence.</dd>
<dt>Location Anchor Host (LAH):</dt>
<dd>Trusted host or device that produces location evidence used to establish residency within a geofence.</dd>
<dt>Workload Host:</dt>
<dd>Physical or virtual machine running the Workload Identity Agent and workloads; produces platform evidence. Unless otherwise stated, this document assumes the unified deployment model in which the Workload Host and the Location Anchor Host (LAH) are the same machine.</dd>
<dt>Composite Geolocation:</dt>
<dd>Location estimate fused from multiple sources and accompanied by a quality indicator.</dd>
<dt>Proof of Residency (PoR) / Co-location:</dt>
<dd>Evidence that binds a workload (or Workload Host) to an approved local environment and geofence for a specific attestation interval.</dd>
<dt>Silicon Root of Trust:</dt>
<dd>Hardware trust anchor that supports measured boot and protects attestation keys.</dd>
<dt>Transparent Zero-Knowledge Proof:</dt>
<dd>ZKP that does not require a trusted setup; used to prove &quot;inside an approved zone&quot; without revealing precise coordinates.</dd>
<dt>Workload Identity Management Plane:</dt>
<dd>Issues and validates workload identities and trust bundles based on verifier results and policy.</dd>
<dt>Host Identity Management Plane:</dt>
<dd>Verifies platform integrity and residency evidence, and manages attestation key registration and platform health state (often via OOB paths).</dd>
<dt>V-GAP (Verifiable Geofencing Attestation Profile):</dt>
<dd>Nested evidence format defined in this document for binding identity to verified platform integrity and verified residency.</dd>
<dt>N_fusion (Workload Fusion Nonce):</dt>
<dd>Fresh nonce used to bind identity issuance to a specific attestation interval, delivered by the Workload Identity Management Plane. Corresponds to the <tt>nonce</tt> field in the <tt>lah-bundle</tt>.</dd>
</dl>
</section>

<section anchor="use-cases"><name>Use Cases</name>
<t>This profile supports attested data residency and geofencing for workloads and (optionally) users. Common use cases fall into: server-centric enforcement, user-centric enforcement, and compliance and risk reduction.</t>

<section anchor="server-centric-enforcement"><name>Server-centric Enforcement</name>
<t>Enterprises need cryptographic proof that workloads run only on approved hosts within an approved geographic boundary, and that data flows only between approved boundaries.</t>

<ul>
<li><t><strong>Workload-to-workload (general):</strong> Relying parties accept workload identities only when the issuing host attests platform integrity and &quot;in-zone&quot; residency, preventing credentials from being used outside the approved boundary.</t>
</li>
<li><t><strong>Agentic AI workloads:</strong> An AI agent may access sensitive data or perform sensitive actions only when its Workload Identity Agent presents hardware-rooted integrity evidence and a verifiable &quot;in-zone&quot; proof (optionally privacy-preserving), binding identity to both platform state and residency.</t>
</li>
<li><t><strong>Federated / edge AI (key or model release):</strong> High-value artifacts (e.g., decryption keys or model weights in federated learning) are released only when the partner/edge host attests it is integral and resident within the required boundary. This is useful for intermittently connected sites.</t>
</li>
<li><t><strong>User-to-server:</strong> Clients validate that the server endpoint is operating within an approved boundary (e.g., by policy tied to the server's attested identity and residency evidence).</t>
</li>
</ul>
</section>

<section anchor="user-centric-enforcement"><name>User-centric Enforcement</name>
<t>Enterprises may also need trustworthy location signals for user-facing access decisions.</t>

<ul>
<li><t><strong>Geofenced access control:</strong> User access is permitted only when the user (or user device) proves it is within an allowed boundary, ideally without requiring precise location disclosure.</t>
</li>
<li><t><strong>On-premises boundaries:</strong> Customer-premises equipment can define an enterprise boundary, with a network or enterprise infrastructure providing supporting evidence for policy enforcement.</t>
</li>
<li><t><strong>Restricted support geographies:</strong> Administrative or support actions can be allowed only when the operator proves presence within allowed geographies, reducing policy and insider-risk exposure.</t>
</li>
</ul>
</section>

<section anchor="compliance-and-risk-reduction"><name>Compliance and Risk Reduction</name>
<t>Geofence attestation provides audit-ready evidence to support data residency and sovereignty controls, and it can also reduce non-compliance risk from misconfiguration or spoofable signals. Even when not mandated, &quot;in-zone&quot; proofs help address: configuration drift, edge relocation/proxying, contractual residency requirements, and location-privacy minimization (proving &quot;inside the zone&quot; without storing coordinates).</t>
</section>
</section>

<section anchor="motivation-and-gaps"><name>Motivation and Gaps</name>
<t>Operators need to enforce <em>where</em> sensitive workloads run without relying on signals that are easy to spoof (IP geolocation, region labels) or credentials that are easy to steal (bearer tokens). In many systems today, platform integrity and residency are inferred from configuration and control-plane metadata rather than verified with cryptographic evidence.</t>
<t>Key gaps include:</t>

<ul spacing="compact">
<li><strong>Unverifiable location metadata (data-at-rest / data-generation):</strong> Location tags for arbitrary data objects are not standardized and are typically unsigned, making provenance and integrity difficult to validate.</li>
<li><strong>Token theft and replay (data-in-use):</strong> Bearer tokens can be copied and replayed from unauthorized hosts or locations; stronger mechanisms exist but are not consistently deployed and can add operational overhead.</li>
<li><strong>Implicit trust in “region” and transit:</strong> A relying party often cannot cryptographically verify a server’s physical residency, and requests may traverse intermediaries (e.g., proxies) that expand the effective trust boundary.</li>
</ul>
</section>

<section anchor="what-this-profile-provides"><name>What This Profile Provides</name>
<t>This document defines a High-Assurance Profile (a specialized RATS profile) that makes <strong>platform integrity</strong> and <strong>geofence residency</strong> verifiable inputs to authorization and credential issuance, while supporting privacy-preserving “in-zone” proofs where available.</t>
<t>At a high level, the profile enables a relying party (or identity issuer) to require evidence that:
1. the Workload Identity Agent is running on an approved, measured platform; and
2. that platform is resident within an approved geographic boundary (optionally without revealing coordinates).</t>
</section>

<section anchor="composition-with-transitive-attestation-and-wimse"><name>Composition with Transitive Attestation and WIMSE</name>
<t>This profile is designed to compose with [[I-D.mw-wimse-transitive-attestation]] and the <strong>WIMSE Architecture</strong> [[I-D.ietf-wimse-architecture]].</t>

<ul spacing="compact">
<li><strong><eref target="Layer 1">[I-D.mw-wimse-transitive-attestation]</eref>:</strong> Binds a workload to a <em>local</em> Workload Identity Agent (co-location / PoR), treating the agent as a trust anchor.</li>
<li><t><strong>This document (Layers 2 and 3):</strong> Defines how that Workload Identity Agent is itself verified:</t>

<ul spacing="compact">
<li><strong>Layer 2 — Platform integrity:</strong> Hardware-rooted evidence of the host state (e.g., TPM-based attestation).</li>
<li><strong>Layer 3 — Residency:</strong> Cryptographically verifiable proof the attested host is inside an approved boundary (optionally privacy-preserving).</li>
</ul></li>
</ul>
<table>
<thead>
<tr>
<th align="left">Layer</th>
<th align="left">Document</th>
<th align="left">Responsibility</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left"><strong>Layer 1</strong></td>
<td align="left">[[I-D.mw-wimse-transitive-attestation]]</td>
<td align="left">Bind workload to a local Workload Identity Agent (co-location / PoR).</td>
</tr>

<tr>
<td align="left"><strong>Layer 2</strong></td>
<td align="left">This document</td>
<td align="left">Verify Workload Host integrity for the Workload Identity Agent (platform evidence).</td>
</tr>

<tr>
<td align="left"><strong>Layer 3</strong></td>
<td align="left">This document</td>
<td align="left">Verify Workload Host residency within an approved boundary (location evidence).</td>
</tr>
</tbody>
</table></section>

<section anchor="operational-use-gating-credentials-on-verified-evidence"><name>Operational Use: Gating Credentials on Verified Evidence</name>
<t>This profile assumes two cooperating control planes:</t>

<ul spacing="compact">
<li><strong>Host Identity Management Plane:</strong> Verifies platform integrity and residency evidence and produces an attestation result.</li>
<li><strong>Workload Identity Management Plane:</strong> Issues or renews workload identities (e.g., SVIDs) only when the attestation result satisfies policy.</li>
</ul>
<t>To prevent mix-and-match and replay, attestation results SHOULD be fresh and SHOULD be bound to the identity issuance event (e.g., by cryptographically binding freshness values used for platform quotes and workload credential issuance within the verifier result).</t>
<t>Where policy requires it, the verifier can additionally require that an agent software measurement (e.g., image digest) is covered by validated platform evidence, reducing the risk that a modified or unauthorized agent obtains credentials.</t>
<t>In intermittently connected edge deployments, local operation can continue during outages, while centralized policy can be enforced on renewal and on release of high-value secrets once connectivity is available.</t>
</section>

<section anchor="high-assurance-profile-verifiable-geofencing-attestation-profile-v-gap"><name>High-Assurance Profile: Verifiable Geofencing Attestation Profile (V-GAP)</name>
<t>V-GAP is a RATS/WIMSE attestation profile that binds a <strong>Workload Identity Agent</strong> to (1) hardware-rooted host integrity and (2) verified residency within a configured geofence. It does this with an evidence bundle from a <strong>Location Anchor Host (LAH)</strong>.</t>

<section anchor="lah-bundle-location-anchor-host-evidence-structure"><name>LAH-Bundle: Location Anchor Host Evidence Structure</name>
<t>The <tt>lah-bundle</tt> is a hardware-sealed evidence structure embedded as an X.509 extension (OID <tt>1.3.6.1.4.1.55744.1.1</tt>) in a SPIRE SVID. It binds a workload identity to physically verifiable claims — TPM hardware identity, privacy-preserving geolocation, and agent binary integrity — without exposing PII.</t>

<section anchor="top-level-structure"><name>Top-Level Structure</name>

<sourcecode type="json"><![CDATA[{
  "lah-bundle": { },
  "mno-endorsement": { },
  "workload": { }
}
]]></sourcecode>
</section>

<section anchor="lah-bundle-fields"><name>lah-bundle Fields</name>
<table>
<thead>
<tr>
<th align="left">Field</th>
<th align="left">Type</th>
<th align="center">Required</th>
<th align="left">Description</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left"><tt>tpm-ak</tt></td>
<td align="left">string (Base64URL)</td>
<td align="center">Yes</td>
<td align="left">TPM Attestation Key public key (PEM-encoded). Hardware identity anchor. The TPM enforces that only this key can produce <tt>tpm-quote-seal</tt> — proving co-residency.</td>
</tr>

<tr>
<td align="left"><tt>geolocation-id-hash</tt></td>
<td align="left">string (Base64URL)</td>
<td align="center">Yes</td>
<td align="left"><tt>SHA-256(tpm-ak-bytes)</tt>. Binds TPM identity to sensor identity - assumption is sensor integrity is handled by OOB host management plane</td>
</tr>

<tr>
<td align="left"><tt>geolocation-proof-hash</tt></td>
<td align="left">string (Base64URL)</td>
<td align="center">Yes</td>
<td align="left">SHA-256 commitment over <tt>geolocation-payload</tt>. Required in both privacy modes. When <tt>privacy-technique=zkp</tt>: <tt>SHA-256(zkp-proof-bytes)</tt>. When <tt>privacy-technique=none</tt>: <tt>SHA-256(JCS({lat, lon, accuracy}))</tt>.</td>
</tr>

<tr>
<td align="left"><tt>privacy-technique</tt></td>
<td align="left">string enum</td>
<td align="center">Yes</td>
<td align="left"><tt>&quot;none&quot;</tt> = raw lat/lon/accuracy in payload. <tt>&quot;zkp&quot;</tt> = zero-knowledge proof URI in payload. Controls location privacy only; device identity privacy is always protected via <tt>geolocation-id-hash</tt>.</td>
</tr>

<tr>
<td align="left"><tt>geolocation-payload</tt></td>
<td align="left">object</td>
<td align="center">Yes</td>
<td align="left">Inner location data. Structure depends on <tt>privacy-technique</tt> (see Payload Variants below). Committed to by <tt>geolocation-proof-hash</tt> and optionally signed by <tt>mno-endorsement.mno-sig</tt>.</td>
</tr>

<tr>
<td align="left"><tt>nonce</tt></td>
<td align="left">string (Base64URL)</td>
<td align="center">Yes</td>
<td align="left">N_fusion freshness nonce issued by the Workload Identity Management Plane. Chained: <tt>HMAC(secret, n \|\| chain[n-1])</tt>. Detects skipped/reordered attestations.</td>
</tr>

<tr>
<td align="left"><tt>timestamp</tt></td>
<td align="left">integer (int64)</td>
<td align="center">Yes</td>
<td align="left">Unix epoch seconds. Set by the LAH agent at bundle construction time.</td>
</tr>

<tr>
<td align="left"><tt>tpm-quote-seal</tt></td>
<td align="left">string (Base64URL)</td>
<td align="center">Yes</td>
<td align="left"><tt>TPM2_Quote</tt> produced by the AK in <tt>tpm-ak</tt>. Qualifying data = <tt>SHA-256(JCS({tpm-ak, geolocation-id-hash, geolocation-proof-hash, privacy-technique, nonce, timestamp, workload-identity-agent-image-digest}))</tt>. Binds all fields into a single hardware-sealed statement.</td>
</tr>

<tr>
<td align="left"><tt>workload-identity-agent-image-digest</tt></td>
<td align="left">string (hex SHA-256)</td>
<td align="center">Yes</td>
<td align="left">SHA-256 digest of the Workload Identity Agent (SPIRE agent) binary, measured at attestation time by the Host Identity Manager (Keylime). Detects agent binary compromise on every renewal cycle.</td>
</tr>
</tbody>
</table></section>

<section anchor="geolocation-payload-variants"><name>geolocation-payload Variants</name>
<t><strong>When <tt>privacy-technique = &quot;none&quot;</tt> (raw coordinates):</strong></t>
<table>
<thead>
<tr>
<th align="left">Field</th>
<th align="left">Type</th>
<th align="center">Required</th>
<th align="left">Description</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left"><tt>lat</tt></td>
<td align="left">number (float64)</td>
<td align="center">Yes</td>
<td align="left">Latitude, WGS-84 decimal degrees</td>
</tr>

<tr>
<td align="left"><tt>lon</tt></td>
<td align="left">number (float64)</td>
<td align="center">Yes</td>
<td align="left">Longitude, WGS-84 decimal degrees</td>
</tr>

<tr>
<td align="left"><tt>accuracy</tt></td>
<td align="left">number (float64)</td>
<td align="center">Yes</td>
<td align="left">Accuracy radius in meters</td>
</tr>
</tbody>
</table><t><tt>geolocation-proof-hash = Base64URL(SHA-256(JCS({lat, lon, accuracy})))</tt></t>
<t><strong>When <tt>privacy-technique = &quot;zkp&quot;</tt> (zero-knowledge proof):</strong></t>
<table>
<thead>
<tr>
<th align="left">Field</th>
<th align="left">Type</th>
<th align="center">Required</th>
<th align="left">Description</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left"><tt>zkp-proof-uri</tt></td>
<td align="left">string (URI)</td>
<td align="center">Yes</td>
<td align="left">URI to fetch full ZKP proof bytes from the proof depository. Verifier fetches bytes, computes <tt>SHA-256(bytes)</tt>, checks against <tt>geolocation-proof-hash</tt>.</td>
</tr>

<tr>
<td align="left"><tt>zkp-format</tt></td>
<td align="left">string enum</td>
<td align="center">Yes</td>
<td align="left">ZKP proof system. Currently: <tt>&quot;plonky2&quot;</tt>.</td>
</tr>
</tbody>
</table><t><tt>geolocation-proof-hash = Base64URL(SHA-256(zkp-proof-bytes))</tt></t>
</section>

<section anchor="mno-endorsement-optional-top-level-sibling"><name>mno-endorsement (Optional, Top-Level Sibling)</name>
<table>
<thead>
<tr>
<th align="left">Field</th>
<th align="left">Type</th>
<th align="center">Required</th>
<th align="left">Description</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left"><tt>mno-key-cert</tt></td>
<td align="left">string (Base64URL DER)</td>
<td align="center">Yes</td>
<td align="left">MNO signing certificate. Verifiers SHOULD validate this certificate chains to a known MNO root before accepting the endorsement.</td>
</tr>

<tr>
<td align="left"><tt>mno-sig</tt></td>
<td align="left">string (Base64URL)</td>
<td align="center">Yes</td>
<td align="left">ECDSA/EdDSA signature over <tt>JCS(geolocation-payload)</tt> only. The MNO attests location within carrier visibility — does not sign host fields (<tt>tpm-ak</tt>, <tt>nonce</tt>, <tt>tpm-quote-seal</tt>).</td>
</tr>
</tbody>
</table></section>

<section anchor="workload-top-level-sibling"><name>workload (Top-Level Sibling)</name>
<table>
<thead>
<tr>
<th align="left">Field</th>
<th align="left">Type</th>
<th align="center">Required</th>
<th align="left">Description</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left"><tt>workload-id</tt></td>
<td align="left">string (SPIFFE ID)</td>
<td align="center">Yes</td>
<td align="left">The workload's SPIFFE identity URI (e.g., <tt>spiffe://example.org/python-app</tt>).</td>
</tr>

<tr>
<td align="left"><tt>key-source</tt></td>
<td align="left">string</td>
<td align="center">Yes</td>
<td align="left">Origin of the workload's key material (e.g., <tt>&quot;tpm-app-key&quot;</tt>). The value is implementer-defined; verifiers SHOULD treat unrecognized values as opaque strings unless policy requires specific values.</td>
</tr>
</tbody>
</table></section>

<section anchor="sensor-type-input-recipes-opaque-to-verifier"><name>Sensor Type Input Recipes (Opaque to Verifier)</name>
<table>
<thead>
<tr>
<th align="left">Sensor Type</th>
<th align="left">geolocation-id-hash Input</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left">Mobile (CAMARA)</td>
<td align="left"><tt>SHA-256(tpm-ak-bytes \|\| IMEI-bytes \|\| IMSI-bytes)</tt></td>
</tr>

<tr>
<td align="left">GNSS receiver</td>
<td align="left"><tt>SHA-256(tpm-ak-bytes \|\| sensor-serial-bytes \|\| sensor-class-id-bytes)</tt></td>
</tr>
</tbody>
</table><t>The verifier sees only the opaque hash — never the raw identifiers.</t>
</section>

<section anchor="tpm-quote-verification-procedure"><name>TPM Quote Verification Procedure</name>

<ol spacing="compact">
<li>Decode <tt>tpm-quote-seal</tt> (Base64URL → bytes)</li>
<li>Parse <tt>TPMS_ATTEST</tt> structure</li>
<li>Assert <tt>TPMS_ATTEST.type == TPM_ST_ATTEST_QUOTE</tt></li>
<li>Compute <tt>expected_qd = SHA-256(JCS({tpm-ak, geolocation-id-hash, geolocation-proof-hash, privacy-technique, nonce, timestamp, workload-identity-agent-image-digest}))</tt></li>
<li>Assert <tt>TPMS_ATTEST.qualifyingData == expected_qd</tt></li>
<li>Verify signature over <tt>TPMS_ATTEST</tt> bytes using <tt>tpm-ak</tt> public key (RSASSA-PKCS1-v1_5 or ECDSA)</li>
</ol>
</section>

<section anchor="example-instance-privacy-technique-zkp"><name>Example Instance (privacy-technique = &quot;zkp&quot;)</name>

<sourcecode type="json"><![CDATA[{
  "lah-bundle": {
    "tpm-ak": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG...\n-----END PUBLIC KEY-----",
    "geolocation-id-hash": "7f4a2c1b9e3d8f0a6b5c4d2e1f0a9b8c...",
    "geolocation-proof-hash": "c8bc2ed62a7a650d99e0884197cdf345...",
    "privacy-technique": "zkp",
    "geolocation-payload": {
      "zkp-proof-uri": "https://verifier.example/v1/proof/c8bc2ed6...",
      "zkp-format": "plonky2"
    },
    "nonce": "ZmUyZjdmMzlmZGVlZWQxOTM1YjY0Mjk0...",
    "timestamp": 1740693456,
    "tpm-quote-seal": "ARoAAQALAAUACwEA...",
    "workload-identity-agent-image-digest": "a1b2c3d4e5f6...64-char-hex-sha256"
  },
  "mno-endorsement": {
    "mno-key-cert": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...",
    "mno-sig": "MEYCIQDx9z2k..."
  },
  "workload": {
    "workload-id": "spiffe://example.org/python-app",
    "key-source": "tpm-app-key"
  }
}
]]></sourcecode>
</section>

<section anchor="nonce-chain-and-merkle-audit-log"><name>Nonce Chain and Merkle Audit Log</name>
<t>Where <tt>bundle[n]</tt> denotes the JCS-canonicalized <tt>lah-bundle</tt> object at attestation interval <tt>n</tt>:</t>

<artwork><![CDATA[chain[n] = SHA-256(chain[n-1] || SHA-256(JCS(bundle[n])))
nonce[n]  = HMAC(secret, n || chain[n-1])
]]></artwork>
<table>
<thead>
<tr>
<th align="left">Mechanism</th>
<th align="left">Role</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left">Chained nonce</td>
<td align="left">Input control — agent cannot submit without responding to the management plane's current state.</td>
</tr>

<tr>
<td align="left">Merkle chain</td>
<td align="left">Audit output — proves inclusion of past bundles, detects gaps, and enables regulatory audit.</td>
</tr>
</tbody>
</table></section>
</section>

<section anchor="scalable-fleet-management"><name>Scalable Fleet Management</name>
<t>Large deployments need lifecycle management for the attestation keys referenced by V-GAP (for example, <tt>tpm-ak</tt>) and for the policies that authorize them.</t>
</section>

<section anchor="key-registry-and-synchronization"><name>Key Registry and Synchronization</name>

<ul spacing="compact">
<li>A Cloud (central) Host Identity Management Plane maintains a registry of accepted AK public keys and associated metadata (e.g., EK certificate chain, hardware identity, and status).</li>
<li>An Edge Host Identity Management Plane <bcp14>MAY</bcp14> maintain a local registry to support disconnected operation and periodically synchronizes updates to the central registry.</li>
</ul>
</section>

<section anchor="key-rotation"><name>Key Rotation</name>
<t>To prevent rogue key injection during rotation:</t>

<ul spacing="compact">
<li>The central registry <bcp14>MUST</bcp14> accept a new AK only if the edge plane provides a rotation proof that chains the new AK to previously accepted state.</li>
<li>A rotation proof <bcp14>MUST</bcp14> be a JCS-canonicalized object signed by the previously accepted AK (or, if available, validated by a fresh hardware-rooted OOB quote).</li>
</ul>

<section anchor="example-rotation-proof-informative"><name>Example Rotation Proof (Informative)</name>

<sourcecode type="json"><![CDATA[{
 "new-ak-pub": "Base64URL_Encoded_Public_Key",
 "serial-number": "AK_Serial_XYZ",
 "timestamp": 1708845600,
 "hardware-uuid": "Host_Hardware_UUID",
 "signature": "Base64URL_Signature_from_Previous_AK"
}
]]></sourcecode>
</section>
</section>

<section anchor="credential-activation-and-re-verification"><name>Credential Activation and Re-Verification</name>
<t>Credential activation (e.g., <tt>TPM2_MakeCredential</tt>) is expensive to run on every request. Verifiers <bcp14>SHOULD</bcp14> perform it on events such as:</t>

<ul spacing="compact">
<li>Initial onboarding<br />
</li>
<li>Reboot / reset detection (e.g., TPM clock/reset counters)<br />
</li>
<li>Policy violations or drift signals (e.g., firmware or inventory changes)<br />
</li>
<li>Failure of location evidence checks<br />
</li>
<li>Explicit elevation to higher assurance policy<br />
</li>
</ul>
<t>Between full activations, verifiers <bcp14>MAY</bcp14> accept fresh quotes from registered AKs as proof of continued compliance, subject to policy.</t>
</section>

<section anchor="revocation-and-health-signals"><name>Revocation and Health Signals</name>

<ul spacing="compact">
<li>The edge plane <bcp14>SHOULD</bcp14> maintain a per-node health signal (e.g., tamper, firmware policy violations).</li>
<li>On severe health signals, the verifier <bcp14>MUST</bcp14> revoke the relevant AK(s) and reject identities derived from them according to policy.</li>
</ul>
</section>

<section anchor="disconnected-operation-leased-identity"><name>Disconnected Operation (Leased Identity)</name>
<t>For intermittent connectivity, the verifier <bcp14>MAY</bcp14> issue identities with extended validity (a lease) under policy. If a lease is used:</t>

<ul spacing="compact">
<li>The edge plane <bcp14>MUST</bcp14> revoke or refuse renewal locally on tamper/drift signals.</li>
<li>The workload <bcp14>MUST</bcp14> re-attest and satisfy current policy on reconnection before renewal or release of high-value secrets.</li>
</ul>
</section>

<section anchor="deployment-patterns-informative"><name>Deployment Patterns (Informative)</name>
<t>Implementations commonly fall into the following patterns, differing in how platform integrity evidence and the <tt>tpm-quote-seal</tt> are collected:</t>

<ul>
<li><t><strong>In-band host attestation</strong>: Evidence collected by host software (for example, Keylime-style deployments). In this pattern, the Workload Identity Management Plane (for example, SPIRE Server) generates <tt>N_fusion</tt> and shares it with the Host Identity Management Plane (for example, the Keylime Verifier) over a server-to-server channel. The Keylime Verifier then delivers <tt>N_fusion</tt> to the Keylime Agent running on the host, which collects TPM and geolocation evidence, assembles the <tt>lah-bundle</tt>, and returns it via the host-side channel. This pattern is well-suited to commodity servers and cloud VMs where a BMC path is not available or not required.</t>
</li>
<li><t><strong>Out-of-band management</strong>: Evidence collected via a management controller / BMC path (for example, iLO-class OOB management such as HPE OneView). In this pattern, the Workload Identity Management Plane (for example, SPIRE Server) generates <tt>N_fusion</tt> and shares it with the Host Identity Management Plane (for example, HPE OneView) over a server-to-server channel. The Host Identity Management Plane then delivers <tt>N_fusion</tt> to the host via the BMC / OOB path — bypassing the host OS entirely. The host TPM seals the <tt>lah-bundle</tt> with that nonce, and the sealed bundle is returned via the same OOB path. This pattern is recommended for high-assurance environments where the host OS is part of the threat model.</t>
</li>
<li><t><strong>Cloud-hosted attestation environments</strong>: Provider mechanisms exposing measured boot and TPM-backed claims (for example, Nitro-class enclaves or shielded VM instances). The cloud provider supplies a hardware-rooted quote that can serve as the <tt>tpm-quote-seal</tt>; the geolocation claim is typically derived from the provider's zone or region attestation. Implementations SHOULD verify that the provider's attestation scope satisfies the geofence policy.</t>
</li>
</ul>
</section>
</section>

<section anchor="operational-considerations"><name>Operational Considerations</name>

<section anchor="distributed-identity-issuance-and-scaling"><name>Distributed Identity Issuance and Scaling</name>
<t>To support edge deployments and intermittent connectivity, identity issuance may be distributed within a sovereign boundary.</t>

<ul spacing="compact">
<li><strong>Edge issuance</strong>: Workload identities (for example, SVIDs) MAY be issued by an issuer deployed within the same boundary as the workloads.</li>
<li><strong>Scoping</strong>: Issued identities SHOULD be scoped so they are not accepted outside the intended deployment boundary (for example, via trust bundle partitioning and policy).</li>
<li><strong>Renewal gating</strong>: Issuers SHOULD renew short-lived identities only when the verifier result for integrity and residency is valid for the requested freshness window.</li>
</ul>
</section>

<section anchor="mobility-and-sovereign-handover-informative"><name>Mobility and Sovereign Handover (Informative)</name>
<t>When a workload moves between anchors or boundaries, the Workload Identity Agent MUST obtain a new V-GAP bundle that reflects the new LAH and current residency.</t>
<t>Verifiers SHOULD treat this as a normal re-attestation event:
- platform integrity continuity can remain stable, but
- residency checks MUST be re-evaluated for the new anchor/boundary.</t>
</section>

<section anchor="location-anchor-hosts-informative"><name>Location Anchor Hosts (Informative)</name>
<t>To scale location sensing, a deployment may use dedicated anchors:</t>

<ul spacing="compact">
<li><strong>End-user anchors</strong>: A user device (for example, a phone) can serve as an LAH for a nearby client device. The mechanism by which the anchor establishes its own location (and any proximity evidence it may provide) is out of scope for this document.</li>
<li><strong>Data center anchors</strong>: A small set of hosts can act as LAHs for a cluster. Timing-based mechanisms (for example, PTP-derived) may assist in establishing relative location; protocol details are deferred to future profiling work (see [[I-D.ramki-ptp-hardware-rooted-attestation]]).</li>
</ul>
</section>
</section>

<section anchor="policy-use-informative"><name>Policy Use (Informative)</name>
<t>Relying parties and identity issuers can use V-GAP results as inputs to authorization.</t>

<ul spacing="compact">
<li><strong>ABAC</strong>: Residency and integrity can be mandatory claims for sensitive operations.</li>
<li><strong>KMS gatekeeping</strong>: Release of high-value assets (for example, decryption keys) SHOULD depend on a recent successful verification result.</li>
<li><strong>Fail closed</strong>: If V-GAP evidence is carried in an X.509 extension and marked CRITICAL, any implementation that does not understand the extension will reject the credential.</li>
</ul>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>V-GAP reduces reliance on spoofable location signals and stolen tokens by making integrity and residency cryptographically verifiable. Implementers still need to address the following threats:</t>

<ul spacing="compact">
<li><strong>Replay and mix-and-match</strong>: Use nonces and evidence stapling so that old location evidence cannot be combined with a fresh platform quote (or vice versa).</li>
<li><strong>Location spoofing</strong>: Treat sensor and network inputs as adversarial. Prefer multiple, corroborating sources where feasible, and apply conservative policy when evidence quality degrades.</li>
<li><strong>Relay and displacement</strong>: When proximity mechanisms are introduced in future profiles, implementers should be aware that they are vulnerable to relay attacks and anchor displacement. Mitigations (such as tight RTT-based acceptance windows and anchor health attestation) are deferred to those future profiles.</li>
<li><strong>Management plane compromise</strong>: OOB paths reduce dependence on the host OS but introduce dependence on the management controller and its network. Protect this plane with secure boot, authenticated updates, strong access controls, network segmentation, and audit logging.</li>
<li><strong>Time and freshness</strong>: Verifiers MUST enforce bounded freshness windows and MUST define recovery behavior (re-attestation, quarantine, or revocation) when clocks drift or evidence becomes stale.</li>
<li><strong>Registry and allowlist integrity</strong>: Protect key registries and policy stores against tampering; treat them as high-value privileged assets.</li>
<li><strong>Privacy</strong>: Avoid unnecessary collection or retention of precise location data. Prefer &quot;in-zone&quot; proofs (ZKP) where policy permits.</li>
</ul>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
<t>IANA is requested to register the following Object Identifier (OID) in the &quot;SMI Numbers&quot; registry under the &quot;SMI Private Enterprise Numbers&quot; (1.3.6.1.4.1) branch, or as appropriate for the V-GAP profile.</t>
<t><strong>Mandatory Criticality:</strong> Implementations of this profile MUST mark the X.509 extension containing the V-GAP Evidence Bundle as <strong>CRITICAL</strong>. This ensures that non-compliant gateways fail closed rather than granting access to residency-constrained workloads.</t>

<ul spacing="compact">
<li><strong>OID</strong>: <tt>1.3.6.1.4.1.55744.1.1</tt></li>
<li><strong>Description</strong>: Verifiable Geofencing Attestation Profile (V-GAP) Evidence Bundle</li>
<li><strong>Reference</strong>: This document.</li>
</ul>
</section>

<section anchor="appendix-open-issues"><name>Appendix: Open Issues</name>
<t>The following items are unresolved and are tracked for future revisions of this document.</t>

<section anchor="ima-restart-behavior"><name>IMA Restart Behavior</name>
<t>Define an interoperable way to detect and handle Workload Identity Agent restarts without requiring a full host reboot, while preserving measurement integrity.</t>
</section>

<section anchor="location-privacy-options"><name>Location Privacy Options</name>
<t>Clarify the complete set of supported privacy techniques and define the policy logic for selecting between precise location disclosure, coarse location, and ZKP-based &quot;in-zone&quot; proofs.</t>
</section>

<section anchor="proximity-profiles"><name>Proximity Profiles</name>
<t>This document defers proximity proof mechanisms to future profiling work. Open items include:</t>

<ul spacing="compact">
<li>Defining one or more proximity evidence profiles (for example, PTP-derived, BLE/UWB ranging, or network-RTT-based) as separate documents.</li>
<li>Specifying how proximity evidence is represented and bound to the V-GAP bundle (for example, as an additional hash field).</li>
<li>Addressing relay and displacement threats, including RTT-based acceptance windows, anchor health attestation, and disagreement policies for multi-anchor deployments.</li>
<li>Profiling the use of CAMARA-style MNO location signals as a proximity corroboration mechanism.</li>
</ul>
</section>

<section anchor="geotagging-textual-data"><name>Geotagging Textual Data</name>
<t>There is no widely deployed standard for geotagging arbitrary textual data objects.</t>
</section>

<section anchor="attesting-geotags"><name>Attesting Geotags</name>
<t>There is no widely deployed standard for cryptographically signing geotags to prevent manipulation.</t>
</section>
</section>

<section anchor="appendix-public-references-for-strict-data-residency-rules"><name>Appendix: Public References for Strict Data Residency Rules</name>
<t>India -- Reserve Bank of India (RBI): Payment System Data Localization (2018): From RBI Circular RBI/2017-18/153 (April 6, 2018): &quot;All system providers shall ensure that the entire data relating to payment systems operated by them are stored in a system only in India. This data should include the full end-to-end transaction details / information collected / carried / processed as part of the message / payment instruction.&quot;</t>
<t>South Korea's Data Localization Regulations -- Geospatial Information Management Act (Spatial Data Act): Article 16, Paragraph 1: Prohibits the export of state-led survey data.</t>
</section>

</middle>

<back>

</back>

</rfc>
