<?xml version='1.0' encoding='UTF-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" ipr="trust200902" category="info" docName="draft-okutomi-session-bound-agent-identity-01" submissionType="IETF">
  <front>
    <title abbrev="Session-Bound Agent Identity">A Profile for Session-Bound Agent Identity</title>
    <seriesInfo name="Internet-Draft" value="draft-okutomi-session-bound-agent-identity-01"/>
    <author fullname="Akira Okutomi" initials="A." surname="Okutomi">
      <organization>Individual</organization>
      <address>
        <email>okutomi+ietf@pm.me</email>
      </address>
    </author>
    <date year="2026" month="June" day="24"/>
    <area>Security</area>
    <workgroup>Individual Submission</workgroup>
    <keyword>agent identity</keyword>
    <keyword>TLS exporter</keyword>
    <keyword>proof of possession</keyword>
    <keyword>remote attestation</keyword>
    <keyword>workload identity</keyword>
    <abstract>
      <t>This document defines a verifier-side profile for accepting agent identity. A verifier accepts an Agent only when an authority statement, holder-of-key proof, accepted TLS session, freshness state, any required attestation result, and verifier-local policy all describe the same intended interaction.</t>
      <t>The profile does not define a TLS extension, attestation evidence format, identity provider, wallet format, registry, control plane, gateway, or application protocol. It composes existing mechanisms and defines the fail-closed acceptance rule between them.</t>
    </abstract>
  </front>
  <middle>
    <section>
      <name>Introduction</name>
      <t>Automated agents often combine transport authentication, signed authorization material, platform attestation, and local policy. Each component can verify successfully while the composition is still wrong. For example, a valid grant can be replayed on another TLS session, a valid endpoint can be used for the wrong task, or a valid platform can be accepted for the wrong agent.</t>
      <t>This document defines a session-bound agent identity profile. The verifier accepts a peer only when the authenticated identity, session binding, freshness state, attestation state when required, and local policy describe the same intended session, platform, service, agent, task, and authority boundary.</t>
      <t>The profile is an application-profile acceptance gate. It does not change TLS <xref target="RFC8446"/>, exported authenticators <xref target="RFC9261"/>, remote attestation roles <xref target="RFC9334"/>, JWT/JWS, CWT/COSE, OAuth, or HTTP. It defines the composition rules needed to fail closed across those mechanisms.</t>
      <t>This document does not define a mandatory Agent control plane, rendezvous service, registry, gateway, transparency log, action log, media relay, or policy distribution service. Deployments can use such components, but they are not required by this profile.</t>
    </section>
    <section>
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/>
        <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      <dl spacing="normal">
        <dt>Agent</dt>
        <dd>
          <t>The workload, process, service component, or automated actor whose identity is being accepted by the verifier.</t>
        </dd>
        <dt>Principal</dt>
        <dd>
          <t>A person or organization on whose behalf an Agent acts.</t>
        </dd>
        <dt>Verifier</dt>
        <dd>
          <t>The party that authenticates the grant, checks the session binding, evaluates freshness and replay state, and compares the result with local policy before returning an accepted identity to the application.</t>
        </dd>
        <dt>Policy authority</dt>
        <dd>
          <t>A locally trusted issuer of authority statements. Some deployments call this role a Manager.</t>
        </dd>
        <dt>Grant material</dt>
        <dd>
          <t>A signed or MACed authority statement issued by a policy authority. It authorizes upper-layer identity, task, and authorization values. It does not prove that the authorized Agent is present on the current TLS session.</t>
        </dd>
        <dt>Session proof</dt>
        <dd>
          <t>A holder-of-key proof that binds one verified authority grant to one accepted TLS or exported-authenticator session. It proves possession and session binding. It does not authorize service, tenant, task, scope, resource, or capability values.</t>
        </dd>
        <dt>Expected value</dt>
        <dd>
          <t>A verifier-local policy input.</t>
        </dd>
        <dt>Observed value</dt>
        <dd>
          <t>A value extracted from authenticated grants, session-bound statements, attestation results, trusted manifests, or locally derived request state. An observed value does not become an expected value without a trusted local policy decision.</t>
        </dd>
        <dt>Wrong-context acceptance</dt>
        <dd>
          <t>Accepting cryptographically valid material for a different service, tenant, Agent, task, delegation, or authority boundary than the verifier intended. This document uses "context diversion" as a short failure description; it is not a new wire mechanism.</t>
        </dd>
        <dt>Intermediary</dt>
        <dd>
          <t>A gateway, relay, proxy, broker, service on the communication path, or component that terminates transport security for either side.</t>
        </dd>
        <dt>Wallet</dt>
        <dd>
          <t>A holder-side presentation component; this profile does not define wallet behavior or make wallets trust roots.</t>
        </dd>
        <dt>Acceptance decision</dt>
        <dd>
          <t>Returning a peer identity or authorization result to the application as profile-authenticated. For one-shot bindings, replay state is committed before this decision is returned.</t>
        </dd>
      </dl>
    </section>
    <section>
      <name>Scope and Non-Goals</name>
      <t>This profile defines verifier behavior before an application treats an accepted TLS peer as the intended platform, service, Agent, task, or authorized actor. It binds three classes of facts:</t>
      <ul spacing="normal">
        <li>
          <t>accepted TLS and post-handshake attestation facts;</t>
        </li>
        <li>
          <t>authenticated identity and authorization material;</t>
        </li>
        <li>
          <t>verifier-local expected policy.</t>
        </li>
      </ul>
      <t>The profile does not select an identity provider, define a new wire-token format, change attestation evidence, change TLS, define wallet behavior, define discovery or rendezvous, or provide a complete authorization framework.</t>
      <t>A requirement belongs in this profile when omitting it could lead to accepting the wrong live session, wrong service or tenant, wrong Agent, wrong task, stale or replayed state, peer-selected metadata as policy, or a security result reused outside the request for which it was produced.</t>
    </section>
    <section>
      <name>Internet Applicability and Deployment Assumptions</name>
      <t>This profile is intended to be usable in both open Internet and enterprise deployments. Closed-world provisioning is one deployment model, not a protocol requirement.</t>
      <t>A prior bilateral relationship between the Agent operator and the Verifier is not required. A Verifier does require a local trust path to the issuer, attestation result, trust framework, or other authority used to evaluate the presented material. If no acceptable trust path exists, acceptance fails closed.</t>
      <t>This profile does not require a single globally trusted authority, mandatory registry, rendezvous service, gateway, online authority, transparency log, or control plane. Deployments MAY use those components, but they are deployment choices and are not required for protocol interoperability.</t>
      <t>Intermediaries are not trusted by default. A gateway or relay that terminates transport security is a separate relying party and sees only the claims and payloads disclosed to it. This profile does not require intermediaries to observe, approve, log, or gate Agent actions.</t>
      <t>When an Agent acts on behalf of a Principal, deployment profiles SHOULD support audience-scoped disclosure, short-lived grants, selective disclosure or reference tokens where available, and Principal-selected authorities and disclosure modes where practical. Claims required for security should be distinguished from claims requested for application convenience.</t>
      <t>These assumptions are intended to preserve strong cryptographic protection, avoid standardizing wiretapping or pervasive monitoring functions, keep privacy analysis explicit, favor end-user interests, and avoid unnecessary centralization of Internet functions <xref target="RFC1984"/>
        <xref target="RFC2804"/>
        <xref target="RFC7258"/>
        <xref target="RFC6973"/>
        <xref target="RFC8890"/>
        <xref target="RFC9518"/>.</t>
    </section>
    <section>
      <name>Conformance</name>
      <t>This document defines conformance for Direct-Agent mode. A conforming implementation completes all grant verification, holder-of-key verification, session-binding verification, required attestation checks, freshness checks, replay checks, and local-policy comparisons before returning a profile-authenticated identity or authorization result to the application.</t>
      <t>A conforming implementation MUST fail closed. It MUST NOT report a profile-authenticated identity from only a verified authority grant, only a session proof, only a TLS endpoint identity, only an attestation result, or only peer-supplied metadata.</t>
    </section>
    <section>
      <name>Acceptance Model</name>
      <t>The labels D0 through D6 are acceptance dimensions used for policy separation and diagnostics. They are not OSI layers, encapsulation layers, wire-format layers, or trust hierarchy levels. The numbering is only a stable diagnostic order. It does not imply that D6 is above D5 or that every deployment evaluates all dimensions.</t>
      <table>
        <thead>
          <tr>
            <th>Dimension</th>
            <th>Verification target</th>
            <th>Main failure class</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>D0</td>
            <td>Live TLS or exported-authenticator session</td>
            <td>MITM or session confusion</td>
          </tr>
          <tr>
            <td>D1</td>
            <td>Attested platform validity, when required</td>
            <td>Fake, malformed, stale, or untrusted evidence</td>
          </tr>
          <tr>
            <td>D2</td>
            <td>Attestation or authenticator-to-session binding</td>
            <td>Relay, replay, or borrowed evidence</td>
          </tr>
          <tr>
            <td>D3</td>
            <td>Service, tenant, deployment, or environment</td>
            <td>Wrong service or tenant; context diversion</td>
          </tr>
          <tr>
            <td>D4</td>
            <td>Workload, process, or Agent</td>
            <td>Same-host wrong-Agent confusion</td>
          </tr>
          <tr>
            <td>D5</td>
            <td>Task, thread, context, or delegation</td>
            <td>Wrong task or delegation; context diversion</td>
          </tr>
          <tr>
            <td>D6</td>
            <td>Authorization or capability policy</td>
            <td>Confused deputy or privilege escalation</td>
          </tr>
        </tbody>
      </table>
      <t>D0 through D2 are authentication and binding dimensions. D3 through D6 are verifier-local policy dimensions. Peer-provided metadata can be observed input; it is not expected policy.</t>
    </section>
    <section>
      <name>Threat Model</name>
      <t>The attacker can observe, replay, reorder, relay, and substitute network or application messages. The attacker can supply malicious peer metadata and can run another Agent on the same host or in the same deployment environment.</t>
      <t>The profile assumes that TLS 1.3, exported-authenticator validation, and evidence appraisal are implemented correctly by the underlying mechanisms. It defines what must be bound to those facts before an application accepts the peer as the intended actor.</t>
      <t>Out of scope are a fully compromised verifier process, a malicious trusted policy authority, compromise of all local secret storage, denial of service, and side channels outside the identity-binding path.</t>
      <t>The main threats are relay, replay, token substitution, stale key use, same-host wrong- Agent confusion, peer-metadata injection, context diversion, confused deputy behavior, cache confusion, and gateway route confusion.</t>
    </section>
    <section>
      <name>Authority and Key Separation</name>
      <t>The profile keeps three key roles separate.</t>
      <table>
        <thead>
          <tr>
            <th>Key role</th>
            <th>Purpose</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>TLS endpoint key</td>
            <td>Proves possession for the accepted TLS or exported-authenticator endpoint.</td>
          </tr>
          <tr>
            <td>Agent binding key</td>
            <td>Signs the session proof.</td>
          </tr>
          <tr>
            <td>Policy-authority key</td>
            <td>Signs authority grants.</td>
          </tr>
        </tbody>
      </table>
      <t>These keys can be related by deployment policy, but they are not interchangeable by default. Policy-authority signing keys MUST NOT be accepted as Agent confirmation keys. Agent confirmation keys MUST NOT be accepted as policy-authority signing keys. Endpoint keys are valid for session binding only when the verified grant or local policy explicitly authorizes that use and the endpoint credential or local endpoint-key lifetime remains valid.</t>
      <t>The protected-header <tt>kid</tt> is only a key-selection hint. Acceptance also depends on issuer, audience, algorithm allow-list, key type, key use, key status, profile version, token type, time validity, revocation state, and local policy. The <tt>none</tt> algorithm is forbidden.</t>
    </section>
    <section>
      <name>Encoding Profiles</name>
      <t>This core profile does not require HTTP, OAuth <xref target="RFC6749"/>, a specific JWT <xref target="RFC7519"/> claim set, JWS <xref target="RFC7515"/> serialization, or a specific CWT label set. An encoding profile fixes the exact wire representation, including token type, claim names or labels, protected-header rules, canonicalization, <tt>grant_hash</tt> input bytes, request-context binding, and diagnostic format.</t>
      <t>OAuth deployments can use the JWT access-token profile <xref target="RFC9068"/>, token revocation and introspection <xref target="RFC7009"/>
        <xref target="RFC7662"/>, mutual-TLS certificate-bound tokens <xref target="RFC8705"/>, resource indicators <xref target="RFC8707"/>, and rich authorization requests <xref target="RFC9396"/> where they fit. Sender-constrained HTTP/OAuth proofs can use DPoP <xref target="RFC9449"/>, but DPoP alone does not provide this profile's TLS-exporter or attestation-to-session binding.</t>
      <t>HTTP bindings can use HTTP Message Signatures <xref target="RFC9421"/>, Digest Fields <xref target="RFC9530"/>, Structured Fields <xref target="RFC9651"/>, and Problem Details <xref target="RFC9457"/> instead of defining new HTTP signing, digest, header, or error formats. Tokenized attestation claims can use EAT <xref target="RFC9711"/> within the RATS model.</t>
    </section>
    <section>
      <name>Relationship to Existing Mechanisms</name>
      <t>Encoding profiles should reuse existing Internet mechanisms rather than define parallel wire formats. In OAuth deployments, authority grants can be OAuth JWT access tokens <xref target="RFC9068"/>, token status and early invalidation can use token revocation or introspection <xref target="RFC7009"/> <xref target="RFC7662"/>, and sender constraining can use mutual-TLS certificate-bound tokens or DPoP when those models fit <xref target="RFC8705"/> <xref target="RFC9449"/>.</t>
      <t>Resource selection and fine-grained authorization can use Resource Indicators and Rich Authorization Requests <xref target="RFC8707"/> <xref target="RFC9396"/>. HTTP profiles can use HTTP Message Signatures, Digest Fields, Structured Field Values, and Problem Details instead of defining new HTTP-specific syntax or error formats <xref target="RFC9421"/> <xref target="RFC9530"/> <xref target="RFC9651"/> <xref target="RFC9457"/>. Attestation token profiles can use EAT with the RATS roles already referenced by this document <xref target="RFC9711"/> <xref target="RFC9334"/>.</t>
      <t>These mechanisms do not by themselves provide this document's fail-closed cross-mechanism acceptance rule. This profile only specifies when the verified grant, session proof, accepted TLS session, freshness state, required attestation result, and verifier-local policy are accepted as the same intended interaction.</t>
    </section>
    <section>
      <name>Grant and Authority Material</name>
      <t>An authority grant authorizes application semantics. It is signed or MACed by a policy authority and identifies the Agent confirmation key, usually through a confirmation-key claim such as <tt>cnf.kid</tt> for JWT <xref target="RFC7800"/> or the corresponding CWT confirmation method <xref target="RFC8747"/>. This profile does not define a new authority grant token format.</t>
      <t>A grant carries the deployment-specific equivalent of profile type, profile version, issuer, subject, audience, grant identifier, issued-at time, expiration time, and confirmation key. When policy requires it, the grant also carries D3 through D6 fields such as service, tenant, deployment, workload, Agent, task, delegation, canonical intent or capability references, scopes, resources, and authorization details.</t>
      <t>The Agent is not the authority for those values. They are accepted only after grant verification, session binding, freshness checks, replay checks, and local policy comparison.</t>
      <t>Multi-audience grants are rejected unless local policy explicitly allows the exact audience set and the resulting authority boundary.</t>
    </section>
    <section>
      <name>Session Proof Material</name>
      <t>A session proof proves that the holder of the confirmation key bound the verified grant to the accepted TLS or exported-authenticator session. It contains at least the abstract profile fields below. An encoding profile fixes the exact JWT claim names, CWT claim labels, COSE/JWS protected-header requirements, canonical encoding rules, and collision-avoidance rules used on the wire.</t>
      <ul spacing="normal">
        <li>
          <t>profile type and profile version;</t>
        </li>
        <li>
          <t><tt>aud</tt>, <tt>jti</tt> or <tt>cti</tt>, <tt>iat</tt>, and <tt>exp</tt>;</t>
        </li>
        <li>
          <t><tt>grant_hash</tt> over the exact verified grant bytes;</t>
        </li>
        <li>
          <t><tt>leaf_public_key_sha256</tt>;</t>
        </li>
        <li>
          <t><tt>tls_exporter_sha256</tt>;</t>
        </li>
        <li>
          <t><tt>request_context_sha256</tt>;</t>
        </li>
        <li>
          <t><tt>nonce</tt>;</t>
        </li>
        <li>
          <t><tt>attestation_binder_sha256</tt> when local policy requires attestation or when accepted attestation-to-session evidence is used.</t>
        </li>
      </ul>
      <t>For the initial compact JWS and CWT/COSE encodings, <tt>grant_hash</tt> is computed over the exact verified grant bytes:</t>
      <sourcecode>grant_hash = SHA-256("sbaip.identity-grant.jwt.v1" || NUL ||
                     exact-compact-jws-grant-bytes)
grant_hash = SHA-256("sbaip.identity-grant.cwt.v1" || NUL ||
                     exact-cose-sign1-or-mac0-grant-bytes)</sourcecode>
      <t><tt>exact-compact-jws-grant-bytes</tt> is the exact ASCII byte sequence of the compact JWS as received and successfully verified, including protected header, payload, and signature segments. The initial JWT encoding does not define <tt>grant_hash</tt> for JWS JSON Serialization; a future encoding profile that uses it MUST define the exact hash input.</t>
      <t><tt>exact-cose-sign1-or-mac0-grant-bytes</tt> is the exact byte sequence of the signed or MACed COSE object as received and successfully verified. A verifier MUST NOT compute <tt>grant_hash</tt> by parsing claims and reserializing JSON, CBOR, or COSE in the acceptance path. Deterministic CBOR/COSE is acceptable only when the encoding profile normatively fixes the deterministic encoding rules <xref target="RFC8392"/>
        <xref target="RFC8949"/>
        <xref target="RFC9052"/>.</t>
      <t>Domain-separation strings beginning with <tt>sbaip</tt> or <tt>SBAIP</tt> are fixed constants for this profile version. They are not external registry names.</t>
      <t>The session proof does not authorize service, tenant, task, scope, resource, or capability values. Those values come from the verified grant and local policy.</t>
    </section>
    <section>
      <name>Direct Session Binding Construction</name>
      <t>This section fixes the Direct-Agent D2 construction. A verifier MUST NOT replace these inputs with peer-selected labels, inferred context, display names, or reserialized semantic metadata.</t>
      <t>Inputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>tls_connection</tt>: the accepted TLS 1.3 connection;</t>
        </li>
        <li>
          <t><tt>exporter_label</tt>: an application- or deployment-profile-selected TLS exporter label. This document does not define that label;</t>
        </li>
        <li>
          <t><tt>leaf_spki</tt>: DER SubjectPublicKeyInfo of the accepted endpoint public key <xref target="RFC5280"/>;</t>
        </li>
        <li>
          <t><tt>role</tt>, <tt>protocol_id</tt>, <tt>aud</tt>, <tt>grant_hash</tt>, <tt>task_context</tt>, and <tt>verifier_nonce_or_attempt_id</tt> from verifier-local state.</t>
        </li>
      </ul>
      <t>The exporter label is selected by the application or deployment profile, not by the peer. A verifier MUST NOT accept a peer-selected exporter label. Local experiments can use private-use labels, such as labels beginning with <tt>EXPERIMENTAL</tt>, as described by <xref target="RFC5705"/>. A generally applicable label can be defined later by another specification and registered according to the TLS Exporter Labels registry procedures updated by <xref target="RFC9847"/>.</t>
      <t>The context bytes are <tt>sbaip_context_v1</tt>:</t>
      <sourcecode>field(name, value) =
    u16be(len(name)) || name || u32be(len(value)) || value

context = "SBAIP-CONTEXT-v1" || NUL ||
          field("role", role) ||
          field("protocol_id", protocol_id) ||
          field("aud", aud) ||
          field("grant_hash", raw_32_byte_grant_hash) ||
          field("task_context", task_context) ||
          field("verifier_nonce_or_attempt_id",
                verifier_nonce_or_attempt_id)</sourcecode>
      <t>Field names are ASCII. Lengths are unsigned big-endian integers. The field sequence and field names are fixed. <tt>grant_hash</tt> is the raw 32-byte digest, not a hex string. <tt>task_context</tt> is itself length-delimited when it contains multiple values.</t>
      <t>Construction:</t>
      <sourcecode>EKM = TLS-Exporter(tls_connection,
                   label = exporter_label,
                   context = context,
                   length = 32)

attestation_binding_input =
    "SBAIP-ATTESTATION-BINDING-v1" || NUL ||
    field("leaf_spki", leaf_spki) ||
    field("ekm", EKM)

leaf_public_key_sha256     = SHA-256(leaf_spki)
tls_exporter_sha256        = SHA-256(EKM)
request_context_sha256     = SHA-256(context)
attestation_binder_sha256  = SHA-256(attestation_binding_input)</sourcecode>
      <t>The session proof carries the SHA-256 values <xref target="RFC6234"/>. A common serialization is lowercase hexadecimal without a <tt>sha256:</tt> prefix, but the encoding profile fixes the exact representation.</t>
      <t><tt>leaf_public_key_sha256</tt> confirms the endpoint key, but it is not session unique. The primary session binding is the TLS exporter under the accepted profile context, plus the grant hash, audience, nonce, attestation binder when present, and replay state. This construction uses the TLS exporter interface <xref target="RFC8446"/> to provide the channel-binding property described by <xref target="RFC5056"/> in a profile-specific form; it is not the bare <tt>tls-exporter</tt> channel-binding value defined by <xref target="RFC9266"/>.</t>
      <t>Attestation evidence or attestation results must be appraised against the same <tt>attestation_binding_input</tt>. For evidence formats that expose report data or nonce, the attestation adapter derives profile-specific values such as:</t>
      <sourcecode>report_data    = SHA-512(attestation_binding_input)
evidence_nonce = SHA-256("SBAIP-EVIDENCE-NONCE-v1" || NUL || EKM)</sourcecode>
      <t>If local policy requires attestation, absence of an accepted attestation result, attestation-to-session evidence, or <tt>attestation_binder_sha256</tt> is an authentication failure. A verifier MUST NOT silently downgrade an attestation-required interaction to a channel-binding-only interaction.</t>
      <t>A verifier compares <tt>tls_exporter_sha256</tt> and <tt>request_context_sha256</tt> with its own accepted values. Missing or mismatched mandatory fields fail closed.</t>
    </section>
    <section>
      <name>Verification Procedure</name>
      <t>Acceptance has an authentication phase, a policy phase, and a replay-commit step.</t>
      <t>Authentication phase:</t>
      <ol spacing="normal">
        <li>
          <t>Verify the authority grant under a trusted policy-authority key.</t>
        </li>
        <li>
          <t>Check issuer, audience, profile guard, algorithm, key status, <tt>iat</tt>, <tt>exp</tt>, grant ID, and required authorization fields.</t>
        </li>
        <li>
          <t>Verify the session proof under the Agent confirmation key or an explicitly authorized endpoint key.</t>
        </li>
        <li>
          <t>Check that the binding signer is authorized by the verified grant or by local policy.</t>
        </li>
        <li>
          <t>Check endpoint credential or endpoint-key validity under local TLS, PKIX, and key-status policy.</t>
        </li>
        <li>
          <t>Recompute <tt>grant_hash</tt> over the exact verified grant bytes.</t>
        </li>
        <li>
          <t>Recompute the accepted context and exporter-derived values.</t>
        </li>
        <li>
          <t>Compare <tt>aud</tt>, endpoint-key hash, TLS exporter hash, request-context hash, attestation binder when required or present, and nonce.</t>
        </li>
        <li>
          <t>Build an internal observed assertion only from verified material.</t>
        </li>
      </ol>
      <t>Policy phase:</t>
      <ol spacing="normal">
        <li>
          <t>Load verifier-local expected values for required dimensions.</t>
        </li>
        <li>
          <t>Reject missing, ambiguous, non-canonical, or peer-supplied expected values.</t>
        </li>
        <li>
          <t>Compare each observed D3 through D6 value with local expected policy.</t>
        </li>
        <li>
          <t>Enforce D6 set semantics. The effective authorization is the intersection of capabilities authorized by the verified grant, capabilities allowed by verifier-local policy, and capabilities requested for the current task context. A requested capability absent from any of those sets is rejected. Surplus observed capabilities are ignored or rejected according to local policy, but they MUST NOT expand the effective authorization.</t>
        </li>
      </ol>
      <t>Replay commit:</t>
      <ul spacing="normal">
        <li>
          <t>before returning the acceptance decision, atomically insert the replay key with an expiry;</t>
        </li>
        <li>
          <t>if the insert fails because the key already exists, reject;</t>
        </li>
        <li>
          <t>failed authentication or policy attempts do not consume a one-shot value unless deployment policy deliberately chooses that anti-probing behavior.</t>
        </li>
      </ul>
      <t>Neither an authority grant alone nor a session proof alone is enough. Sender-constraining proves possession and freshness; it does not authorize surplus scopes, resources, capabilities, or authorization details.</t>
    </section>
    <section>
      <name>Freshness, Replay, Rotation, and Revocation</name>
      <t>The accepted assertion expiry is the earliest applicable expiry among:</t>
      <sourcecode>grant exp,
session proof exp,
TLS endpoint credential or endpoint-key lifetime,
attestation-result exp,
evidence challenge lifetime,
attestation collateral or TCB lifetime,
endpoint credential validity,
replay-cache TTL,
local policy maximum TTL</sourcecode>
      <t>A missing required freshness policy value fails closed. Evidence without a trusted timestamp is acceptable only for the current challenge and current authentication attempt.</t>
      <t>TLS resumption creates a new accepted TLS connection for this profile. A resumed connection MUST NOT reuse a session proof or replay-cache entry from the original connection. Profile-authenticated identity MUST NOT be returned for TLS 0-RTT data.</t>
      <t>When multiple tasks share one TLS connection, each accepted task binding MUST include a task-specific <tt>task_context</tt> and <tt>verifier_nonce_or_attempt_id</tt>. Reusing the same context and nonce across tasks fails closed.</t>
      <t>Replay protection is keyed at least over:</t>
      <sourcecode>grant_hash || aud || tls_exporter_sha256 ||
request_context_sha256 || nonce</sourcecode>
      <t>When available, the key also includes the binding statement ID, task-binding value, evidence nonce, verifier challenge, or attestation-result identifier.</t>
      <t>Key lookup and key caches MUST be scoped by the equivalent of:</t>
      <sourcecode>profile_version || token_type || issuer || audience ||
key_use || alg || kty || kid || key_status || public_key_thumbprint</sourcecode>
      <t><tt>kid</tt> is never a global key name. Unknown, revoked, retired, stale, wrong-use, or ambiguous keys fail closed. Deployments that need early invalidation must support grant revocation, policy-authority-key revocation, and Agent-binding-key revocation separately.</t>
    </section>
    <section>
      <name>Canonical Policy Values</name>
      <t>Decision-sensitive semantic values must be canonical before acceptance. Common examples are <tt>ontology_id</tt>, <tt>intent_ref</tt>, and <tt>capability_ref</tt>.</t>
      <t>Receivers MUST NOT repair peer-provided aliases, display labels, natural language phrases, case variants, URI variants, or model interpretations during the final acceptance path. Alias resolution belongs to the policy authority, trusted registry, or local policy engine before issuance or comparison.</t>
      <t>An alias is acceptable only when it resolves to exactly one canonical reference under a pinned registry namespace and version. Missing, ambiguous, deprecated, or unsupported registry data fails closed.</t>
    </section>
    <section>
      <name>Deployment Topologies</name>
      <section>
        <name>Direct-Agent Mode</name>
        <t>In Direct-Agent mode, the Agent terminates TLS and signs the session proof with the confirmation key named by the verified authority grant, or with an endpoint key explicitly authorized by the grant or local policy.</t>
      </section>
      <section>
        <name>Gateway-Routed Mode</name>
        <t>Gateway-routed mode is a separate profile and is not the default Internet deployment model. Gateway session binding proves the gateway endpoint, not the final Agent process. A relying party accepts the final Agent only after a route assertion passes local route policy, freshness, replay, and any required final-Agent holder-of-key check. A gateway, route service, transparency log, or action log is a deployment choice, not a protocol requirement.</t>
        <t>The route assertion binds the gateway identity, relying-party audience, route, tenant or authority partition, target Agent, request context, nonce, and expiry. Missing, stale, replayed, wrong-route, wrong-tenant, wrong-task, or wrong-Agent assertions fail closed. Gateway deployments that exchange tokens can use OAuth 2.0 Token Exchange <xref target="RFC8693"/> when applicable.</t>
      </section>
    </section>
    <section>
      <name>Privacy, Caching, and Diagnostics</name>
      <t>Identity-binding data can create correlation. Deployments SHOULD prefer audience-scoped or pairwise identifiers, short lifetimes, selective disclosure, reference tokens, and minimized logs. Full grants, binding statements, key fingerprints, attestation evidence, tenant IDs, task IDs, and capability references should not be logged unless needed for security audit. Intermediaries SHOULD receive only the claims and payloads needed for their role.</t>
      <t>Response caching and security-state caching are different. Verified grants, session proofs, attestation evidence, authorization decisions, and verification results MUST NOT be cached as acceptance evidence for a later session or request. The default for profile-sensitive HTTP responses is <tt>no-store</tt>
        <xref target="RFC9111"/>. <tt>Vary</tt> is not enough when the decision depends on non-header security state.</t>
      <t>Diagnostics should preserve the acceptance dimension, field, and error class, but should not echo raw peer values. Implementations should reject invalid UTF-8, CRLF, control characters, and HTML delimiter characters in profile fields unless the field profile explicitly permits and canonicalizes them.</t>
    </section>
    <section>
      <name>Security Considerations</name>
      <t>The security of this profile depends on the verifier applying all acceptance checks before returning a profile-authenticated identity to the application. Partial verification is not enough.</t>
      <t>Implementations need fail-closed parsing for token type, algorithm, key, audience, duplicate claim names, malformed base64url, unsupported nesting, unexpected <tt>crit</tt>, and <tt>typ</tt>/<tt>cty</tt> ambiguity <xref target="RFC8725"/>. A parser that silently accepts duplicate JSON member names or unsupported critical headers is not suitable for this profile.</t>
      <t>Before acceptance, a conforming implementation verifies at least: separated authority grant and session proof authorities; exact verified grant bytes in <tt>grant_hash</tt>; the locally selected exporter label and exact <tt>sbaip_context_v1</tt> bytes; endpoint key, exporter, context, nonce, and required attestation binder values; TLS endpoint credential validity; atomic replay commit; verifier-local D3 through D6 policy; canonical semantic references; and the earliest applicable expiry. Gateway mode, when used, also authenticates the gateway endpoint and gateway-to-Agent route separately.</t>
      <t>Implementations should evaluate relay, borrowed attestation, token substitution, multiple tasks on one TLS connection, HTTP/2 or gRPC connection reuse, TLS resumption, 0-RTT behavior, distributed replay-cache races, gateway route confusion, malformed JWT/CWT/COSE inputs, duplicate JSON members, Unicode edge cases, and the invariant that a grant is accepted only with the intended binding, session, and local policy.</t>
      <t>Deployment profiles should evaluate mandatory intermediaries or registries, what is exposed to them, gatekeeping or monitoring risk, and whether Principals can choose trusted authorities and disclosed claims.</t>
    </section>
    <section>
      <name>IANA Considerations</name>
      <t>This document makes no IANA requests.</t>
      <t>This profile does not define a new TLS exporter label. Protocols using this profile are expected to define or select an appropriate application-specific exporter label. Any future generally applicable label is expected to follow the registration procedures for the "TLS Exporter Labels" registry, as updated by <xref target="RFC9847"/>.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6234.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8446.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9261.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9334.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7515.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7519.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8725.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7800.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8392.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8747.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8949.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9052.xml"/>
    </references>
    <references>
      <name>Informative References</name>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1984.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2804.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5056.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5705.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6749.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6973.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7009.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7258.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7662.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8693.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8705.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8707.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8890.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9068.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9111.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9266.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9396.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9421.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9449.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9518.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9530.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9651.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9711.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9847.xml"/>
    </references>
  </back>
</rfc>
