<?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-ritz-eca-impl-00" submissionType="IETF" category="exp" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="ECA-impl">Ephemeral Compute Attestation (ECA) - Implementation Guide</title><seriesInfo value="draft-ritz-eca-impl-00" stream="IETF" status="experimental" name="Internet-Draft"></seriesInfo>
<author fullname="Nathanael Ritz"><organization>Independent</organization><address><postal><street></street>
</postal><email>nathanritz@gmail.com</email></address></author><date year="2025" month="September" day="28"></date>
<area>SEC</area>
<workgroup></workgroup>

<abstract>
<t>This document provides implementation guidance, deployment
patterns, and integration considerations for the Ephemeral Compute
Attestation (ECA) protocol. It explores concrete Instance Factor
patterns ranging from hardware-rooted to artifact-based approaches,
documents operational experiences from prototype implementations,
and describes how ECA integrates with existing identity frameworks
such as ACME and SPIFFE/SPIRE. The document includes practical examples,
test vectors, and architectural guidance for deploying ECA across diverse
compute environments from cloud VMs to bare-metal systems.</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>The Ephemeral Compute Attestation (ECA) protocol
<xref target="I-D.ritz-eca"></xref> defines a transport-agnostic, three-phase
ceremony for establishing compute instance identity without
pre-shared operational credentials. While the core protocol
document specifies the normative requirements and security
properties, this companion document addresses the practical aspects
of implementing and deploying ECA in real-world environments.</t>
<t>This guide serves three primary audiences:</t>

<ol spacing="compact" type="%d.">
<li><strong>Implementers</strong> seeking concrete examples, test vectors, and
reference code for building ECA-compliant systems</li>
<li><strong>Operators</strong> evaluating deployment patterns and integration
strategies for their infrastructure</li>
<li><strong>Architects</strong> designing systems that leverage ECA for identity
bootstrapping in multi-cloud or high-assurance environments</li>
</ol>
<t>The guidance ranges from minimal deployments suitable for
individual developers to enterprise-scale integrations with
existing identity management systems. Each pattern is accompanied
by security considerations, operational trade-offs, and
implementation notes drawn from prototype experience.</t>
</section>

<section anchor="instance-factor-patterns-ifp"><name>Instance Factor Patterns (IFP)</name>
<t>ECA supports full integration with hardware roots of trust (HRoT)
where available, and such integration is RECOMMENDED. ECA does not
replace the need for HRoTs where the threat model must assume a
compromised service provider, hypervisor or related platform
risks.</t>
<t>The choice of IFP pattern determines the source of the <tt>IF</tt> and the
strength of the resulting security guarantee. The security of the
ECA protocol's initial phase depends on the Attester proving
possession of this secret <tt>IF</tt>, which is bound to the public
<strong>Boot Factor (<tt>BF</tt>)</strong>.</t>
<t>The three defined patterns are:</t>

<ul spacing="compact">
<li><strong>IFP Pattern A (Hardware-Rooted)</strong>: The <tt>IF</tt> is a secret value
derived from a hardware root of trust (HRoT), such as a vTPM or
TEE. This pattern provides the highest level of security, as it
can mitigate threats from a compromised provider.</li>
<li><strong>IFP Pattern B (Orchestrator-Provisioned)</strong>: The <tt>IF</tt> is a
secret provided by a trusted orchestrator through a secure
channel, like instance metadata. This approach protects against
network attackers but assumes the infrastructure provider is
trusted.</li>
<li><strong>IFP Pattern C (Artifact-Based)</strong>: The <tt>IF</tt> is the entire
content of a larger provisioned file (e.g., an <tt>authorized_keys</tt>
file) that also contains the <tt>BF</tt>. This pattern is designed to
address Trust-on-First-Use (TOFU) vulnerabilities in constrained
environments.</li>
</ul>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>See <eref target="https://datatracker.ietf.org/doc/draft-ritz-eca-00/">ECA Protocol Security Considerations</eref></t>

<section anchor="minimal-deployment-and-trust-chain-sketch-pattern-c"><name>Minimal Deployment and Trust Chain Sketch (Pattern C)</name>
<t>This section illustrates how ECA can be used even at a small,
human-driven scale—such as by an individual developer—to provide
cryptographic assurance for ephemeral instances without requiring
complex infrastructure or hardware roots of trust, using <tt>IFP
Pattern C</tt>. For security considerations with this pattern, see the
core protocol document's Section 6.2 &quot;Impersonation Risk&quot;.</t>
<t>In this sketch, the Instance Factor (IF) is an artifact-based
secret such as the full content of an injected file containing the
Boot Factor (BF). Mapped to RATS architecture roles, the laptop is
the <tt>Verifier</tt>, the VM is the <tt>Attester</tt> and the individual
developer acts effectively as the <tt>Relying Party</tt> (RP).</t>

<ol spacing="compact" type="%d.">
<li>Developer trusts their local ECA toolchain CLI for <tt>BF</tt>
generation</li>
<li>Developer trusts Service Provider to correctly inject
<tt>BF</tt>/<tt>SSH public key</tt></li>
<li>Developer trusts their laptop to keep <tt>VF</tt> confidential</li>
<li>VM proves possession of <tt>BF</tt>+<tt>IF</tt> to receive <tt>VF</tt></li>
<li>VM proves possession of <tt>BF</tt>+<tt>VF</tt> to complete attestation</li>
<li>Developer has acceptable assurance to connect directly with VM</li>
</ol>
<blockquote><t>Implementation note: As of this draft (-00), preliminary tests
with a prototype CLI toolchain suggest a total attestation
latency of approx. 1.5 seconds—from VM liveliness to actionable
results. See Section 8 for further implementation details.</t>
</blockquote></section>
</section>

<section anchor="post-attestation-patterns"><name>Post-Attestation Patterns</name>
<t>Once the ceremony has concluded, operators can make policy
decisions about how to handle the Attestation Result (AR). This may
include transmitting the <tt>AR</tt> directly to the successful Attester
so that it may present the <tt>AR</tt> to Relying Parties (RPs) who trust
the Verifier's signature. The full scope and mechanism of
presenting and accepting <tt>AR</tt>s to <tt>RP</tt>s is outside the scope of
this document.</t>

<section anchor="stateful-re-attestation-for-long-running-instances"><name>Stateful Re-Attestation for Long-Running Instances</name>
<t>The ECA protocol is primarily designed for the initial identity
bootstrap of ephemeral compute instances. However, long-running
workloads may require a mechanism for renewing their operational
credentials. A credential renewal can be modeled as a
&quot;re-attestation&quot; ceremony.</t>
<t>In this model, the original, stable <tt>eca_attester_id</tt> identity
would serve as a Renewal Factor (<tt>RF</tt>), analogous to the <tt>BF</tt>. The
new Instance Factor (<tt>IF</tt>) would be a manifest of &quot;known good&quot;
measurements of the instance's current state (e.g., hashes of
critical binaries or configuration files). This turns the renewal
into a periodic health and integrity check, ensuring the instance
remains in a known-good state throughout its lifecycle. A future
profile of ECA may define a renewal protocol based on stateful
re-attestation.</t>
</section>

<section anchor="chaining-and-hierarchical-trust"><name>Chaining and Hierarchical Trust</name>
<t>The ECA protocol is inherently composable, enabling the creation of
multi-layer trust architectures that can propagate trust from
hardware up through layers of software. This is achieved by using
the signed Attestation Result (AR) from one ceremony as a
cryptographic input—specifically, the Instance Factor (IF)—for a
subsequent ceremony.</t>
<t>A straightforward deployment pattern for this is represented by the
following &quot;bare-metal-to-VM&quot; attestation chain:</t>

<ol type="%d.">
<li><t><strong>Initial Attestation (Hardware Layer):</strong> A physical host
(<tt>Attester i</tt>) performs an ECA ceremony using an <strong>Instance
Factor</strong> derived from a hardware root of trust (e.g., a TPM
quote, per <tt>IFP Pattern A</tt>). It attests to a low-level Verifier
(<tt>Verifier i</tt>) that is trusted to appraise hardware integrity.
The successful result is a signed Attestation Result, <tt>AR_i</tt>.</t>
</li>
<li><t><strong>Second-Level Attestation (VM Layer):</strong> A virtual machine
(<tt>Attester ii</tt>) is instantiated on the host. Its provisioned
<strong>Instance Factor</strong> is the signed <tt>AR_i</tt> from the hardware
layer. <tt>Attester ii</tt> performs its own ECA ceremony with a higher
-level cloud orchestrator (<tt>Verifier ii</tt>). To validate,
<tt>Verifier ii</tt> first cryptographically verifies <tt>AR_i</tt>
(confirming it trusts <tt>Verifier i</tt>), and if valid, proceeds with
the rest of the ECA ceremony.</t>
</li>
</ol>
<t>The final result, <tt>AR_ii</tt>, is a portable credential that
cryptographically proves a healthy VM is running on a specific,
healthy, and previously attested physical host. The same pattern
can be used to bridge trust domains, for example by consuming an
<tt>SVID</tt> from an existing <tt>SPIFFE/SPIRE</tt> infrastructure as the
Instance Factor for an attester in a separate cloud environment. A
future profile of ECA may define a specific profile for chaining
and hierarchical trust.</t>
</section>

<section anchor="risks-and-mitigations-for-composable-deployments"><name>Risks and Mitigations for Composable Deployments</name>
<t>While ECA is designed to be composable (e.g., chaining
attestations), realizing this benefit in large teams is expected to
require significant operational discipline. Operators should be
aware of the following risks:</t>

<dl newline="true">
<dt>The &quot;Glue Code&quot; Trap</dt>
<dd><t>The security of the overall system depends on the integrity of
each link in the chain. Custom scripts or shims used to connect
different attestation layers can inadvertently reintroduce the
very vulnerabilities (e.g., parsing flaws, state management
bugs) that SAE <xref target="I-D.ritz-sae"></xref> is designed to eliminate. It
is STRONGLY RECOMMENDED to use standardized, well-vetted
integrations (e.g., official plugins for tools like Vault or
SPIRE) over bespoke &quot;glue code.&quot;</t>
</dd>
<dt>Organizational Friction</dt>
<dd><t>In multi-team environments, clear ownership of the end-to-end
attestation process is critical. Without a shared governance
model, configuration drift between what DevOps provisions, what
Security expects, and what the application implements can lead to
systemic failures.</t>
</dd>
</dl>
</section>
</section>

<section anchor="integration-with-existing-frameworks"><name>Integration with Existing Frameworks</name>
<t>The ECA protocol is designed to complement, not replace, existing
identity and attestation systems. It acts as a foundational
&quot;attestation engine&quot; that fills specific gaps in cross-domain
portability and high-assurance bootstrapping for ephemeral
workloads. Its role is to provide a verifiable, portable proof of
identity that can be consumed by a wide range of higher-level
identity frameworks and certificate issuance protocols, as
illustrated below.</t>

<artwork><![CDATA[┌─────────────────┐    ┌──────────────────┐    ┌──────────────────┐
│   Ephemeral     │    │   Identity &     │    │   Certificate    │
│   Compute       │    │   Access         │    │   Authority      │
│   Environment   │    │   Management     │    │   Ecosystems     │
├─────────────────┤    ├──────────────────┤    ├──────────────────┤
│ • Cloud VMs     │    │ • SPIFFE/SPIRE   │    │ • ACME-RATS      │
│ • Containers    │◄───│ • Vault          │◄───│ • PKI            │
│ • Bare Metal    │    │ • IAM Systems    │    │ • CA/Browser     │
└─────────────────┘    └──────────────────┘    └──────────────────┘
         │                        │                       │
         └────────────────────────┼───────────────────────┘
                                  │
                         ┌────────▼────────┐
                         │   ECA + SAE     │
                         │  Attestation    │
                         │    Engine       │
                         └─────────────────┘
]]></artwork>

<section anchor="realizing-the-rats-passport-model"><name>Realizing the RATS Passport Model</name>
<t>ECA aligns with the Passport Model of the RATS Architecture
<xref target="RFC9334"></xref>, where the Attester obtains a portable Attestation
Result (e.g., an EAT <xref target="RFC9711"></xref>) from the Verifier for presentation
to Relying Parties. While RATS provides the roles and terminology
for remote attestation, it does not specify a concrete protocol for
cross-cloud identity bootstrapping. ECA fills this gap by defining
a phased exchange that produces standardized EATs bound to joint
ephemeral factors, enabling interoperability across heterogeneous
providers.</t>
</section>

<section anchor="eca--acme-rats"><name>ECA + ACME-RATS</name>
<t>A powerful use case for ECA is as a mechanism to satisfy the
attestation challenges proposed within the ACME working group, as
described in the &quot;(ACME) rats Identifier and Challenge Type&quot;
(ACME-RATS) Internet-Draft <xref target="I-D.liu-acme-rats"></xref>. The <tt>ACME-RATS</tt>
specification defines an abstract challenge/response mechanism for
device attestation but intentionally leaves the implementation of
the attestation procedure itself out of scope. ECA can act as a
bridge, providing the full three-phase ceremony—from initial
bootstrap to final proof-of-possession—that an ACME client can
execute to produce the verifiable Attestation Result (AR) required
by the <tt>attestation-result-01</tt> challenge (Passport Model).</t>
<t>When you combine ECA with the ACME-RATS framework, you create a
complete, end-to-end automated flow.</t>
<t>This integration approach enables a powerful vision: just as ACME
enabled the automation of web server certificates and brought about
ubiquitous HTTPS, the combination of ACME-RATS and ECA can enable
the automated issuance of high-assurance identities to ephemeral
workloads, realizing a &quot;Let's Encrypt&quot; for Machines.&quot;</t>

<section anchor="conceptual-integration"><name>Conceptual Integration</name>
<t>An integration of an ACME client with an ECA Attester would follow
this sequence:</t>

<ol type="%d.">
<li><t><strong>ACME Challenge:</strong> The ACME client (running on the ephemeral
instance) requests a certificate and receives an
<tt>attestation-result-01</tt> challenge from the ACME server. This
challenge includes a server-provided <tt>token</tt> (acting as a nonce
for freshness) and optional <tt>claimsHint</tt> (e.g., required claims
like <tt>FIPS_mode</tt> or <tt>OS_patch_level</tt>).</t>
</li>
<li><t><strong>ECA Initiation:</strong> The ACME client triggers an ECA ceremony
with a trusted Verifier (separate from the ACME Server). The
ACME <tt>token</tt> is passed to the ECA Verifier to be used as (or
bound to) the <tt>vnonce</tt> for the ceremony, ensuring freshness
binding.</t>
</li>
<li><t><strong>ECA Ceremony:</strong> The Attester (ACME client/instance) and
Verifier execute the full, three-phase ECA protocol as defined
in <tt>draft-ritz-eca-core</tt>. If a <tt>claimsHint</tt> was provided, the
Attester collects corresponding measurements/claims in its
Evidence (e.g., EAT). The Verifier ensures the ACME <tt>token</tt> is
included as the <tt>nonce</tt> claim in the final Evidence EAT
(validated at Gate 8: Nonce Match).</t>
</li>
<li><t><strong>Attestation Result:</strong> Upon successful validation (including
appraisal against Verifier policy), the Verifier produces a
signed Attestation Result (AR) and delivers it to the Attester
(e.g., via SAE transport).</t>
</li>
<li><t><strong>ACME Response:</strong> The ACME client wraps the signed AR in a
Conceptual Message Wrapper (CMW) with
<tt>type=attestation-result</tt> and submits it to the ACME server,
completing the challenge.</t>
</li>
<li><t><strong>ACME Validation (as RP):</strong> The ACME Server verifies the
Verifier's signature on the AR (using pre-configured trust
anchors), checks the <tt>nonce</tt> matches its issued <tt>token</tt>,
appraises claims against policy (including any required
<tt>claimsHint</tt>), and—if valid—issues the certificate.</t>
</li>
</ol>
</section>

<section anchor="roles-and-artifacts"><name>Roles and Artifacts</name>
<t>This section provides a conceptual, speculative composition where
an ECA ceremony supplies an Attestation Result (AR) that satisfies
the ACME <tt>attestation-result-01</tt> challenge.</t>

<dl newline="true">
<dt>Attester</dt>
<dd><t>Ephemeral instance (e.g., VM/workload) running the ACME client
and ECA Attester logic. It possesses initial factors (BF + IF),
collects Evidence (e.g., from TPM/TEE/platform measurer), and
performs the ECA ceremony to obtain an AR.</t>
</dd>
<dt>Evidence Source</dt>
<dd><t>Implementation-specific (e.g., TPM/TEE for hardware-rooted IFP
Pattern A; see Section 2).</t>
</dd>
<dt>Verifier</dt>
<dd><t>Separate trusted entity (e.g., enterprise-operated or
manufacturer-designated). Appraises Evidence against policy,
issues signed AR. Trusts anchors for Evidence sources but is
<em>not</em> the ACME Server.</t>
</dd>
<dt>ACME Server (RP/RA/CA)</dt>
<dd><t>Issues challenges, acts as Relying Party (validates AR
signature/claims/nonce), enforces policy, and finalizes
certificate issuance. Pre-configured with trust anchors for one
or more Verifiers.</t>
</dd>
<dt>Inputs</dt>
<dd>
<ul spacing="compact">
<li><strong>ACME Challenge Token</strong>: Freshness nonce; bound to ECA
<tt>vnonce</tt>.</li>
</ul>

<ul spacing="compact">
<li><strong>Claims Hint</strong> (optional): Guides Evidence collection (e.g.,
<tt>FIPS_mode</tt>, <tt>OS_patch_level</tt>); reflected in AR claims.</li>
</ul></dd>
<dt>Outputs</dt>
<dd>
<ul spacing="compact">
<li><strong>Attestation Result (AR)</strong>: Verifier-signed (delivered to
Attester).</li>
</ul>

<ul spacing="compact">
<li><strong>CMW Object</strong>: Wraps AR (Attester → ACME Server);
<tt>type=attestation-result</tt>, <tt>format</tt> = AR profile (e.g., AR4SI
or EAT).</li>
</ul></dd>
</dl>
</section>

<section anchor="operational-flow-conceptual"><name>Operational Flow (Conceptual)</name>

<artwork><![CDATA[+----------------+        +-----------------+     +-----------------+
|    Attester    |        |     Verifier    |     |    ACME Server  |
| (ACME client)  |        |  (RATS role)    |     |   (RA/CA roles) |
+--------+-------+        +--------+--------+     +---------+-------+
         |                         |                        |
(1) New Order / AuthZ              |                        |
         |------------------------>|  [normal ACME steps]   |
         |                         |                        |
(2) Challenge: attestation-result-01 (token, [claimsHint])  |
         |<-------------------------------------------------|
         |                                                  |
(3) Start ECA ceremony (freshness := token)                 |
(3a) Collect evidence (incl. hinted claims)                 |
         |------------------------ evidence --------------->|
         |                         |                        |
(4) Appraise evidence; produce Attestation Result (AR)      |
         |<---------------------- signed AR ----------------|
         |                         |                        |
(5) Wrap AR in CMW                 |                        |
      (type=attestation-result, format=AR profile)          |
         |                                                  |
(6) Respond to challenge with CMW-wrapped AR                |
         |------------------------------------------------->|
         |                         |                        |
(7) Verify Verifier signature; evaluate claims vs. policy   |
         |<----------------------- challenge=valid ---------|
         |                         |                        |
(8) Finalize order; issue certificate                       |
         |<-------------------------------------------------|
         |                         |                        |
]]></artwork>
</section>

<section anchor="eca--acme-rats-trust-chain-sketch"><name>ECA + ACME-RATS Trust Chain Sketch</name>

<ul spacing="compact">
<li><strong>ACME Server</strong> is pre-configured with trust anchors (e.g., key
set or CA) for one or more Verifiers.</li>
<li><strong>Attester</strong> trusts its local Evidence source (e.g., HRoT) and
the Verifier (via ECA's cryptographic proofs) but starts in a
privileged credential vacuum—no ACME-specific creds prior to
challenge completion.</li>
<li><strong>Verifier</strong> publishes a stable identifier (e.g., <tt>key id</tt>)
discoverable by the ACME Server (e.g., via directory or config).</li>
<li><strong>Freshness/Nonce Binding</strong>: ACME <tt>token</tt> is bound to ECA
<tt>vnonce</tt> (e.g., <tt>vnonce = token</tt> or
<tt>vnonce = SHA-256(token || eca_uuid)</tt>), included in Evidence EAT,
and reflected in AR. ACME Server checks match at validation.</li>
</ul>
</section>
</section>

<section anchor="the-spiffespire-framework"><name>The SPIFFE/SPIRE Framework</name>
<t>SPIFFE/SPIRE provides a robust framework for issuing short-lived
cryptographic identities (SVIDs) to workloads, enabling zero-trust
authentication in distributed systems. While SPIFFE/SPIRE addresses
&quot;secret zero&quot; in many scenarios through platform-specific node
attestors (e.g., AWS EC2 or Kubernetes), it relies on extensible
plugins for custom environments which is a natural fit for an ECA
plugin implementation. SPIFFE/SPIRE is a CNCF-graduated community
standard rather than an IETF standard.</t>

<dl>
<dt>What ECA/SAE adds.</dt>
<dd><t>ECA defines an exposure-tolerant, accept-once bootstrap that
binds artifacts across dual channels and emits standardized
EAT-based evidence and Attestation Results (AR). SAE provides a
pull-only, static-artifact transport that works in heterogeneous
or constrained networks. These properties make ECA a good fit as
a high-assurance <em>node</em> attestor feeding SPIRE, without changing
SPIFFE's SVID/workload APIs.</t>
</dd>
<dt>Integration surface (SPIRE).</dt>
<dd><t>SPIRE supports authoring custom plugins via its extension points,
including node-attestors. Prior work integrates TPM-/IMA-based
attestation via Keylime, illustrating the &quot;hardware- or
higher-assurance attestor&quot; pattern that ECA can follow.</t>
</dd>
<dt>Operational intent.</dt>
<dd><t>ECA does not replace SPIFFE/SPIRE. It <em>precedes</em> or <em>augments</em>
SPIRE node admission where provider metadata is weak, join-token
operations are costly, or transports are constrained. After ECA
succeeds, SPIRE issues SVIDs and federates as usual.</t>
</dd>
</dl>
<blockquote><t><em>Terminology note.</em> In SPIRE, node-attestor plugins expose
<strong>selectors</strong> (key-value attributes used in SPIRE's policy
engine) that registration policies can match. In the ECA→SPIRE
mapping, fields from ECA's EAT/AR (e.g., <tt>eca_uuid</tt>, EUID,
JP/PoP artifacts, integrity beacons) naturally become such
selectors. <em>(SPIRE selector/registration context:
<eref target="title:">SPIRE-CONCEPTS</eref>.)</em></t>
</blockquote>
<artwork><![CDATA[# Example of SPIRE registration entry using ECA-derived selectors
spire-server entry create -spiffeID "spiffe://example.org/my-service" \
  -parentID "spiffe://example.org/spire/agent/eca/<verifier_id>" \
  -selector "eca:euid:a1b2c3d4..." \
  -selector "eca:ihb:e5f6g7h8..."
]]></artwork>
<t>Complementary deployment patterns:</t>

<dl newline="true">
<dt>Alt-cloud / bare-metal without signed metadata.</dt>
<dd><t><em>Today:</em> defaults to join tokens or bespoke attestors where
robust, signed instance identity is absent.
<em>ECA integration:</em> implement ECA as a node-attestor plugin;
ECA's EAT/AR fields (e.g., EUID, IHB, PoP, nonces) become SPIRE
selectors for registration, then SPIRE issues SVIDs.</t>
</dd>
<dt>High-assurance with HRoT (Confidential/edge).</dt>
<dd><t><em>Today:</em> SPIRE can leverage TPM/IMA via Keylime but still depends
on environment-specific control planes.
<em>ECA integration:</em> ECA Pattern A binds identity to HRoT and
proves joint possession via SAE; SPIRE consumes the AR to gate
SVID issuance.
<em>(Keylime integrations:</em> <eref target="title:">KEYLIME-SPIRE-PLUGIN</eref>,
<eref target="title:">REDHAT-KEYLIME-SPIRE</eref>; <em>SPIRE plugin surface:</em> <eref target="title:">SPIRE-EXTENDING</eref>,
<eref target="title:">SPIRE-PLUGIN-SDK</eref>.)*</t>
</dd>
<dt>Dynamic multi-cluster aliasing/federation.</dt>
<dd><t><em>Today:</em> coordinating join tokens and node aliases across domains
can be operationally heavy.
<em>ECA integration:</em> selectors derived from ECA's EAT/AR (e.g.,
<tt>eca_uuid</tt>, EUID, JP) provide portable, verifiable bindings
without maintaining a separate join-token database.</t>
</dd>
<dt>Standards position.</dt>
<dd><t>SPIFFE/SPIRE are CNCF community standards; ECA/SAE are IETF
Internet-Drafts. This document positions ECA to <em>interoperate
with</em> SPIFFE/SPIRE—augmenting bootstrap where needed—rather than
to replace them. <em>(Status/background:</em> <eref target="title:">CNCF-GRADUATION</eref>,
<eref target="title:">SPIFFE-OVERVIEW</eref>.)*</t>
</dd>
</dl>
</section>

<section anchor="brski-bootstrapping-remote-secure-key-infrastructure"><name>BRSKI (Bootstrapping Remote Secure Key Infrastructure)</name>
<t>BRSKI <xref target="RFC8995"></xref> solves <em>manufacturer-anchored onboarding</em> for
physical devices that ship with an IEEE 802.1AR IDevID and a
manufacturer voucher service (MASA). ECA targets <em>ephemeral
compute</em> (VMs, containers) that typically lack such an identity.</t>
<t>The mechanisms are complementary: <strong>BRSKI</strong> is for day-0 hardware
onboarding based on supply-chain provenance, while ECA is for
just-in-time software and instance attestation at runtime. An
operator could use BRSKI to securely enroll a physical device into
their network, and then use ECA as a subsequent, continuous
attestation check to validate the software state running on that
device before releasing application-level privileges.</t>
</section>

<section anchor="summary-of-integration-benefits"><name>Summary of Integration Benefits</name>
<t>Adopting ECA as a foundational attestation engine provides several
key benefits:</t>

<ul spacing="compact">
<li><strong>Standards-Based:</strong> Built on emerging and established IETF
standards like RATS, EAT, and ACME.</li>
<li><strong>Portable:</strong> The protocol's transport-agnostic design works
across cloud, on-premise, and edge environments.</li>
<li><strong>Composable:</strong> Can be layered with existing systems like
SPIFFE/SPIRE to enhance their security posture.</li>
<li><strong>High-Assurance:</strong> Supports hardware roots of trust (<tt>IFP
Pattern A</tt>) for zero-trust environments.</li>
<li><strong>Automation-Friendly:</strong> Designed from the ground up for
ephemeral, dynamic, and automated infrastructures.</li>
</ul>
</section>
</section>

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

<dl>
<dt>Scalability</dt>
<dd><t>The use of a simple artifact repository allows for high
scalability using standard web infrastructure like CDNs and
object storage.</t>
</dd>
<dt>Time Synchronization</dt>
<dd><t>Reasonably synchronized time is REQUIRED for proper validation of
the <tt>nbf</tt> and <tt>exp</tt> time windows (Gate 4 skew tolerance: ±60s).
The use of a time synchronization protocol like NTP <xref target="RFC5905"></xref> is
RECOMMENDED. Polling MUST use exponential backoff with jitter.</t>
</dd>
<dt>Addressing Complexity</dt>
<dd><t>The multi-phase design of ECA is intentionally confined to the
infrastructure layer to provide a simple and secure operational
experience. ECA's cryptographic machinery is expected to be
abstracted away from the end-user. The prototype implementation
demonstrates this, executing a complete, parallel attestation
with a single command (e.g.
<tt>eca-toolchain attest --manifest ./manifest.yml</tt>), similar to how
a sophisticated suite of standards (SMTP, DKIM, etc.) underpins a
simple email &quot;send&quot; button.</t>
</dd>
</dl>

<section anchor="provisioning-and-repository-access"><name>Provisioning and Repository Access</name>
<t>The ECA protocol requires the Attester to publish artifacts while
adhering to the <strong>Privileged Credential Vacuum</strong> design principle
(see core protocol Section 3). This is achievable using standard
cloud primitives that grant ephemeral, narrowly-scoped write
capabilities without provisioning long-term secrets. Common
patterns include the control plane injecting a time-limited
pre-signed URL (e.g., for Amazon S3 or GCS) or a short-lived,
scoped OAuth2 token for the instance to use. In this model, the
Attester is granted the temporary <em>capability</em> to write to its
specific repository path, fulfilling the protocol's needs without
violating the zero-trust principle of verify-then-trust. Verifiers
MUST NOT rely on any CA or key material delivered by the Attester
for appraisal trust establishment. This reinforces the requirement
in core protocol Section 3.1.7.</t>
</section>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
<t>See <eref target="https://datatracker.ietf.org/doc/draft-ritz-eca-00/">ECA Protocol IANA Considerations</eref></t>
</section>

<section anchor="reference-profile-eca-vm-v1"><name>Reference Profile: ECA-VM-v1</name>
<blockquote><t>Stability note: This profile documents the concrete choices used
by the reference prototype to enable experimentation and interop.
It is non-normative and may change in future drafts based on
feedback.</t>
</blockquote>
<section anchor="primitives"><name>Primitives</name>

<ul spacing="compact">
<li>Hash / KDF: HKDF-SHA-256 (RFC5869), SHA-256 (RFC6234)</li>
<li>MAC: HMAC-SHA-256</li>
<li>Signatures: Ed25519 (RFC8032)</li>
<li>KEM/HPKE: X25519 + HPKE base mode (RFC9180) for Verifier -&gt;
Attester secrecy in Phase 2. The <tt>eca_uuid</tt> is used as the AAD,
and the <tt>info</tt> parameter for key derivation is <tt>&quot;ECA/v1/hpke&quot;</tt>.</li>
<li>Nonces: Verifier freshness <tt>vnonce</tt> is exactly 16 bytes (encoded
base64url, unpadded)</li>
</ul>
</section>

<section anchor="integrity-hash-beacon-ihb"><name>Integrity Hash Beacon (IHB)</name>

<ul spacing="compact">
<li><tt>IHB = SHA-256( BF || IF )</tt>, rendered as lowercase hex for
transport where necessary.</li>
</ul>
</section>

<section anchor="deterministic-key-material"><name>Deterministic Key Material</name>
<t>All keys are deterministically derived from ceremony inputs via
domain-separated HKDF invocations. Notation:
<tt>HKDF-Extract(salt, IKM)</tt> then <tt>HKDF-Expand(PRK, info, L)</tt>. The
<tt>eca_uuid</tt> is appended to the <tt>salt</tt> in all derivations to ensure
session uniqueness.</t>

<ul>
<li><t><strong>Phase 1 MAC key (Attester artifact MAC)</strong></t>

<ul spacing="compact">
<li><tt>IKM = BF || IF</tt></li>
<li><tt>salt = &quot;ECA:salt:auth:v1&quot; || eca_uuid</tt></li>
<li><tt>info = &quot;ECA:info:auth:v1&quot;</tt></li>
<li><tt>K_MAC_Ph1 = HKDF-Expand( HKDF-Extract(salt, IKM), info, 32 )</tt></li>
<li>Usage: HMAC-SHA-256 over the CBOR Phase-1 payload bytes.</li>
</ul></li>
<li><t><strong>Phase 2 ECDH/HPKE seed (Attester's ephemeral X25519 keypair)</strong></t>

<ul spacing="compact">
<li><tt>IKM = BF || IF</tt></li>
<li><tt>salt = &quot;ECA:salt:encryption:v1&quot; || eca_uuid</tt></li>
<li><tt>info = &quot;ECA:info:encryption:v1&quot;</tt></li>
<li><tt>seed32 = HKDF-Expand( HKDF-Extract(salt, IKM), info, 32 )</tt></li>
<li>The Attester forms an X25519 private key by clamping <tt>seed32</tt>
per RFC7748; the public key is derived normally.</li>
<li>The Verifier uses HPKE with the Attester's public key to
encrypt <tt>{VF, vnonce}</tt>.</li>
</ul></li>
<li><t><strong>Phase 3 signing key (Attester's Ed25519 identity keypair)</strong></t>

<ul spacing="compact">
<li><tt>IKM = BF || VF</tt></li>
<li><tt>salt = &quot;ECA:salt:composite-identity:v1&quot; || eca_uuid</tt></li>
<li><tt>info = &quot;ECA:info:composite-identity:v1&quot;</tt></li>
<li><tt>sk_seed32 = HKDF-Expand( HKDF-Extract(salt, IKM), info, 32 )</tt></li>
<li>The Attester initializes Ed25519 with <tt>sk_seed32</tt> as the
private key seed and derives the corresponding public key.</li>
</ul></li>
<li><t><strong>HPKE KDF <tt>info</tt> parameter:</strong> <tt>info = &quot;ECA/v1/hpke&quot;</tt></t>
</li>
</ul>
</section>

<section anchor="phase-artifacts"><name>Phase Artifacts</name>
<t><em>This section provides a high-level description of the payloads.
For concrete byte-for-byte examples, see Section 7.</em></t>

<section anchor="phase-1-payload-attester-repo"><name>Phase 1 Payload (Attester→Repo)</name>
<t>The Phase-1 payload is a CBOR map containing the following claims,
which is then protected by an external HMAC tag.</t>
<table>
<thead>
<tr>
<th align="left">Claim</th>
<th align="left">Value Type</th>
<th align="left">Description</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left"><tt>kem_pub</tt></td>
<td align="left"><tt>bstr</tt> (raw 32 bytes)</td>
<td align="left">Attester's ephemeral X25519 public key.</td>
</tr>

<tr>
<td align="left"><tt>ihb</tt></td>
<td align="left"><tt>tstr</tt> (lowercase hex)</td>
<td align="left">Integrity Hash Beacon.</td>
</tr>
</tbody>
</table></section>

<section anchor="phase-2-payload-verifier---repo"><name>Phase 2 Payload (Verifier -&gt; Repo)</name>
<t>The Phase-2 payload is a signed CBOR map containing the following
claims.</t>
<table>
<thead>
<tr>
<th align="left">Claim</th>
<th align="left">Value Type</th>
<th align="left">Description</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left"><tt>C</tt></td>
<td align="left"><tt>tstr</tt> (base64url unpadded)</td>
<td align="left">HPKE ciphertext</td>
</tr>

<tr>
<td align="left"><tt>vnonce</tt></td>
<td align="left"><tt>tstr</tt> (base64url unpadded)</td>
<td align="left">The Verifier-generated nonce.</td>
</tr>
</tbody>
</table><t>The plaintext for HPKE encryption is the direct concatenation of
the raw bytes: <tt>plaintext = VF || vnonce</tt>.</t>
</section>

<section anchor="phase-3-payload-attester---repo"><name>Phase 3 Payload (Attester -&gt; Repo)</name>
<t>The Phase-3 payload is a signed EAT as defined in the core protocol
Section 11.1. The profile-specific constructions for proofs are as
follows:</t>

<ul spacing="compact">
<li><t><strong>Joint-Possession Proof (concrete for this profile):</strong></t>

<ul spacing="compact">
<li><tt>jp_proof = SHA-256( BF || VF )</tt>, rendered as lowercase hex.</li>
</ul></li>
<li><t><strong>Proof-of-Possession (concrete for this profile):</strong></t>

<ul spacing="compact">
<li><t>First, a bound hash is computed from the session context:</t>

<ul spacing="compact">
<li><tt>bound_data = eca_uuid || IHB_bytes || eca_attester_id_bytes || vnonce_raw_bytes</tt></li>
<li><tt>bound_hash = SHA-256( bound_data )</tt></li>
</ul></li>
<li><t>Then, a dedicated MAC key is derived:</t>

<ul spacing="compact">
<li><tt>IKM = BF || VF</tt></li>
<li><tt>salt = &quot;ECA:salt:kmac:v1&quot; || eca_uuid</tt></li>
<li><tt>info = &quot;ECA:info:kmac:v1&quot;</tt></li>
<li><tt>K_MAC_PoP = HKDF-Expand( HKDF-Extract(salt, IKM), info, 32 )</tt></li>
</ul></li>
<li><t>Finally, the PoP tag is computed over the bound hash:</t>

<ul spacing="compact">
<li><tt>pop_tag = base64url( HMAC-SHA-256( K_MAC_PoP, bound_hash ) )</tt></li>
</ul></li>
</ul></li>
<li>The <tt>jp_proof</tt> and <tt>pop_tag</tt> are included in the EAT, which is
then signed with the Attester's Ed25519 key.</li>
</ul>
</section>
</section>

<section anchor="verification-verifier"><name>Verification (Verifier)</name>

<ul spacing="compact">
<li>Verify Phase-1 MAC with <tt>K_MAC_Ph1</tt>.</li>
<li>Verify the signed Phase-2 payload with the Verifier's public key;
HPKE-Open with Attester's kem key to recover <tt>{VF, vnonce}</tt>.</li>
<li>Recompute Attester signing key from <tt>BF||VF</tt> and verify the EAT
signature.</li>
<li>Recompute <tt>jp_proof</tt> and <tt>pop_tag</tt> inputs and compare
constant-time.</li>
<li>Apply local appraisal policy; on success, emit an Attestation
Result bound to <tt>eca_uuid</tt>.</li>
</ul>
</section>

<section anchor="interop-notes"><name>Interop Notes</name>

<ul spacing="compact">
<li><strong>Encodings</strong>: All binary fields referenced in EAT must be
explicitly encoded (e.g., base64url) and stated as such in the
claims table. NumericDate claims (<tt>iat</tt>, <tt>nbf</tt>, <tt>exp</tt>) use 64-bit
unsigned integers.</li>
<li><strong>Side-Channel Resistance</strong>: To mitigate timing attacks,
implementations SHOULD use constant-time cryptographic
comparisons. Payloads that are inputs to cryptographic operations
(e.g., Evidence) MAY be padded to a fixed size using a
length-prefix scheme to ensure unambiguous parsing.</li>
</ul>
</section>
</section>

<section anchor="test-vectors-and-payloads"><name>Test Vectors and Payloads</name>
<t>This section provides concrete test vectors generated using the
deterministic inputs listed below.</t>

<section anchor="deterministic-inputs"><name>Deterministic Inputs</name>
<table>
<thead>
<tr>
<th align="left">Parameter</th>
<th align="left">Value (Base64URL)</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left"><tt>eca_uuid</tt></td>
<td align="left"><tt>4b6483ee-3d36-4221-ac2e-2c0271aa9d62</tt> (String)</td>
</tr>

<tr>
<td align="left"><tt>bf</tt></td>
<td align="left"><tt>Be80sHHnLhyYH_koGgKTFA</tt></td>
</tr>

<tr>
<td align="left"><tt>if</tt></td>
<td align="left"><tt>aS1kODFhOTc4N2U5MWQ1MTZk</tt></td>
</tr>

<tr>
<td align="left"><tt>vf</tt></td>
<td align="left"><tt>A-g7iYp8nS5Q-1t_1A1gAFpsgAnJb2DE8_2j2b6b2b4</tt></td>
</tr>

<tr>
<td align="left"><tt>vnonce</tt></td>
<td align="left"><tt>VGhpcyBpcyBhIHZub25jZQ</tt></td>
</tr>

<tr>
<td align="left"><tt>verifier_priv_key</tt></td>
<td align="left"><tt>T2vjA9ssm2E-s2e-8a0A6c0d8f0A4c0B8g0B2a0E6e0F8g0B2a0E4c0d6e0F2a0B</tt></td>
</tr>

<tr>
<td align="left"><tt>iat</tt>/<tt>nbf</tt></td>
<td align="left"><tt>1759020000</tt> (Integer)</td>
</tr>

<tr>
<td align="left"><tt>exp</tt></td>
<td align="left"><tt>1759020300</tt> (Integer)</td>
</tr>
</tbody>
</table></section>

<section anchor="phase-1-attester-to-verifier"><name>Phase 1: Attester to Verifier</name>

<ul spacing="compact">
<li><strong>CBOR Payload (Hex):</strong> <tt>a2676b656d5f7075625820a7238510a716447881c798033b2591a329d70d473b1f31b25e79c5324ab2a5436369686278407d772921258b68a41a4825ce2de85626305a4e5113d03bb63222338248d5516a</tt></li>
<li><strong>HMAC Tag (Hex):</strong> <tt>47f607144e54619b165b4528174542d9972332617f699043236e7655938d2146</tt></li>
</ul>
</section>

<section anchor="phase-2-verifier-to-attester"><name>Phase 2: Verifier to Attester</name>

<ul spacing="compact">
<li><strong>COSE_Sign1 (Hex):</strong>
<tt>8443a10127a1045820f18146247c40465243179a32c286d933b499a22f4b0653063529b3506e5793085888a261437882692d38642d31624e2d397a502d356f4e2d38774d2d39774e2d37764c2d396f4d2d3572502d336f4e2d31724d2d3977502d38764e2d377a4d2d386f4e2d3977502d37774d2d36724e2d39774d66766e6f6e6365781656476870637942706379426849485a756232356a5a515840a1b5d1e433433ad75a7b5a59334d58045e057139169a83852230413009180709b8602b11548a339598818822306716a4a95829810a08e612809e3557e05</tt></li>
</ul>
</section>

<section anchor="phase-3-attester-to-verifier-evidence-eat"><name>Phase 3: Attester to Verifier (Evidence EAT)</name>

<ul spacing="compact">
<li><strong>COSE_Sign1 (Hex):</strong>
<tt>8443a10127a10458200e6d6d4d12228518898144216834162002364402633005510680104163486048590181b8f602041a68c48d601a01041a0105021a68c48d68061a68c48d6007782434623634383365652d336433362d343232312d616332652d3263303237316161396436320a781656476870637942706379426849485a756232356a5a5118ff784061396238633764366535663461336232633164306539663861376236633564346533663261316230633964386537663661356234633364326531663061396238190109782475726e3a696574663a706172616d733a6561743a70726f66696c653a6563612d76311901117840376437373239323132353862363861343161343832356365326465383536323633303561346535313133643033626236333232323333383234386435353136611901127823534f6d652d504f502d7461472d696e2d62417365363475526c2d666f526d41741901136b6174746573746174696f6e1901147840663965386437633662356134663365326431633062396138663765366435633462336132663165306439633862376136663565346433633262316130663965385840d21a50587d40232c45f8f84724335c0a37397b9870020a160868132924300302061418435860361324386001292024103868032608481230483429381640</tt></li>
</ul>
</section>

<section anchor="verifier-attestation-result-ar"><name>Verifier Attestation Result (AR)</name>

<ul spacing="compact">
<li><strong>COSE_Sign1 (Hex):</strong>
<tt>8443a10127a1045820f18146247c40465243179a32c286d933b499a22f4b0653063529b3506e5793085860a5017576657269666965722d696e7374616e63652d30303102784061396238633764366535663461336232633164306539663861376236633564346533663261316230633964386537663661356234633364326531663061396238061a68c48d6507782434623634383365652d336433362d343232312d616332652d326330323731616139643632381a00280004782475726e3a696574663a706172616d733a726174733a7374617475733a73756363657373584090280385293810842813952809481943890258102850918501294890248190382958019489038209859018491809385901384901839285901839285091830</tt></li>
</ul>
</section>

<section anchor="cddl-schemas"><name>CDDL Schemas</name>
<t>The following CDDL definitions describe the canonical structure of
the protocol payloads.</t>

<sourcecode type="cddl"><![CDATA[; Phase 1: Attester's initial proof
Phase1Payload = {
  "kem_pub": bstr .size 32,
  "ihb": tstr
}

; Phase 2: Verifier's challenge
Phase2Payload = {
  "C": tstr,
  "vnonce": tstr
}

; Phase 3: Attester's final evidence
EvidenceEAT = {
  2 => tstr, ; sub (EUID)
  4 => uint, ; exp
  5 => uint, ; nbf
  6 => uint, ; iat
  7 => tstr, ; jti (eca_uuid)
  10 => tstr, ; nonce
  256 => tstr, ; EUID
  265 => tstr, ; eat_profile
  273 => tstr, ; Measurements (IHB)
  274 => tstr, ; PoP
  275 => tstr, ; IntendedUse
  276 => tstr ; JP
}

; Final Attestation Result from Verifier
AttestationResult = {
  1 => tstr, ; iss
  2 => tstr, ; sub (EUID)
  6 => uint, ; iat
  7 => tstr, ; jti (eca_uuid)
  -262148 => tstr ; status
}
]]></sourcecode>

<section anchor="interop-fixtures-json"><name>Interop Fixtures (JSON)</name>
<t>This JSON object contains all deterministic values and artifacts as hex-encoded strings, suitable for automated testing.</t>

<sourcecode type="json"><![CDATA[{
  "deterministic_inputs": {
    "eca_uuid": "4b6483ee-3d36-4221-ac2e-2c0271aa9d62",
    "bf_b64url": "Be80sHHnLhyYH_koGgKTFA",
    "if_b64url": "aS1kODFhOTc4N2U5MWQ1MTZk",
    "vf_b64url": "A-g7iYp8nS5Q-1t_1A1gAFpsgAnJb2DE8_2j2b6b2b4",
    "vnonce_b64url": "VGhpcyBpcyBhIHZub25jZQ",
    "timestamps": {
      "iat": 1759020000,
      "nbf": 1759020000,
      "exp": 1759020300
    }
  },
  "phase_1": {
    "payload_cbor_hex": "a2676b656d5f7075625820a7238510a716447881c798033b2591a329d70d473b1f31b25e79c5324ab2a5436369686278407d772921258b68a41a4825ce2de85626305a4e5113d03bb63222338248d5516a",
    "mac_hex": "47f607144e54619b165b4528174542d9972332617f699043236e7655938d2146"
  },
  "phase_2": {
    "cose_sign1_hex": "8443a10127a1045820f18146247c40465243179a32c286d933b499a22f4b0653063529b3506e5793085888a261437882692d38642d31624e2d397a502d356f4e2d38774d2d39774e2d37764c2d396f4d2d3572502d336f4e2d31724d2d3977502d38764e2d377a4d2d386f4e2d3977502d37774d2d36724e2d39774d66766e6f6e6365781656476870637942706379426849485a756232356a5a515840a1b5d1e433433ad75a7b5a59334d58045e057139169a83852230413009180709b8602b11548a339598818822306716a4a95829810a08e612809e3557e05"
  },
  "phase_3_evidence": {
    "cose_sign1_hex": "8443a10127a10458200e6d6d4d12228518898144216834162002364402633005510680104163486048590181b8f602041a68c48d601a01041a0105021a68c48d68061a68c48d6007782434623634383365652d336433362d343232312d616332652d3263303237316161396436320a781656476870637942706379426849485a756232356a5a5118ff784061396238633764366535663461336232633164306539663861376236633564346533663261316230633964386537663661356234633364326531663061396238190109782475726e3a696574663a706172616d733a6561743a70726f66696c653a6563612d76311901117840376437373239323132353862363861343161343832356365326465383536323633303561346535313133643033626236333232323333383234386435353136611901127823534f6d652d504f502d7461472d696e2d62417365363475526c2d666f526d41741901136b6174746573746174696f6e1901147840663965386437633662356134663365326431633062396138663765366435633462336132663165306439633862376136663565346433633262316130663965385840d21a50587d40232c45f8f84724335c0a37397b9870020a160868132924300302061418435860361324386001292024103868032608481230483429381640"
  },
  "attestation_result": {
    "cose_sign1_hex": "8443a10127a1045820f18146247c40465243179a32c286d933b499a22f4b0653063529b3506e5793085860a5017576657269666965722d696e7374616e63652d30303102784061396238633764366535663461336232633164306539663861376236633564346533663261316230633964386537663661356234633364326531663061396238061a68c48d6507782434623634383365652d336433362d343232312d616332652d326330323731616139643632381a00280004782475726e3a696574663a706172616d733a726174733a7374617475733a73756363657373584090280385293810842813952809481943890258102850918501294890248190382958019489038209859018491809385901384901839285901839285091830"
  }
}
]]></sourcecode>
</section>
</section>
</section>

<section anchor="implementation-status"><name>Implementation Status</name>
<t>A working prototype demonstrates end-to-end attestation including:</t>

<ul spacing="compact">
<li>Complete three-phase protocol implementation</li>
<li>EAT-compliant evidence generation</li>
<li>Concurrent execution capability</li>
<li>Docker-based orchestration for testing</li>
</ul>
<table>
<thead>
<tr>
<th>Metric</th>
<th>Value</th>
<th>Notes</th>
</tr>
</thead>

<tbody>
<tr>
<td>Protocol Execution</td>
<td><sub>1.3s</sub></td>
<td>Phases 1-3, excluding infra</td>
</tr>

<tr>
<td>Full Attestation (incl. containers)</td>
<td><sub>6s</sub></td>
<td>Parallel runs, randomized mode</td>
</tr>

<tr>
<td>Scalability</td>
<td>3 concurrent</td>
<td>No failures observed</td>
</tr>
</tbody>
</table><t>An end-to-end happy-path version of the Prototype is available at [GH-ECA-SAE-PROTO].</t>
</section>

<section anchor="acknowledgments"><name>Acknowledgments</name>
<t>The design of this protocol was heavily influenced by the
simplicity and security goals of the <tt>AGE</tt> [AGE] file encryption
tool. The protocol's core cryptographic mechanisms would not be as
simple or robust without the prior work of the IETF community in
standardizing modern primitives, particularly Hybrid Public Key
Encryption (HPKE) in [RFC 9180]. The author wishes to thank the
contributors of these foundational standards for making this work
possible.</t>
</section>

<section anchor="sec-refs-norm"><name>Normative References</name>

<dl spacing="compact">
<dt><xref target="I-D.ritz-eca"></xref></dt>
<dd>Ritz, N., &quot;Ephemeral Compute Attestation (ECA) Protocol&quot;, Work in
Progress, Internet-Draft, draft-ritz-eca-00, 28 September 2025.</dd>
<dt><xref target="I-D.ritz-sae"></xref></dt>
<dd>Ritz, N., &quot;Static Artifact Exchange (SAE) Protocol&quot;, Work in
Progress, Internet-Draft, draft-ritz-sae-00, 28 September 2025.</dd>
<dt><xref target="I-D.liu-acme-rats"></xref></dt>
<dd>Liu, P., &quot;Automated Certificate Management Environment (ACME)
rats Identifier and Challenge Type&quot;, Work in Progress,
Internet-Draft, draft-liu-acme-rats-02, 24 September 2025.</dd>
<dt>[GH-ECA-SAE-PROTO]</dt>
<dd>title: &quot;OSS MTI prototype for the ECA &amp; SAE Internet-Drafts.&quot;
target: <eref target="https://github.com/eca-sae/prototype-eca-sae/tree/proto-0.1.0">https://github.com/eca-sae/prototype-eca-sae/tree/proto-0.1.0</eref>
date: 2025-09-28</dd>
<dt><xref target="RFC2119"></xref></dt>
<dd>Bradner, S., &quot;Key words for use in RFCs to Indicate Requirement
Levels&quot;, BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997.</dd>
<dt><xref target="RFC5905"></xref></dt>
<dd>Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, &quot;Network
Time Protocol Version 4: Protocol and Algorithms Specification&quot;,
RFC 5905, DOI 10.17487/RFC5905, June 2010.</dd>
<dt><xref target="RFC8995"></xref></dt>
<dd>Pritikin, M., Richardson, M., Eckert, T., Behringer, M., and K.
Watsen, &quot;Bootstrapping Remote Secure Key Infrastructure (BRSKI)&quot;,
RFC 8995, DOI 10.17487/RFC8995, May 2021.</dd>
<dt><xref target="RFC9334"></xref></dt>
<dd>Birkholz, H., Thaler, D., Richardson, M., Smith, N., and W. Pan,
&quot;Remote ATtestation procedureS (RATS) Architecture&quot;, RFC 9334,
DOI 10.17487/RFC9334, January 2023.</dd>
<dt><xref target="RFC9711"></xref></dt>
<dd>Mandyam, G., Lundblade, L., Ballesteros, M., and J. O'Donoghue,
&quot;The Entity Attestation Token (EAT)&quot;, RFC 9711,
DOI 10.17487/RFC9711, August 2025.</dd>
</dl>
<t>target: <eref target="https://spiffe.io/docs/latest/spiffe-about/spiffe-concepts/">https://spiffe.io/docs/latest/spiffe-about/spiffe-concepts/</eref>
  date: 2025-01
  organization: &quot;CNCF SPIFFE Project&quot;</t>
<t>target: <eref target="https://spiffe.io/docs/latest/spiffe-about/overview/">https://spiffe.io/docs/latest/spiffe-about/overview/</eref>
  date: 2025-01
  organization: &quot;CNCF SPIFFE Project&quot;</t>
<t>target: <eref target="https://spiffe.io/docs/latest/spire-about/spire-concepts/">https://spiffe.io/docs/latest/spire-about/spire-concepts/</eref>
  date: 2025-01
  organization: &quot;CNCF SPIRE Project&quot;</t>
<t>target: <eref target="https://spiffe.io/docs/latest/deploying/spire_agent/">https://spiffe.io/docs/latest/deploying/spire_agent/</eref>
  date: 2025-01
  organization: &quot;CNCF SPIRE Project&quot;</t>
<t>target: <eref target="https://spiffe.io/docs/latest/deploying/configuring/">https://spiffe.io/docs/latest/deploying/configuring/</eref>
  date: 2025-01
  organization: &quot;CNCF SPIRE Project&quot;</t>
<t>target: <eref target="https://spiffe.io/docs/latest/planning/extending/">https://spiffe.io/docs/latest/planning/extending/</eref>
  date: 2025-01
  organization: &quot;CNCF SPIRE Project&quot;</t>
<t>target: <eref target="https://github.com/spiffe/spire-plugin-sdk">https://github.com/spiffe/spire-plugin-sdk</eref>
  date: 2025-08
  organization: &quot;CNCF SPIRE Project&quot;</t>
<t>target: <eref target="https://www.cncf.io/announcements/2022/09/20/spiffe-and-spire-projects-graduate-from-cloud-native-computing-foundation-incubator/">https://www.cncf.io/announcements/2022/09/20/spiffe-and-spire-projects-graduate-from-cloud-native-computing-foundation-incubator/</eref>
  date: 2022-09-20
  organization: &quot;Cloud Native Computing Foundation&quot;</t>
<t>target: <eref target="https://developer.hpe.com/blog/spiffe-spire-graduates-enabling-greater-security-solutions/">https://developer.hpe.com/blog/spiffe-spire-graduates-enabling-greater-security-solutions/</eref>
  date: 2022-10-24
  organization: &quot;HPE Developer Blog&quot;</t>
<t>target: <eref target="https://www.infoq.com/news/2022/09/spire-graduates-cncf/">https://www.infoq.com/news/2022/09/spire-graduates-cncf/</eref>
  date: 2022-09-23
  organization: &quot;InfoQ News&quot;</t>
<t>target: <eref target="https://github.com/keylime/spire-keylime-plugin">https://github.com/keylime/spire-keylime-plugin</eref>
  date: 2025-01
  organization: &quot;Keylime Project&quot;</t>
<t>target: <eref target="https://keylime.dev/blog/2024/02/07/remote-attestation-blog-part1.html">https://keylime.dev/blog/2024/02/07/remote-attestation-blog-part1.html</eref>
  date: 2024-02-07
  organization: &quot;Keylime Project&quot;</t>
<t>target: <eref target="https://next.redhat.com/2025/01/24/spiffe-spire-and-keylime-software-identity-based-on-secure-machine-state/">https://next.redhat.com/2025/01/24/spiffe-spire-and-keylime-software-identity-based-on-secure-machine-state/</eref>
  date: 2025-01-24
  organization: &quot;Red Hat (Emerging Tech)&quot;</t>

<artwork><![CDATA[target: https://github.com/spiffe/spire/issues/5647
date: 2024-11-12
organization: "SPIRE GitHub Issues"
]]></artwork>

<dl spacing="compact">
<dt>[AGE]</dt>
<dd>Valsorda, F. and Cartwright-Cox, B., &quot;The age encryption
specification&quot;, February 2022, <eref target="https://age-encryption.org/v1">https://age-encryption.org/v1</eref>.</dd>
</dl>
</section>

</middle>

<back>
<references><name>Informative References</name>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.liu-acme-rats.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ritz-eca.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ritz-sae.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5905.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8995.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9334.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9711.xml"/>
</references>

</back>

</rfc>
