<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="https://xml2rfc.ietf.org/schema/rfc7991bis.rnc" type="application/relax-ng-compact-syntax"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     version="3"
     category="std"
     consensus="true"
     docName="draft-winmagic-oauth-condition-bound-keys-00"
     ipr="trust200902"
     submissionType="IETF"
     tocInclude="true"
     sortRefs="true"
     symRefs="true">
  <front>
    <title abbrev="Condition-Bound Keys">Condition-Bound Keys for Mutual-TLS Client Authentication and DPoP</title>

    <seriesInfo name="Internet-Draft" value="draft-winmagic-oauth-condition-bound-keys-00"/>

    <author initials="T." surname="Nguyen-Huu" fullname="Thi Nguyen-Huu">
      <organization>WinMagic</organization>
      <address>
        <email>thi.nh@winmagic.com</email>
      </address>
    </author>

    <author initials="S." surname="Nikitin" fullname="Sergei Nikitin">
      <organization>WinMagic</organization>
      <address>
        <email>sergei.nikitin@winmagic.com</email>
      </address>
    </author>

    <author initials="J." surname="O'Leary" fullname="John O'Leary">
      <organization>WinMagic</organization>
      <address>
        <email>John.OLeary@winmagic.com</email>
      </address>
    </author>

    <date year="2026" month="August" day="11"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>

    <abstract>
      <t>
        Login and session protection are two markets solving one problem:
        verify identity before giving access. Online, access is mostly the
        transaction, so that is where identity should be verified. Done this
        way, there is no session and no login; identity assurance is embedded
        in the transaction: it is encrypted by a key only the right identity
        has.
      </t>
      <t>
        The key that does this exists only where an actor -- human or machine
        -- a platform, and local policy hold, now. It disappears when the
        conditions are no longer met. All three are observed on the endpoint.
        It is hardware-rooted by default and non-exfiltratable, existing
        nowhere else, and its presence means validity: the identity is live
        now.
      </t>
      <t>
        This document specifies that key and its uses: under mutual TLS, in a
        DPoP proof, as a raw public key, in Device Bound Session Credentials,
        and as a FIDO2 passkey, or in a non-FIDO mode carrying user
        verification without user interaction.
      </t>
    </abstract>
    <note removeInRFC="true">
      <name>Note to Readers</name>
      <t>
        The applicability of this work spans efforts specified in the IETF, the
        W3C, the FIDO Alliance, and the OpenID Foundation. The authors raised it
        informally in 2025 but do not know the process well, and would welcome
        advice on where it belongs and on how to bring it there -- in the IETF,
        and equally in the W3C and the OpenID Foundation. If the scope is judged
        to span several existing efforts, the authors would support taking it up
        as a Birds-of-a-Feather session.
      </t>
      <t>
        This revision is deliberately not exhaustive. It states the mechanism
        and its effect on the OAuth mechanisms it profiles; it does not attempt
        a threat model, a worked attestation mechanism, or a complete treatment
        of transport behavior. Comment on the approach is more useful at this
        stage than detail on what is not yet covered.
      </t>
    </note>
  </front>

  <middle>

    <section anchor="intro" numbered="true">
      <name>Introduction</name>
      <t>
        An access token records a decision made before it was issued. Between
        issuance and use the actor may have walked away, the platform may have
        fallen out of policy, and the authorization may have been narrowed. The
        token says none of this. It cannot. A signed artifact reports the moment
        it was signed.
      </t>
      <t>
        OAuth answers this in two ways. Sender-constraining mechanisms --
        mutual-TLS client authentication with certificate-bound access tokens
        <xref target="RFC8705"/>, and DPoP <xref target="RFC9449"/> -- establish
        that the request comes from a holder of a particular key. Separately,
        short lifetimes limit how long a stale decision can be used.
      </t>
      <t>
        This is not an argument about theft. Take a token that cannot be
        copied at all: one actor, one platform, a
        credential held in exactly one place. Nothing above changes. The user
        can still walk away and the machine can still fall out of policy.
        Copying decides where a stale record can be used; it does not make the
        record stale.
      </t>
      <t>
        So the key is where to work. Make the key exist only while a stated set
        of conditions holds. When a condition fails, the key is gone, and no new
        proof that requires it can be made. Nothing is sent and no signal is
        needed.
      </t>
      <t>
        Two things follow. First, for conditions the platform itself can see --
        the actor walks away, the platform falls out of policy -- revocation is
        by absence. The party that observes the failure is the party that
        withdraws the key. Conditions decided elsewhere still require a signal;
        that boundary is drawn in <xref target="failure"/>.
      </t>
      <t>
        Second, the token's lifetime stops standing in for validity. A short
        lifetime bounds how long a record of a past authentication can still be
        used. Where this key applies, that work is done by the key, and
        lifetime is free to be what it was meant to be: how long a permission
        should last. Lifetimes need not change. They are no longer what ends
        access.
      </t>
      <t>
        Where the actor is a verified human, there is nothing left for a login
        to establish or a session to remember. That case is developed in
        <xref target="human-actor"/> and <xref target="sessions"/>.
      </t>
      <section anchor="scope" numbered="true">
        <name>Scope</name>
        <t>
          This document is an Applicability Statement in the sense of
          <xref target="RFC2026"/>, Section 3.2. It specifies how existing
          OAuth protocol specifications are combined and constrained for a
          class of deployment, and defines no new protocol element: no grant
          type, no token format, no endpoint, no parameter, and no role. Its
          normative requirements are addressed to profiles that adopt it.
        </t>
        <t>
          This document specifies:
        </t>
        <ul>
          <li>the properties a binding key must have to be condition-bound, and what a profile must state about them;</li>
          <li>how such a key is used with the client authentication and sender-constraining mechanisms OAuth already defines;</li>
          <li>what an authorization server can verify and what a resource server can verify, which are not the same;</li>
          <li>the effect on tokens already issued, distinguishing bearer from sender-constrained;</li>
          <li>failure behavior, including which conditions are enforced by key absence and which require an external signal; and</li>
          <li>application to delegated and asynchronous flows.</li>
        </ul>
        <t>
          This document does not define a credential format, a policy language,
          an attestation evidence format, or a hardware recipe, and how keys are
          registered is out of scope. The checks this document builds on are
          stated in <xref target="verification"/> in the form this document
          relies on them. The general credential and validity model from which
          they are drawn, and its application to workload identity within a
          trust domain, are specified in
          <xref target="I-D.winmagic-wimse-condition-bounded-credentials"/>,
          which this document does not otherwise restate.
        </t>
      </section>
    </section>

    <section anchor="requirements-language" numbered="true">
      <name>Requirements Language</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>
    </section>

    <section anchor="terminology" numbered="true">
      <name>Terminology</name>
      <t>
        This document uses the terms of <xref target="RFC6749"/>,
        <xref target="RFC8705"/>, <xref target="RFC9449"/>, and
        <xref target="RFC8693"/>. In addition:
      </t>
      <dl newline="true" spacing="normal">
        <dt>Actor</dt>
        <dd>The entity whose identity the credential represents: a human verified into a platform, a workload, or an agent acting for a human. The term is used as in <xref target="RFC8693"/> where an actor chain is present, and generically otherwise.</dd>

        <dt>Platform</dt>
        <dd>The hardware, firmware, and execution environment in which the binding key is created, protected, and used.</dd>

        <dt>Condition</dt>
        <dd>A policy predicate that must be satisfied for the binding key to be usable. Conditions may include measured platform state, device posture, verified presence of a human actor, authorization state, or deployment-defined local state.</dd>

        <dt>Condition-Bound Key</dt>
        <dd>A non-exfiltratable private key whose use is gated on a set of conditions evaluated locally at the platform, such that the key cannot produce a signature for the next operation once any required condition fails. Validity is the present usability of the key, not a date carried in a credential. The key exists only while the intended identity is verified -- typically the combination of an actor, a platform, and local policy observable at the endpoint -- and disappears when a condition no longer holds. This key is referred to as a Live Key in other published material.</dd>


        <dt>Binding Key</dt>
        <dd>The key to which a token or client authentication is constrained: the private key corresponding to the certificate in <xref target="RFC8705"/>, or the DPoP proof key in <xref target="RFC9449"/>.</dd>
      </dl>
    </section>

    <section anchor="what-tokens-establish" numbered="true">
      <name>What a Sender Constraint Establishes</name>
      <t>
        A resource server that validates a certificate-bound access token per
        <xref target="RFC8705"/> Section 3 establishes that the client
        presenting the token holds the private key for the certificate whose
        thumbprint appears in the token's confirmation claim. A resource server
        that validates a DPoP proof per <xref target="RFC9449"/> establishes
        that the presenter holds the private key for the JWK in the proof
        header, and that the proof is bound to this request.
      </t>
      <t>
        In both cases the established fact is possession of a key at the time of
        the request. What that supports is an inference: the key was issued to,
        or registered by, a particular client on a particular platform, and it
        has not moved, so the request comes from that platform. The inference is sound, and it is bounded. It does not establish that the human on
        whose behalf the token was issued is still there. It does not establish
        that the platform is still in the state it was in when the authorization
        decision was made. It does not establish that a policy predicate
        evaluated at issuance still evaluates the same way.
      </t>
      <t>
        This is structural, not a defect in either mechanism. An
        authorization server or resource server can check a signature because
        the signature is carried in the request. It cannot check the actor's
        continued presence or the platform's current state, because neither is
        carried in the request and neither can be: any assertion about them
        placed in the request would itself be a record made at some earlier
        moment, subject to the same objection.
      </t>
      <t>
        Rather than convey the condition to the verifier, this document
        makes it a precondition of the proof the verifier already requires. The verifier's checks do not
        change; what changes is what a passing check implies.
      </t>
    </section>

    <section anchor="condition-bound-keys" numbered="true">
      <name>Condition-Bound Keys</name>
      <t>
        A binding key is condition-bound for the purposes of this document when
        all of the following hold:
      </t>
      <ol>
        <li>The private key is generated and used inside a boundary from which it cannot be extracted in usable form, and signing occurs inside that boundary.</li>
        <li>Use of the key is gated by a policy evaluated at the platform, such that the key cannot produce a new signature while any required condition is unsatisfied.</li>
        <li>The gate is enforced rather than asserted: if a copy of the key can exist and be used outside the boundary while being treated as the same key, the property does not hold.</li>
        <li>Evidence is available to a verifier that the key's use policy is the policy the verifier intends to rely on.</li>
      </ol>
      <t>
        Properties 1 through 3 are properties of the platform. Property 4 is
        what makes the arrangement verifiable, and is discussed in
        <xref target="verification"/>. Validity in this document is the present
        usability of the key: the key is usable when every required condition
        holds, and not otherwise, so a party that obtains a proof from it has
        established that those conditions held when the proof was made. A profile
        <bcp14>MUST</bcp14> specify how the boundary is enforced, which
        conditions gate key use, and how a verifier obtains evidence of both.
        The general model and terminology are specified in
        <xref target="I-D.winmagic-wimse-condition-bounded-credentials"/>.
      </t>
      <t>
        Where a deployment would otherwise hold the client's authentication key or DPoP
        proof key in software, it instead holds a condition-bound key. Every
        message flow specified by <xref target="RFC8705"/> and
        <xref target="RFC9449"/> is unchanged. What changes is that the client
        becomes unable to produce a new proof from the moment a condition
        fails. Where a proof is not required -- because a connection is already
        established, because it is resumed from a previous one, or because the
        token is a bearer token -- the key's absence has no effect.
        <xref target="failure"/> states what a profile must do about the first
        two; <xref target="already-issued"/> addresses the third.
      </t>
    </section>

    <section anchor="binding" numbered="true">
      <name>Use with Existing OAuth Mechanisms</name>

      <section anchor="mtls-client-auth" numbered="true">
        <name>Mutual-TLS Client Authentication</name>
        <t>
          <xref target="RFC8705"/> defines two mutual-TLS client authentication
          methods. In the PKI method (<tt>tls_client_auth</tt>) the
          authorization server validates the client's certificate chain to a
          trust anchor and matches a configured subject. In the self-signed
          method (<tt>self_signed_tls_client_auth</tt>) the authorization server
          does not validate a chain at all: the client registers its
          certificates via <tt>jwks</tt> or <tt>jwks_uri</tt>, and
          authentication succeeds when the certificate presented in the
          handshake matches one registered for that client.
        </t>
        <t>
          The self-signed method is the natural fit for a condition-bound
          key: it is already registration of a key, with
          the certificate serving as an envelope rather than as an assertion of
          authority by a third party. A deployment using it obtains no property
          from the certificate's dates or issuer, and therefore loses nothing
          when the key underneath is condition-bound rather than
          lifetime-bound.
        </t>
        <t>
          When the client's authentication key is condition-bound, a failure of
          any gating condition means a new mutual-TLS client authentication
          cannot complete. The client cannot obtain a token from the token
          endpoint, cannot refresh, and cannot perform token exchange on a
          connection established after the failure.
        </t>
        <t>
          This holds at every handshake, and not only when the authorization
          server chooses to re-evaluate policy. It does not hold at every
          request: client authentication occurs once per connection, so requests
          sent on a connection established while conditions held are not gated
          again. A profile relying on this mechanism at the token endpoint
          <bcp14>MUST</bcp14> address connection reuse and session resumption,
          per <xref target="failure"/>.
        </t>
      </section>

      <section anchor="cert-bound-tokens" numbered="true">
        <name>Certificate-Bound Access Tokens</name>
        <t>
          <xref target="RFC8705"/> Section 3 binds an access token to the
          client's certificate by carrying the certificate's SHA-256 thumbprint
          in the <tt>cnf</tt> claim, and requires the protected resource to
          confirm that the certificate presented in the mutual-TLS connection
          matches it.
        </t>
        <t>
          Where the corresponding private key is condition-bound, the resource
          server's existing check acquires a second meaning at no cost. The
          client can only present that certificate in a completed mutual-TLS
          handshake if it can sign with the key, and it can only sign if the
          conditions hold. The thumbprint comparison is unchanged; what a
          successful comparison implies is not.
        </t>
        <t>
          This depends on a handshake having occurred. Where a connection is
          resumed rather than newly established, the certificate the resource
          server obtains from its TLS layer may be the one remembered from the
          original handshake, and the thumbprint comparison will pass without
          the key having been exercised. <xref target="failure"/> states what a
          profile must do about this.
        </t>
      </section>

      <section anchor="dpop-use" numbered="true">
        <name>DPoP</name>
        <t>
          <xref target="RFC9449"/> binds a token to a key held by the client and
          requires a signed proof per request. Where the DPoP proof key is
          condition-bound, no new proof can be produced once a required
          condition fails, and the resource server rejects the request under its
          existing rules.
        </t>
        <t>
          A DPoP proof is bound to a request but is produced before the request
          is sent, so a proof signed while conditions held can be presented
          after they have failed. <xref target="RFC9449"/> Section 11.2
          addresses this directly, observing that where proofs can be
          pre-generated, what is demonstrated is possession of a proof rather
          than possession of the key. A profile using condition-bound DPoP keys
          <bcp14>MUST</bcp14> state the acceptance window it applies to the
          <tt>iat</tt> claim, and <bcp14>MUST</bcp14> treat that window as the
          bound on how long a failed condition can remain unenforced. A profile
          <bcp14>SHOULD</bcp14> require server-supplied nonces, which move the
          bound to a value the server controls; a profile relying on nonces for
          this purpose <bcp14>MUST NOT</bcp14> assume they are available, since
          support is optional for both the authorization server and the resource
          server, and <bcp14>MUST</bcp14> state its behavior where they are not.
        </t>
        <t>
          DPoP's proof travels in the HTTP message rather than in the transport
          channel. Two consequences follow, and the second is the more important
          one for this profile.
        </t>
        <t>
          The proof survives a TLS-terminating intermediary, so deployments in
          which the client's connection is terminated before reaching the
          resource server <bcp14>SHOULD</bcp14> use DPoP rather than
          certificate-bound access tokens.
        </t>
        <t>
          The proof is also produced once per request rather than once per
          connection. Mutual-TLS client authentication occurs in the handshake,
          and over HTTP/2 and HTTP/3 there is no protocol-legal way to repeat it
          within a connection: <xref target="RFC9113"/> Section 9.2.3 and
          <xref target="RFC9001"/> Section 4.4 both prohibit post-handshake
          authentication, the latter stating the reason -- the multiplexing
          those transports provide prevents a client from correlating a
          certificate request with the application-level event that prompted it.
          Condition enforcement carried by the TLS binding key is therefore
          bounded at per-connection granularity by the transport, not by this
          profile. Where a profile requires enforcement at per-request
          granularity, DPoP is the only mechanism OAuth defines that provides
          it.
        </t>
        <t>
          Both properties are properties of where the proof rides, and apply
          whether or not the key is condition-bound. What condition-binding adds
          is that the granularity of the proof becomes the granularity of
          enforcement.
        </t>
      </section>

      <section anchor="raw-keys" numbered="true">
        <name>Credential Carriers and Raw Public Keys</name>
        <t>
          Nothing in this profile depends on the binding key being carried in an
          X.509 certificate. The same protected key may be presented inside a
          certificate or as a raw public key under <xref target="RFC7250"/>,
          where the peer sends a SubjectPublicKeyInfo and the identity is
          established by prior registration. For the self-signed method of
          <xref target="RFC8705"/>, where no chain is validated and the
          authorization server already matches against registered keys, the
          certificate contributes nothing that registration does not already
          supply.
        </t>
        <t>
          This document does not propose changes to
          <xref target="RFC8705"/>, which is specified in terms of X.509. It
          notes the relationship because deployments without a PKI are a
          principal audience for condition-bound keys, and because a profile
          that registers keys directly is a smaller step from the self-signed
          method than it may appear.
        </t>
      </section>
    </section>

    <section anchor="beyond-oauth" numbered="true">
      <name>Use Beyond OAuth</name>
      <t>
        The key described here is not specific to OAuth, and the properties
        above do not depend on an authorization server being present. Three
        cases outside this working group are noted, without proposing changes
        to the specifications that govern them.
      </t>

      <section anchor="dbsc-use" numbered="true">
        <name>Device Bound Session Credentials</name>
        <t>
          <xref target="DBSC"/> binds a browser session to a key held on the
          device: the user agent proves possession at a refresh endpoint and
          receives short-lived cookies for other requests. Where that key is
          condition-bound, a failed condition ends the refresh rather than the
          request in flight, and the outstanding cookies expire without
          renewal. The bound on exposure is then the cookie lifetime the site
          already chose.
        </t>
        <t>
          For a consumer, the site's sign-in stops being a separate event. The
          key establishes who is present at each refresh, so the cookie carries
          a short-lived result rather than a remembered sign-in, and the user is
          not prompted while the conditions hold. What the cookie is exposed to
          between refreshes is unchanged: it remains valid for the lifetime the
          site set.
        </t>
        <t>
          An Intent to Ship for <xref target="DBSC"/> was approved in February
          2026, so the mechanism is on a path to deployment rather than a
          proposal.
        </t>
        <t>
          Whether a user agent can use a key gated on conditions outside its
          own control is an implementation question this document does not
          answer. <xref target="DBSC"/> is deliberately silent on how keys are
          stored, which leaves the question open rather than settled against.
        </t>
      </section>

      <section anchor="webauthn-use" numbered="true">
        <name>WebAuthn Credentials</name>
        <t>
          A condition-bound key can be used as a full FIDO credential, or in a
          non-FIDO version, for broad enterprise use with no user interaction.
          This document does not propose changes to <xref target="WebAuthn"/>
          and does not specify either mode.
        </t>
      </section>

      <section anchor="caep-use" numbered="true">
        <name>Continuous Access Evaluation</name>
        <t>
          Continuous access evaluation carries a decision from a transmitter to
          a receiver, and its architecture assumes those are different parties:
          the party that observes a change is not the party that enforces it.
          The endpoint has no defined role, so a fact the endpoint observes
          must first reach a transmitter before it can act.
        </t>
        <t>
          Where the endpoint both observes the condition and holds the key, it
          can enforce what it sees without anything being transmitted. This
          does not make continuous access evaluation unnecessary. It remains
          what it was always needed for: conditions decided somewhere other
          than where the key lives, such as an administrative revocation, a
          change of entitlement, or a risk signal from a service the endpoint
          cannot see. What it suggests is that the endpoint is an under-used
          party in these designs, and that giving it a defined role reduces how
          much has to travel.
        </t>
      </section>
    </section>

    <section anchor="verification" numbered="true">
      <name>What Each Party Can Verify</name>
      <t>
        A verifier accepting a condition-bound key establishes three things:
        that the key is one it has registered or can trace to an accepted trust
        root; that the peer in this exchange proved possession of that key; and
        that the key's use was gated by the policy the verifier intends to rely
        on, with evidence for that policy fresh enough for its purposes. Any of
        these failing means the use fails closed. Stated in that form, the
        checks assume a single verifier that is also the TLS peer: the party that
        checks possession is the party that decides. In OAuth this is generally
        not the case. The authorization server authenticates the client
        directly. The resource server receives a token issued by the
        authorization server, and may or may not hold a mutual-TLS connection to
        the client. The two therefore observe different things and can conclude
        different things, and a profile that does not distinguish them will
        overclaim at the resource server.
      </t>

      <section anchor="as-verification" numbered="true">
        <name>At the Authorization Server</name>
        <t>
          The authorization server is the TLS peer of the client. It observes a
          completed handshake in which the client signed with the binding key,
          and it holds, from registration or enrollment, evidence about that
          key's use policy. It can therefore establish:
        </t>
        <ul>
          <li>that the client controls the registered key (from the handshake);</li>
          <li>that the key was, at registration, gated on a stated use policy (from enrollment evidence, including Attestation Results in the sense of <xref target="RFC9334"/> where available); and</li>
          <li>consequently, that the gating conditions held at the moment of this request, to the assurance level of the enrollment evidence.</li>
        </ul>
        <t>
          The third conclusion is the one that carries the profile, and its
          strength is bounded by the second. A verifier that has no evidence
          about the key's use policy learns only that a key was used. A profile
          <bcp14>MUST</bcp14> state what evidence establishes the key-use policy
          and what freshness rule applies to it, and an authorization server
          <bcp14>MUST NOT</bcp14> treat a successful client authentication as
          evidence of conditions when it holds no evidence of the policy gating
          the key.
        </t>
      </section>

      <section anchor="rs-verification" numbered="true">
        <name>At the Resource Server</name>
        <t>
          The resource server's position depends on how the token is
          constrained.
        </t>
        <t>
          With a certificate-bound access token and a mutual-TLS connection
          reaching the resource server, the resource server is a TLS peer and
          its position resembles the authorization server's: the completed
          handshake demonstrates that the key was usable for this request.
          Whether it can go further and conclude anything about conditions
          depends on whether it has evidence of the key-use policy, which it
          typically does not obtain directly. Where the authorization server
          holds that evidence, it <bcp14>MAY</bcp14> convey the result of its
          appraisal in the token; the resource server then relies on the
          authorization server's appraisal rather than on its own, and this
          <bcp14>MUST</bcp14> be represented as such.
        </t>
        <t>
          With DPoP, the resource server verifies a per-request signature. The
          same distinction applies: the signature demonstrates present
          usability of the key; any conclusion about what gates that key rests
          on evidence the resource server did not itself observe.
        </t>
        <t>
          With a bearer token, the resource server learns nothing from this
          profile. There is no proof to fail.
        </t>
        <t>
          Condition-binding makes the failure reliable everywhere a proof is
          required, and makes the appraisal available only where evidence of
          the key-use policy is held. A
          profile <bcp14>MUST NOT</bcp14> claim that a resource server verifies
          conditions when what it verifies is a signature whose production was
          gated by conditions it cannot observe.
        </t>
      </section>
    </section>

    <section anchor="already-issued" numbered="true">
      <name>Effect on Tokens Already Issued</name>
      <t>
        What happens to a token already issued, when a condition fails
        afterwards, depends on the token type.
      </t>
      <t>
        A bearer access token already in the client's possession is unaffected.
        It is a copyable artifact whose acceptance requires no proof, so there
        is no proof to withhold. It remains usable until it expires or is
        rejected by some other means. Deployments relying on bearer tokens
        <bcp14>SHOULD</bcp14> continue to use short access-token lifetimes;
        this profile does not remove that requirement and does not reduce the
        need for it.
      </t>
      <t>
        A sender-constrained access token -- certificate-bound per
        <xref target="RFC8705"/> or DPoP-bound per <xref target="RFC9449"/> --
        is a different case. Its acceptance requires the client to demonstrate
        possession of the binding key at each use. If that key is
        condition-bound and a required condition fails, no new demonstration can
        be produced, and the token is unusable from that moment, subject to the
        DPoP pre-generation window in <xref target="dpop-use"/>. This occurs
        without a revocation message, without the resource server learning why,
        and without any action by the user. It is not that the token is revoked;
        it is that the token can no longer be used.
      </t>
      <t>
        Refresh tokens follow the same rule, and in the ordinary deployment they
        follow the stronger side of it: where the client authenticates to the
        token endpoint with a condition-bound key, a refresh request on a new
        connection cannot complete once a condition fails, regardless of the
        refresh token's own constraint. This is subject to the connection-reuse
        and resumption limits in <xref target="failure"/>.
      </t>
    </section>

    <section anchor="delegated" numbered="true">
      <name>Delegated and Asynchronous Flows</name>
      <t>
        Delegated flows built on token exchange <xref target="RFC8693"/>, in
        which one party acts for another and may continue after the user goes
        offline, are where the distance between a decision and its use is
        largest, and therefore where this profile is most consequential.
      </t>
      <t>
        In such a flow an acting party authenticates to the authorization
        server, presents a token addressed to it, and receives tokens with which
        to continue a task. Policy is re-evaluated by the authorization server
        at each such request. Between requests the authorization server observes
        nothing, and a token already issued remains usable for its lifetime.
        The usual mitigation is to shorten the interval and the lifetime.
        That reduces the exposure without removing it, and trades against
        the long-running task the flow exists to support.
      </t>
      <t>
        Where the acting party's client authentication key is condition-bound,
        the interval closes rather than shortens. The authorization server still
        re-evaluates its own policy at each request; in addition, no request can
        be made on a newly established connection unless the acting party's
        conditions hold at that moment.
        The two are complementary: the authorization server enforces what it
        can see, and the platform enforces what only it can see.
      </t>
      <t>
        Two limits <bcp14>MUST</bcp14> be stated by any profile applying this to
        a delegated flow. First, the conditions enforced are those of the
        platform where the key lives; where a task is delegated to a party on
        another platform, that party's conditions are what gate its key, and the
        original user's conditions are not thereby enforced. Second, autonomous
        operation across a period of user unavailability necessarily rests on a
        pre-authorization made while the user was present; condition-binding
        constrains where and under what platform state that authorization can be
        exercised, and does not remove its pre-authorized character.
      </t>
    </section>

    <section anchor="failure" numbered="true">
      <name>Failure Behavior</name>
      <t>
        Two enforcement paths <bcp14>MUST</bcp14> be distinguished, and a
        profile <bcp14>MUST</bcp14> state which conditions it assigns to each.
      </t>
      <t>
        Conditions the platform evaluates locally -- presence of the verified
        human, measured platform state, posture, local policy predicates -- are
        enforced by the key's absence. The party that observes the failure is the party that withdraws the
        key, so no message has to travel.
        Enforcement takes effect at the next use of the key.
      </t>
      <t>
        Conditions originating elsewhere -- an authorization narrowed by an
        administrator, a role removed, a platform distrusted by a central
        authority -- cannot be observed by the platform and are not enforced by
        key absence. These require an out-of-band signal, for example a
        Continuous Access Evaluation Profile event <xref target="CAEP"/>, carried by a signalling framework such as <xref target="SSF"/>, or they take effect at the authorization
        server's next policy evaluation. This profile does not remove that
        requirement.
      </t>
      <section anchor="resumption" numbered="true">
        <name>Connection Reuse and Session Resumption</name>
        <t>
          Enforcement by key absence acts at the next operation requiring the
          key. Two transport behaviors mean that an operation which required the
          key once may not require it again.
        </t>
        <t>
          Connection reuse. An established connection does not re-exercise the
          binding key while it runs. This is a property of connection-oriented
          transport rather than of this profile: certificate expiry and
          revocation act at the next handshake for the same reason. Over HTTP/2
          and HTTP/3 it is more than a default. <xref target="RFC9113"/>
          Section 9.2.3 and <xref target="RFC9001"/> Section 4.4 prohibit
          post-handshake authentication outright, so there is no conforming way
          for a server to require the binding key again on a connection it has
          already accepted. A profile cannot close this by specifying more
          carefully; it can only choose a mechanism whose proof rides in the
          message, or bound the connection. A profile permitting long-lived
          connections <bcp14>MUST NOT</bcp14> represent the proof given at
          connection setup as continuing evidence that conditions still hold,
          and <bcp14>SHOULD</bcp14> bound connection lifetime, drive teardown
          from an external signal, or both.
        </t>
        <t>
          Session resumption. Resumption re-establishes an authenticated
          connection without exercising the binding key. In TLS 1.3 a resumed
          handshake authenticates from a pre-shared key derived from the earlier
          handshake and sends neither Certificate nor CertificateVerify
          (<xref target="RFC9846"/>, Section 2.2). Earlier versions of TLS behave
          comparably. A resumed connection is therefore not evidence
          that gating conditions hold, and whether the certificate from the
          original handshake remains available to the application -- and so
          whether the check required by <xref target="RFC8705"/> Section 3
          passes or fails -- is implementation-dependent.
        </t>
        <t>
          A profile using condition-bound keys <bcp14>MUST</bcp14> specify its
          treatment of session resumption, and <bcp14>MUST</bcp14> do one of the
          following.
        </t>
        <ol spacing="normal">
          <li>
            Disable resumption for connections used for mutual-TLS client
          authentication and for connections carrying certificate-bound access
          tokens. The first of these is the connection to the authorization
          server, which carries no access token and is the case in which this
          profile's enforcement is otherwise strongest.
          </li>
          <li>
            Require the binding key to be exercised on the resumed connection
          before it is relied upon. TLS 1.3 post-handshake authentication
          (<xref target="RFC9846"/>, Section 4.7.2) runs Certificate and
          CertificateVerify and so does exercise the key. It is not available
          over HTTP/2 or HTTP/3, for the reasons given above, and this option is
          therefore confined to HTTP/1.1 and to non-HTTP uses of TLS.
          </li>
          <li>
            Bound ticket lifetime to the shortest-lived condition the profile
          enforces. Where that condition is the presence of a human, which can
          fail in seconds, this option collapses into the first: a ticket
          lifetime short enough to be honest is short enough that resumption
          serves no purpose. It is a distinct option only for profiles whose
          fastest-failing condition is measured in minutes or longer.
          </li>
        </ol>

        <t>
          A profile <bcp14>MUST NOT</bcp14> permit indefinite extension of an
          authenticated session through chained ticket reissuance.
        </t>
      </section>
    </section>

    <section anchor="human-actor" numbered="true">
      <name>The Verified Human Actor</name>
      <t>
        OAuth's principal subject is a human, and the case this profile treats
        as central is a human verified into a platform, whose continued presence
        is a condition on the binding key.
      </t>
      <t>
        In this arrangement the user does not hold a key; the platform does, and
        the platform's key is usable only while that user is verified as
        present at it. The user is not asked to act at the moment of use. There is no user interaction, no prompt, and no code, because what is
        established is not that the user can perform an action but that the
        user is present, which the platform can determine without asking.
        The credential presented to the authorization server is therefore
        evidence about the present rather than a record of a past
        authentication event.
      </t>
      <t>
        That a verified human is present at a platform is an association, and it is all that is established.
        It is not consent to a particular action, not authorization for a
        particular scope, and not accountability for a decision. Consent and
        authorization remain the business of the authorization server and of
        tokens. Accountability is evidence of a past decision and is
        legitimately an artifact. A profile <bcp14>MUST NOT</bcp14> represent
        the presence of a verified human as approval of anything.
      </t>
      <t>
        An agent acting for a human is the composition of two actors. Where the
        agent runs on the platform at which the human is verified, both
        conditions gate the same key and the question of on whose behalf the
        agent acts is answered locally, at the moment of action, without a
        propagated claim. Where the agent runs elsewhere, it is a separate actor
        on a separate platform with its own key and its own conditions, and the
        human's authority reaches it as a conveyed, scoped permission. A profile
        <bcp14>MUST</bcp14> state which topology it addresses. A key gated only
        on the platform's state cannot distinguish which of several actors
        co-located on that platform is making a request; where such
        distinction is required, the key <bcp14>MUST</bcp14> be specific to the
        actor rather than to the platform.
      </t>
    </section>

    <section anchor="sessions" numbered="true">
      <name>Consequence for Sessions</name>
      <t>
        This section is informative and states a consequence rather than a
        requirement.
      </t>
      <t>
        A session exists because authenticating a user costs the user
        something. Ask once, at sign-in, then hold the result. Lifetimes,
        idle timeouts, renewal, and revocation all follow from holding it.
      </t>
      <t>
        A condition-bound key costs the user nothing. The user is verified
        into the platform, and the key signs only while that holds, so every
        request carries a live proof that the verified user is present.
        There is nothing to hold. Login and session become one thing,
        happening at each use. The key does not say who the user is; that
        remains the authorization server's determination, and tokens still
        carry authorization. What ends is the need for a stored sign-in
        result to stand in for a user who is there.
      </t>
    </section>

    <section anchor="applicability" numbered="true">
      <name>Applicability</name>
      <t>
        This profile suits actors on stable, attestable platforms: user
        endpoints, virtual machines with a virtual TPM, persistent services,
        edge and operational-technology systems, and long-lived agents. It is
        not proposed for high-churn, ephemeral, hardware-less clients, where a
        per-operation hardware signature is a throughput ceiling and short-lived
        software-keyed credentials remain the appropriate tool. The boundary is
        set by operation rate and hardware availability.
      </t>
      <t>
        Deployments whose access tokens are bearer tokens obtain the benefit at
        the authorization server only, per <xref target="already-issued"/>.
      </t>
    </section>

    <section anchor="security" numbered="true">
      <name>Security Considerations</name>
      <t>
        This document adds to the considerations in <xref target="RFC9700"/>,
        which apply unchanged; those below concern only what changes when the
        binding key is condition-bound.
      </t>
      <t>
        <strong>The gate is software-observed.</strong> The key's
        non-extractability is enforced by hardware. The evaluation of the
        conditions gating its use is performed by software on the platform,
        reading sensors and policy state. A profile
        <bcp14>MUST NOT</bcp14> represent condition evaluation as a
        cryptographic property. What is cryptographic is that a new signature cannot
        be produced when the gate does not open; what the gate reads is a
        software judgment, and its integrity rests on the platform's measured
        state.
      </t>
      <t>
        <strong>A compromised or emulated root is not self-detecting.</strong>
        This profile does not claim that a condition-bound key detects
        compromise or emulation of the hardware root protecting it. That failure
        is addressed by attestation re-appraisal and by the external signalling
        path, not by the key's own behavior.
      </t>
      <t>
        <strong>Clone and extraction signals.</strong> Non-extractability is an
        assumption about a boundary, and boundaries can fail: an extraction
        exploit, a side channel, or a cryptanalytic break would leave a working
        copy of the key elsewhere, where the protections this profile relies on
        do not apply. In each of those cases two instances exist and each
        advances its own count. A per-credential monotonic use counter detects
        this: two instances each advance their own, and the values diverge.
        <xref target="WebAuthn"/> establishes the pattern, carrying such a
        counter in authenticator data. TLS provides no equivalent carrier, so a
        profile relying on this signal for a key presented in a TLS handshake
        <bcp14>MUST</bcp14> specify how the value is conveyed, and
        <bcp14>MUST</bcp14> treat it as advisory: an anomalous value is raised
        for review rather than treated as a failure, and it
        <bcp14>MUST NOT</bcp14> gate key production or token issuance. In OAuth
        deployments the natural scope is the registration of the key with a
        given authorization server, and the value may be reported alongside the
        proof.
      </t>
      <t>
        <strong>Virtualized platforms.</strong> Where the protection boundary is
        a virtual TPM, snapshot and rollback of the virtual machine can restore
        a key together with a platform state that no longer reflects reality. A
        profile using a virtual root <bcp14>MUST</bcp14> specify instance
        binding and rollback protection.
      </t>
      <t>
        <strong>Absence is not distinguishable from failure.</strong> A resource
        server or authorization server observing a failed proof cannot tell
        whether a condition failed, the platform is offline, or an attacker is
        present. This is a deliberate property -- the failure carries no
        information about why -- and it means that condition failure produces no
        signal usable for monitoring. Deployments requiring visibility into why
        access ceased <bcp14>MUST</bcp14> obtain it from the platform through a
        separate reporting path, and <bcp14>MUST NOT</bcp14> infer it from the
        failure.
      </t>
      <t>
        <strong>Offline behavior.</strong> Because validity is the present
        usability of the key rather than a signed lifetime, a party can
        authenticate without a live connection to an issuing authority. Where a
        deployment makes an externally sourced status a required condition,
        loss of connectivity means that condition cannot be confirmed and the
        key fails closed. A profile <bcp14>MUST</bcp14> state whether external
        status is a required condition, since this determines whether
        disconnected operation is possible or prohibited.
      </t>
    </section>

    <section anchor="privacy" numbered="true">
      <name>Privacy Considerations</name>
      <t>
        A non-rotating key is a correlation handle. The properties this profile
        relies on come from a key that does not change: it is registered once,
        held in hardware, and presented for as long as the platform and the
        enrollment last. The same public key, or the same certificate
        thumbprint, is therefore presented to every resource server the client
        reaches over mutual TLS, and appears in the confirmation claim of every
        certificate-bound token issued for it. Two resource servers under
        different administrative control can determine that they are speaking to
        the same client instance by comparing that value alone, without
        cooperation from the authorization server.
      </t>
      <t>
        Rotation, whatever else it costs, breaks this. A deployment adopting
        this profile is trading unlinkability for the properties described in
        <xref target="condition-bound-keys"/>, and the trade should be made
        deliberately. For governed enterprise actors it is usually the right
        trade and supports accountability and audit. It is not the right trade
        everywhere, and this document does not claim it is.
      </t>
      <t>
        A profile <bcp14>SHOULD</bcp14> register a separate key per
        authorization server rather than one key across all of them, which
        confines correlation to the resource servers of a single trust domain. A
        profile <bcp14>MAY</bcp14> register a separate key per resource server
        where the deployment can bear the enrollment cost, which removes the
        handle at the cost of the operational simplicity that motivates a single
        key. A profile <bcp14>MUST</bcp14> state which it does.
      </t>
      <t>
        What presence detection observes, and what leaves the endpoint. A
        condition gating the key on the verified presence of a human is
        evaluated by observing that human -- by a sensor, a proximity
        measurement, a periodic re-verification, or a combination. These
        observations are made continuously and are of a person, and they are
        among the more sensitive things a platform can hold.
      </t>
      <t>
        The structure of this profile keeps them local. The gate is evaluated at
        the endpoint, and what reaches the authorization server or the resource
        server is a signature or its absence. No sensor reading, no posture
        measurement and no record of when presence lapsed travels as a
        consequence of the mechanism specified here. This is the same property
        <xref target="security"/> describes as a limitation for monitoring --
        the failure carries no information about why -- read from the other
        side: it is also a disclosure limit, and it holds by construction rather
        than by policy.
      </t>
      <t>
        It holds only for the gate itself. A deployment that separately reports
        presence state, posture, or the reason for a failure over a different
        path -- a management channel, a continuous-evaluation event, a telemetry
        stream -- discloses whatever that path carries, and
        <xref target="security"/> requires such a path to exist wherever
        visibility is needed. A profile <bcp14>MUST</bcp14> state what its
        reporting path discloses, to whom, and at what granularity, and
        <bcp14>MUST NOT</bcp14> describe the mechanism in this document as
        privacy-preserving on the strength of the gate alone when such a path is
        in use.
      </t>
      <t>
        Enrollment evidence. The verifier's evidence about the key-use policy is
        established at enrollment, and it is the place where detail about the
        platform is disclosed. Attestation evidence can carry device identity,
        firmware and software versions, measured state, configuration, and the
        identity of the operator. A verifier needs enough of this to appraise
        the policy; it rarely needs all of it. A profile
        <bcp14>SHOULD</bcp14> convey an Attestation Result or a policy decision
        in the sense of <xref target="RFC9334"/> rather than raw measurements,
        so that the appraisal happens once, at a party equipped for it, and the
        relying parties receive a conclusion. Where raw evidence is conveyed, a
        profile <bcp14>MUST</bcp14> state what it contains and
        <bcp14>SHOULD</bcp14> restrict it to the predicates the relying party
        appraises.
      </t>
      <t>
        Pre-authorization. A permission granted in advance to cover a period of
        user unavailability, as described in <xref target="delegated"/>, is for
        its duration a conveyed artifact rather than a live condition, and is
        correspondingly more exposed to the properties this profile otherwise
        removes. It <bcp14>SHOULD</bcp14> be kept short and narrowly scoped.
      </t>
    </section>

    <section anchor="relationship" numbered="true">
      <name>Relationship to Existing Work</name>
      <t>
        This document builds on <xref target="RFC8705"/> and <xref
        target="RFC9449"/> and changes neither, and introduces no new party
        to any flow.
      </t>
      <t>
        The general credential and validity model, its terminology, and the
        verifier checks that this document extends to the two-verifier case
        are specified in
        <xref target="I-D.winmagic-wimse-condition-bounded-credentials"/>. That
        document addresses workload identity within a trust domain; this one
        addresses the OAuth-facing case, where a human is the principal subject,
        tokens are issued by an authorization server, and the party deciding is
        often not the party that held the channel.
      </t>
      <t>
        Work on delegated and asynchronous authorization, including refresh
        token profiles for token exchange, specifies what an authorization
        server maintains and enforces across a delegated task. This profile is
        complementary to that work: it constrains what the acting party can do
        between the authorization server's evaluations, and leaves the
        authorization server's requirements intact.
      </t>
      <t>
        Work on client instance identity and on attestation-based client
        authentication addresses how an authorization server learns about a
        client instance it has not enrolled. This profile is orthogonal: it
        concerns the properties of the key once the client is known, whichever
        mechanism established that knowledge.
      </t>
    </section>

    <section anchor="iana" numbered="true">
      <name>IANA Considerations</name>
      <t>
        This document has no IANA actions.
      </t>
    </section>

    <section anchor="acks" numbered="true">
      <name>Acknowledgements</name>
      <t>
        The authors thank the participants of the OAuth and WIMSE working groups
        whose discussions of delegated authorization, agent identity, and
        proof-of-possession informed this work.
      </t>
    </section>

  </middle>

  <back>
    <references anchor="references">
      <name>References</name>

      <references anchor="normative">
        <name>Normative References</name>

        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="Scott Bradner"/>
            <date year="1997" month="March"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>

        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author initials="B." surname="Leiba" fullname="Barry Leiba"/>
            <date year="2017" month="May"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>

        <reference anchor="RFC6749" target="https://www.rfc-editor.org/info/rfc6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author initials="D." surname="Hardt" fullname="Dick Hardt"/>
            <date year="2012" month="October"/>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>

        <reference anchor="RFC8705" target="https://www.rfc-editor.org/info/rfc8705">
          <front>
            <title>OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens</title>
            <author initials="B." surname="Campbell" fullname="Brian Campbell"/>
            <author initials="J." surname="Bradley" fullname="John Bradley"/>
            <author initials="N." surname="Sakimura" fullname="Nat Sakimura"/>
            <author initials="T." surname="Lodderstedt" fullname="Torsten Lodderstedt"/>
            <date year="2020" month="February"/>
          </front>
          <seriesInfo name="RFC" value="8705"/>
          <seriesInfo name="DOI" value="10.17487/RFC8705"/>
        </reference>

        <reference anchor="RFC9449" target="https://www.rfc-editor.org/info/rfc9449">
          <front>
            <title>OAuth 2.0 Demonstrating Proof of Possession (DPoP)</title>
            <author initials="D." surname="Fett" fullname="Daniel Fett"/>
            <author initials="B." surname="Campbell" fullname="Brian Campbell"/>
            <author initials="J." surname="Bradley" fullname="John Bradley"/>
            <author initials="T." surname="Lodderstedt" fullname="Torsten Lodderstedt"/>
            <author initials="M." surname="Jones" fullname="Michael B. Jones"/>
            <author initials="D." surname="Waite" fullname="David Waite"/>
            <date year="2023" month="September"/>
          </front>
          <seriesInfo name="RFC" value="9449"/>
          <seriesInfo name="DOI" value="10.17487/RFC9449"/>
        </reference>
        <reference anchor="RFC7250" target="https://www.rfc-editor.org/info/rfc7250">
          <front>
            <title>Using Raw Public Keys in Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)</title>
            <author initials="P." surname="Wouters" fullname="Paul Wouters"/>
            <author initials="H." surname="Tschofenig" fullname="Hannes Tschofenig"/>
            <author initials="J." surname="Gilmore" fullname="John Gilmore"/>
            <author initials="S." surname="Weiler" fullname="Samuel Weiler"/>
            <author initials="T." surname="Kivinen" fullname="Tero Kivinen"/>
            <date year="2014" month="June"/>
          </front>
          <seriesInfo name="RFC" value="7250"/>
          <seriesInfo name="DOI" value="10.17487/RFC7250"/>
        </reference>
        <reference anchor="RFC8693" target="https://www.rfc-editor.org/info/rfc8693">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author initials="M." surname="Jones" fullname="Michael B. Jones"/>
            <author initials="A." surname="Nadalin" fullname="Anthony Nadalin"/>
            <author initials="B." surname="Campbell" fullname="Brian Campbell"/>
            <author initials="J." surname="Bradley" fullname="John Bradley"/>
            <author initials="C." surname="Mortimore" fullname="Chuck Mortimore"/>
            <date year="2020" month="January"/>
          </front>
          <seriesInfo name="RFC" value="8693"/>
          <seriesInfo name="DOI" value="10.17487/RFC8693"/>
        </reference>
        <reference anchor="RFC9334" target="https://www.rfc-editor.org/info/rfc9334">
          <front>
            <title>Remote ATtestation procedureS (RATS) Architecture</title>
            <author initials="H." surname="Birkholz" fullname="Henk Birkholz"/>
            <author initials="D." surname="Thaler" fullname="Dave Thaler"/>
            <author initials="M." surname="Richardson" fullname="Michael Richardson"/>
            <author initials="N." surname="Smith" fullname="Ned Smith"/>
            <author initials="W." surname="Pan" fullname="Wei Pan"/>
            <date year="2023" month="January"/>
          </front>
          <seriesInfo name="RFC" value="9334"/>
          <seriesInfo name="DOI" value="10.17487/RFC9334"/>
        </reference>

        <reference anchor="RFC9846" target="https://www.rfc-editor.org/info/rfc9846">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author initials="E." surname="Rescorla"/>
            <date year="2026" month="July"/>
          </front>
          <seriesInfo name="RFC" value="9846"/>
          <seriesInfo name="DOI" value="10.17487/RFC9846"/>
        </reference>

        <reference anchor="RFC9113" target="https://www.rfc-editor.org/info/rfc9113">
          <front>
            <title>HTTP/2</title>
            <author initials="M." surname="Thomson" role="editor"/>
            <author initials="C." surname="Benfield" role="editor"/>
            <date year="2022" month="June"/>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>

        <reference anchor="RFC9001" target="https://www.rfc-editor.org/info/rfc9001">
          <front>
            <title>Using TLS to Secure QUIC</title>
            <author initials="M." surname="Thomson"/>
            <author initials="S." surname="Turner"/>
            <date year="2021" month="May"/>
          </front>
          <seriesInfo name="RFC" value="9001"/>
          <seriesInfo name="DOI" value="10.17487/RFC9001"/>
        </reference>

      </references>

      <references anchor="informative">
        <name>Informative References</name>


        <reference anchor="RFC9700" target="https://www.rfc-editor.org/info/rfc9700">
          <front>
            <title>Best Current Practice for OAuth 2.0 Security</title>
            <author initials="T." surname="Lodderstedt"/>
            <author initials="J." surname="Bradley"/>
            <author initials="A." surname="Labunets"/>
            <author initials="D." surname="Fett"/>
            <date year="2025" month="January"/>
          </front>
          <seriesInfo name="BCP" value="240"/>
          <seriesInfo name="RFC" value="9700"/>
        </reference>

        <reference anchor="RFC2026" target="https://www.rfc-editor.org/info/rfc2026">
          <front>
            <title>The Internet Standards Process -- Revision 3</title>
            <author initials="S." surname="Bradner"/>
            <date year="1996" month="October"/>
          </front>
          <seriesInfo name="BCP" value="9"/>
          <seriesInfo name="RFC" value="2026"/>
        </reference>

        <reference anchor="CAEP" target="https://openid.net/specs/openid-caep-1_0-final.html">
          <front>
            <title>OpenID Continuous Access Evaluation Profile 1.0</title>
            <author><organization>OpenID Foundation</organization></author>
            <date year="2025" month="August" day="29"/>
          </front>
        </reference>

        <reference anchor="SSF" target="https://openid.net/specs/openid-sharedsignals-framework-1_0-final.html">
          <front>
            <title>OpenID Shared Signals Framework Specification 1.0</title>
            <author><organization>OpenID Foundation</organization></author>
            <date year="2025" month="August" day="29"/>
          </front>
        </reference>

        <reference anchor="I-D.winmagic-wimse-condition-bounded-credentials" target="https://datatracker.ietf.org/doc/draft-winmagic-wimse-condition-bounded-credentials/">
          <front>
            <title>Condition-Bounded Credentials for Workload and Agent Identity: Non-Exfiltratable Keys and Validity by Presence</title>
            <author initials="T." surname="Nguyen-Huu" fullname="Thi Nguyen-Huu"/>
            <author initials="S." surname="Nikitin" fullname="Sergei Nikitin"/>
            <author initials="J." surname="O'Leary" fullname="John O'Leary"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-winmagic-wimse-condition-bounded-credentials"/>
        </reference>

        <reference anchor="DBSC" target="https://www.w3.org/TR/dbsc/">
          <front>
            <title>Device Bound Session Credentials</title>
            <author>
              <organization>W3C Web Application Security Working Group</organization>
            </author>
            <date year="2025" month="August"/>
          </front>
            <refcontent>W3C First Public Working Draft</refcontent>
        </reference>

        <reference anchor="WebAuthn" target="https://www.w3.org/TR/webauthn-3/">
          <front>
            <title>Web Authentication: An API for accessing Public Key Credentials, Level 3</title>
            <author>
              <organization>W3C</organization>
            </author>
            <date year="2026" month="May"/>
          </front>
            <refcontent>W3C Candidate Recommendation Snapshot</refcontent>
        </reference>
      </references>
    </references>
  </back>
</rfc>
