<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-fane-opena2a-aap-01"
     ipr="trust200902"
     category="std"
     submissionType="IETF"
     tocInclude="true"
     sortRefs="true"
     symRefs="true"
     version="3">

  <front>
    <title abbrev="AAP">OpenA2A Agent Authorization Protocol (AAP)</title>
    <seriesInfo name="Internet-Draft" value="draft-fane-opena2a-aap-01"/>

    <author fullname="Abdel Fane" initials="A." surname="Fane">
      <organization>OpenA2A</organization>
      <address>
        <postal>
          <country>US</country>
        </postal>
        <email>info@opena2a.org</email>
      </address>
    </author>

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

    <area>Security</area>
    <workgroup>Individual Submission</workgroup>
    <keyword>agent authorization</keyword>
    <keyword>AI agents</keyword>
    <keyword>delegation</keyword>
    <keyword>credential isolation</keyword>
    <keyword>behavioral attestation</keyword>

    <abstract>
      <t>This document defines the OpenA2A Agent Authorization Protocol (AAP), a
      protocol for authorization in AI agent systems. AAP provides mechanisms
      for agent identity assertion, scoped capability grants, cross-agent
      delegation, behavioral attestation, cross-organizational federation, and
      revocation propagation. AAP is the authorization complement to agent
      communication protocols such as A2A and the Model Context Protocol, in the
      same way that OAuth 2.0 complements HTTP for web applications.</t>

      <t>AAP has two layers. The token model, defined in this document, specifies
      the AAP credentials and assertions: what they contain, how they are signed,
      and how they are verified. A companion broker and resolution layer
      specifies how an agent obtains and exercises a grant without the credential
      value ever entering the agent's reasoning context. This confinement
      property, that no secret, temporary credential, or backend identifier
      reaches the agent or the model behind it, is the primary design goal of the
      protocol.</t>
    </abstract>
  </front>

  <middle>

    <section anchor="introduction">
      <name>Introduction</name>
      <t>AI agent systems present authorization challenges that existing
      protocols such as OAuth 2.0 <xref target="RFC6749"/>, SAML, and OpenID
      Connect were not designed to address. Agents are non-deterministic: the
      same agent with identical permissions can behave differently depending on
      its inputs, conversation history, and model state. Static authorization
      grants cannot account for this behavioral variability.</t>

      <t>A second, agent-specific hazard is credential exposure. An autonomous
      agent that holds a secret in its reasoning context can be induced, through
      prompt injection or tool-output poisoning, to disclose or misuse it. AAP
      therefore treats the confinement of credentials away from the agent's
      reasoning context as a first-class requirement rather than a deployment
      detail.</t>

      <t>AAP introduces six protocol components that together provide
      authorization coverage for agent-to-agent, agent-to-service, and
      human-to-agent interactions:</t>

      <ol spacing="normal">
        <li><t><strong>Agent Identity Token (AIT)</strong>: a cryptographic
        identity assertion.</t></li>
        <li><t><strong>Capability Grant Token (CGT)</strong>: a scoped,
        short-lived authorization.</t></li>
        <li><t><strong>Delegation Assertion (DA)</strong>: cross-agent capability
        delegation.</t></li>
        <li><t><strong>Behavioral Attestation Claim (BAC)</strong>: a real-time
        behavioral state proof.</t></li>
        <li><t><strong>Cross-Organizational Trust Federation</strong>: mutual
        trust between issuing authorities.</t></li>
        <li><t><strong>Revocation Propagation</strong>: federated revocation
        within a bounded interval.</t></li>
      </ol>

      <t>AAP is positioned as the authorization complement to agent
      communication protocols such as A2A <xref target="A2A"/> and the Model
      Context Protocol <xref target="MCP"/>, which convey messages and tool
      invocations but do not themselves define scoped, attested authorization.</t>

      <t>A governing constraint applies to every choice in AAP: the protocol and
      its vocabulary are open, and nothing in AAP requires a vendor, cloud
      provider, or government to surrender control of its own trust root. The
      topology is a trust program of federated, conformant Root Authorities, not
      a single root, the same property that let DNS, TLS, OAuth, and OpenID
      Connect achieve broad deployment.</t>
    </section>

    <section anchor="conventions">
      <name>Conventions and 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>

      <t>Some JSON examples in this document carry digest values longer than
      the 72-character line limit; those lines are folded using the single
      backslash strategy of <xref target="RFC8792"/>. The backslash fold
      marker and the leading whitespace of a continuation line are display
      artifacts, not part of the example content.</t>

      <dl spacing="normal">
        <dt>Agent</dt>
        <dd>An AI system that can take actions on behalf of a user or
        organization.</dd>

        <dt>Agent Trust eXtension (ATX)</dt>
        <dd>A signed credential issued by a Registry attesting to an agent's
        identity, code integrity, capabilities, and trust level, as defined in
        <xref target="ATX"/>. The AIT references an ATX by hash.</dd>

        <dt>Agent Security Context (ASC)</dt>
        <dd>Shared state describing an agent's current security posture across
        monitoring components.</dd>

        <dt>Registry / Root Authority</dt>
        <dd>A trust authority that issues ATXs, maintains a transparency log
        <xref target="RFC9162"/>, and computes trust scores. Participants operate
        conformant Root Authorities under the Agent Trust Protocol
        <xref target="ATP"/>.</dd>

        <dt>Broker</dt>
        <dd>A local, operator-controlled component that resolves an abstract
        grant reference to a concrete, scoped action on a resource without
        exposing any credential to the agent, as specified in
        <xref target="AAP-BROKER-PROFILE"/>.</dd>
      </dl>
    </section>

    <section anchor="ait">
      <name>Agent Identity Token (AIT)</name>
      <t>The AIT is a cryptographic assertion of agent identity, analogous to an
      OpenID Connect ID Token. It is presented by an agent to identify itself to
      other agents, services, and infrastructure. An AIT is an identity assertion
      only; it conveys no authorization (see <xref target="sec-trust-authz"/>).</t>

      <t>An AIT is an AAP token in the serialized form of
      <xref target="serialization"/>: a JWT <xref target="RFC7519"/> whose claims
      follow the JWT registry naming convention. The required claims are "iss"
      (the issuing Registry decentralized identifier), "sub" (the agent
      decentralized identifier), "atx_reference" (the SHA-256 of the agent's
      current ATX), "trust_level" (the Registry trust level, an integer from 0 to
      4), "iat" and "exp" (the validity window as NumericDate values, that is,
      seconds since the epoch), and "jti" (a unique token identifier). The
      optional "agent_id", "declared_purpose", and "aap_ver" claims MAY also
      appear.</t>

      <sourcecode type="json"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

{
  "iss": "did:opena2a:authority:opena2a.org",
  "sub": "did:opena2a:agent:acme/orders-reader",
  "agent_id": "aim_orders_reader",
  "atx_reference":
    "sha256:2052879dda15b1ca5e60319e3477a400\
      8412bffdaf3c3566c658795a48cab8fd",
  "declared_purpose": "Reads order records for reporting",
  "trust_level": 4,
  "iat": 1780315200,
  "exp": 1780318800,
  "jti": "1c9f2e8a7b6d5c4e3f2a1b0c9d8e7f6a"
}
]]></sourcecode>

      <t>No reference implementation mints AITs yet; the claim schema and this
      generated example pin the form for implementers.</t>

      <t>AIT verification MUST be local. The verifier checks the signature
      against the issuer's public key, distributed via the trust anchor
      mechanism. No network call to a Registry is required at verification
      time.</t>
    </section>

    <section anchor="cgt">
      <name>Capability Grant Token (CGT)</name>
      <t>The CGT is a short-lived, scoped authorization token, analogous to an
      OAuth 2.0 access token <xref target="RFC6749"/>. It authorizes a specific
      capability exercise under fine-grained authorization constraints. In a
      broker deployment <xref target="AAP-BROKER-PROFILE"/>, the CGT is what the
      broker mints from a verified ATX before exchanging it for a downstream
      credential.</t>

      <t>The CGT claim set is ratified byte-for-byte from the reference broker
      implementation. The required claims are "iss" (the minting broker's issuer
      identifier), "sub" (the agent decentralized identifier, taken from the
      verified ATX and never from agent input), "aud" (the downstream audience or
      resource), "scope" (the downstream authorization scope as a string, for
      example "orders.read"), "trust_class" (the abstract ATX capability
      exercised for this grant, in "class:action" form), "issuer_chain" (the ATX
      issuer chain), "trust_level" (an integer from 0 to 4), "iat" and "exp" (the
      validity window, where "exp" minus "iat" is the policy time-to-live), and
      "jti". The "fga_constraints", "intent_verified", "max_uses", and
      "context_required" claims are OPTIONAL and are not minted by the v1
      reference.</t>

      <sourcecode type="json"><![CDATA[
{
  "iss": "https://broker.acme.example",
  "sub": "did:opena2a:agent:acme/orders-reader",
  "aud": "https://api.orders.internal",
  "scope": "orders.read",
  "trust_class": "orders:read",
  "issuer_chain": ["did:opena2a:authority:opena2a.org"],
  "trust_level": 4,
  "iat": 1780315200,
  "exp": 1780315500,
  "jti": "9f8e7d6c5b4a39281706f5e4d3c2b1a0"
}
]]></sourcecode>

      <t>In a broker deployment the CGT is used as the OAuth 2.0 Token Exchange
      <xref target="RFC8693"/> "subject_token" with a "subject_token_type" of
      "urn:ietf:params:oauth:token-type:jwt", so the downstream authorization
      server verifies it as a standard JWT against the broker's published key
      material.</t>

      <t>A CGT has a bounded time-to-live. This document defines three tiers;
      profiles MAY define others:</t>
      <dl spacing="compact">
        <dt>STANDARD</dt><dd>4 hours.</dd>
        <dt>PRIVILEGED</dt><dd>30 minutes.</dd>
        <dt>SUPER_PRIVILEGED</dt><dd>15 minutes, no renewal; human approval
        REQUIRED.</dd>
      </dl>
    </section>

    <section anchor="da">
      <name>Delegation Assertion (DA)</name>
      <t>The DA enables cross-agent capability delegation, analogous to OAuth 2.0
      Token Exchange <xref target="RFC8693"/>. A delegatee's capability scope
      MUST NOT exceed the delegator's scope. The exchange mode of the broker
      profile is a realization of the DA over <xref target="RFC8693"/>.</t>

      <t>A DA is subject to the following constraints:</t>
      <ul spacing="normal">
        <li>A maximum delegation depth limits the length of a delegation
        chain.</li>
        <li>The delegator's ATX hash is embedded to preserve an audit trail.</li>
        <li>Scope is cryptographically bounded and MUST NOT be broadened by a
        delegatee.</li>
      </ul>

      <t>A DA is an AAP token in the form of <xref target="serialization"/>: the
      CGT claim set plus the delegation members of <xref target="RFC8693"/>. Here
      "sub" is the delegatee; "act" carries the delegating agent as
      {"sub": delegator}, with nested "act" objects expressing a chain, innermost
      actor first; "max_depth" bounds further delegation; and "delegator_atx"
      embeds the delegator's ATX hash for the audit trail. The delegatee's "scope"
      and "trust_class" MUST be equal to or a subset of the delegator's.</t>

      <sourcecode type="json"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

{
  "iss": "https://broker.acme.example",
  "sub": "did:opena2a:agent:acme/reporting-bot",
  "aud": "https://api.orders.internal",
  "scope": "orders.read",
  "trust_class": "orders:read",
  "issuer_chain": ["did:opena2a:authority:opena2a.org"],
  "trust_level": 4,
  "act": { "sub": "did:opena2a:agent:acme/orders-reader" },
  "max_depth": 1,
  "delegator_atx":
    "sha256:2052879dda15b1ca5e60319e3477a400\
      8412bffdaf3c3566c658795a48cab8fd",
  "iat": 1780315200,
  "exp": 1780315500,
  "jti": "4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d"
}
]]></sourcecode>

      <t>The v1 reference realizes delegation through the broker profile's
      Exchange mode, where the broker assertion is the subject token of the
      <xref target="RFC8693"/> exchange; it does not yet mint standalone DAs with
      an "act" chain.</t>
    </section>

    <section anchor="bac">
      <name>Behavioral Attestation Claim (BAC)</name>
      <t>The BAC is a short-lived signed assertion of an agent's current
      behavioral state, with a time-to-live on the order of 60 seconds. It has no
      direct parallel in existing web protocols; it exists because agents are
      non-deterministic.</t>

      <t>A BAC declares its level in the "bac_level" claim, an integer 1, 2, or
      3. The levels are cumulative: an L2 claim carries the L1 members, and an L3
      claim carries all of them.</t>
      <dl spacing="compact">
        <dt>1</dt><dd>Build-time attestation: the "atx_reference".</dd>
        <dt>2</dt><dd>Runtime self-attestation: additionally the "binary_hash".</dd>
        <dt>3</dt><dd>Behavioral continuity: additionally the "drift_score", the
        "anomaly_state", and "intent_verified".</dd>
      </dl>

      <sourcecode type="json"><![CDATA[
NOTE: '\' line wrapping per RFC 8792

{
  "iss": "did:opena2a:authority:opena2a.org",
  "sub": "did:opena2a:agent:acme/orders-reader",
  "bac_level": 3,
  "atx_reference":
    "sha256:2052879dda15b1ca5e60319e3477a400\
      8412bffdaf3c3566c658795a48cab8fd",
  "binary_hash":
    "sha256:479bd28a55e3a3eb20b9f5b48202318d\
      5de9d0dbea9e6df20b2ee7ff95a4c135",
  "drift_score": 0.04,
  "anomaly_state": "nominal",
  "intent_verified": true,
  "iat": 1780315200,
  "exp": 1780315260,
  "jti": "7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b"
}
]]></sourcecode>

      <t>The validity window MUST satisfy "exp" minus "iat" less than or equal to
      60 seconds. BAC verification is local: the receiver verifies the signature
      against the issuing Registry instance's published public key, under the
      suite model of <xref target="sec-pq"/>. The post-quantum profile, an
      ML-DSA-65 <xref target="FIPS204"/> signature alongside Ed25519 via the
      multi-signature form of <xref target="serialization"/>, is shipped for
      CGTs (the reference broker mints it and the conformance suite carries
      generated hybrid fixtures); for BACs it remains a target: no
      implementation mints BACs yet, and the v1 BAC fixtures carry a single
      Ed25519 signature.</t>
    </section>

    <section anchor="federation">
      <name>Cross-Organizational Federation</name>
      <t>Federation follows a PKI-style hierarchy: subordinate Registry nodes
      (Root Authorities) issue ATXs that are trusted by their peers according to
      published trust lists. Any federated node can verify any other node's ATXs
      without direct contact. No participant joins a central operator; each
      operates a conformant Root Authority and cross-trusts its peers.</t>

      <section anchor="revocation">
        <name>Revocation Propagation</name>
        <t>When any node revokes an ATX, the revocation MUST propagate to all
        federation members within 60 seconds via signed push. No member is
        required to poll. Authorization revocation in the broker profile is bound
        entirely to this mechanism; the profile defines no separate revocation
        system.</t>
      </section>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>

      <section anchor="sec-confinement">
        <name>Credential Confinement</name>
        <t>Where AAP is deployed via a broker, no credential value, temporary
        token, or backend identifier may enter an agent's reasoning context. This
        requirement is normative in the broker profile
        <xref target="AAP-BROKER-PROFILE"/> and is the property that defends
        against the credential-harvest and exfiltration attack classes catalogued
        in <xref target="THREATMATRIX"/>. An agent emits an abstract grant
        reference; the broker verifies the agent's ATX, evaluates resource
        policy, obtains a scoped credential, performs the operation, and returns
        only the result.</t>
      </section>

      <section anchor="sec-replay">
        <name>Replay Prevention</name>
        <t>All tokens include a unique identifier in the "jti" claim: 16 random
        bytes encoded as 32 lowercase hexadecimal characters, as minted by the
        reference implementation. Receivers MUST track used identifiers for the
        token's time-to-live window and MUST reject a repeated identifier. The
        reference verifiers enforce this: an identifier is remembered from first
        acceptance until the token's "exp", and a second presentation inside
        that window is rejected after all other checks pass.</t>
      </section>

      <section anchor="sec-pq">
        <name>Cryptographic Agility and Post-Quantum Readiness</name>
        <t>The signature suite is a named, swappable field, the JOSE "alg" of each
        signature's protected header (<xref target="serialization"/>), so suites
        can be added or retired by negotiation rather than by a new credential
        format. A verifier MUST reject a token whose declared suite it does not
        support rather than silently downgrade. Suite acceptance is pinned by
        verifier policy per path, never selected by the token; a producer
        configured for the hybrid profile on a path MUST NOT fall back to a
        classical-only token on that path except through explicit version
        negotiation.</t>

        <t>The v1 suite registry (<xref target="serialization"/>) contains two
        active entries: "EdDSA" (Ed25519 <xref target="RFC8037"/>) and
        "ML-DSA-65" (FIPS 204 <xref target="FIPS204"/>, whose JOSE "alg"
        identifier and AKP key type are registered by
        <xref target="RFC9964"/>). The post-quantum profile is a hybrid of
        Ed25519 and ML-DSA-65, carried as two signature entries of the
        multi-signature form (<xref target="serialization"/>), one per suite: a
        hybrid token verifies only if at least one ML-DSA-65 signature and at
        least one Ed25519 signature verify, with every declared entry verifying.
        The hybrid form is RECOMMENDED wherever both ends implement AAP;
        single-suite compact tokens remain the interoperability baseline.
        ML-DSA-65 signing uses the empty context string and no pre-hash variant,
        as <xref target="RFC9964"/> requires, and ML-DSA-65 verification keys
        publish as AKP JSON Web Keys. The reference implementation mints all
        three forms, and the conformance suite carries generated hybrid and
        ML-DSA-65 fixtures, including rejection fixtures in which one of a
        hybrid token's two signatures is invalid. Key exchange, where AAP
        deployments negotiate transport keys, targets a hybrid of X25519 and
        ML-KEM-768 <xref target="FIPS203"/>; ML-KEM has no final JOSE
        registration, so that row remains reserved on the adoption path this
        section previously applied to ML-DSA-65.</t>
      </section>

      <section anchor="sec-intent">
        <name>Intent Verification</name>
        <t>Semantic intent classification can express constraints that static
        policies cannot. Intent classification is probabilistic; systems MUST NOT
        rely on it alone to authorize irreversible actions.</t>
      </section>

      <section anchor="sec-trust-authz">
        <name>Trust Is Not Authorization</name>
        <t>A valid AIT or ATX is an identity and posture assertion, not
        permission to act on a resource, and trust is not transitive.
        Authorization exists only where a local policy grants it. Brokers MUST
        default-deny.</t>
      </section>
    </section>

    <section anchor="serialization">
      <name>Token Serialization and Signing</name>
      <t>This section pins the byte-level form of every AAP token: the AIT, CGT,
      DA, and BAC. AAP tokens are JOSE objects, that is, JWTs
      <xref target="RFC7519"/> over JWS <xref target="RFC7515"/>. The form is
      ratified from the reference implementation: what the reference broker
      actually signs is normative, byte for byte.</t>

      <t>The signed bytes are the JWS Signing Input:</t>
      <sourcecode><![CDATA[
ASCII( BASE64URL(UTF8(protected header)) || "." ||
       BASE64URL(payload) )
]]></sourcecode>

      <t>AAP defines no other canonical form: serialization is canonicalization.
      The producer serializes the header and claim set once, as compact JSON with
      no insignificant whitespace, and signs those exact bytes; a verifier
      operates on the transmitted base64url segments and never re-serializes.
      There is no separate canonicalization step and no field projection. This is
      a deliberate difference from ATX and ATP, and it exists because AAP tokens,
      uniquely in the family, are verified by foreign systems: OAuth 2.0 Token
      Exchange <xref target="RFC8693"/> authorization servers and OpenID
      Connect-style verifiers that understand exactly one thing, a standard JWT.
      Base64url is unpadded, per <xref target="RFC7515"/>.</t>

      <t>The protected header carries "alg" (a suite identifier from the registry
      below), "typ" (the value "JWT"), and "kid" (the key identifier of the
      signing key in the issuer's published key material; Ed25519 keys publish
      as OKP JSON Web Keys and ML-DSA-65 keys as AKP JSON Web Keys per
      <xref target="RFC9964"/>).</t>

      <t>The compact serialization "header.payload.signature" is the v1 baseline
      and is REQUIRED on every interoperability path where a foreign system
      verifies the token; in particular a CGT or DA presented as an
      <xref target="RFC8693"/> "subject_token" MUST be compact. A compact token
      carries exactly one signature, and therefore exactly one suite. The suite
      of a compact token is pinned per path by verifier policy
      (<xref target="sec-pq"/>): "EdDSA" is the interoperability baseline, and
      an "ML-DSA-65" compact token serves counterparties that support the
      <xref target="RFC9964"/> suites. During the current adoption window the
      RECOMMENDED default on foreign-interoperability paths remains "EdDSA",
      because deployed token-exchange and OpenID Connect-style verifiers do not
      yet verify the <xref target="RFC9964"/> suites. Where more
      than one signature is required, the hybrid post-quantum profile of
      <xref target="sec-pq"/>, the token is carried as JWS General JSON
      Serialization (<xref target="RFC7515"/>), with one signature entry per
      suite, each with its own protected header over the same payload. Every
      declared entry MUST verify; a verifier MUST NOT accept a token on a subset
      of its declared signatures. A general-form token that declares any
      ML-DSA-65 entry is on the hybrid profile and MUST carry at least one
      Ed25519 entry and at least one ML-DSA-65 entry; a verifier MUST reject a
      general-form token missing either family, so a stripped hybrid token can
      never degrade to single-family acceptance. Multiple entries of one suite
      with no ML-DSA-65 entry remain a legal multi-signature (co-signature)
      form.</t>

      <t>The v1 suite registry contains two entries:</t>
      <dl spacing="compact">
        <dt>EdDSA</dt><dd>Ed25519 <xref target="RFC8037"/>. Active; the
        interoperability baseline.</dd>
        <dt>ML-DSA-65</dt><dd>FIPS 204 <xref target="FIPS204"/>, JOSE
        registration <xref target="RFC9964"/>. Active. Hybrid with EdDSA via the
        multi-signature form, or single-suite compact on
        post-quantum-capable interoperability paths. ML-DSA-44 and ML-DSA-87,
        though registered for JOSE, are not in this registry and are rejected as
        unknown suites.</dd>
      </dl>
      <t>Adding or retiring a suite is a change to this registry plus version
      negotiation, never a change of format.</t>

      <t>Claim names use the JWT registry convention, lowercase with snake_case
      for compound names such as "trust_class" and "issuer_chain". This is a
      deliberate exception to the OpenA2A camelCase JSON convention, which governs
      API responses rather than IETF-track token claims. The "iat" and "exp"
      claims are NumericDate values (seconds since the epoch), not date strings.
      The optional "aap_ver" claim carries the claim-schema version; it is
      OPTIONAL in v1 and REQUIRED from the first federated version, where a peer
      broker must select a claim schema without a shared channel.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests registration of the "aap" URI scheme in the
      Uniform Resource Identifier (URI) Schemes registry, and, via the broker
      profile <xref target="AAP-BROKER-PROFILE"/>, the "grant" URI scheme. It
      further anticipates registries for AAP protocol versions, credential-provider
      mode identifiers, and signature suite identifiers, to be coordinated with
      the ATX signature suite registry <xref target="ATX"/>. Until those
      registries exist, the signature suite registry of
      <xref target="serialization"/> is managed within this specification. The
      concrete registration templates will be provided in a future revision of
      this document.</t>
    </section>

  </middle>

  <back>
    <references>
      <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="S. Bradner"/>
          <date year="1997" month="March"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
      </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="B. Leiba"/>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
      </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="D. Hardt" role="editor"/>
          <date year="2012" month="October"/>
        </front>
        <seriesInfo name="RFC" value="6749"/>
      </reference>

      <reference anchor="RFC7515" target="https://www.rfc-editor.org/info/rfc7515">
        <front>
          <title>JSON Web Signature (JWS)</title>
          <author initials="M." surname="Jones" fullname="M. Jones"/>
          <author initials="J." surname="Bradley" fullname="J. Bradley"/>
          <author initials="N." surname="Sakimura" fullname="N. Sakimura"/>
          <date year="2015" month="May"/>
        </front>
        <seriesInfo name="RFC" value="7515"/>
      </reference>

      <reference anchor="RFC7519" target="https://www.rfc-editor.org/info/rfc7519">
        <front>
          <title>JSON Web Token (JWT)</title>
          <author initials="M." surname="Jones" fullname="M. Jones"/>
          <author initials="J." surname="Bradley" fullname="J. Bradley"/>
          <author initials="N." surname="Sakimura" fullname="N. Sakimura"/>
          <date year="2015" month="May"/>
        </front>
        <seriesInfo name="RFC" value="7519"/>
      </reference>

      <reference anchor="RFC8037" target="https://www.rfc-editor.org/info/rfc8037">
        <front>
          <title>CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE)</title>
          <author initials="I." surname="Liusvaara" fullname="I. Liusvaara"/>
          <date year="2017" month="January"/>
        </front>
        <seriesInfo name="RFC" value="8037"/>
      </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="M. Jones"/>
          <author initials="A." surname="Nadalin" fullname="A. Nadalin"/>
          <author initials="B." surname="Campbell" fullname="B. Campbell" role="editor"/>
          <author initials="J." surname="Bradley" fullname="J. Bradley"/>
          <author initials="C." surname="Mortimore" fullname="C. Mortimore"/>
          <date year="2020" month="January"/>
        </front>
        <seriesInfo name="RFC" value="8693"/>
      </reference>

      <reference anchor="RFC9162" target="https://www.rfc-editor.org/info/rfc9162">
        <front>
          <title>Certificate Transparency Version 2.0</title>
          <author initials="B." surname="Laurie" fullname="B. Laurie"/>
          <author initials="E." surname="Messeri" fullname="E. Messeri"/>
          <author initials="R." surname="Stradling" fullname="R. Stradling"/>
          <date year="2021" month="December"/>
        </front>
        <seriesInfo name="RFC" value="9162"/>
      </reference>

      <reference anchor="FIPS203" target="https://doi.org/10.6028/NIST.FIPS.203">
        <front>
          <title>Module-Lattice-Based Key-Encapsulation Mechanism Standard</title>
          <author>
            <organization>National Institute of Standards and Technology</organization>
          </author>
          <date year="2024" month="August"/>
        </front>
        <seriesInfo name="FIPS" value="203"/>
      </reference>

      <reference anchor="FIPS204" target="https://doi.org/10.6028/NIST.FIPS.204">
        <front>
          <title>Module-Lattice-Based Digital Signature Standard</title>
          <author>
            <organization>National Institute of Standards and Technology</organization>
          </author>
          <date year="2024" month="August"/>
        </front>
        <seriesInfo name="FIPS" value="204"/>
      </reference>

      <reference anchor="RFC9964" target="https://www.rfc-editor.org/info/rfc9964">
        <front>
          <title>ML-DSA for JSON Object Signing and Encryption (JOSE) and CBOR
          Object Signing and Encryption (COSE)</title>
          <author initials="M." surname="Prorock"/>
          <author initials="O." surname="Steele"/>
          <date year="2026" month="May"/>
        </front>
        <seriesInfo name="RFC" value="9964"/>
        <seriesInfo name="DOI" value="10.17487/RFC9964"/>
      </reference>

      <reference anchor="ATX" target="https://specs.opena2a.org/atx">
        <front>
          <title>Agent Trust eXtension (ATX) Credential Format</title>
          <author initials="A." surname="Fane" fullname="Abdel Fane">
            <organization>OpenA2A</organization>
          </author>
          <date year="2026"/>
        </front>
      </reference>

      <reference anchor="ATP" target="https://specs.opena2a.org/atp">
        <front>
          <title>Agent Trust Protocol (ATP)</title>
          <author initials="A." surname="Fane" fullname="Abdel Fane">
            <organization>OpenA2A</organization>
          </author>
          <date year="2026"/>
        </front>
      </reference>
    </references>

    <references>
      <name>Informative References</name>

      <reference anchor="RFC8792" target="https://www.rfc-editor.org/info/rfc8792">
        <front>
          <title>Handling Long Lines in Content of Internet-Drafts and RFCs</title>
          <author initials="K." surname="Watsen" fullname="K. Watsen"/>
          <author initials="E." surname="Auerswald" fullname="E. Auerswald"/>
          <author initials="A." surname="Farrel" fullname="A. Farrel"/>
          <author initials="Q." surname="Wu" fullname="Q. Wu"/>
          <date year="2020" month="June"/>
        </front>
        <seriesInfo name="RFC" value="8792"/>
      </reference>

      <reference anchor="AAP-BROKER-PROFILE" target="https://specs.opena2a.org/aap/broker-profile">
        <front>
          <title>AAP Broker and Resolution Profile</title>
          <author initials="A." surname="Fane" fullname="Abdel Fane">
            <organization>OpenA2A</organization>
          </author>
          <date year="2026"/>
        </front>
      </reference>

      <reference anchor="A2A" target="https://a2aproject.github.io/A2A/">
        <front>
          <title>Agent2Agent (A2A) Protocol Specification</title>
          <author>
            <organization>A2A Project</organization>
          </author>
          <date year="2026"/>
        </front>
      </reference>

      <reference anchor="MCP" target="https://modelcontextprotocol.io/">
        <front>
          <title>Model Context Protocol Specification</title>
          <author>
            <organization>Model Context Protocol</organization>
          </author>
          <date year="2026"/>
        </front>
      </reference>

      <reference anchor="THREATMATRIX" target="https://threats.opena2a.org">
        <front>
          <title>AI Agent Threat Matrix</title>
          <author>
            <organization>OpenA2A</organization>
          </author>
          <date year="2026"/>
        </front>
      </reference>

      <reference anchor="CRUZ-AAP" target="https://datatracker.ietf.org/doc/draft-aap-oauth-profile/">
        <front>
          <title>Agent Authorization Profile (AAP) for OAuth 2.0</title>
          <author surname="Cruz"/>
          <date year="2026"/>
        </front>
      </reference>

      <reference anchor="DUNBAR-AAP" target="https://datatracker.ietf.org/doc/draft-dunbar-agent-attachment/">
        <front>
          <title>Agent Attachment Protocol (AAP)</title>
          <author surname="Dunbar"/>
          <date year="2026"/>
        </front>
      </reference>

      <reference anchor="MISHRA-DAAP" target="https://datatracker.ietf.org/doc/draft-mishra-oauth-agent-grants/">
        <front>
          <title>Delegated Agent Authorization Protocol (DAAP)</title>
          <author surname="Mishra"/>
          <date year="2026"/>
        </front>
      </reference>
    </references>

    <section anchor="related-work">
      <name>Related Work</name>
      <t>The "AAP" acronym is contested in this space. An independent
      Internet-Draft, "Agent Authorization Profile" <xref target="CRUZ-AAP"/>,
      specifies an OAuth 2.0 and JSON Web Token profile for agent authorization;
      it is a profile of existing OAuth mechanisms and introduces no new protocol
      elements. A separate Internet-Draft uses the same "AAP" letters for an
      unrelated "Agent Attachment Protocol" <xref target="DUNBAR-AAP"/> concerned
      with edge-node attachment. The present document defines a distinct token
      model (AIT, CGT, DA, and BAC), a broker-based credential-confinement layer,
      and a federation and revocation model. These documents are author-namespaced
      and are intended to coexist on the Internet-Drafts record.</t>

      <t>Closest in intent is the "Delegated Agent Authorization Protocol"
      <xref target="MISHRA-DAAP"/>, which extends OAuth 2.0 with agent grant and
      delegation semantics. The present document differs in that authorization is
      exercised through a local broker that confines the credential value away
      from the agent's reasoning context (<xref target="sec-confinement"/>) and
      binds to behavioral attestation (<xref target="bac"/>), rather than issuing
      an OAuth token the agent holds directly. Related agent-identity drafts using
      the "AIP" acronym address identity assertion rather than the
      scoped-authorization and credential-confinement problems that are the focus
      of this document.</t>
    </section>

    <section anchor="ack">
      <name>Acknowledgments</name>
      <t>This specification was authored in the open and benefits from review of
      its authorization and delegation model by the OpenA2A community.</t>
    </section>
  </back>

</rfc>
