<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     docName="draft-bandyopadhayaya-oauth-ciba-push-binding-00"
     ipr="trust200902"
     obsoletes=""
     updates=""
     submissionType="IETF"
     xml:lang="en"
     version="3">

  <front>
    <title abbrev="CIBA Push Device Binding">CIBA Binding for OAuth Push-Based Authentication Device Discovery</title>
    <seriesInfo name="Internet-Draft" value="draft-bandyopadhayaya-oauth-ciba-push-binding-00"/>

    <author fullname="Jyotirmoy Bandyopadhayaya" initials="J." surname="Bandyopadhayaya">
      <organization>LoginRadius</organization>
      <address>
        <email>jyotirmoy.bandyopadhayaya@loginradius.com</email>
      </address>
    </author>

    <date year="2026" month="July" day="29"/>

    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>

    <keyword>OAuth</keyword>
    <keyword>CIBA</keyword>
    <keyword>push authentication</keyword>
    <keyword>device binding</keyword>

    <abstract>
      <t>
        A companion specification, "Discovery and Device Lifecycle for
        OAuth Push-Based Authentication", defines a generic,
        back-channel-protocol-agnostic device registration, attestation,
        and lifecycle layer for out-of-band OAuth 2.0 authenticator
        devices. This document is the thin binding that
        lets a device registered under that specification be woken by
        OpenID Connect Client-Initiated Backchannel Authentication (CIBA)
        Core's authorization endpoint: one request parameter, one
        additive error code, and a statement of how CIBA's existing
        <tt>binding_message</tt> composes with the base document's
        interaction-type ceremony. This document adds no new endpoints
        and no new discovery fields of its own.
      </t>
    </abstract>

  </front>

  <middle>

    <section anchor="intro" numbered="true" toc="default">
      <name>Introduction</name>
      <t>
        <xref target="I-D.bandyopadhayaya-oauth-push-device"/> (the "base
        document") defines a generic device registration, attestation,
        and lifecycle layer. This document binds that generic layer to
        OIDC CIBA Core <xref target="OIDC.CIBA"/>'s
        <tt>/bc-authorize</tt> endpoint. Everything other than the two
        additive elements defined here, discovery document shape,
        registration, revocation, key rotation, device management,
        account recovery, push transport, and the attestation and
        registry trust model, is defined entirely by the base document
        and is not repeated here.
      </t>
      <t>
        This split follows the precedent of WebAuthn <xref
        target="WebAuthn2"/> (a browser-facing API defined by the W3C)
        and CTAP (an authenticator-facing protocol defined by the FIDO
        Alliance): one generic protocol-facing layer, and one thin
        binding to a specific consuming interface.
      </t>

      <section anchor="terminology" numbered="true" toc="default">
        <name>Terminology</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&nbsp;14 <xref target="RFC2119"/>
          <xref target="RFC8174"/> when, and only when, they appear in all
          capitals, as shown here.
        </t>
        <t>
          This document uses the terminology defined in <xref
          target="I-D.bandyopadhayaya-oauth-push-device"/>, and the
          terminology defined in OIDC CIBA Core <xref target="OIDC.CIBA"/>
          (in particular <tt>auth_req_id</tt> and
          <tt>binding_message</tt>).
        </t>
      </section>
    </section>

    <section anchor="relationship" numbered="true" toc="default">
      <name>Relationship to Existing Standards</name>
      <t>
        OIDC CIBA Core defines <tt>/bc-authorize</tt>, <tt>auth_req_id</tt>,
        and the poll/ping/push delivery modes, plus discovery fields on
        <tt>/.well-known/openid-configuration</tt>. It assumes an
        authenticator is already registered with the AS;
        <xref target="I-D.bandyopadhayaya-oauth-push-device"/> fills that
        gap generically, and this document connects the two.
      </t>
      <t>
        An AS implementing this binding publishes both discovery
        documents: <tt>/.well-known/openid-configuration</tt> (with
        CIBA's standard fields, including
        <tt>backchannel_authentication_endpoint</tt>) and
        <tt>/.well-known/oauth-push-notification</tt> (per <xref
        target="I-D.bandyopadhayaya-oauth-push-device"/>). The two are
        independent documents operated by the same AS; nothing in either
        is required to reference the other.
      </t>
      <t>
        This binding modifies CIBA's request/response surface in exactly
        two places (<xref target="revocation-binding"/>, <xref
        target="interaction-binding"/>) and nowhere else. All device
        registration, key rotation, revocation, and push transport happen
        exactly as <xref target="I-D.bandyopadhayaya-oauth-push-device"/>
        defines, with zero CIBA-specific variation.
      </t>
    </section>

    <section anchor="revocation-binding" numbered="true" toc="default">
      <name>Device Revocation and the CIBA Error Surface</name>
      <t>
        The base document requires that revoking a device cascade to
        invalidate any pending authentication request bound to it, and
        defers the concrete error shape to the consuming protocol's
        binding. For CIBA:
      </t>
      <ul>
        <li><t>
          A revoked device's credential resolving during
          <tt>/bc-authorize</tt>, or a poll on an already-issued
          <tt>auth_req_id</tt> bound to a now-revoked device,
          <bcp14>MUST</bcp14> return <tt>device_revoked</tt> as an
          additive CIBA error, using the same response shape as CIBA's
          existing <tt>access_denied</tt> error.
        </t></li>
        <li><t>
          This is the only modification this binding makes to CIBA's
          response surface. It is purely additive: CIBA-compliant ASes
          that do not implement this binding are unaffected, and existing
          CIBA clients that do not recognize <tt>device_revoked</tt>
          degrade to generic error handling per <xref target="RFC6749"
          section="5.2"/> (an unrecognized <tt>error</tt> value).
        </t></li>
        <li><t>
          The base document's revocation wake signal
          (<tt>{"wake_reason": "device_revoked", "ref_id":
          "{device_id}"}</tt>) is unchanged by this binding; the
          application's local key wipe happens identically regardless of
          which consuming protocol triggered the revocation.
        </t></li>
      </ul>
    </section>

    <section anchor="interaction-binding" numbered="true" toc="default">
      <name>interaction_type on the Authorization Request</name>
      <t>
        The base document defines the <tt>interaction_type</tt> ceremony
        vocabulary (<tt>boolean</tt>, <tt>number_choose</tt>,
        <tt>input_manual</tt>) and the discovery-level
        <tt>interaction_type_supported</tt> /
        <tt>minimum_interaction_type</tt> fields, but leaves per-request
        selection and content-carrying to the consuming protocol. For
        CIBA:
      </t>
      <ul>
        <li><t>
          <tt>/bc-authorize</tt> gains an <tt>interaction_type</tt>
          request parameter. The RP selects a value per request; the AS
          <bcp14>MUST</bcp14> reject a value weaker than
          <tt>minimum_interaction_type</tt> with CIBA's existing
          <tt>invalid_request</tt> error. The downgrade-protection
          requirement is enforced identically to the base document's
          general rule, surfaced through CIBA's existing error
          vocabulary rather than a new error code.
        </t></li>
        <li><t>
          Composition with CIBA's existing <tt>binding_message</tt>:
        </t>
          <dl newline="true">
            <dt>interaction_type=boolean</dt>
            <dd><tt>binding_message</tt> is unchanged: purely advisory
              display, exactly as CIBA defines it today.</dd>
            <dt>interaction_type=number_choose</dt>
            <dd>The AS populates <tt>binding_message</tt> with the real
              number the RP displays; decoy numbers are generated by the
              AS and delivered exclusively via the base document's
              authenticated pull step, never in the CIBA request or the
              opaque wake push.</dd>
            <dt>interaction_type=input_manual</dt>
            <dd><tt>binding_message</tt> carries the code the user
              transcribes.</dd>
          </dl>
        </li>
        <li><t>
          If the RP omits <tt>interaction_type</tt>, the AS uses
          <tt>minimum_interaction_type</tt> as the default: an RP never
          receives a weaker ceremony than the AS's floor by omission.
        </t></li>
      </ul>
    </section>

    <section anchor="no-other-changes" numbered="true" toc="default">
      <name>Scope Boundary</name>
      <t>
        For the avoidance of doubt: discovery document shape and fields,
        registration flow (including the registration-token JWT, the
        PAR-pattern registration POST, and the <tt>push_device</tt>
        scope), key rotation (grace window, DPoP binding, replay nonce),
        device management (<tt>max_devices_per_user</tt>, atomic device
        replacement, primary-device selection), account recovery, push
        transport (opaque wake payload, mandatory JWE, signed downgrade
        reporting), and the trust/attestation model (registry BLOB
        format, root pinning, registry-list redundancy) are all defined
        solely by <xref
        target="I-D.bandyopadhayaya-oauth-push-device"/> and apply to a
        CIBA-binding AS exactly as written there. This document adds no
        new endpoints and no new discovery fields.
      </t>
    </section>

    <section anchor="security" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>
        This document inherits all security properties of <xref
        target="I-D.bandyopadhayaya-oauth-push-device"/> without
        modification; see that document's Security Considerations
        section.
      </t>
      <t>
        The <tt>device_revoked</tt> error (<xref
        target="revocation-binding"/>) is purely additive to CIBA's error
        surface and introduces no new attack surface beyond what
        <tt>access_denied</tt> already exposes: it discloses only that a
        given device is revoked, which the party attempting
        <tt>/bc-authorize</tt> for that device already necessarily
        controls or has observed failing.
      </t>
      <t>
        The <tt>interaction_type</tt> downgrade protection (<xref
        target="interaction-binding"/>) is the mechanism that
        specifically defends against MFA-fatigue/prompt-bombing attacks
        for CIBA-bound deployments; an AS that fails to enforce
        <tt>minimum_interaction_type</tt> reintroduces that exposure
        despite implementing the base document correctly.
      </t>
    </section>

    <section anchor="iana" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>
        This document defines no new discovery fields, endpoints, or
        well-known URIs; all IANA actions are performed by <xref
        target="I-D.bandyopadhayaya-oauth-push-device"/>. This document
        defines one new CIBA error code, <tt>device_revoked</tt> (<xref
        target="revocation-binding"/>), and one new CIBA
        authorization-request parameter, <tt>interaction_type</tt> (<xref
        target="interaction-binding"/>); if CIBA Core or a future revision
        thereof establishes an IANA registry for its error codes or
        request parameters, this document's values should be registered
        there.
      </t>
    </section>

  </middle>

  <back>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner"/>
            <date year="1997" month="March"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author initials="B." surname="Leiba" fullname="B. Leiba"/>
            <date year="2017" month="May"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
        </reference>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author initials="D." surname="Hardt" fullname="D. Hardt" role="editor"/>
            <date year="2012" month="October"/>
          </front>
          <seriesInfo name="RFC" value="6749"/>
        </reference>
        <reference anchor="OIDC.CIBA" target="https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0.html">
          <front>
            <title>OpenID Connect Client-Initiated Backchannel Authentication Flow - Core 1.0</title>
            <author initials="G." surname="Fernandez" fullname="G. Fernandez"/>
            <author initials="F." surname="Walter" fullname="F. Walter"/>
            <author initials="A." surname="Nennker" fullname="A. Nennker"/>
            <author initials="D." surname="Tonge" fullname="D. Tonge"/>
            <author initials="B." surname="Campbell" fullname="B. Campbell"/>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="I-D.bandyopadhayaya-oauth-push-device">
          <front>
            <title>Discovery and Device Lifecycle for OAuth Push-Based Authentication</title>
            <author initials="J." surname="Bandyopadhayaya" fullname="J. Bandyopadhayaya"/>
            <date year="2026" month="July"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bandyopadhayaya-oauth-push-device-00"/>
        </reference>
      </references>

      <references>
        <name>Informative References</name>
        <reference anchor="WebAuthn2" target="https://www.w3.org/TR/webauthn-2/">
          <front>
            <title>Web Authentication: An API for accessing Public Key Credentials Level 2</title>
            <author><organization>W3C</organization></author>
            <date year="2021" month="April"/>
          </front>
        </reference>
      </references>

    <section anchor="acks" numbered="false" toc="default">
      <name>Acknowledgments</name>
      <t>
        This document's structure follows the companion-specification
        precedent of WebAuthn and CTAP, cited in <xref
        target="intro"/>.
      </t>
    </section>

  </back>
</rfc>
