<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 3.4.8) -->
<?rfc rfcedstyle="yes"?>
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc text-list-symbols="-o*+"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ritz-seat-facts-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="FACTS-TLS">Factor-based Attestation and Credential Transport Scheme (FACTS) over TLS 1.3</title>
    <seriesInfo name="Internet-Draft" value="draft-ritz-seat-facts-00"/>
    <author initials="N." surname="Ritz" fullname="Nathanael Ritz">
      <organization>Independent</organization>
      <address>
        <email>ietf@nritz.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="01"/>
    <area>Security</area>
    <workgroup>Secure Evidence and Attestation Transport</workgroup>
    <keyword>attestation</keyword>
    <keyword>RATS</keyword>
    <keyword>TLS</keyword>
    <abstract>
      <?line 90?>

<t>This document describes FACTS (Factor-based Attestation and Credential Transport Scheme) over TLS 1.3. Conceptually acting as "multi-factor authentication" for machine identities, factor-based attestation derives session trust from multiple independent cryptographic inputs rather than a single point of failure. Specifically, it utilizes a dual-key scheme that binds identity to attestation evidence through the use of key encapsulation material keys (KEM) and traditional identity signing keys (IK), establishing per-session freshness.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ritz-seat-facts/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Secure Evidence and Attestation Transport Working Group mailing list (<eref target="mailto:seat@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/seat"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/seat/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/nathanaelritz/facts-tls"/>.</t>
    </note>
  </front>
  <middle>
    <?line 94?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Remote attestation enables an entity to demonstrate the integrity of its runtime environment to a remote peer. When combined with TLS <xref target="I-D.ietf-tls-rfc8446bis"/>, attestation allows a relying party to verify that the TLS endpoint operates within a Trusted Execution Environment (TEE) with known-good software before exchanging application data.</t>
      <t>This document combines the latency properties of intra-handshake attestation with the security binding of post-handshake attestation through a dual-key authentication architecture that introduces four targeted architectural changes that preserve the standard TLS 1.3 state machine and key schedule:</t>
      <ol spacing="normal" type="1"><li>
          <t><em>LTK and KEM Keys:</em> Introduction of a dedicated encapsulation key (<tt>pubKEM</tt>), alongside the usual long-term signing or identity key (<tt>pubIK</tt> / <tt>LTK</tt>).</t>
        </li>
        <li>
          <t><em>Early authentication:</em> Accessing signed identity documents (e.g. signed JWT/CWT) just before starting the TLS handshake enables cryptographic binding of <tt>pubKEM</tt> to the server identity and <tt>pubIK</tt> jointly, closing the identity/key confusion gap that diversion attacks exploit.</t>
        </li>
        <li>
          <t><em>Dual-Nonce Encapsulation:</em> Encapsulation of mutual 'challenge' and 'counter-challenge' nonces (CN1, CN2) to the Server's <tt>pubKEM</tt> and the Client's per-session <tt>pubKEM</tt>, respectively.</t>
        </li>
        <li>
          <t><em>Session-Specific Quote Encryption:</em> Encrypting the attestation quote under <tt>psk_attest</tt> (derived from both challenge nonces), with the <tt>rdata</tt> committing to the full suite of parameters (<tt>pubIK_S</tt>, <tt>CN1</tt>, <tt>CN2</tt>, <tt>pubKEM_C</tt>).</t>
        </li>
      </ol>
      <t>The pre-handshake Identity Document is formatted as a JSON Web Token <xref target="RFC7519"/> carrying keys in a JWKS <tt>cnf</tt> claim <xref target="RFC7800"/>.  No novel cryptographic structures are introduced by this document. JWT provides a self-contained, channel-independent integrity guarantee suitable for distribution over untrusted transports such as DNS.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The reader is assumed to be familiar with the vocabulary and concepts defined in <xref target="RFC9334"/>, <xref target="I-D.ietf-tls-rfc8446bis"/>, and <xref target="RFC9180"/>. FACTS relies on the RATS Conceptual Message Wrapper (CMW) <xref target="I-D.ietf-rats-msg-wrap"/> for encapsulating attestation payloads and supports both the background-check and passport topologies defined in <xref target="RFC9334"/>.</t>
      <dl>
        <dt>TLS Identity Key (privIK / pubIK aka LTK):</dt>
        <dd>
          <t>A long-term signing key pair used by a TLS peer for authentication during the handshake via CertificateVerify. In the threat model of this document, <tt>privIK</tt> is assumed to be potentially compromisable by an adversary with sufficient access to the software layer.</t>
        </dd>
        <dt>Encapsulation Key (privKEM / pubKEM):</dt>
        <dd>
          <t>A key pair used for Authenticated Hybrid Public Key Encryption (AuthHPKE, mode 2 of <xref target="RFC9180"/>). In the threat model of this document, <tt>privKEM</tt> is assumed to be potentially compromisable independently of <tt>privIK</tt>.</t>
        </dd>
        <dt>Attestation Key (privAK / pubAK):</dt>
        <dd>
          <t>A hardware-bound key pair rooted in the TEE's hardware root of trust (e.g., a TPM endorsement key, an Intel TDX report signing key, or an Arm CCA platform attestation key). The private component (<tt>privAK</tt>) <bcp14>MUST NOT</bcp14> be extractable from the hardware security boundary. This key pair is the trust anchor for the protocol's Evidence integrity.</t>
        </dd>
        <dt>Challenge Nonce (CN1, CN2):</dt>
        <dd>
          <t>Ephemeral random values exchanged between client and server during the handshake using AuthHPKE. <tt>CN1</tt> is generated by the client and sealed to the server's <tt>pubKEM</tt>. <tt>CN2</tt> is generated by the server and sealed to the client's <tt>pubKEM</tt>. Together they provide mutual freshness and form the basis for attestation key derivation.</t>
        </dd>
        <dt>Session Binding Commitment (rdata / eat_nonce):</dt>
        <dd>
          <t>The 32-byte SHA-256 digest SHA-256(<tt>pubIK_S || CN1 || CN2 || pubKEM_C</tt>) that binds the attester's identity key, both challenge nonces, and the client's ephemeral <tt>KEM</tt> key into a single compound nonce. No single party controls all four inputs. This value is conveyed in the platform-specific report data field of the TEE attestation report (where it is referred to as <tt>rdata</tt>) and as the <tt>eat_nonce</tt> claim when serialized as an EAT. Both carry the identical digest; the distinction is purely one of serialization layer.</t>
        </dd>
        <dt>Attestation Key Material (psk_attest):</dt>
        <dd>
          <t>A symmetric key derived from both challenge nonces. <tt>psk_attest</tt> is used to encrypt Evidence during the handshake and is subsequently injected into the Extended Key Update to rotate session traffic keys.</t>
        </dd>
        <dt>Trust Authority (TA / CA):</dt>
        <dd>
          <t>A trusted third party that signs the Identity Document, establishing a verifiable chain of trust. This document uses "CA" for simplicity.</t>
        </dd>
        <dt>Platform Measurements (quote):</dt>
        <dd>
          <t>The set of cryptographic measurements characterizing the Trusted Computing Base (TCB) of the platform, reduced to a 32-byte SHA-256 commitment (the Evidence Commitment) for use as input to key derivation.</t>
        </dd>
      </dl>
    </section>
    <section anchor="protocol-architecture">
      <name>Protocol Architecture</name>
      <figure anchor="fig-arch-topology">
        <name>FACTS Architectural Topology</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="576" width="344" viewBox="0 0 344 576" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,208 L 8,272" fill="none" stroke="black"/>
              <path d="M 40,160 L 40,200" fill="none" stroke="black"/>
              <path d="M 48,272 L 48,304" fill="none" stroke="black"/>
              <path d="M 56,32 L 56,80" fill="none" stroke="black"/>
              <path d="M 96,80 L 96,160" fill="none" stroke="black"/>
              <path d="M 96,208 L 96,272" fill="none" stroke="black"/>
              <path d="M 120,368 L 120,400" fill="none" stroke="black"/>
              <path d="M 120,480 L 120,512" fill="none" stroke="black"/>
              <path d="M 128,208 L 128,272" fill="none" stroke="black"/>
              <path d="M 160,160 L 160,200" fill="none" stroke="black"/>
              <path d="M 168,272 L 168,360" fill="none" stroke="black"/>
              <path d="M 168,400 L 168,472" fill="none" stroke="black"/>
              <path d="M 168,512 L 168,544" fill="none" stroke="black"/>
              <path d="M 192,32 L 192,80" fill="none" stroke="black"/>
              <path d="M 216,208 L 216,272" fill="none" stroke="black"/>
              <path d="M 224,368 L 224,400" fill="none" stroke="black"/>
              <path d="M 224,480 L 224,512" fill="none" stroke="black"/>
              <path d="M 248,208 L 248,272" fill="none" stroke="black"/>
              <path d="M 280,160 L 280,200" fill="none" stroke="black"/>
              <path d="M 288,272 L 288,304" fill="none" stroke="black"/>
              <path d="M 288,384 L 288,544" fill="none" stroke="black"/>
              <path d="M 336,208 L 336,272" fill="none" stroke="black"/>
              <path d="M 56,32 L 192,32" fill="none" stroke="black"/>
              <path d="M 56,80 L 192,80" fill="none" stroke="black"/>
              <path d="M 40,160 L 280,160" fill="none" stroke="black"/>
              <path d="M 8,208 L 96,208" fill="none" stroke="black"/>
              <path d="M 128,208 L 216,208" fill="none" stroke="black"/>
              <path d="M 248,208 L 336,208" fill="none" stroke="black"/>
              <path d="M 8,272 L 96,272" fill="none" stroke="black"/>
              <path d="M 128,272 L 216,272" fill="none" stroke="black"/>
              <path d="M 248,272 L 336,272" fill="none" stroke="black"/>
              <path d="M 48,304 L 288,304" fill="none" stroke="black"/>
              <path d="M 120,368 L 224,368" fill="none" stroke="black"/>
              <path d="M 232,384 L 288,384" fill="none" stroke="black"/>
              <path d="M 120,400 L 224,400" fill="none" stroke="black"/>
              <path d="M 120,480 L 224,480" fill="none" stroke="black"/>
              <path d="M 120,512 L 224,512" fill="none" stroke="black"/>
              <path d="M 168,544 L 288,544" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="288,200 276,194.4 276,205.6" fill="black" transform="rotate(90,280,200)"/>
              <polygon class="arrowhead" points="240,384 228,378.4 228,389.6" fill="black" transform="rotate(180,232,384)"/>
              <polygon class="arrowhead" points="176,472 164,466.4 164,477.6" fill="black" transform="rotate(90,168,472)"/>
              <polygon class="arrowhead" points="176,360 164,354.4 164,365.6" fill="black" transform="rotate(90,168,360)"/>
              <polygon class="arrowhead" points="176,312 164,306.4 164,317.6" fill="black" transform="rotate(270,168,312)"/>
              <polygon class="arrowhead" points="168,200 156,194.4 156,205.6" fill="black" transform="rotate(90,160,200)"/>
              <polygon class="arrowhead" points="48,200 36,194.4 36,205.6" fill="black" transform="rotate(90,40,200)"/>
              <g class="text">
                <text x="92" y="52">(Trust</text>
                <text x="152" y="52">anchor)</text>
                <text x="88" y="68">signs</text>
                <text x="124" y="68">ID</text>
                <text x="152" y="68">Doc</text>
                <text x="132" y="116">Signed</text>
                <text x="172" y="116">ID</text>
                <text x="220" y="116">Document</text>
                <text x="144" y="132">(subject,</text>
                <text x="212" y="132">pubIK,</text>
                <text x="272" y="132">pubKEM)</text>
                <text x="52" y="228">Identity</text>
                <text x="172" y="228">Identity</text>
                <text x="292" y="228">Identity</text>
                <text x="48" y="244">Store</text>
                <text x="168" y="244">Store</text>
                <text x="288" y="244">Store</text>
                <text x="48" y="260">(JWT)</text>
                <text x="172" y="260">(Cert)</text>
                <text x="288" y="260">(Log)</text>
                <text x="204" y="340">Lookup</text>
                <text x="172" y="388">Verifier</text>
                <text x="216" y="436">Challenge</text>
                <text x="172" y="500">Attester</text>
                <text x="224" y="564">Signature</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
      +----------------+
      | (Trust anchor) |
      | signs ID Doc   |
      +----+-----------+
           |
           | Signed ID Document
           | (subject, pubIK, pubKEM)
           |
    +------+-------+--------------+
    |              |              |
    v              v              v
+----------+   +----------+   +----------+
| Identity |   | Identity |   | Identity |
|  Store   |   |  Store   |   |  Store   |
|  (JWT)   |   |  (Cert)  |   |  (Log)   |
+----+-----+   +----+-----+   +----+-----+
     |              |              |
     +--------------+--------------+
                    ^
                    | Lookup
                    v
              +------------+
              |  Verifier  |<------+
              +-----+------+       |
                    |              |
                    | Challenge    |
                    |              |
                    v              |
              +------------+       |
              |  Attester  |       |
              +-----+------+       |
                    |              |
                    +--------------+
                       Signature
]]></artwork>
        </artset>
      </figure>
      <t>FACTS proceeds in three phases, preceded by an enrollment step that executes once per server instance. The protocol's trust model rests on two independently operating dimensions: the attestation ordering (which peer attests first) and the appraisal topology (how evidence is evaluated). These dimensions combine freely.</t>
      <figure anchor="fig-facts-flow">
        <name>FACTS Decision Flow</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="928" width="448" viewBox="0 0 448 928" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,800 L 8,848" fill="none" stroke="black"/>
              <path d="M 16,512 L 16,560" fill="none" stroke="black"/>
              <path d="M 16,608 L 16,640" fill="none" stroke="black"/>
              <path d="M 80,848 L 80,880" fill="none" stroke="black"/>
              <path d="M 88,560 L 88,600" fill="none" stroke="black"/>
              <path d="M 96,224 L 96,256" fill="none" stroke="black"/>
              <path d="M 96,304 L 96,352" fill="none" stroke="black"/>
              <path d="M 112,768 L 112,792" fill="none" stroke="black"/>
              <path d="M 120,480 L 120,504" fill="none" stroke="black"/>
              <path d="M 128,32 L 128,64" fill="none" stroke="black"/>
              <path d="M 152,512 L 152,560" fill="none" stroke="black"/>
              <path d="M 160,176 L 160,216" fill="none" stroke="black"/>
              <path d="M 160,640 L 160,672" fill="none" stroke="black"/>
              <path d="M 160,800 L 160,848" fill="none" stroke="black"/>
              <path d="M 176,256 L 176,296" fill="none" stroke="black"/>
              <path d="M 176,352 L 176,384" fill="none" stroke="black"/>
              <path d="M 184,512 L 184,560" fill="none" stroke="black"/>
              <path d="M 200,64 L 200,96" fill="none" stroke="black"/>
              <path d="M 208,768 L 208,784" fill="none" stroke="black"/>
              <path d="M 232,480 L 232,504" fill="none" stroke="black"/>
              <path d="M 240,560 L 240,600" fill="none" stroke="black"/>
              <path d="M 256,224 L 256,256" fill="none" stroke="black"/>
              <path d="M 256,304 L 256,352" fill="none" stroke="black"/>
              <path d="M 280,32 L 280,64" fill="none" stroke="black"/>
              <path d="M 304,608 L 304,640" fill="none" stroke="black"/>
              <path d="M 312,160 L 312,192" fill="none" stroke="black"/>
              <path d="M 312,512 L 312,560" fill="none" stroke="black"/>
              <path d="M 440,160 L 440,192" fill="none" stroke="black"/>
              <path d="M 128,32 L 280,32" fill="none" stroke="black"/>
              <path d="M 128,64 L 280,64" fill="none" stroke="black"/>
              <path d="M 144,128 L 256,128" fill="none" stroke="black"/>
              <path d="M 272,160 L 296,160" fill="none" stroke="black"/>
              <path d="M 312,160 L 440,160" fill="none" stroke="black"/>
              <path d="M 168,192 L 192,192" fill="none" stroke="black"/>
              <path d="M 272,192 L 440,192" fill="none" stroke="black"/>
              <path d="M 96,224 L 256,224" fill="none" stroke="black"/>
              <path d="M 96,256 L 256,256" fill="none" stroke="black"/>
              <path d="M 96,304 L 256,304" fill="none" stroke="black"/>
              <path d="M 96,352 L 256,352" fill="none" stroke="black"/>
              <path d="M 16,512 L 152,512" fill="none" stroke="black"/>
              <path d="M 184,512 L 312,512" fill="none" stroke="black"/>
              <path d="M 16,560 L 152,560" fill="none" stroke="black"/>
              <path d="M 184,560 L 312,560" fill="none" stroke="black"/>
              <path d="M 16,608 L 304,608" fill="none" stroke="black"/>
              <path d="M 16,640 L 304,640" fill="none" stroke="black"/>
              <path d="M 8,800 L 160,800" fill="none" stroke="black"/>
              <path d="M 8,848 L 160,848" fill="none" stroke="black"/>
              <path d="M 248,112 L 256,128" fill="none" stroke="black"/>
              <path d="M 144,128 L 152,112" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="304,160 292,154.4 292,165.6" fill="black" transform="rotate(0,296,160)"/>
              <polygon class="arrowhead" points="248,600 236,594.4 236,605.6" fill="black" transform="rotate(90,240,600)"/>
              <polygon class="arrowhead" points="240,504 228,498.4 228,509.6" fill="black" transform="rotate(90,232,504)"/>
              <polygon class="arrowhead" points="216,784 204,778.4 204,789.6" fill="black" transform="rotate(90,208,784)"/>
              <polygon class="arrowhead" points="208,96 196,90.4 196,101.6" fill="black" transform="rotate(90,200,96)"/>
              <polygon class="arrowhead" points="184,384 172,378.4 172,389.6" fill="black" transform="rotate(90,176,384)"/>
              <polygon class="arrowhead" points="184,296 172,290.4 172,301.6" fill="black" transform="rotate(90,176,296)"/>
              <polygon class="arrowhead" points="176,192 164,186.4 164,197.6" fill="black" transform="rotate(180,168,192)"/>
              <polygon class="arrowhead" points="168,672 156,666.4 156,677.6" fill="black" transform="rotate(90,160,672)"/>
              <polygon class="arrowhead" points="168,216 156,210.4 156,221.6" fill="black" transform="rotate(90,160,216)"/>
              <polygon class="arrowhead" points="128,504 116,498.4 116,509.6" fill="black" transform="rotate(90,120,504)"/>
              <polygon class="arrowhead" points="120,792 108,786.4 108,797.6" fill="black" transform="rotate(90,112,792)"/>
              <polygon class="arrowhead" points="96,600 84,594.4 84,605.6" fill="black" transform="rotate(90,88,600)"/>
              <polygon class="arrowhead" points="88,880 76,874.4 76,885.6" fill="black" transform="rotate(90,80,880)"/>
              <g class="text">
                <text x="164" y="52">Device</text>
                <text x="216" y="52">Boots</text>
                <text x="256" y="52">TEE</text>
                <text x="184" y="116">Valid</text>
                <text x="224" y="116">AR?</text>
                <text x="160" y="148">|</text>
                <text x="240" y="148">|</text>
                <text x="160" y="164">(Yes)</text>
                <text x="244" y="164">(No)</text>
                <text x="376" y="180">Enrollment/CA</text>
                <text x="204" y="196">AR</text>
                <text x="244" y="196">Issued</text>
                <text x="132" y="244">Client</text>
                <text x="192" y="244">Fetches</text>
                <text x="236" y="244">AR</text>
                <text x="136" y="324">TLS</text>
                <text x="192" y="324">Handshake</text>
                <text x="140" y="340">(FACTS</text>
                <text x="192" y="340">Phase</text>
                <text x="228" y="340">2)</text>
                <text x="104" y="404">/</text>
                <text x="140" y="404">Server</text>
                <text x="200" y="404">Policy:</text>
                <text x="248" y="404">\</text>
                <text x="96" y="420">|</text>
                <text x="156" y="420">Attest</text>
                <text x="204" y="420">Now?</text>
                <text x="256" y="420">|</text>
                <text x="104" y="436">\</text>
                <text x="248" y="436">/</text>
                <text x="120" y="452">|</text>
                <text x="232" y="452">|</text>
                <text x="120" y="468">(Yes)</text>
                <text x="236" y="468">(No)</text>
                <text x="60" y="532">Standard</text>
                <text x="116" y="532">Flow</text>
                <text x="216" y="532">Cond.</text>
                <text x="260" y="532">mTLS</text>
                <text x="52" y="548">Server</text>
                <text x="112" y="548">Attests</text>
                <text x="220" y="548">Client</text>
                <text x="280" y="548">Attests</text>
                <text x="64" y="628">Phase</text>
                <text x="100" y="628">3:</text>
                <text x="128" y="628">EKU</text>
                <text x="152" y="628">&amp;</text>
                <text x="176" y="628">PSK</text>
                <text x="232" y="628">Injection</text>
                <text x="96" y="692">/</text>
                <text x="132" y="692">Server</text>
                <text x="188" y="692">Attest</text>
                <text x="224" y="692">\</text>
                <text x="88" y="708">|</text>
                <text x="156" y="708">Pending?</text>
                <text x="232" y="708">|</text>
                <text x="96" y="724">\</text>
                <text x="224" y="724">/</text>
                <text x="112" y="740">|</text>
                <text x="208" y="740">|</text>
                <text x="112" y="756">(Yes)</text>
                <text x="212" y="756">(No)</text>
                <text x="216" y="804">(Mutual</text>
                <text x="276" y="804">Attest</text>
                <text x="328" y="804">Done)</text>
                <text x="76" y="820">Post-Handshake</text>
                <text x="40" y="836">(SEAT</text>
                <text x="92" y="836">Expat)</text>
                <text x="32" y="900">(Mutual</text>
                <text x="92" y="900">Attest</text>
                <text x="144" y="900">Done)</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                       +------------------+
                       | Device Boots TEE |
                       +--------+---------+
                                |
                                v
                          / Valid AR? \
                         +-------------+
                           |         |
                         (Yes)      (No) ---> +---------------+
                           |                  | Enrollment/CA |
                           |<--(AR Issued)----+---------------+
                           v
                   +-------------------+
                   | Client Fetches AR |
                   +---------+---------+
                             |
                             v
                   +-------------------+
                   |   TLS Handshake   |
                   |  (FACTS Phase 2)  |
                   +---------+---------+
                             |
                             v
                    / Server Policy:  \
                   |    Attest Now?    |
                    \                 /
                      |             |
                    (Yes)          (No)
                      |             |
                      v             v
         +----------------+   +---------------+
         | Standard Flow  |   | Cond. mTLS    |
         | Server Attests |   | Client Attests|
         +--------+-------+   +------+--------+
                  |                  |
                  v                  v
         +-----------------------------------+
         |   Phase 3: EKU & PSK Injection    |
         +-----------------+-----------------+
                           |
                           v
                   / Server Attest \
                  |    Pending?     |
                   \               /
                     |           |
                   (Yes)        (No)
                     |           |
                     v           v
        +------------------+   (Mutual Attest Done)
        | Post-Handshake   |
        | (SEAT Expat)     |
        +--------+---------+
                 |
                 v
        (Mutual Attest Done)
]]></artwork>
        </artset>
      </figure>
      <t><strong>Enrollment.</strong> A device with no valid AR generates its identity and encapsulation key pairs and produces an EAT <xref target="RFC9711"/> signed by its hardware-bound attestation key. The Verifier appraises the platform measurements and, if accepted, issues an AR carrying the dual-key binding: <tt>cnf</tt> <xref target="RFC7800"/> for pubIK (<em>signing</em>) and attested_kem for pubKEM (<em>encapsulation</em>). This AR is distributed via DNS, HTTPS, or any untrusted channel; the Verifier's signature protects integrity. See <xref target="enrollment"/> for the enrollment protocol and <xref target="eat-ar-structs"/> for the AR and EAT claim structures.</t>
      <t><strong>Phase 1 -- Identity Lookup.</strong> The client fetches and verifies the AR, extracting <tt>pubIK_S</tt> and <tt>pubKEM_S</tt>. It generates an ephemeral <tt>pubKEM_C</tt>, unique to this session and never reused.</t>
      <t><strong>Phase 2 -- Attested TLS Handshake.</strong> The client seals a challenge nonce (<tt>CN1</tt>) to <tt>pubKEM_S</tt>; the server proves possession of <tt>privKEM_S</tt> by unsealing it, then seals its counter-challenge (<tt>CN2</tt>) to the client's ephemeral <tt>pubKEM_C</tt>. Both peers derive <tt>psk_attest</tt>.</t>
      <t>The handshake then branches on server policy. In the standard flow, the server includes its encrypted evidence in the Certificate message. In the conditional <em>mTLS</em> flow, the server withholds its evidence and issues a facts_attest_req, requiring the client to attest first.</t>
      <t>The choice between Passport and Background Check topologies <xref target="RFC9334"/> is orthogonal to this ordering and applies independently to either flow.</t>
      <t><strong>Phase 3 -- EKU with PSK Injection.</strong> After evidence appraisal, an Extended Key Update <xref target="I-D.ietf-tls-extended-key-update"/> mixes psk_attest into the traffic keys. Any adversary lacking privKEM_C cannot derive the rotated keys and is evicted.</t>
      <t><strong>Post-Handshake.</strong> If the server deferred attestation, it delivers evidence via Exported Authenticators <xref target="I-D.fossati-seat-expat"/> over the rotated channel. Periodic reattestation is available to any flow via the same mechanism.</t>
    </section>
    <section anchor="protocol-flow">
      <name>Protocol Flow</name>
      <t>The following diagram illustrates the 3 phase flow:</t>
      <figure anchor="fig-facts-tls-flow">
        <name>The 3 phase flow of FACTS-TLS</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1408" width="544" viewBox="0 0 544 1408" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 32,48 L 32,1376" fill="none" stroke="black"/>
              <path d="M 48,304 L 48,368" fill="none" stroke="black"/>
              <path d="M 184,432 L 184,480" fill="none" stroke="black"/>
              <path d="M 232,752 L 232,784" fill="none" stroke="black"/>
              <path d="M 320,176 L 320,224" fill="none" stroke="black"/>
              <path d="M 352,656 L 352,704" fill="none" stroke="black"/>
              <path d="M 352,848 L 352,928" fill="none" stroke="black"/>
              <path d="M 384,1200 L 384,1232" fill="none" stroke="black"/>
              <path d="M 392,80 L 392,128" fill="none" stroke="black"/>
              <path d="M 456,48 L 456,1376" fill="none" stroke="black"/>
              <path d="M 32,96 L 392,96" fill="none" stroke="black"/>
              <path d="M 32,128 L 392,128" fill="none" stroke="black"/>
              <path d="M 32,176 L 320,176" fill="none" stroke="black"/>
              <path d="M 32,224 L 320,224" fill="none" stroke="black"/>
              <path d="M 48,384 L 440,384" fill="none" stroke="black"/>
              <path d="M 184,432 L 456,432" fill="none" stroke="black"/>
              <path d="M 184,480 L 456,480" fill="none" stroke="black"/>
              <path d="M 48,544 L 440,544" fill="none" stroke="black"/>
              <path d="M 48,608 L 440,608" fill="none" stroke="black"/>
              <path d="M 32,656 L 352,656" fill="none" stroke="black"/>
              <path d="M 32,704 L 352,704" fill="none" stroke="black"/>
              <path d="M 48,800 L 440,800" fill="none" stroke="black"/>
              <path d="M 32,848 L 352,848" fill="none" stroke="black"/>
              <path d="M 32,928 L 352,928" fill="none" stroke="black"/>
              <path d="M 48,976 L 440,976" fill="none" stroke="black"/>
              <path d="M 48,1024 L 440,1024" fill="none" stroke="black"/>
              <path d="M 48,1072 L 440,1072" fill="none" stroke="black"/>
              <path d="M 32,1200 L 384,1200" fill="none" stroke="black"/>
              <path d="M 32,1232 L 384,1232" fill="none" stroke="black"/>
              <path d="M 240,1246 L 440,1246" fill="none" stroke="black"/>
              <path d="M 240,1250 L 440,1250" fill="none" stroke="black"/>
              <path d="M 240,1262 L 440,1262" fill="none" stroke="black"/>
              <path d="M 240,1266 L 440,1266" fill="none" stroke="black"/>
              <path d="M 48,1294 L 432,1294" fill="none" stroke="black"/>
              <path d="M 48,1298 L 432,1298" fill="none" stroke="black"/>
              <path d="M 48,1358 L 432,1358" fill="none" stroke="black"/>
              <path d="M 48,1362 L 432,1362" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="448,1248 436,1242.4 436,1253.6" fill="black" transform="rotate(0,440,1248)"/>
              <polygon class="arrowhead" points="448,1072 436,1066.4 436,1077.6" fill="black" transform="rotate(0,440,1072)"/>
              <polygon class="arrowhead" points="448,384 436,378.4 436,389.6" fill="black" transform="rotate(0,440,384)"/>
              <polygon class="arrowhead" points="440,1360 428,1354.4 428,1365.6" fill="black" transform="rotate(0,432,1360)"/>
              <polygon class="arrowhead" points="440,1296 428,1290.4 428,1301.6" fill="black" transform="rotate(0,432,1296)"/>
              <polygon class="arrowhead" points="248,1264 236,1258.4 236,1269.6" fill="black" transform="rotate(180,240,1264)"/>
              <polygon class="arrowhead" points="56,1360 44,1354.4 44,1365.6" fill="black" transform="rotate(180,48,1360)"/>
              <polygon class="arrowhead" points="56,1296 44,1290.4 44,1301.6" fill="black" transform="rotate(180,48,1296)"/>
              <polygon class="arrowhead" points="56,1024 44,1018.4 44,1029.6" fill="black" transform="rotate(180,48,1024)"/>
              <polygon class="arrowhead" points="56,976 44,970.4 44,981.6" fill="black" transform="rotate(180,48,976)"/>
              <polygon class="arrowhead" points="56,800 44,794.4 44,805.6" fill="black" transform="rotate(180,48,800)"/>
              <polygon class="arrowhead" points="56,608 44,602.4 44,613.6" fill="black" transform="rotate(180,48,608)"/>
              <polygon class="arrowhead" points="56,544 44,538.4 44,549.6" fill="black" transform="rotate(180,48,544)"/>
              <g class="text">
                <text x="28" y="36">Client</text>
                <text x="452" y="36">Server</text>
                <text x="56" y="68">[1]</text>
                <text x="112" y="68">Pre-fetch</text>
                <text x="188" y="68">identity</text>
                <text x="240" y="68">doc</text>
                <text x="280" y="68">(e.g.</text>
                <text x="332" y="68">signed</text>
                <text x="404" y="68">jwt/x.509)</text>
                <text x="100" y="84">during</text>
                <text x="140" y="84">IP</text>
                <text x="200" y="84">resolution,</text>
                <text x="280" y="84">service</text>
                <text x="352" y="84">discovery</text>
                <text x="416" y="84">etc</text>
                <text x="128" y="116">in(untrusted_dns_txt,</text>
                <text x="276" y="116">(identity_doc,</text>
                <text x="360" y="116">sig))</text>
                <text x="496" y="132">\</text>
                <text x="496" y="148">|</text>
                <text x="56" y="164">[2]</text>
                <text x="108" y="164">Internal</text>
                <text x="188" y="164">Validation</text>
                <text x="492" y="164">[Phase</text>
                <text x="532" y="164">1]</text>
                <text x="496" y="180">|</text>
                <text x="96" y="196">verify(pubCA,</text>
                <text x="208" y="196">identity_doc,</text>
                <text x="284" y="196">sig)</text>
                <text x="496" y="196">/</text>
                <text x="72" y="212">extract</text>
                <text x="132" y="212">(ID_S,</text>
                <text x="200" y="212">pubKEM_S,</text>
                <text x="276" y="212">pubIK_S)</text>
                <text x="48" y="260">-</text>
                <text x="64" y="260">-</text>
                <text x="80" y="260">-</text>
                <text x="96" y="260">-</text>
                <text x="112" y="260">-</text>
                <text x="128" y="260">-</text>
                <text x="144" y="260">-</text>
                <text x="160" y="260">-</text>
                <text x="176" y="260">-</text>
                <text x="200" y="260">TLS</text>
                <text x="232" y="260">1.3</text>
                <text x="288" y="260">Handshake</text>
                <text x="336" y="260">-</text>
                <text x="352" y="260">-</text>
                <text x="368" y="260">-</text>
                <text x="384" y="260">-</text>
                <text x="400" y="260">-</text>
                <text x="416" y="260">-</text>
                <text x="432" y="260">-</text>
                <text x="448" y="260">-</text>
                <text x="56" y="292">[3]</text>
                <text x="120" y="292">ClientHello</text>
                <text x="96" y="308">key_share</text>
                <text x="104" y="324">facts_hello</text>
                <text x="160" y="340">facts_challenge(pubKEM_C,</text>
                <text x="160" y="356">HPKE{CN1}_{pubKEM_S})</text>
                <text x="100" y="372">psk_binder</text>
                <text x="264" y="420">[4]</text>
                <text x="328" y="420">Decapsulate</text>
                <text x="384" y="420">+</text>
                <text x="420" y="420">Verify</text>
                <text x="244" y="452">hpkeOpen(ct,</text>
                <text x="328" y="452">aad_ct,</text>
                <text x="404" y="452">privKEM_S)</text>
                <text x="244" y="468">verify</text>
                <text x="320" y="468">psk_binder;</text>
                <text x="384" y="468">new</text>
                <text x="416" y="468">CN2</text>
                <text x="336" y="516">[5]</text>
                <text x="400" y="516">ServerHello</text>
                <text x="328" y="532">+</text>
                <text x="376" y="532">key_share</text>
                <text x="152" y="580">[6]</text>
                <text x="256" y="580">{EncryptedExtensions}</text>
                <text x="144" y="596">+</text>
                <text x="304" y="596">facts_challenge(HPKE{CN2}_{pubKEM_C})</text>
                <text x="56" y="644">[7]</text>
                <text x="120" y="644">Decapsulate</text>
                <text x="184" y="644">CN2</text>
                <text x="496" y="644">\</text>
                <text x="496" y="660">|</text>
                <text x="108" y="676">hpkeOpen(cn2_ct,</text>
                <text x="208" y="676">aad_ee,</text>
                <text x="284" y="676">privKEM_C)</text>
                <text x="492" y="676">[Phase</text>
                <text x="532" y="676">2]</text>
                <text x="92" y="692">`psk_attest`</text>
                <text x="152" y="692">=</text>
                <text x="208" y="692">derive(CN1,</text>
                <text x="276" y="692">CN2)</text>
                <text x="496" y="692">|</text>
                <text x="496" y="708">/</text>
                <text x="240" y="740">[8]</text>
                <text x="312" y="740">{Certificate}</text>
                <text x="312" y="756">facts_attestation</text>
                <text x="272" y="772">(pubIK,</text>
                <text x="344" y="772">selfsign,</text>
                <text x="344" y="788">AEAD{quote}_{psk_attest})</text>
                <text x="56" y="836">[9]</text>
                <text x="100" y="836">Verify</text>
                <text x="176" y="836">Certificate</text>
                <text x="96" y="868">verify(pubCA,</text>
                <text x="208" y="868">identity_doc,</text>
                <text x="284" y="868">sig)</text>
                <text x="128" y="884">attest_open(encQuote,</text>
                <text x="272" y="884">`psk_attest`)</text>
                <text x="96" y="900">verify(pubAK,</text>
                <text x="192" y="900">dataSign,</text>
                <text x="252" y="900">sig)</text>
                <text x="64" y="916">check</text>
                <text x="204" y="916">hash(pubIK,CN1,CN2,pubKEM_C)</text>
                <text x="268" y="964">[10]</text>
                <text x="368" y="964">{CertificateVerify}</text>
                <text x="292" y="1012">[11]</text>
                <text x="380" y="1012">{ServerFinished}</text>
                <text x="60" y="1060">[12]</text>
                <text x="148" y="1060">{ClientFinished}</text>
                <text x="48" y="1108">-</text>
                <text x="64" y="1108">-</text>
                <text x="80" y="1108">-</text>
                <text x="96" y="1108">-</text>
                <text x="112" y="1108">-</text>
                <text x="128" y="1108">-</text>
                <text x="144" y="1108">-</text>
                <text x="160" y="1108">-</text>
                <text x="176" y="1108">-</text>
                <text x="204" y="1108">Post</text>
                <text x="264" y="1108">Handshake</text>
                <text x="312" y="1108">-</text>
                <text x="328" y="1108">-</text>
                <text x="344" y="1108">-</text>
                <text x="360" y="1108">-</text>
                <text x="376" y="1108">-</text>
                <text x="392" y="1108">-</text>
                <text x="408" y="1108">-</text>
                <text x="424" y="1108">-</text>
                <text x="440" y="1108">-</text>
                <text x="180" y="1140">[I-D.ietf-tls-extended-key-update,</text>
                <text x="80" y="1156">(requires</text>
                <text x="152" y="1156">EKU-PSK</text>
                <text x="228" y="1156">extension)</text>
                <text x="60" y="1188">[13]</text>
                <text x="108" y="1188">Derive</text>
                <text x="192" y="1188">post-rotation</text>
                <text x="264" y="1188">key</text>
                <text x="296" y="1188">for</text>
                <text x="328" y="1188">PFS</text>
                <text x="496" y="1188">\</text>
                <text x="496" y="1204">|</text>
                <text x="72" y="1220">eku_key</text>
                <text x="112" y="1220">=</text>
                <text x="180" y="1220">(eku_dh_shared</text>
                <text x="252" y="1220">||</text>
                <text x="320" y="1220">`psk_attest`)</text>
                <text x="492" y="1220">[Phase</text>
                <text x="532" y="1220">3]</text>
                <text x="496" y="1236">|</text>
                <text x="60" y="1252">[14]</text>
                <text x="100" y="1252">{EKU</text>
                <text x="156" y="1252">Request}</text>
                <text x="496" y="1252">/</text>
                <text x="60" y="1268">[15]</text>
                <text x="100" y="1268">{EKU</text>
                <text x="160" y="1268">Response}</text>
                <text x="76" y="1316">[16]</text>
                <text x="144" y="1316">Application</text>
                <text x="212" y="1316">Data</text>
                <text x="76" y="1332">[17]</text>
                <text x="132" y="1332">Periodic</text>
                <text x="228" y="1332">re-Attestation</text>
                <text x="316" y="1332">health</text>
                <text x="372" y="1332">checks</text>
                <text x="124" y="1348">[e.g.,</text>
                <text x="248" y="1348">I-D.fossati-seat-expat]</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
  Client                                               Server
     |                                                    |
     | [1] Pre-fetch identity doc (e.g. signed jwt/x.509) |
     |     during IP resolution, service discovery, etc   |
     +--------------------------------------------+       |
     | in(untrusted_dns_txt, (identity_doc, sig)) |       |
     +--------------------------------------------+       |    \
     |                                                    |    |
     | [2] Internal Validation                            | [Phase 1]
     +-----------------------------------+                |    |
     | verify(pubCA, identity_doc, sig)  |                |    /
     | extract (ID_S, pubKEM_S, pubIK_S) |                |
     +-----------------------------------+                |
     |                                                    |
     | - - - - - - - - - TLS 1.3 Handshake - - - - - - - -|
     |                                                    |
     | [3] ClientHello                                    |
     | + key_share                                        |
     | + facts_hello                                      |
     | + facts_challenge(pubKEM_C,                        |
     | +   HPKE{CN1}_{pubKEM_S})                          |
     | + psk_binder                                       |
     | -------------------------------------------------> |
     |                                                    |
     |                           [4] Decapsulate + Verify |
     |                  +---------------------------------+
     |                  | hpkeOpen(ct, aad_ct, privKEM_S) |
     |                  |    verify psk_binder; new CN2   |
     |                  +---------------------------------+
     |                                                    |
     |                                    [5] ServerHello |
     |                                    + key_share     |
     | <------------------------------------------------- |
     |                                                    |
     |             [6] {EncryptedExtensions}              |
     |             + facts_challenge(HPKE{CN2}_{pubKEM_C})|
     | <------------------------------------------------- |
     |                                                    |
     | [7] Decapsulate CN2                                |    \
     +---------------------------------------+            |    |
     | hpkeOpen(cn2_ct, aad_ee, privKEM_C)   |            | [Phase 2]
     | `psk_attest` = derive(CN1, CN2)       |            |    |
     +---------------------------------------+            |    /
     |                                                    |
     |                        [8] {Certificate}           |
     |                        + facts_attestation         |
     |                        + (pubIK, selfsign,         |
     |                        + AEAD{quote}_{psk_attest}) |
     | <------------------------------------------------- |
     |                                                    |
     | [9] Verify Certificate                             |
     +---------------------------------------+            |
     | verify(pubCA, identity_doc, sig)      |            |
     | attest_open(encQuote, `psk_attest`)   |            |
     | verify(pubAK, dataSign, sig)          |            |
     | check hash(pubIK,CN1,CN2,pubKEM_C)    |            |
     +---------------------------------------+            |
     |                                                    |
     |                           [10] {CertificateVerify} |
     | <------------------------------------------------- |
     |                                                    |
     |                              [11] {ServerFinished} |
     | <------------------------------------------------- |
     |                                                    |
     | [12] {ClientFinished}                              |
     | -------------------------------------------------> |
     |                                                    |
     | - - - - - - - - - Post Handshake - - - - - - - - - |
     |                                                    |
     | [I-D.ietf-tls-extended-key-update,                 |
     | (requires EKU-PSK extension)                       |
     |                                                    |
     | [13] Derive post-rotation key for PFS              |    \
     +-------------------------------------------+        |    |
     | eku_key = (eku_dh_shared || `psk_attest`) |        | [Phase 3]
     +-------------------------------------------+        |    |
     | [14] {EKU Request}      =========================> |    /
     | [15] {EKU Response}     <========================= |
     |                                                    |
     | <===============================================>  |
     |   [16] Application Data                            |
     |   [17] Periodic re-Attestation health checks       |
     |        [e.g., I-D.fossati-seat-expat]              |
     | <===============================================>  |
     |                                                    |
]]></artwork>
        </artset>
      </figure>
      <section anchor="split-session-alternative">
        <name>Split-Session Alternative</name>
        <t>An alternative design uses a sacrificial bootstrap handshake followed by PSK-DHE resumption on a new TCP connection, rather than EKU within a single connection.</t>
        <figure anchor="fig-split">
          <name>Split-Session Alternative: Bootstrap + PSK-DHE Resume</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="432" width="456" viewBox="0 0 456 432" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 24,48 L 24,256" fill="none" stroke="black"/>
                <path d="M 24,304 L 24,416" fill="none" stroke="black"/>
                <path d="M 208,80 L 208,248" fill="none" stroke="black"/>
                <path d="M 400,48 L 400,256" fill="none" stroke="black"/>
                <path d="M 400,304 L 400,416" fill="none" stroke="black"/>
                <path d="M 32,96 L 200,96" fill="none" stroke="black"/>
                <path d="M 216,96 L 392,96" fill="none" stroke="black"/>
                <path d="M 32,144 L 200,144" fill="none" stroke="black"/>
                <path d="M 216,144 L 392,144" fill="none" stroke="black"/>
                <path d="M 40,382 L 392,382" fill="none" stroke="black"/>
                <path d="M 40,386 L 392,386" fill="none" stroke="black"/>
                <path d="M 40,398 L 384,398" fill="none" stroke="black"/>
                <path d="M 40,402 L 384,402" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="400,384 388,378.4 388,389.6" fill="black" transform="rotate(0,392,384)"/>
                <polygon class="arrowhead" points="400,96 388,90.4 388,101.6" fill="black" transform="rotate(0,392,96)"/>
                <polygon class="arrowhead" points="224,144 212,138.4 212,149.6" fill="black" transform="rotate(180,216,144)"/>
                <polygon class="arrowhead" points="208,96 196,90.4 196,101.6" fill="black" transform="rotate(0,200,96)"/>
                <polygon class="arrowhead" points="48,400 36,394.4 36,405.6" fill="black" transform="rotate(180,40,400)"/>
                <polygon class="arrowhead" points="40,144 28,138.4 28,149.6" fill="black" transform="rotate(180,32,144)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="212" y="36">MiTM</text>
                  <text x="404" y="36">Attester/TEE</text>
                  <text x="208" y="52">|</text>
                  <text x="32" y="68">-</text>
                  <text x="48" y="68">-</text>
                  <text x="64" y="68">-</text>
                  <text x="104" y="68">Session</text>
                  <text x="156" y="68">0.5:</text>
                  <text x="216" y="68">Bootstrap</text>
                  <text x="312" y="68">(sacrificial)</text>
                  <text x="376" y="68">-</text>
                  <text x="392" y="68">-</text>
                  <text x="44" y="84">CH</text>
                  <text x="64" y="84">+</text>
                  <text x="136" y="84">facts_challenge</text>
                  <text x="252" y="116">SH</text>
                  <text x="272" y="116">+</text>
                  <text x="292" y="116">EE</text>
                  <text x="312" y="116">+</text>
                  <text x="336" y="116">CRT</text>
                  <text x="360" y="116">+</text>
                  <text x="312" y="132">facts_attestation</text>
                  <text x="60" y="180">Verify</text>
                  <text x="124" y="180">Evidence</text>
                  <text x="60" y="196">Derive</text>
                  <text x="132" y="196">psk_attest</text>
                  <text x="68" y="212">Exporter</text>
                  <text x="152" y="212">CN1,CN2</text>
                  <text x="68" y="228">Finished</text>
                  <text x="120" y="228">NOT</text>
                  <text x="156" y="228">sent</text>
                  <text x="32" y="260">-</text>
                  <text x="48" y="260">-</text>
                  <text x="80" y="260">ABORT</text>
                  <text x="136" y="260">Session</text>
                  <text x="184" y="260">0.5</text>
                  <text x="208" y="260">-</text>
                  <text x="224" y="260">-</text>
                  <text x="240" y="260">-</text>
                  <text x="256" y="260">-</text>
                  <text x="272" y="260">-</text>
                  <text x="288" y="260">-</text>
                  <text x="304" y="260">-</text>
                  <text x="320" y="260">-</text>
                  <text x="336" y="260">-</text>
                  <text x="352" y="260">-</text>
                  <text x="368" y="260">-</text>
                  <text x="384" y="260">-</text>
                  <text x="32" y="308">-</text>
                  <text x="48" y="308">-</text>
                  <text x="64" y="308">-</text>
                  <text x="104" y="308">Session</text>
                  <text x="156" y="308">1.0:</text>
                  <text x="208" y="308">PSK-DHE</text>
                  <text x="268" y="308">Resume</text>
                  <text x="304" y="308">-</text>
                  <text x="320" y="308">-</text>
                  <text x="336" y="308">-</text>
                  <text x="352" y="308">-</text>
                  <text x="368" y="308">-</text>
                  <text x="384" y="308">-</text>
                  <text x="52" y="324">(new</text>
                  <text x="88" y="324">TCP</text>
                  <text x="152" y="324">connection)</text>
                  <text x="48" y="356">CH2</text>
                  <text x="72" y="356">+</text>
                  <text x="96" y="356">PSK</text>
                  <text x="140" y="356">binder</text>
                  <text x="64" y="372">+</text>
                  <text x="96" y="372">0-RTT</text>
                  <text x="160" y="372">EarlyData</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                  MiTM                Attester/TEE
  |                      |                       |
  |- - - Session 0.5: Bootstrap (sacrificial) - -|
  | CH + facts_challenge |                       |
  |--------------------->|---------------------->|
  |                      |    SH + EE + CRT +    |
  |                      |    facts_attestation  |
  |<---------------------|<----------------------|
  |                      |                       |
  | Verify Evidence      |                       |
  | Derive psk_attest    |                       |
  | Exporter + CN1,CN2   |                       |
  | Finished NOT sent    |                       |
  |                      |                       |
  |- - ABORT Session 0.5 - - - - - - - - - - - - |


  |- - - Session 1.0: PSK-DHE Resume - - - - - - |
  | (new TCP connection)                         |
  |                                              |
  | CH2 + PSK binder                             |
  |    + 0-RTT EarlyData                         |
  | ============================================>|
  | <=========================================== |
  |                                              |
]]></artwork>
          </artset>
        </figure>
        <t>The EKU-based design is the practical extension of this concept: it replaces the connection tear-down and PSK-DHE resumption with an in-band EKU exchange, saving one TCP round-trip (SYN/SYN-ACK) plus the second ClientHello flight. Both produce equivalent post-rotation security. The split-session variant is useful for legacy stacks without EKU support.</t>
      </section>
    </section>
    <section anchor="key-schedule">
      <name>Key Schedule Integration</name>
      <t>FACTS integrates with the TLS 1.3 key schedule at two points: the Early Secret (for PSK binder validation) and the Extended Key Update (for traffic key rotation).</t>
      <section anchor="early-secret-binding">
        <name>Early Secret Binding</name>
        <t><tt>CN1</tt> is used to derive a PSK that feeds into the Early Secret computation, enabling PSK binder validation in the ClientHello.</t>
        <artwork><![CDATA[
PSK          = HKDF-Extract(salt=0, IKM=CN1)
Early Secret = HKDF-Extract(salt=0, IKM=PSK)
binder_key   = Derive-Secret(Early Secret, "res binder", "")
binder       = HMAC(binder_key, Transcript(ClientHello_truncated))
]]></artwork>
      </section>
      <section anchor="pskattest-derivation">
        <name><tt>psk_attest</tt> Derivation</name>
        <t>Both peers derive the attestation key material from the concatenation of both challenge nonces:</t>
        <artwork><![CDATA[
psk_attest = HKDF-Expand-Label(
    HKDF-Extract(salt=0, IKM=CN1 || CN2),
    "facts:v1:psk", "", Hash.length)
]]></artwork>
        <t><tt>psk_attest</tt> serves two purposes: it encrypts Evidence during the handshake (via AEAD), and it is injected into the EKU key schedule after Evidence appraisal.</t>
      </section>
      <section anchor="aad-construction">
        <name>AAD Construction</name>
        <t>Two distinct AAD values are used, one per HPKE operation. Both <bcp14>MUST</bcp14> be computed as specified here; deviations invalidate the session-binding properties of the protocol.</t>
        <t><strong><tt>aad_ct</tt></strong> — used when sealing CN1 in <tt>facts_challenge</tt> (ClientHello):</t>
        <artwork><![CDATA[
aad_ct = Hash(pubKEM_S || ClientHello.random || NegotiationOffer)
]]></artwork>
        <t>This binds the CN1 ciphertext to the target server's KEM key, the client's fresh random, and the negotiated parameters. An adversary cannot replay the ciphertext to a different server or across sessions.</t>
        <t><strong><tt>aad_ee</tt></strong> — used when sealing CN2 in <tt>facts_challenge</tt> (EncryptedExtensions):</t>
        <artwork><![CDATA[
aad_ee = Hash(ClientHello || ServerHello)
]]></artwork>
        <t>This binds the CN2 ciphertext to the full handshake transcript up to that point (<tt>log_SH</tt>). The CN2 ciphertext is therefore specific to the handshake in flight and cannot be transferred to any other session.</t>
        <t>Implementations <bcp14>MUST</bcp14> use the negotiated handshake hash algorithm for both computations. The <tt>NegotiationOffer</tt> in <tt>aad_ct</tt> is the <tt>offer</tt> value from the key exchange negotiation as carried in the ClientHello.</t>
      </section>
    </section>
    <section anchor="evidence-binding">
      <name>Evidence Binding</name>
      <t>The attester binds the TEE Evidence to the TLS session by including session-specific data in the TEE-signed attestation report.</t>
      <section anchor="report-data-construction">
        <name>Report Data Construction</name>
        <artwork><![CDATA[
rdata = SHA-256(pubIK_S || CN1 || CN2 || pubKEM_C)
]]></artwork>
        <t>The report data (<tt>rdata</tt>) binds the Evidence to both the attester's identity key, the mutually exchanged nonces and the Client's own ephemeral per-session pubKEM KEM.</t>
      </section>
    </section>
    <section anchor="eku-injection">
      <name>Extended Key Update with PSK Injection</name>
      <t>After Evidence appraisal succeeds, the client initiates an Extended Key Update <xref target="I-D.ietf-tls-extended-key-update"/> that injects <tt>psk_attest</tt> into the key schedule, rotating the traffic keys to values that incorporate attestation-derived keying material.</t>
      <section anchor="procedure">
        <name>Procedure</name>
        <ol spacing="normal" type="1"><li>
            <t>The client generates an ephemeral key pair for the EKU exchange: <tt>(eku_x, g^eku_x)</tt>.</t>
          </li>
          <li>
            <t>The client sends an EKU request containing <tt>g^eku_x</tt>.</t>
          </li>
          <li>
            <t>The server generates its ephemeral key pair: <tt>(eku_y, g^eku_y)</tt>.</t>
          </li>
          <li>
            <t>Both peers compute the EKU Diffie-Hellman shared secret: <tt>eku_dh = DH(g^eku_x, eku_y)</tt> (equivalently, <tt>DH(g^eku_y, eku_x)</tt>).</t>
          </li>
          <li>
            <t>Both peers construct the combined input keying material: <tt>combined_ikm = eku_dh || psk_attest</tt></t>
          </li>
          <li>
            <t>Both peers derive new traffic keys:</t>
          </li>
        </ol>
        <figure anchor="fig-key-schedule">
          <name>FACTS Key Schedule for Extended Key Update</name>
          <artwork><![CDATA[
combined_ikm     = eku_dh_shared || psk_attest

stored_secret    = Derive(main_secret_N, "derived", "")
main_secret_N+1  = HKDF-Extract(stored_secret, combined_ikm)

eku_cts = Derive(main_secret_N+1, "c_app_traffic_N+1", eku_log)
eku_sts = Derive(main_secret_N+1, "s_app_traffic_N+1", eku_log)
]]></artwork>
        </figure>
        <figure anchor="fig-eku-kdf">
          <name>EKU Key Schedule with PSK Injection</name>
          <artwork><![CDATA[
  main_secret_N
       |
  Derive(main_secret_N, "derived", "")
       |
  stored_secret
       |          (eku_dh || psk_attest)
       |                 |
       +--------> HKDF-Extract(stored, combined_ikm)
                         |
                   main_secret_N+1
                  /               \
                 '                 '
             Derive               Derive
        "c_app_traffic_N+1"   "s_app_traffic_N+1"
               |                     |
           eku_cts                eku_sts
]]></artwork>
        </figure>
        <t>Because <tt>combined_ikm</tt> includes <tt>psk_attest</tt>, which requires knowledge of <tt>CN2</tt>, any entity that cannot derive <tt>CN2</tt> (because it lacks <tt>privKEM_C</tt> to unseal the server's <tt>Ctx2</tt>) cannot compute <tt>main_secret_N+1</tt> or any traffic keys derived from it.</t>
      </section>
      <section anchor="interaction-with-draft-ietf-tls-extended-key-update">
        <name>Interaction with draft-ietf-tls-extended-key-update</name>
        <t>The PSK injection mechanism defined in this section extends the EKU key schedule specified in <xref target="I-D.ietf-tls-extended-key-update"/>. The standard EKU derivation uses only the DH shared secret as IKM; FACTS concatenates <tt>psk_attest</tt> to the DH shared secret before extraction. All other aspects of the EKU exchange (message formats, transcript construction, key switch timing) remain as specified in <xref target="I-D.ietf-tls-extended-key-update"/>.</t>
      </section>
    </section>
    <section anchor="extension-definitions">
      <name>Extension Definitions</name>
      <section anchor="facts-hello-extension">
        <name>The <tt>facts_hello</tt> Extension</name>
        <t>The <tt>facts_hello</tt> extension is carried in the ClientHello and serves as the capability signal for FACTS. Its presence indicates that the client supports the FACTS protocol and is prepared to send <tt>facts_challenge</tt>. It optionally carries a <tt>hw_id</tt> hint that identifies the hardware platform, enabling the CA or Verifier to select the correct endorsement key bundle, manufacturer reference values, and appraisal policy before the attestation quote arrives.</t>
        <artwork><![CDATA[
enum {
    facts_hello_v1(1),
    (255)
} FactsHelloVersion;

enum {
    no_hw_id(0),
    hw_id_present(1),
    (255)
} FactsHelloFlags;

struct {
    FactsHelloVersion version;        /* MUST be facts_hello_v1 */
    FactsHelloFlags   flags;
    select (FactsHello.flags) {
        case hw_id_present:
            opaque hw_id<1..2^16-1>; /* opaque platform identifier */
        case no_hw_id:
            /* empty */
    };
} FactsHello;
]]></artwork>
        <t><tt>version</tt> <bcp14>MUST</bcp14> be <tt>facts_hello_v1</tt>. Servers that do not recognize the version <bcp14>MUST</bcp14> ignore the extension.</t>
        <t><tt>hw_id</tt> is an opaque value whose encoding is platform-specific. It is not a credential and is not secret. It is transmitted in the clear in ClientHello. Deployments with elevated privacy requirements <bcp14>SHOULD</bcp14> use <tt>no_hw_id</tt> and rely on the <tt>facts_attest_req</tt> context for platform identification, or deliver platform identity inside the encrypted <tt>facts_attestation</tt> payload instead.</t>
      </section>
      <section anchor="facts-challenge-extension">
        <name>The <tt>facts_challenge</tt> Extension</name>
        <t>The <tt>facts_challenge</tt> extension carries HPKE-sealed challenge nonces. It appears in two messages with distinct structures and HPKE modes.</t>
        <section anchor="clienthello-variant">
          <name>ClientHello Variant</name>
          <artwork><![CDATA[
struct {
    opaque initiator_id<0..2^16-1>;  /* ID_C: connecting peer identity */
    opaque pubKEM_C<1..2^16-1>;      /* ephemeral per-session KEM public key */
    opaque ct<1..2^16-1>;            /* sealed CN1 */
} FactsChallengeClient;
]]></artwork>
          <t>The ciphertext <tt>ct</tt> <bcp14>MUST</bcp14> be computed as:</t>
          <artwork><![CDATA[
/* Runtime flow — HPKE Mode 0 (RFC 9180 §5.1) */
ct = HPKE-Seal(plaintext=CN1, aad=aad_ct, pkR=pubKEM_S)

/* Enrollment flow — Auth HPKE Mode 2 (RFC 9180 §5.2.1) */
ct = AuthHPKE-Seal(plaintext=CN1, aad=aad_ct, pkR=pubKEM_S, skS=privLTK_C)
]]></artwork>
          <t>where <tt>aad_ct</tt> is computed per <xref target="aad-construction"/>.</t>
          <t>The server <bcp14>MUST</bcp14> verify that <tt>pubKEM_C</tt> is a valid public key for the negotiated KEM group before proceeding.</t>
        </section>
        <section anchor="encryptedextensions-variant">
          <name>EncryptedExtensions Variant</name>
          <artwork><![CDATA[
struct {
    opaque ct<1..2^16-1>;            /* sealed CN2 */
} FactsChallengeServer;
]]></artwork>
          <t>The ciphertext <tt>ct</tt> <bcp14>MUST</bcp14> be computed as:</t>
          <artwork><![CDATA[
/* Runtime flow — HPKE Mode 0 */
ct = HPKE-Seal(plaintext=CN2, aad=aad_ee, pkR=pubKEM_C)

/* Enrollment flow — Auth HPKE Mode 2 */
ct = AuthHPKE-Seal(plaintext=CN2, aad=aad_ee, pkR=pubKEM_C, skS=privIK_S)
]]></artwork>
          <t>where <tt>aad_ee</tt> is computed per <xref target="aad-construction"/>.</t>
          <t>The <tt>facts_challenge</tt> extension in EncryptedExtensions <bcp14>MUST NOT</bcp14> appear unless the corresponding <tt>facts_challenge</tt> was present in the ClientHello. Servers that receive <tt>facts_challenge</tt> in ClientHello without a <tt>facts_hello</tt> extension <bcp14>MUST</bcp14> abort with <tt>missing_extension</tt>.</t>
        </section>
      </section>
      <section anchor="facts-attestation-extension">
        <name>The <tt>facts_attestation</tt> Extension</name>
        <t>The <tt>facts_attestation</tt> extension is carried in the Certificate message and delivers the encrypted TEE Evidence along with the self-signed key binding. It is the sole extension defined by this document that is permitted in the Certificate message.</t>
        <artwork><![CDATA[
struct {
    opaque pubIK<1..2^16-1>;         /* attester's identity public key */
    opaque selfsign<1..2^16-1>;      /* sign(privIK, (pubIK || encEvidence)) */
    opaque encEvidence<1..2^16-1>;   /* AEAD{CMW-wrapped quote}_{psk_attest} */
} FactsAttestation;
]]></artwork>
        <t><tt>pubIK</tt> <bcp14>MUST</bcp14> match the public key in the Certificate's leaf entry. The client <bcp14>MUST</bcp14> abort with <tt>illegal_parameter</tt> if they differ.</t>
        <t><tt>selfsign</tt> is a signature over the concatenation of <tt>pubIK</tt> and <tt>encEvidence</tt>, produced by <tt>privIK</tt>. It binds the identity key to the encrypted Evidence payload within the same Certificate message, preventing substitution of one attester's Evidence under another attester's certificate.</t>
        <t><tt>encEvidence</tt> is the attestation quote encrypted under <tt>psk_attest</tt> using AEAD (ChaCha20-Poly1305 per <xref target="RFC8439"/>). The plaintext is a RATS CMW-wrapped Evidence payload per <xref target="I-D.ietf-rats-msg-wrap"/>.</t>
      </section>
    </section>
    <section anchor="enrollment">
      <name>Enrollment</name>
      <t>Certificate enrollment has a foundational chicken-and-egg problem in TEE environments: a client needs credentials to authenticate to a CA, but obtaining credentials is the reason it is connecting to the CA in the first place. FACTS uses the mTLS handshake wire format to deliver the client's X.509 certificate over a channel that is cryptographically proven to terminate at the verified hardware boundary: the CA's challenge nonce (CN2) is sealed to the client's ephemeral <tt>pubKEM_C</tt>, the client's TEE evidence binds that nonce and the client's fresh <tt>pubLTK_C</tt> in the hardware-signed quote, and the resulting certificate arrives over traffic keys that only a party holding <tt>privKEM_C</tt> could have derived.</t>
      <figure anchor="fig-facts-mtls-flow">
        <name>Attestation over mTLS supplying RATS AR</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1184" width="616" viewBox="0 0 616 1184" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 32,48 L 32,1152" fill="none" stroke="black"/>
              <path d="M 48,608 L 48,640" fill="none" stroke="black"/>
              <path d="M 208,704 L 208,800" fill="none" stroke="black"/>
              <path d="M 232,288 L 232,320" fill="none" stroke="black"/>
              <path d="M 352,192 L 352,240" fill="none" stroke="black"/>
              <path d="M 352,384 L 352,464" fill="none" stroke="black"/>
              <path d="M 456,64 L 456,1152" fill="none" stroke="black"/>
              <path d="M 48,144 L 440,144" fill="none" stroke="black"/>
              <path d="M 32,192 L 352,192" fill="none" stroke="black"/>
              <path d="M 32,240 L 352,240" fill="none" stroke="black"/>
              <path d="M 48,336 L 440,336" fill="none" stroke="black"/>
              <path d="M 32,384 L 352,384" fill="none" stroke="black"/>
              <path d="M 32,464 L 352,464" fill="none" stroke="black"/>
              <path d="M 48,512 L 440,512" fill="none" stroke="black"/>
              <path d="M 48,560 L 440,560" fill="none" stroke="black"/>
              <path d="M 48,656 L 440,656" fill="none" stroke="black"/>
              <path d="M 208,704 L 456,704" fill="none" stroke="black"/>
              <path d="M 208,800 L 456,800" fill="none" stroke="black"/>
              <path d="M 48,848 L 440,848" fill="none" stroke="black"/>
              <path d="M 48,896 L 440,896" fill="none" stroke="black"/>
              <path d="M 240,990 L 440,990" fill="none" stroke="black"/>
              <path d="M 240,994 L 440,994" fill="none" stroke="black"/>
              <path d="M 240,1006 L 440,1006" fill="none" stroke="black"/>
              <path d="M 240,1010 L 440,1010" fill="none" stroke="black"/>
              <path d="M 48,1038 L 432,1038" fill="none" stroke="black"/>
              <path d="M 48,1042 L 432,1042" fill="none" stroke="black"/>
              <path d="M 48,1134 L 432,1134" fill="none" stroke="black"/>
              <path d="M 48,1138 L 432,1138" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="448,992 436,986.4 436,997.6" fill="black" transform="rotate(0,440,992)"/>
              <polygon class="arrowhead" points="448,896 436,890.4 436,901.6" fill="black" transform="rotate(0,440,896)"/>
              <polygon class="arrowhead" points="448,848 436,842.4 436,853.6" fill="black" transform="rotate(0,440,848)"/>
              <polygon class="arrowhead" points="448,656 436,650.4 436,661.6" fill="black" transform="rotate(0,440,656)"/>
              <polygon class="arrowhead" points="440,1136 428,1130.4 428,1141.6" fill="black" transform="rotate(0,432,1136)"/>
              <polygon class="arrowhead" points="440,1040 428,1034.4 428,1045.6" fill="black" transform="rotate(0,432,1040)"/>
              <polygon class="arrowhead" points="248,1008 236,1002.4 236,1013.6" fill="black" transform="rotate(180,240,1008)"/>
              <polygon class="arrowhead" points="56,1136 44,1130.4 44,1141.6" fill="black" transform="rotate(180,48,1136)"/>
              <polygon class="arrowhead" points="56,1040 44,1034.4 44,1045.6" fill="black" transform="rotate(180,48,1040)"/>
              <polygon class="arrowhead" points="56,560 44,554.4 44,565.6" fill="black" transform="rotate(180,48,560)"/>
              <polygon class="arrowhead" points="56,512 44,506.4 44,517.6" fill="black" transform="rotate(180,48,512)"/>
              <polygon class="arrowhead" points="56,336 44,330.4 44,341.6" fill="black" transform="rotate(180,48,336)"/>
              <polygon class="arrowhead" points="56,144 44,138.4 44,149.6" fill="black" transform="rotate(180,48,144)"/>
              <g class="text">
                <text x="28" y="36">Client</text>
                <text x="452" y="36">Server</text>
                <text x="236" y="52">[Pre-handshake</text>
                <text x="316" y="52">...]</text>
                <text x="48" y="68">-</text>
                <text x="64" y="68">-</text>
                <text x="80" y="68">-</text>
                <text x="96" y="68">-</text>
                <text x="112" y="68">-</text>
                <text x="128" y="68">-</text>
                <text x="144" y="68">-</text>
                <text x="160" y="68">-</text>
                <text x="176" y="68">-</text>
                <text x="192" y="68">-</text>
                <text x="208" y="68">-</text>
                <text x="224" y="68">-</text>
                <text x="240" y="68">-</text>
                <text x="256" y="68">-</text>
                <text x="272" y="68">-</text>
                <text x="288" y="68">-</text>
                <text x="304" y="68">-</text>
                <text x="320" y="68">-</text>
                <text x="336" y="68">-</text>
                <text x="352" y="68">-</text>
                <text x="368" y="68">-</text>
                <text x="384" y="68">-</text>
                <text x="400" y="68">-</text>
                <text x="416" y="68">-</text>
                <text x="432" y="68">-</text>
                <text x="448" y="68">-</text>
                <text x="48" y="100">-</text>
                <text x="64" y="100">-</text>
                <text x="80" y="100">-</text>
                <text x="96" y="100">-</text>
                <text x="112" y="100">-</text>
                <text x="128" y="100">-</text>
                <text x="144" y="100">-</text>
                <text x="160" y="100">-</text>
                <text x="176" y="100">-</text>
                <text x="192" y="100">-</text>
                <text x="208" y="100">-</text>
                <text x="236" y="100">mTLS</text>
                <text x="272" y="100">1.3</text>
                <text x="296" y="100">-</text>
                <text x="312" y="100">-</text>
                <text x="328" y="100">-</text>
                <text x="344" y="100">-</text>
                <text x="360" y="100">-</text>
                <text x="376" y="100">-</text>
                <text x="392" y="100">-</text>
                <text x="408" y="100">-</text>
                <text x="424" y="100">-</text>
                <text x="440" y="100">-</text>
                <text x="248" y="132">[1]</text>
                <text x="348" y="132">{CertificateRequest}</text>
                <text x="56" y="180">[2]</text>
                <text x="120" y="180">Decapsulate</text>
                <text x="184" y="180">CN2</text>
                <text x="496" y="180">\</text>
                <text x="496" y="196">|</text>
                <text x="108" y="212">hpkeOpen(cn2_ct,</text>
                <text x="208" y="212">aad_ee,</text>
                <text x="284" y="212">privKEM_C)</text>
                <text x="488" y="212">[mTLS</text>
                <text x="564" y="212">Attestation]</text>
                <text x="92" y="228">`psk_attest`</text>
                <text x="152" y="228">=</text>
                <text x="208" y="228">derive(CN1,</text>
                <text x="276" y="228">CN2)</text>
                <text x="496" y="228">|</text>
                <text x="496" y="244">/</text>
                <text x="208" y="276">[3]</text>
                <text x="280" y="276">{Certificate}</text>
                <text x="312" y="292">facts_attestation</text>
                <text x="272" y="308">(pubIK,</text>
                <text x="344" y="308">selfsign,</text>
                <text x="344" y="324">AEAD{quote}_{psk_attest})</text>
                <text x="56" y="372">[4]</text>
                <text x="100" y="372">Verify</text>
                <text x="176" y="372">Certificate</text>
                <text x="96" y="404">verify(pubCA,</text>
                <text x="208" y="404">identity_doc,</text>
                <text x="284" y="404">sig)</text>
                <text x="128" y="420">attest_open(encQuote,</text>
                <text x="272" y="420">`psk_attest`)</text>
                <text x="96" y="436">verify(pubAK,</text>
                <text x="192" y="436">dataSign,</text>
                <text x="252" y="436">sig)</text>
                <text x="64" y="452">check</text>
                <text x="204" y="452">hash(pubIK,CN1,CN2,pubKEM_C)</text>
                <text x="272" y="500">[5]</text>
                <text x="368" y="500">{CertificateVerify}</text>
                <text x="288" y="548">[6]</text>
                <text x="372" y="548">{ServerFinished}</text>
                <text x="56" y="596">[7]</text>
                <text x="128" y="596">{Certificate}</text>
                <text x="128" y="612">facts_attestation</text>
                <text x="88" y="628">(pubIK,</text>
                <text x="160" y="628">selfsign,</text>
                <text x="188" y="644">AEAD{client_quote}_{psk_attest})</text>
                <text x="248" y="692">[8]</text>
                <text x="292" y="692">Verify</text>
                <text x="348" y="692">Client</text>
                <text x="396" y="692">Cert</text>
                <text x="332" y="724">attest_open(client_encQuote,</text>
                <text x="280" y="740">psk_attest)</text>
                <text x="272" y="756">verify(pubAK,</text>
                <text x="368" y="756">dataSign,</text>
                <text x="428" y="756">sig)</text>
                <text x="240" y="772">check</text>
                <text x="320" y="772">hash(pubIK_S,</text>
                <text x="396" y="772">CN1,</text>
                <text x="252" y="788">CN2,</text>
                <text x="312" y="788">pubKEM_C)</text>
                <text x="56" y="836">[9]</text>
                <text x="152" y="836">{CertificateVerify}</text>
                <text x="60" y="884">[10]</text>
                <text x="148" y="884">{ClientFinished}</text>
                <text x="48" y="916">-</text>
                <text x="64" y="916">-</text>
                <text x="80" y="916">-</text>
                <text x="96" y="916">-</text>
                <text x="112" y="916">-</text>
                <text x="128" y="916">-</text>
                <text x="144" y="916">-</text>
                <text x="160" y="916">-</text>
                <text x="176" y="916">-</text>
                <text x="204" y="916">Post</text>
                <text x="264" y="916">Handshake</text>
                <text x="312" y="916">-</text>
                <text x="328" y="916">-</text>
                <text x="344" y="916">-</text>
                <text x="360" y="916">-</text>
                <text x="376" y="916">-</text>
                <text x="392" y="916">-</text>
                <text x="408" y="916">-</text>
                <text x="424" y="916">-</text>
                <text x="440" y="916">-</text>
                <text x="180" y="948">[I-D.ietf-tls-extended-key-update,</text>
                <text x="80" y="964">(requires</text>
                <text x="152" y="964">EKU-PSK</text>
                <text x="228" y="964">extension)</text>
                <text x="60" y="996">[11]</text>
                <text x="100" y="996">{EKU</text>
                <text x="156" y="996">Request}</text>
                <text x="60" y="1012">[12]</text>
                <text x="100" y="1012">{EKU</text>
                <text x="160" y="1012">Response}</text>
                <text x="76" y="1060">[13]</text>
                <text x="144" y="1060">Application</text>
                <text x="212" y="1060">Data</text>
                <text x="496" y="1060">\</text>
                <text x="96" y="1076">+</text>
                <text x="132" y="1076">issued</text>
                <text x="172" y="1076">AR</text>
                <text x="212" y="1076">(ID_C,</text>
                <text x="276" y="1076">pubIK_C,</text>
                <text x="352" y="1076">pubKEM_C)</text>
                <text x="496" y="1076">|</text>
                <text x="76" y="1092">[14]</text>
                <text x="132" y="1092">Periodic</text>
                <text x="228" y="1092">re-Attestation</text>
                <text x="316" y="1092">health</text>
                <text x="372" y="1092">checks</text>
                <text x="524" y="1092">[Attestation</text>
                <text x="512" y="1108">Result]</text>
                <text x="124" y="1124">[e.g.,</text>
                <text x="248" y="1124">I-D.fossati-seat-expat]</text>
                <text x="496" y="1124">|</text>
                <text x="496" y="1140">/</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
  Client                                               Server
     |                  [Pre-handshake ...]
     | - - - - - - - - - - - - - - - - - - - - - - - - - -|
     |                                                    |
     | - - - - - - - - - - - mTLS 1.3 - - - - - - - - - - |
     |                                                    |
     |                         [1] {CertificateRequest}   |
     | <------------------------------------------------- |
     |                                                    |
     | [2] Decapsulate CN2                                |    \
     +---------------------------------------+            |    |
     | hpkeOpen(cn2_ct, aad_ee, privKEM_C)   |            | [mTLS Attestation]
     | `psk_attest` = derive(CN1, CN2)       |            |    |
     +---------------------------------------+            |    /
     |                                                    |
     |                    [3] {Certificate}               |
     |                        + facts_attestation         |
     |                        + (pubIK, selfsign,         |
     |                        + AEAD{quote}_{psk_attest}) |
     | <------------------------------------------------- |
     |                                                    |
     | [4] Verify Certificate                             |
     +---------------------------------------+            |
     | verify(pubCA, identity_doc, sig)      |            |
     | attest_open(encQuote, `psk_attest`)   |            |
     | verify(pubAK, dataSign, sig)          |            |
     | check hash(pubIK,CN1,CN2,pubKEM_C)    |            |
     +---------------------------------------+            |
     |                                                    |
     |                            [5] {CertificateVerify} |
     | <------------------------------------------------- |
     |                                                    |
     |                              [6] {ServerFinished}  |
     | <------------------------------------------------- |
     |                                                    |
     | [7] {Certificate}                                  |
     | + facts_attestation                                |
     | + (pubIK, selfsign,                                |
     | + AEAD{client_quote}_{psk_attest})                 |
     | -------------------------------------------------> |
     |                                                    |
     |                         [8] Verify Client Cert     |
     |                     +------------------------------+
     |                     | attest_open(client_encQuote, |
     |                     |   psk_attest)                |
     |                     | verify(pubAK, dataSign, sig) |
     |                     | check hash(pubIK_S, CN1,     |
     |                     |   CN2, pubKEM_C)             |
     |                     +------------------------------+
     |                                                    |
     | [9] {CertificateVerify}                            |
     | -------------------------------------------------> |
     |                                                    |
     | [10] {ClientFinished}                              |
     | -------------------------------------------------> |
     | - - - - - - - - - Post Handshake - - - - - - - - - |
     |                                                    |
     | [I-D.ietf-tls-extended-key-update,                 |
     | (requires EKU-PSK extension)                       |
     |                                                    |
     | [11] {EKU Request}      =========================> |
     | [12] {EKU Response}     <========================= |
     |                                                    |
     | <===============================================>  |
     |   [13] Application Data                            |    \
     |       + issued AR (ID_C, pubIK_C, pubKEM_C)        |    |
     |   [14] Periodic re-Attestation health checks       |  [Attestation
     |                                                    |   Result]
     |        [e.g., I-D.fossati-seat-expat]              |    |
     | <===============================================>  |    /
     |                                                    |
]]></artwork>
        </artset>
      </figure>
      <section anchor="facts-attest-request-extension">
        <name>The <tt>facts_attest_req</tt> Extension</name>
        <t>The <tt>facts_attest_req</tt> extension is carried in the <tt>CertificateRequest</tt> message. It signals that the server requires client attestation before it will release its own Evidence, and communicates the Evidence format requirements the client must satisfy. CA enrollment is one application of this signal; privacy-gated disclosure to unauthenticated clients is another.</t>
        <section anchor="extension-structure">
          <name>Extension Structure</name>
          <artwork><![CDATA[
struct {
    ExtensionType extension_type = facts_attest_req; /* 0xTBD1 */
    opaque extension_data<0..2^16-1>;
} Extension;

struct {
    FactsAttestRequestVersion version;
    FactsEvidenceFormat supported_formats<1..2^8-1>;
    opaque responder_identity<0..2^16-1>;  /* responder's ID_S, for rdata binding */
    opaque request_context<0..2^8-1>;      /* opaque, echoed in client response */
} FactsAttestRequestParams;

enum {
    facts_attest_req_v1(1),
    (255)
} FactsAttestRequestVersion;

enum {
    eat_cbor(1),       /* EAT CBOR per RFC 9711 */
    eat_json(2),       /* EAT JSON */
    cmw(3),            /* RATS CMW per I-D.ietf-rats-msg-wrap */
    csr_attestation(4),/* I-D.ietf-lamps-csr-attestation attribute format */
    (255)
} FactsEvidenceFormat;
]]></artwork>
          <t><tt>version</tt> identifies the <tt>facts_attest_req</tt> protocol version. Clients that do not recognize the version <bcp14>MUST</bcp14> abort with <tt>handshake_failure</tt>.</t>
          <t><tt>supported_formats</tt> is an ordered list of Evidence formats the responder is willing to accept, in descending preference. The client <bcp14>MUST</bcp14> select the first format it supports. If no common format exists, the client <bcp14>MUST</bcp14> abort with <tt>handshake_failure</tt>.</t>
          <t><tt>responder_identity</tt> carries the responder's <tt>ID_S</tt> value as it appears in its Identity Document. The client <bcp14>MUST</bcp14> verify this matches the <tt>ID_S</tt> bound in the pre-fetched Identity Document. This closes the identity confirmation loop: the responder explicitly asserts its identity inline rather than relying solely on the certificate chain.</t>
          <t><tt>request_context</tt> is an opaque value chosen by the responder. The client <bcp14>MUST</bcp14> echo it verbatim in its response. It serves as a lightweight correlation handle and <bcp14>MAY</bcp14> encode responder-internal state such as a request identifier or policy selector. It <bcp14>MUST NOT</bcp14> be used as a freshness mechanism; freshness is provided by <tt>CN1</tt> and <tt>CN2</tt>.</t>
        </section>
        <section anchor="server-behavior">
          <name>Server Behavior</name>
          <t>A server sending <tt>facts_attest_req</tt> in CertificateRequest:</t>
          <ol spacing="normal" type="1"><li>
              <t><bcp14>MUST</bcp14> include <tt>facts_challenge</tt> in EncryptedExtensions. A <tt>facts_attest_req</tt> without a corresponding <tt>facts_challenge</tt> in EncryptedExtensions is a protocol error; the client <bcp14>MUST</bcp14> abort with <tt>missing_extension</tt>.</t>
            </li>
            <li>
              <t><bcp14>MUST</bcp14> deliver a valid X.509 certificate in its own Certificate message.</t>
            </li>
            <li>
              <t><bcp14>MUST</bcp14> omit <tt>facts_attestation</tt> from its own Certificate message. Server Evidence delivery is deferred to post-handshake Exported Authenticators <xref target="I-D.fossati-seat-expat"/> once the client has been verified. See <xref target="conditional-evidence-disclosure"/>.</t>
            </li>
          </ol>
        </section>
        <section anchor="client-behavior">
          <name>Client Behavior</name>
          <t>Upon receiving a <tt>CertificateRequest</tt> containing <tt>facts_attest_req</tt>, the client:</t>
          <ol spacing="normal" type="1"><li>
              <t>Verifies <tt>version</tt> is supported.</t>
            </li>
            <li>
              <t>Selects an Evidence format from <tt>supported_formats</tt>.</t>
            </li>
            <li>
              <t>Verifies <tt>responder_identity</tt> matches the pre-fetched Identity Document.</t>
            </li>
            <li>
              <t>Derives <tt>psk_attest</tt> from <tt>CN1</tt> and <tt>CN2</tt> per <xref target="key-schedule"/>.</t>
            </li>
            <li>
              <t>Produces TEE Evidence bound to the session parameters, encrypts it under <tt>psk_attest</tt>, and delivers it in <tt>facts_attestation</tt> within its Certificate message per <xref target="facts-attestation-extension"/>.</t>
            </li>
          </ol>
          <t>The enrollment-specific client steps (key pair generation, <tt>CRTEnroll</tt> construction, <tt>rdata</tt> binding), defined earlier in this section, are a specific application of this general mechanism.</t>
          <t>A client that is unable or unwilling to attest <bcp14>MUST</bcp14> send an empty Certificate message and <bcp14>MUST NOT</bcp14> send <tt>facts_attestation</tt>. The server <bcp14>MUST</bcp14> then abort with <tt>certificate_required</tt>.</t>
        </section>
        <section anchor="relationship-to-certreqcontext">
          <name>Relationship to <tt>cert_req_context</tt></name>
          <t>The standard TLS 1.3 <tt>CertificateRequest</tt> carries a <tt>certificate_request_context</tt> field that the client echoes in its Certificate message to prevent replay across connections. The <tt>request_context</tt> in <tt>facts_attest_req</tt> is distinct from and supplementary to this field. Both <bcp14>MUST</bcp14> be echoed. Implementations <bcp14>MUST NOT</bcp14> conflate them.</t>
        </section>
      </section>
    </section>
    <section anchor="eat-ar-structs">
      <name>EAT/AR Claims as Identity Documents</name>
      <t>FACTS uses two identity documents to convey device identity and verifier appraisal: an Entity Attestation Token (EAT) <xref target="RFC9711"/> produced by the attesting device, and an Attestation Result (AR) produced by the verifier. The EAT is signed by the device attestation key (privAK). The AR is signed by the verifier under a separate trust anchor.</t>
      <t>Both documents <bcp14>MAY</bcp14> be serialized in any format supported by the negotiated <tt>FactsEvidenceFormat</tt>; JWT serialization is one valid option. The claims and key binding structures defined in this section apply regardless of serialization format.</t>
      <t>The AR's <tt>cnf</tt>-based key binding follows the same proof-of-possession pattern established for OAuth token binding via mutual TLS <xref target="RFC8705"/> and DPoP <xref target="RFC9449"/>, extended with an <tt>attested_kem</tt> claim that provides a second, independent proof-of-possession channel through HPKE nonce encapsulation.</t>
      <section anchor="eat-structure">
        <name>EAT Structure</name>
        <t>The EAT payload <bcp14>MUST</bcp14> include the following FACTS-specific claims:</t>
        <artwork><![CDATA[
struct {
    string   sub;         // Stable device identifier bound to pubIK and pubKEM
    uint64   iat;
    uint64   nbf;
    uint64   exp;
    bytes    eat_nonce;   // SHA-256(pubIK_S || CN1 || CN2 || pubKEM_C),
                          //   base64url-unpadded;
    array    keys;        // JWKS array carrying exactly two JWK entries
    string   eat_profile; // EAT profile identifier per RFC 9711
} EatClaims;
]]></artwork>
        <t>All other claims <bcp14>MUST</bcp14> conform to <xref target="RFC9711"/>.</t>
        <t><tt>eat_nonce</tt> carries the session binding commitment defined in <xref target="evidence-binding"/>. Its value <bcp14>MUST</bcp14> be the base64url-unpadded encoding of <tt>SHA-256(pubIK_S || CN1 || CN2 || pubKEM_C)</tt>. Implementations <bcp14>MUST NOT</bcp14> place a verbatim verifier challenge in this field. How this value is conveyed to the underlying platform attestation primitive is defined in per-platform companion documents.</t>
        <t>The <tt>keys</tt> member is a JWKS array <xref target="RFC7517"/> carrying exactly two JWK entries:</t>
        <artwork><![CDATA[
keys: [
    { "kty": "OKP", "crv": "Ed25519", "use": "sig",
      "kid": "pubIK_S",  "x": "<pubIK key material>" },
    { "kty": "OKP", "crv": "X25519",  "use": "enc",
      "kid": "pubKEM_S", "x": "<pubKEM key material>" }
]
]]></artwork>
        <t>The first entry carries pubIK_S with <tt>"use": "sig"</tt> and the second carries pubKEM_S with <tt>"use": "enc"</tt>. Both <bcp14>MUST</bcp14> use the OKP key type per <xref target="RFC8037"/>. The EAT presents these keys as part of the device's attested evidence; they are bound to the platform measurements by the TEE's signature over the complete EAT.</t>
        <t>Platform-specific EAT claims (ueid, oemid, hwmodel, hwversion, swname, swversion, secboot, dbgstat, and claims defined by the applicable attestation profile such as PSA IoT) <bcp14>MAY</bcp14> be included and are interpreted per the applicable platform profile.</t>
      </section>
      <section anchor="ar-structure">
        <name>AR Structure</name>
        <t>The AR is issued by the verifier during enrollment alongside the X.509 certificate. It enables the passport model <xref target="RFC9334"/> for subsequent FACTS handshakes, permitting the device to present a cached attestation result without a live background-check round-trip to the verifier.</t>
        <t>The AR payload <bcp14>MUST</bcp14> include:</t>
        <artwork><![CDATA[
struct {
    string   iss;           // Verifier identity
    string   sub;           // MUST match sub from the appraised EAT
    string   aud;           // Intended relying party audience
    object   cnf;           // Confirmation claim per RFC 7800
    object   attested_kem;  // Attested encapsulation key
} ArClaims;
]]></artwork>
        <t>The <tt>cnf</tt> claim <xref target="RFC7800"/> <bcp14>MUST</bcp14> contain a <tt>jwk</tt> member carrying a single JWK entry <xref target="RFC7517"/> with <tt>"use": "sig"</tt> carrying pubIK_S:</t>
        <artwork><![CDATA[
"cnf": {
    "jwk": { "kty": "OKP", "crv": "Ed25519", "use": "sig",
             "kid": "pubIK_S", "x": "<pubIK key material>" }
}
]]></artwork>
        <t>A relying party that receives an AR <bcp14>MUST</bcp14> verify that the <tt>cnf.jwk</tt> key matches the public key presented in the TLS Certificate message. This is the standard proof-of-possession confirmation: <tt>CertificateVerify</tt> proves the server holds the private key corresponding to the confirmed public key.</t>
        <t>The <tt>attested_kem</tt> claim carries the encapsulation key as a standalone JWK with <tt>"use": "enc"</tt>:</t>
        <artwork><![CDATA[
"attested_kem": {
    "kty": "OKP", "crv": "X25519", "use": "enc",
    "kid": "pubKEM_S", "x": "<pubKEM key material>"
}
]]></artwork>
        <t>This key is the target for the client's HPKE-sealed challenge nonce (<tt>CN1</tt>) in the <tt>facts_challenge</tt> extension. Successful unsealing by the server constitutes proof-of-possession of the attested encapsulation key. Additional appraisal claims are implementation-specific and out of scope for this document.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="idealized-deployment-topology-assumptions">
        <name>Idealized deployment topology assumptions</name>
        <figure anchor="fig-topology">
          <name>Infrastructure Topology</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="624" width="392" viewBox="0 0 392 624" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,592" fill="none" stroke="black"/>
                <path d="M 32,64 L 32,224" fill="none" stroke="black"/>
                <path d="M 48,128 L 48,192" fill="none" stroke="black"/>
                <path d="M 48,448 L 48,576" fill="none" stroke="black"/>
                <path d="M 64,496 L 64,560" fill="none" stroke="black"/>
                <path d="M 72,400 L 72,440" fill="none" stroke="black"/>
                <path d="M 80,288 L 80,336" fill="none" stroke="black"/>
                <path d="M 104,128 L 104,192" fill="none" stroke="black"/>
                <path d="M 112,232 L 112,280" fill="none" stroke="black"/>
                <path d="M 112,368 L 112,432" fill="none" stroke="black"/>
                <path d="M 120,128 L 120,192" fill="none" stroke="black"/>
                <path d="M 120,496 L 120,560" fill="none" stroke="black"/>
                <path d="M 136,496 L 136,560" fill="none" stroke="black"/>
                <path d="M 176,128 L 176,192" fill="none" stroke="black"/>
                <path d="M 192,496 L 192,560" fill="none" stroke="black"/>
                <path d="M 200,64 L 200,224" fill="none" stroke="black"/>
                <path d="M 208,496 L 208,560" fill="none" stroke="black"/>
                <path d="M 224,64 L 224,224" fill="none" stroke="black"/>
                <path d="M 240,128 L 240,192" fill="none" stroke="black"/>
                <path d="M 264,496 L 264,560" fill="none" stroke="black"/>
                <path d="M 296,128 L 296,192" fill="none" stroke="black"/>
                <path d="M 304,232 L 304,280" fill="none" stroke="black"/>
                <path d="M 312,368 L 312,432" fill="none" stroke="black"/>
                <path d="M 320,288 L 320,336" fill="none" stroke="black"/>
                <path d="M 352,448 L 352,576" fill="none" stroke="black"/>
                <path d="M 368,64 L 368,224" fill="none" stroke="black"/>
                <path d="M 384,32 L 384,592" fill="none" stroke="black"/>
                <path d="M 8,32 L 384,32" fill="none" stroke="black"/>
                <path d="M 32,64 L 200,64" fill="none" stroke="black"/>
                <path d="M 224,64 L 368,64" fill="none" stroke="black"/>
                <path d="M 48,128 L 104,128" fill="none" stroke="black"/>
                <path d="M 120,128 L 176,128" fill="none" stroke="black"/>
                <path d="M 240,128 L 296,128" fill="none" stroke="black"/>
                <path d="M 48,192 L 104,192" fill="none" stroke="black"/>
                <path d="M 120,192 L 176,192" fill="none" stroke="black"/>
                <path d="M 240,192 L 296,192" fill="none" stroke="black"/>
                <path d="M 32,224 L 200,224" fill="none" stroke="black"/>
                <path d="M 224,224 L 368,224" fill="none" stroke="black"/>
                <path d="M 80,288 L 320,288" fill="none" stroke="black"/>
                <path d="M 80,336 L 320,336" fill="none" stroke="black"/>
                <path d="M 112,368 L 312,368" fill="none" stroke="black"/>
                <path d="M 72,400 L 104,400" fill="none" stroke="black"/>
                <path d="M 112,432 L 312,432" fill="none" stroke="black"/>
                <path d="M 48,448 L 352,448" fill="none" stroke="black"/>
                <path d="M 64,496 L 120,496" fill="none" stroke="black"/>
                <path d="M 136,496 L 192,496" fill="none" stroke="black"/>
                <path d="M 208,496 L 264,496" fill="none" stroke="black"/>
                <path d="M 64,560 L 120,560" fill="none" stroke="black"/>
                <path d="M 136,560 L 192,560" fill="none" stroke="black"/>
                <path d="M 208,560 L 264,560" fill="none" stroke="black"/>
                <path d="M 48,576 L 352,576" fill="none" stroke="black"/>
                <path d="M 8,592 L 384,592" fill="none" stroke="black"/>
                <path d="M 224,304 L 228,296" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="312,232 300,226.4 300,237.6" fill="black" transform="rotate(270,304,232)"/>
                <polygon class="arrowhead" points="120,232 108,226.4 108,237.6" fill="black" transform="rotate(270,112,232)"/>
                <polygon class="arrowhead" points="80,440 68,434.4 68,445.6" fill="black" transform="rotate(90,72,440)"/>
                <g class="text">
                  <text x="72" y="84">Machine</text>
                  <text x="112" y="84">1</text>
                  <text x="156" y="84">(ID_HW1)</text>
                  <text x="300" y="84">ID_HW2</text>
                  <text x="116" y="100">privIK_1</text>
                  <text x="300" y="100">privIK_2</text>
                  <text x="72" y="148">VM1</text>
                  <text x="144" y="148">VM2</text>
                  <text x="260" y="148">VM</text>
                  <text x="280" y="148">n</text>
                  <text x="328" y="148">...</text>
                  <text x="68" y="164">prIK</text>
                  <text x="140" y="164">prIK</text>
                  <text x="260" y="164">prIK</text>
                  <text x="72" y="180">prKEM</text>
                  <text x="144" y="180">prKEM</text>
                  <text x="264" y="180">prKEM</text>
                  <text x="148" y="260">shared</text>
                  <text x="340" y="260">shared</text>
                  <text x="172" y="308">Manufacturer</text>
                  <text x="240" y="308">CSP</text>
                  <text x="264" y="308">A</text>
                  <text x="196" y="324">privAK_A</text>
                  <text x="196" y="388">Manufacturer/CSP</text>
                  <text x="272" y="388">B</text>
                  <text x="212" y="420">privAK_B</text>
                  <text x="112" y="468">Machine</text>
                  <text x="152" y="468">n</text>
                  <text x="196" y="468">(ID_HWn)</text>
                  <text x="276" y="468">privIK_n</text>
                  <text x="88" y="516">VM1</text>
                  <text x="160" y="516">VM2</text>
                  <text x="228" y="516">VM</text>
                  <text x="248" y="516">n</text>
                  <text x="296" y="516">...</text>
                  <text x="84" y="532">prIK</text>
                  <text x="156" y="532">prIK</text>
                  <text x="228" y="532">prIK</text>
                  <text x="88" y="548">prKEM</text>
                  <text x="160" y="548">prKEM</text>
                  <text x="232" y="548">prKEM</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
 .----------------------------------------------.
 |                                              |
 |  .--------------------.  .-----------------. |
 |  | Machine 1 (ID_HW1) |  |      ID_HW2     | |
 |  |      privIK_1      |  |     privIK_2    | |
 |  |                    |  |                 | |
 |  | +------+ +------+  |  | +------+        | |
 |  | | VM1  | | VM2  |  |  | | VM n |  ...   | |
 |  | |prIK  | |prIK  |  |  | |prIK  |        | |
 |  | |prKEM | |prKEM |  |  | |prKEM |        | |
 |  | +------+ +------+  |  | +------+        | |
 |  |                    |  |                 | |
 |  '---------+----------'  '---------+-------' |
 |            ^                       ^         |
 |            | shared                | shared  |
 |            |                       |         |
 |        .-----------------------------.       |
 |        |     Manufacturer/CSP A      |       |
 |        |          privAK_A           |       |
 |        '-----------------------------'       |
 |                                              |
 |            .------------------------.        |
 |            |  Manufacturer/CSP B    |        |
 |       +----|                        |        |
 |       |    |        privAK_B        |        |
 |       v    '------------------------'        |
 |    .--+----------------------------------.   |
 |    |    Machine n (ID_HWn)  privIK_n     |   |
 |    |                                     |   |
 |    | +------+ +------+ +------+          |   |
 |    | | VM1  | | VM2  | | VM n |  ...     |   |
 |    | |prIK  | |prIK  | |prIK  |          |   |
 |    | |prKEM | |prKEM | |prKEM |          |   |
 |    | +------+ +------+ +------+          |   |
 |    '-------------------------------------'   |
 '----------------------------------------------'
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="threat-model">
        <name>Threat Model</name>
        <t>FACTS is designed to mitigate compromise under adversarial conditions:</t>
        <ul spacing="normal">
          <li>
            <t>The adversary is an active MitM: they can intercept, inject, modify, and replay protocol messages on the network.</t>
          </li>
          <li>
            <t>The distribution channel for AR is untrusted and may serve attacker-controlled content (such as DNS without DNSSEC).</t>
          </li>
          <li>
            <t>Various states of compromise are tested including combinations where privAK is compromised while privIK and privKEM are secured, or when privIK and privKEM are compromised but privAK holds.</t>
          </li>
        </ul>
        <section anchor="proverif-model-work-in-progress">
          <name>ProVerif model (Work in Progress)</name>
          <t>A comprehensive ProVerif model, adapted from the open-source release of the <xref target="ID-Crisis"/> formal analysis of <xref target="I-D.fossati-tls-attestation"/> has been extended to evaluate the security properties of FACTS over TLS 1.3 <xref target="FACTS-ProVerif"/>.</t>
        </section>
      </section>
      <section anchor="key-separation">
        <name>Key Separation</name>
        <t>The attacks demonstrated in <xref target="ID-Crisis"/> arise from using a single key for both TLS authentication and attestation binding, enabling an adversary to relay evidence across sessions. FACTS separates these roles:</t>
        <ul spacing="normal">
          <li>
            <t>The IK signs the TLS transcript (CertificateVerify) and the selfsign binding. Compromise of privIK enables TLS impersonation but does not yield a valid quote.</t>
          </li>
          <li>
            <t>The EK decapsulates challenge nonces and enables <tt>psk_attest</tt> derivation. Compromise of privKEM enables decryption of the quote but does not enable transcript forgery.</t>
          </li>
          <li>
            <t>The AK signs the TEE quote. Compromise requires breaching the hardware security boundary.</t>
          </li>
        </ul>
        <t>An adversary holding privKEM and privIK simultaneously can impersonate the TLS layer but cannot produce a quote with valid rdata for a session they did not participate in, because rdata binds (pubIK, CN1, CN2, pubKEM_C) and CN2 is sealed to the client's ephemeral pubKEM_C which the adversary does not control.</t>
      </section>
      <section anchor="compound-authentication">
        <name>Compound Authentication</name>
        <t>The FACTS ProVerif model <xref target="FACTS-ProVerif"/> indicates compound injective-agreement between the Client and Server Pre-Finish ("Property G-C2") holds even when the private Attestation Key (AK) has been leaked. This suggests that the compound authentication property - both for the TLS session and the attestation evidence - refer to the same endpoint even under privAK compromise.</t>
      </section>
      <section anchor="pre-handshake-identity-binding">
        <name>Pre-Handshake Identity Binding</name>
        <t>The Identity Document distributed via DNS closes the identity/key separation gap identified in <xref target="ID-Crisis"/>. By binding pubKEM and pubIK to the server identity under a CA signature before the handshake begins, the client can verify that the keys used in the handshake correspond to the expected server identity. An adversary presenting keys not bound in a valid Identity Document will fail client verification.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <section anchor="dns-lookup-exposure">
        <name>DNS Lookup Exposure</name>
        <t>Pre-fetching the Identity Document via DNS reveals the client's intent to connect to the target server to any observer with visibility into DNS traffic. This is equivalent to the exposure present in any DNS resolution prior to TLS establishment. Deployments with elevated privacy requirements <bcp14>SHOULD</bcp14> use encrypted DNS (DoH or DoT).</t>
      </section>
      <section anchor="evidence-disclosure">
        <name>Evidence Disclosure</name>
        <t>The TEE quote is encrypted under <tt>psk_attest</tt>, which is derived from the challenge nonces exchanged between the two peers. The quote is therefore not visible to passive network observers. The client obtains the decrypted quote after step [9] and appraises it directly (background-check model per <xref target="RFC9334"/>) or forwards it to a Verifier. In the latter case, the Verifier learns the server's platform measurements and authentication timing.</t>
      </section>
      <section anchor="identity-document-opacity">
        <name>Identity Document Opacity</name>
        <t>The Identity Document carries only public key values and standard JWT metadata. It does not contain platform measurements, hardware identifiers, or personally identifiable information. Distribution via DNS does not create a correlation surface beyond the server's domain name.</t>
      </section>
      <section anchor="conditional-evidence-disclosure">
        <name>Conditional Evidence Disclosure</name>
        <t><xref target="I-D.fossati-seat-expat"/> observes that when the server acts as Attester, it can require client authentication before releasing Evidence, limiting exposure of hardware-level claims to authorized clients. This document adopts that principle within the handshake.</t>
        <t>In the standard FACTS flow, any client that completes the HPKE exchange obtains the server's decrypted TEE Evidence. The <tt>facts_attest_req</tt> extension (<xref target="facts-attest-request-extension"/>) allows the server to withhold its own Evidence and require client attestation first. Server Evidence is subsequently delivered via Exported Authenticators <xref target="I-D.fossati-seat-expat"/> post-handshake.</t>
        <t>Deployments where the server's platform measurements are sensitive <bcp14>SHOULD</bcp14> use <tt>facts_attest_req</tt> for connections from unauthenticated or untrusted clients. The decision to require client-first attestation is a server-local policy choice.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="tls-extensiontype-registry">
        <name>TLS ExtensionType Registry</name>
        <t>IANA is requested to register the following entries in the "TLS ExtensionType Values" registry <xref target="RFC8447"/>:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Extension Name</th>
              <th align="left">TLS 1.3</th>
              <th align="left">DTLS-Only</th>
              <th align="left">Recommended</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">TBD1</td>
              <td align="left">facts_hello</td>
              <td align="left">CH</td>
              <td align="left">N</td>
              <td align="left">Y</td>
            </tr>
            <tr>
              <td align="left">TBD2</td>
              <td align="left">facts_challenge</td>
              <td align="left">CH, EE</td>
              <td align="left">N</td>
              <td align="left">Y</td>
            </tr>
            <tr>
              <td align="left">TBD3</td>
              <td align="left">facts_attestation</td>
              <td align="left">CT</td>
              <td align="left">N</td>
              <td align="left">Y</td>
            </tr>
            <tr>
              <td align="left">TBD4</td>
              <td align="left">facts_attest_req</td>
              <td align="left">CR</td>
              <td align="left">N</td>
              <td align="left">Y</td>
            </tr>
          </tbody>
        </table>
        <t>The <tt>facts_challenge</tt> extension is permitted in both ClientHello (CH) and EncryptedExtensions (EE). Its structure and HPKE mode differ per message as specified in <xref target="facts-challenge-extension"/>. The presence of <tt>facts_challenge</tt> in EncryptedExtensions is conditional on its presence in the corresponding ClientHello, per <xref target="RFC8446"/>.</t>
        <t>The <tt>facts_attestation</tt> extension is permitted only in the Certificate message (CT). It carries an encrypted CMW-wrapped Evidence payload and a self-signed key binding as specified in <xref target="facts-attestation-extension"/>.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9334">
          <front>
            <title>Remote ATtestation procedureS (RATS) Architecture</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="D. Thaler" initials="D." surname="Thaler"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <author fullname="N. Smith" initials="N." surname="Smith"/>
            <author fullname="W. Pan" initials="W." surname="Pan"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>In network protocol exchanges, it is often useful for one end of a communication to know whether the other end is in an intended operating state. This document provides an architectural overview of the entities involved that make such tests possible through the process of generating, conveying, and evaluating evidentiary Claims. It provides a model that is neutral toward processor architectures, the content of Claims, and protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9334"/>
          <seriesInfo name="DOI" value="10.17487/RFC9334"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="I-D.ietf-tls-rfc8446bis">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Independent</organization>
            </author>
            <date day="13" month="September" year="2025"/>
            <abstract>
              <t>   This document specifies version 1.3 of the Transport Layer Security
   (TLS) protocol.  TLS allows client/server applications to communicate
   over the Internet in a way that is designed to prevent eavesdropping,
   tampering, and message forgery.

   This document updates RFCs 5705, 6066, 7627, and 8422 and obsoletes
   RFCs 5077, 5246, 6961, 8422, and 8446.  This document also specifies
   new requirements for TLS 1.2 implementations.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tls-rfc8446bis-14"/>
        </reference>
        <reference anchor="I-D.ietf-rats-msg-wrap">
          <front>
            <title>RATS Conceptual Messages Wrapper (CMW)</title>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer SIT</organization>
            </author>
            <author fullname="Ned Smith" initials="N." surname="Smith">
              <organization>Independent</organization>
            </author>
            <author fullname="Thomas Fossati" initials="T." surname="Fossati">
              <organization>Linaro</organization>
            </author>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
              <organization>University of Applied Sciences Bonn-Rhein-Sieg</organization>
            </author>
            <author fullname="Dionna Glaze" initials="D." surname="Glaze">
              <organization>Google LLC</organization>
            </author>
            <date day="11" month="December" year="2025"/>
            <abstract>
              <t>   The Conceptual Messages introduced by the RATS architecture (RFC
   9334) are protocol-agnostic data units that are conveyed between RATS
   roles during remote attestation procedures.  Conceptual Messages
   describe the meaning and function of such data units within RATS data
   flows without specifying a wire format, encoding, transport
   mechanism, or processing details.  The initial set of Conceptual
   Messages is defined in Section 8 of RFC 9334 and includes Evidence,
   Attestation Results, Endorsements, Reference Values, and Appraisal
   Policies.

   This document introduces the Conceptual Message Wrapper (CMW) that
   provides a common structure to encapsulate these messages.  It
   defines a dedicated CBOR tag, corresponding JSON Web Token (JWT) and
   CBOR Web Token (CWT) claims, and an X.509 extension.

   This allows CMWs to be used in CBOR-based protocols, web APIs using
   JWTs and CWTs, and PKIX artifacts like X.509 certificates.
   Additionally, the draft defines a media type and a CoAP content
   format to transport CMWs over protocols like HTTP, MIME, and CoAP.

   The goal is to improve the interoperability and flexibility of remote
   attestation protocols.  Introducing a shared message format such as
   CMW enables consistent support for different attestation message
   types, evolving message serialization formats without breaking
   compatibility, and avoiding the need to redefine how messages are
   handled within each protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-rats-msg-wrap-23"/>
        </reference>
        <reference anchor="RFC9180">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
        <reference anchor="RFC8439">
          <front>
            <title>ChaCha20 and Poly1305 for IETF Protocols</title>
            <author fullname="Y. Nir" initials="Y." surname="Nir"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This document defines the ChaCha20 stream cipher as well as the use of the Poly1305 authenticator, both as stand-alone algorithms and as a "combined mode", or Authenticated Encryption with Associated Data (AEAD) algorithm.</t>
              <t>RFC 7539, the predecessor of this document, was meant to serve as a stable reference and an implementation guide. It was a product of the Crypto Forum Research Group (CFRG). This document merges the errata filed against RFC 7539 and adds a little text to the Security Considerations section.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8439"/>
          <seriesInfo name="DOI" value="10.17487/RFC8439"/>
        </reference>
        <reference anchor="RFC7517">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
        <reference anchor="RFC7800">
          <front>
            <title>Proof-of-Possession Key Semantics for JSON Web Tokens (JWTs)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="April" year="2016"/>
            <abstract>
              <t>This specification describes how to declare in a JSON Web Token (JWT) that the presenter of the JWT possesses a particular proof-of- possession key and how the recipient can cryptographically confirm proof of possession of the key by the presenter. Being able to prove possession of a key is also sometimes described as the presenter being a holder-of-key.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7800"/>
          <seriesInfo name="DOI" value="10.17487/RFC7800"/>
        </reference>
        <reference anchor="RFC8037">
          <front>
            <title>CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE)</title>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document defines how to use the Diffie-Hellman algorithms "X25519" and "X448" as well as the signature algorithms "Ed25519" and "Ed448" from the IRTF CFRG elliptic curves work in JSON Object Signing and Encryption (JOSE).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8037"/>
          <seriesInfo name="DOI" value="10.17487/RFC8037"/>
        </reference>
        <reference anchor="RFC9711">
          <front>
            <title>The Entity Attestation Token (EAT)</title>
            <author fullname="L. Lundblade" initials="L." surname="Lundblade"/>
            <author fullname="G. Mandyam" initials="G." surname="Mandyam"/>
            <author fullname="J. O'Donoghue" initials="J." surname="O'Donoghue"/>
            <author fullname="C. Wallace" initials="C." surname="Wallace"/>
            <date month="April" year="2025"/>
            <abstract>
              <t>An Entity Attestation Token (EAT) provides an attested claims set that describes the state and characteristics of an entity, a device such as a smartphone, an Internet of Things (IoT) device, network equipment, or such. This claims set is used by a relying party, server, or service to determine the type and degree of trust placed in the entity.</t>
              <t>An EAT is either a CBOR Web Token (CWT) or a JSON Web Token (JWT) with attestation-oriented claims.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9711"/>
          <seriesInfo name="DOI" value="10.17487/RFC9711"/>
        </reference>
        <reference anchor="I-D.ietf-tls-extended-key-update">
          <front>
            <title>Extended Key Update for Transport Layer Security (TLS) 1.3</title>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
              <organization>Siemens</organization>
            </author>
            <author fullname="Michael Tüxen" initials="M." surname="Tüxen">
              <organization>Münster Univ. of Applied Sciences</organization>
            </author>
            <author fullname="Tirumaleswar Reddy.K" initials="T." surname="Reddy.K">
              <organization>Nokia</organization>
            </author>
            <author fullname="Steffen Fries" initials="S." surname="Fries">
              <organization>Siemens</organization>
            </author>
            <author fullname="Yaroslav Rosomakho" initials="Y." surname="Rosomakho">
              <organization>Zscaler</organization>
            </author>
            <date day="18" month="February" year="2026"/>
            <abstract>
              <t>   TLS 1.3 ensures forward secrecy by performing an ephemeral Diffie-
   Hellman key exchange during the initial handshake, protecting past
   communications even if a party's long-term keys (typically a private
   key with a corresponding certificate) are later compromised.  While
   the built-in KeyUpdate mechanism allows application traffic keys to
   be refreshed during a session, it does not incorporate fresh entropy
   from a new key exchange and therefore does not provide post-
   compromise security.  This limitation can pose a security risk in
   long-lived sessions, such as those found in industrial IoT or
   telecommunications environments.

   To address this, this specification defines an extended key update
   mechanism that performs a fresh Diffie-Hellman exchange within an
   active session, thereby ensuring post-compromise security.  By
   forcing attackers to exfiltrate new key material repeatedly, this
   approach mitigates the risks associated with static key compromise.
   Regular renewal of session keys helps contain the impact of such
   compromises.  The extension is applicable to both TLS 1.3 and DTLS
   1.3.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tls-extended-key-update-09"/>
        </reference>
        <reference anchor="RFC8447">
          <front>
            <title>IANA Registry Updates for TLS and DTLS</title>
            <author fullname="J. Salowey" initials="J." surname="Salowey"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document describes a number of changes to TLS and DTLS IANA registries that range from adding notes to the registry all the way to changing the registration policy. These changes were mostly motivated by WG review of the TLS- and DTLS-related registries undertaken as part of the TLS 1.3 development process.</t>
              <t>This document updates the following RFCs: 3749, 5077, 4680, 5246, 5705, 5878, 6520, and 7301.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8447"/>
          <seriesInfo name="DOI" value="10.17487/RFC8447"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9261">
          <front>
            <title>Exported Authenticators in TLS</title>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <date month="July" year="2022"/>
            <abstract>
              <t>This document describes a mechanism that builds on Transport Layer Security (TLS) or Datagram Transport Layer Security (DTLS) and enables peers to provide proof of ownership of an identity, such as an X.509 certificate. This proof can be exported by one peer, transmitted out of band to the other peer, and verified by the receiving peer.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9261"/>
          <seriesInfo name="DOI" value="10.17487/RFC9261"/>
        </reference>
        <reference anchor="RFC9449">
          <front>
            <title>OAuth 2.0 Demonstrating Proof of Possession (DPoP)</title>
            <author fullname="D. Fett" initials="D." surname="Fett"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Waite" initials="D." surname="Waite"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>This document describes a mechanism for sender-constraining OAuth 2.0 tokens via a proof-of-possession mechanism on the application level. This mechanism allows for the detection of replay attacks with access and refresh tokens.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9449"/>
          <seriesInfo name="DOI" value="10.17487/RFC9449"/>
        </reference>
        <reference anchor="RFC7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="RFC8705">
          <front>
            <title>OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes OAuth client authentication and certificate-bound access and refresh tokens using mutual Transport Layer Security (TLS) authentication with X.509 certificates. OAuth clients are provided a mechanism for authentication to the authorization server using mutual TLS, based on either self-signed certificates or public key infrastructure (PKI). OAuth authorization servers are provided a mechanism for binding access tokens to a client's mutual-TLS certificate, and OAuth protected resources are provided a method for ensuring that such an access token presented to it was issued to the client presenting the token.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8705"/>
          <seriesInfo name="DOI" value="10.17487/RFC8705"/>
        </reference>
        <reference anchor="I-D.fossati-tls-attestation">
          <front>
            <title>Using Attestation in Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)</title>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
         </author>
            <author fullname="Yaron Sheffer" initials="Y." surname="Sheffer">
              <organization>Intuit</organization>
            </author>
            <author fullname="Paul Howard" initials="P." surname="Howard">
              <organization>Arm Limited</organization>
            </author>
            <author fullname="Ionuț Mihalcea" initials="I." surname="Mihalcea">
              <organization>Arm Limited</organization>
            </author>
            <author fullname="Yogesh Deshpande" initials="Y." surname="Deshpande">
              <organization>Arm Limited</organization>
            </author>
            <author fullname="Arto Niemi" initials="A." surname="Niemi">
              <organization>Huawei</organization>
            </author>
            <author fullname="Thomas Fossati" initials="T." surname="Fossati">
              <organization>Linaro</organization>
            </author>
            <date day="30" month="April" year="2025"/>
            <abstract>
              <t>   The TLS handshake protocol allows authentication of one or both peers
   using static, long-term credentials.  In some cases, it is also
   desirable to ensure that the peer runtime environment is in a secure
   state.  Such an assurance can be achieved using attestation which is
   a process by which an entity produces evidence about itself that
   another party can use to appraise whether that entity is found in a
   secure state.  This document describes a series of protocol
   extensions to the TLS 1.3 handshake that enables the binding of the
   TLS authentication key to a remote attestation session.  This enables
   an entity capable of producing attestation evidence, such as a
   confidential workload running in a Trusted Execution Environment
   (TEE), or an IoT device that is trying to authenticate itself to a
   network access point, to present a more comprehensive set of security
   metrics to its peer.  These extensions have been designed to allow
   the peers to use any attestation technology, in any remote
   attestation topology, and mutually.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-fossati-tls-attestation-09"/>
        </reference>
        <reference anchor="I-D.fossati-seat-early-attestation">
          <front>
            <title>Using Attestation in Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)</title>
            <author fullname="Yaron Sheffer" initials="Y." surname="Sheffer">
              <organization>Intuit</organization>
            </author>
            <author fullname="Ionuț Mihalcea" initials="I." surname="Mihalcea">
              <organization>Arm Limited</organization>
            </author>
            <author fullname="Yogesh Deshpande" initials="Y." surname="Deshpande">
              <organization>Arm Limited</organization>
            </author>
            <author fullname="Thomas Fossati" initials="T." surname="Fossati">
              <organization>Linaro</organization>
            </author>
            <author fullname="Tirumaleswar Reddy.K" initials="T." surname="Reddy.K">
              <organization>Nokia</organization>
            </author>
            <date day="1" month="March" year="2026"/>
            <abstract>
              <t>   The TLS handshake protocol allows authentication of one or both peers
   using static, long-term credentials.  In some cases, it is also
   desirable to ensure that the peer runtime environment is in a secure
   state.  Such an assurance can be achieved using remote attestation
   which is a process by which an entity produces Evidence about itself
   that another party can use to appraise whether that entity is found
   in a secure state.  This document describes a series of TLS
   extensions that enable the binding of the TLS authentication key to a
   remote attestation session.  This enables an entity capable of
   producing attestation Evidence, such as a confidential workload
   running in a Trusted Execution Environment (TEE), or an IoT device
   that is trying to authenticate itself to a network access point, to
   present a more comprehensive set of security metrics to its peer.
   These extensions have been designed to allow the peers to use any
   attestation technology, in any remote attestation topology, and to
   use them mutually.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-fossati-seat-early-attestation-03"/>
        </reference>
        <reference anchor="I-D.fossati-seat-expat">
          <front>
            <title>Remote Attestation with Exported Authenticators</title>
            <author fullname="Muhammad Usama Sardar" initials="M. U." surname="Sardar">
              <organization>TU Dresden</organization>
            </author>
            <author fullname="Thomas Fossati" initials="T." surname="Fossati">
              <organization>Linaro</organization>
            </author>
            <author fullname="Tirumaleswar Reddy.K" initials="T." surname="Reddy.K">
              <organization>Nokia</organization>
            </author>
            <author fullname="Yaron Sheffer" initials="Y." surname="Sheffer">
              <organization>Intuit</organization>
            </author>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
              <organization>University of Applied Sciences Bonn-Rhein-Sieg</organization>
            </author>
            <author fullname="Ionuț Mihalcea" initials="I." surname="Mihalcea">
              <organization>Arm Limited</organization>
            </author>
            <date day="26" month="February" year="2026"/>
            <abstract>
              <t>   This specification defines a method for two parties in a
   communication interaction to exchange Evidence and Attestation
   Results using exported authenticators, as defined in [RFC9261].
   Additionally, it introduces the cmw_attestation extension, which
   allows attestation credentials to be included directly in the
   Certificate message sent during the Exported Authenticator-based
   post-handshake authentication.  The approach supports both the
   passport and background check models from the RATS architecture while
   ensuring that attestation remains bound to the underlying
   communication channel.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-fossati-seat-expat-02"/>
        </reference>
        <reference anchor="I-D.ietf-lamps-csr-attestation">
          <front>
            <title>Use of Remote Attestation with Certification Signing Requests</title>
            <author fullname="Mike Ounsworth" initials="M." surname="Ounsworth">
              <organization>Cryptic Forest Software</organization>
            </author>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
              <organization>Siemens</organization>
            </author>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer SIT</organization>
            </author>
            <author fullname="Monty Wiseman" initials="M." surname="Wiseman">
         </author>
            <author fullname="Ned Smith" initials="N." surname="Smith">
         </author>
            <date day="11" month="February" year="2026"/>
            <abstract>
              <t>   Certification Authorities (CAs) issuing certificates to Public Key
   Infrastructure (PKI) end entities may require a certificate signing
   request (CSR) to include additional verifiable information to confirm
   policy compliance.  For example, a CA may require an end entity to
   demonstrate that the private key corresponding to a CSR's public key
   is secured by a hardware security module (HSM), is not exportable,
   etc.  The process of generating, transmitting, and verifying
   additional information required by the CA is called remote
   attestation.  While work is currently underway to standardize various
   aspects of remote attestation, a variety of proprietary mechanisms
   have been in use for years, particularly regarding protection of
   private keys.

   This specification defines an ASN.1 structure for remote attestation
   that can accommodate proprietary and standardized attestation
   mechanisms, as well as an attribute and an extension to carry the
   structure in PKCS#10 and Certificate Request Message Format (CRMF)
   messages, respectively.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-lamps-csr-attestation-22"/>
        </reference>
        <reference anchor="ID-Crisis" target="https://doi.org/10.1145/3779208.3785387">
          <front>
            <title>Identity Crisis in Confidential Computing: Formal Analysis of Attested TLS</title>
            <author initials="M. U." surname="Sardar">
              <organization/>
            </author>
            <author initials="M." surname="Moustafa">
              <organization/>
            </author>
            <author initials="T." surname="Aura">
              <organization/>
            </author>
            <date year="2026" month="February"/>
          </front>
        </reference>
        <reference anchor="RelayAttacks" target="https://mailarchive.ietf.org/arch/msg/seat/x3eQxFjQFJLceae6l4_NgXnmsDY/">
          <front>
            <title>Relay Attacks in Intra-handshake Attestation for Confidential Agentic AI Systems</title>
            <author initials="M. U." surname="Sardar">
              <organization/>
            </author>
            <author initials="V." surname="Dubeyko">
              <organization/>
            </author>
            <author initials="J." surname="Jacquet">
              <organization/>
            </author>
            <date year="2026" month="January"/>
          </front>
        </reference>
        <reference anchor="FACTS-ProVerif" target="https://github.com/nathanaelritz/formal-spec-id-crisis">
          <front>
            <title>FACTS: ProVerif Model</title>
            <author initials="N." surname="Ritz">
              <organization/>
            </author>
            <date year="2026" month="March"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 960?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Sardar et al. for the open-source release of the Identity Crisis model and for the detailed relay attack disclosures to the community. Thank you to the authors and contributors who have worked tirelessly on the foundational body of work for attested TLS, and for their insights on the IETF mailing lists that helped shape this approach. A special additional thanks to Usama Sardar for sharing valuable time for discussions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
