<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.17 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-barnes-oauth-pika-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="PIKA">Proof of Issuer Key Authority (PIKA)</title>
    <seriesInfo name="Internet-Draft" value="draft-barnes-oauth-pika-01"/>
    <author fullname="Richard L. Barnes">
      <organization>Cisco</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>
    <author fullname="Sharon Goldberg">
      <organization>BastionZero, Inc.</organization>
      <address>
        <email>goldbe@bastionzero.com</email>
      </address>
    </author>
    <date year="2024" month="July" day="08"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>openid</keyword>
    <keyword>verifiable credential</keyword>
    <keyword>openpubkey</keyword>
    <abstract>
      <?line 51?>

<t>A relying party verifying a JSON Web Token (JWT) needs to verify that the public
key used to verify the signature legitimately represents the issuer represented
in the "iss" claim of the JWT.  Today, relying parties commonly use the "iss"
claim to fetch a set of authorized signing keys over HTTPS, relying on the
security of HTTPS to establish the authority of the downloaded keys for that
issuer.  The ephemerality of this proof of authority makes it unsuitable for use
cases where a JWT might need to be verified for some time.  In this document, we
define a format for Proofs of Issuer Key Authority, which establish the
authority of a key using a signed object instead of an HTTPS connection.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://bifurcation.github.io/redistributable-jwks/draft-barnes-oauth-redistributable-jwks.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-barnes-oauth-pika/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web Authorization Protocol Working Group mailing list (<eref target="mailto:oauth@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/oauth/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/oauth/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/bifurcation/redistributable-jwks"/>.</t>
    </note>
  </front>
  <middle>
    <?line 63?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>A relying party verifying a JSON Web Token (JWT) <xref target="RFC7519"/> needs to verify
that the public key used to verify the signature legitimately represents the
issuer represented in the "iss" claim of the JWT.</t>
      <t>Today, relying parties commonly use the <tt>iss</tt> claim to fetch a set of authorized
signing keys over HTTPS, relying on the security of HTTPS to establish the
authority of the downloaded keys for that issuer.  For example, in OpenID
Connect Discovery <xref target="OIDC-Discovery"/>, the <tt>iss</tt> claim is used to form a URL
from which issuer metadata is downloaded over HTTPS.  The issuer's JWK set is
linked via the <tt>jwks_uri</tt> field in the metadata.  The SD-JWT-VC specification
describes a similar HTTPS-based mechanism for discovering the valid keys for an
issuer (see <xref section="5" sectionFormat="of" target="I-D.ietf-oauth-sd-jwt-vc"/>).</t>
      <t>These HTTPS-based authority mechanisms are "live", in the sense that they can
only prove the authority of a key to someone who does an HTTPS transaction with
the relevant server.  The fact that the server needs to be reachable and
responsive at the time the JWT is being validated is a serious limitation in
some use cases, two examples of which are given below.</t>
      <t>In this document, we define Proofs of Issuer Key Authority (PIKA), a format for a
redistributable proof of authority for an issuer key.  As in OIDC and SD-JWT-VC,
we assume that issuers are identified by HTTPS URLs, or at least by domain
names.  A PIKA is then simply a JWT whose payload contains the
issuer key in question, and whose header contains an X.509 certificate proving
that the PIKA-signing key is authoritative for the issuer's domain name.</t>
      <figure anchor="fig-trust-model">
        <name>Trust model for PIKA or HTTPS-based discovery</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="288" viewBox="0 0 288 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 72,64 L 72,144" fill="none" stroke="black"/>
              <path d="M 120,128 L 120,160" fill="none" stroke="black"/>
              <path d="M 152,32 L 152,64" fill="none" stroke="black"/>
              <path d="M 184,160 L 184,176" fill="none" stroke="black"/>
              <path d="M 184,208 L 184,240" fill="none" stroke="black"/>
              <path d="M 232,224 L 232,256" fill="none" stroke="black"/>
              <path d="M 256,128 L 256,160" fill="none" stroke="black"/>
              <path d="M 280,224 L 280,256" fill="none" stroke="black"/>
              <path d="M 8,32 L 152,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 152,64" fill="none" stroke="black"/>
              <path d="M 120,128 L 256,128" fill="none" stroke="black"/>
              <path d="M 72,144 L 112,144" fill="none" stroke="black"/>
              <path d="M 120,160 L 256,160" fill="none" stroke="black"/>
              <path d="M 232,224 L 280,224" fill="none" stroke="black"/>
              <path d="M 184,240 L 224,240" fill="none" stroke="black"/>
              <path d="M 232,256 L 280,256" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="232,240 220,234.4 220,245.6" fill="black" transform="rotate(0,224,240)"/>
              <polygon class="arrowhead" points="120,144 108,138.4 108,149.6" fill="black" transform="rotate(0,112,144)"/>
              <g class="text">
                <text x="44" y="52">Domain</text>
                <text x="92" y="52">name</text>
                <text x="128" y="52">PKI</text>
                <text x="36" y="100">(HTTPS</text>
                <text x="80" y="100">r</text>
                <text x="112" y="100">PIKA)</text>
                <text x="156" y="148">Issuer</text>
                <text x="200" y="148">JWK</text>
                <text x="232" y="148">Set</text>
                <text x="140" y="196">(JWT</text>
                <text x="208" y="196">validation)</text>
                <text x="256" y="244">JWT</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+-----------------+
| Domain name PKI |
+-------+---------+
        |
 (HTTPS or PIKA)
        |
        |     +----------------+
        +---->| Issuer JWK Set |
              +-------+--------+
                      |
               (JWT validation)
                      |
                      |     +-----+
                      +---->| JWT |
                            +-----+
]]></artwork>
        </artset>
      </figure>
      <t>This design preserves the same trust model as in the HTTPS-based proof of
authority; it just swaps the signature in the TLS handshake underlying HTTPS for
an object signature.  PIKAs are thus "redistributable" in the same
sense that an intermediate certificate would be, so that they can be verified
without the issuer being online and reachable.</t>
      <t>We also define a simple syntax for referencing PIKAs keys in metadata documents
such as OIDC Discovery metadata and SD-JWT-VC issuer metadata.</t>
      <section anchor="use-case-end-to-end-security">
        <name>Use Case: End-to-End Security</name>
        <t>In applications using MLS for end-to-end security, endpoints can authenticate to
each other using Verifiable Credentials (VCs) <xref target="I-D.barnes-mls-addl-creds"/>.
These VCs are formatted as JWTs.  In such applications, HTTPS-based proof of
authority is an availability risk to the application and to the VC issuer.</t>
        <t>The risk to the application is clear: A client joining an MLS group needs to
validate the credentials of their peers.  If part of that process entails making
an HTTPS query to validate the authority of the keys used to sign their peers'
credentials, and the relevant HTTPS server is down, then the client will not be
able to join the group and use the application.  Worse, since different peers
may have credentials from different issuers, an outage at any one of those
issuers can cause downtime for the application.</t>
        <t>The use of HTTPS to validate authority also creates unnecessary load on the VC
issuer.  Consider, for example, an MLS-based video conference with 1,000
participants presenting credentials from 10 different issuers, all of whom join
at the start of the meeting.  This situation would create a spike of around
10,000 HTTPS requests to the VC issuer.</t>
        <t>With PIKAs, the clients in a meeting can bundle the proof of authority along
with their VC, avoiding the need for any HTTPS interaction with the issuer at
all.</t>
      </section>
      <section anchor="use-case-verifying-stored-signatures">
        <name>Use Case: Verifying Stored Signatures</name>
        <t>Some applications are interested in verifying historical signatures.  For
example, a container registry might wish to demonstrate that a container was
signed by its author at some time in the past.</t>
        <t>Live HTTPS-based proofs of authority are fundamentally incompatible with these
applications, since the proof of authority they produce cannot be preserved and
reused later.  With PIKAs, a trusted timestamping authority is all
that is needed to achieve the desired properties.</t>
        <t>Suppose the registry stores the following information for each container:</t>
        <ul spacing="normal">
          <li>
            <t>A signature by the container author over the container</t>
          </li>
          <li>
            <t>A JWT attesting to the container author's identity and public key, e.g., a
Verifiable Credential or an OpenPubkey PK Token <xref target="OpenPubkey"/></t>
          </li>
          <li>
            <t>A PIKA providing the JWT issuer's key and proving its authority
for the issuer</t>
          </li>
          <li>
            <t>An assertion by the timestamping authority that all of the above artifacts
existed at a time in the past when they were all valid</t>
          </li>
        </ul>
        <t>Based on the timetamping authority's assertion, a relying party can validate
that at the specified time, the container was signed by an author with the
specified identity, and that the identity was asserted by the specified issuer.</t>
      </section>
      <section anchor="alternatives">
        <name>Alternatives</name>
        <t>An alternative design discussed in <xref section="3.5" sectionFormat="of" target="I-D.ietf-oauth-sd-jwt-vc"/>
is to simply sign the based JWT with an X.509 certified keys.  This design has a
few drawbacks relative to the design described here:</t>
        <t>First, it changes the trust model relative to HTTPS-based proof of authority.
The issuer JWT-signing key is removed as an intermediate step.  This makes it
more difficult for this design to coexist with HTTPS-based proof of identity.</t>
        <t>Second, it removes flexibility that allows for efficiency.  The extra data of
the X.509 certificate chain has to be sent every time the base JWT is sent.
Allowing the two to be decoupled allows for more flexible caching schemes.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="proof-of-issuer-key-authority-format">
      <name>Proof of Issuer Key Authority Format</name>
      <t>Because the requirements for PIKAs are similar to those for OpenID Federation
<xref target="OIDC-Federation"/>, we re-use the Federation Historical Keys Response format as
a base format for PIKAs.</t>
      <t>A PIKA is a JWT meeting the requirements of the Historical Keys Response format
in <xref target="OIDC-Federation"/>.  In particular, the JWT Claims in a PIKA <bcp14>MUST</bcp14> contain
<tt>iss</tt>, <tt>iat</tt>, and <tt>keys</tt> claims. Each JWK in the JWK Set in the <tt>keys</tt> claim
<bcp14>MUST</bcp14> contain <tt>kid</tt> and <tt>exp</tt> claims, and <bcp14>SHOULD</bcp14> contain an <tt>iat</tt> claim.</t>
      <t>A PIKA <bcp14>MUST</bcp14> also satisfy the following additional requirements:</t>
      <ul spacing="normal">
        <li>
          <t>The <tt>iss</tt> field in the JWT Claims <bcp14>MUST</bcp14> be formatted as an HTTPS URL or a
domain name.</t>
        </li>
        <li>
          <t>The JOSE Header of the PIKA <bcp14>MUST</bcp14> contain an <tt>x5c</tt> field.  The contents of this
field <bcp14>MUST</bcp14> represent a certificate chain that authenticates the domain name in
the <tt>iss</tt> field.  The domain name <bcp14>MUST</bcp14> appear as a <tt>dNSName</tt> entry in the
<tt>subjectAltName</tt> extension of the end-entity certificate.</t>
        </li>
        <li>
          <t>The <tt>alg</tt> field of the PIKA <bcp14>MUST</bcp14> represent an algorithm that is
compatible with the subject public key of the certificate in the <tt>x5c</tt>
parameter.</t>
        </li>
        <li>
          <t>The JWT Claims in a PIKA <bcp14>SHOULD</bcp14> contain an <tt>exp</tt> claim.  If an <tt>exp</tt> claim is
not present, then a relying party <bcp14>MUST</bcp14> behave as if the <tt>exp</tt> field were set
to the <tt>notAfter</tt> time in the end-entity certificate in the <tt>x5c</tt> field.</t>
        </li>
      </ul>
      <t><xref target="fig-example-pika"/> shows the contents of the JWT header and JWT payload for an
example PIKA, omitting the full certificate chain:</t>
      <figure anchor="fig-example-pika">
        <name>An example Proof of Issuer Key Authority</name>
        <artwork><![CDATA[
JWT Header:
{
  "alg": "ES256",
  "typ": "JWT",
  "x5c": ["MII..."]
}

JWT Payload:
{
  "iss": "https://server.example.com",
  "iat": 123972394272,
  "exp": 124003930272,
  "keys":
    [
      {
        "kty": "EC",
        "crv": "P-256",
        "alg": "ES256"
        "x": "qiGKLwXRJmJR_AOQpWOHXLX5uYIfzvPwDurWvmZBwvw",
        "y": "ip8nyuLpJ5NpriZzCVKiG0TteqPMkrzfNOUQ8YzeGdk"
        "kid": "2HnoFS3YnC9tjiCaivhWLVUJ3AxwGGz_98uRFaqMEEs",
        "iat": 123972394872,
        "exp": 123974395972
      },
      {
        "kty": "RSA",
        "n": "ng5jr...",
        "e": "AQAB",
        "kid": "8KnoFS3YnC9tjiCaivhWLVUJ3AxwGGz_98uRFaqMJJr",
        "iat": 123972394872,
        "exp": 123974394972
        "revoked": {
          "revoked_at": 123972495172,
          "reason": "keyCompromise",
          "reason_code": 1
        }
      }
    ]
}

JWT Signature:
// Signature over JWT Header and Claims, as defined in RFC 7519
]]></artwork>
      </figure>
      <t>A Verifier that receives such a PIKA validates it by taking the
following steps:</t>
      <ol spacing="normal" type="1"><li>
          <t>If this PIKA was looked up using an <tt>iss</tt> value, verify that the
value of the <tt>iss</tt> claim in the PIKA is identical to the one used
to discover it.</t>
        </li>
        <li>
          <t>Verify that the PIKA is currently valid, according to its <tt>iat</tt> and <tt>exp</tt> claims.</t>
        </li>
        <li>
          <t>Verify that the certificate chain in the <tt>x5c</tt> field is currently valid from a trusted
certificate authority (see [@!RFC5280][@!RFC6125]).</t>
        </li>
        <li>
          <t>Verify that the end-entity certificate matches the <tt>iss</tt> field of the PIKA.</t>
        </li>
        <li>
          <t>Verify the signature on the PIKA using the subject public key of the
end-entity certificate</t>
        </li>
      </ol>
      <t>Before using a key in a PIKA to validate a JWT, a Verifier <bcp14>MUST</bcp14> verify that the
time at which the JWT was signed (e.g., as expressed by its <tt>iat</tt> claim) is
within the signing interval for the key.  This interval is expressed by the
<tt>iat</tt> and <tt>exp</tt> fields within the key attested to in the PIKA.</t>
    </section>
    <section anchor="referencing-proofs-of-issuer-key-authority">
      <name>Referencing Proofs of Issuer Key Authority</name>
      <t>JWT issuers commonly advertise their JWK Sets using mechanisms such as OpenID
Connect Discovery or SD-JWT-VC Credential Issuer Metadata <xref target="OIDC-Discovery"/>
        <xref target="I-D.ietf-oauth-sd-jwt-vc"/>.  These discovery mechanisms could be extended to
also provide PIKAs, using one of a few approaches.</t>
      <t>Current discovery mechanisms typically present the issuer's JWK set as a value
or link embedded in the metadata object.  Similarly, the Federation Historical
Keys endpoint in OpenID Federation provides a link from which the issuer's
historical keys may be downloaded (see Section 5.1.1 of <xref target="OIDC-Federation"/>).
These mechanisms are illustrated in <xref target="fig-issuer-metadata"/>.</t>
      <figure anchor="fig-issuer-metadata">
        <name>Current mechanisms for provided an issuer JWK Set</name>
        <sourcecode type="json"><![CDATA[
{
    // Other metadata...

    // Current mechanisms for unsigned JWKS
    "jwks_uri": "https://example.com/jwks",
    "jwks": { "keys": [ ... ] },

    // OpenID Federation historical keys
    "federation_historical_keys_endpoint": "https://example.com/historical_keys",
}
]]></sourcecode>
      </figure>
      <t>A similar field could be defined to provide a single set of issuer keys
expressed as a PIKA, either by reference or by value.  Such a mechanism requires
the issuer to list all of the keys that are currently valid in one PIKA,
requiring a Relying Party to download the whole PIKA even if they are only
interested in one key.</t>
      <t>An alternative design would allow for more specific PIKAs, covering
individual keys and referencing them by <tt>kid</tt>.  With such a design, an issuer
metadata object would contain a map like the following (showing three keys with
<tt>kid</tt> values "us-east-2024-01", "us-west-2024-01", and "us-east-2024-04"):</t>
      <figure anchor="fig-specific-pikas">
        <name>Referencing individual PIKAs by Key ID</name>
        <sourcecode type="json"><![CDATA[
{
  // Other metadata...

  "signed_jwks": {
    "us-east-2024-01": "https://example.com/signed_jwks/us-east-2024-01",
    "us-west-2024-01": "https://example.com/signed_jwks/us-east-2024-01",
    "us-east-2024-04": "https://example.com/signed_jwks/us-east-2024-01",
  }
}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="durability-of-key-authority">
        <name>Durability of Key Authority</name>
        <t>The main difference between establishing the authority of issuer keys via PIKA
vs. via HTTPS is that where HTTPS is ephemeral, a PIKA can be redistribted and
verfied for some period of time (until its <tt>exp</tt> time).  Issuers should exercise
care in choosing the <tt>exp</tt> value they populate in a PIKA, in order to avoid a
key being used beyond its intended lifetime.</t>
        <t>An issuer may wish to revoke a key, in the sense of instructing verifiers that
they should no longer use the key to validate JWTs from the issuer.  PIKAs
provide both implicit and explicit revocation.  With implicit revocation, the
issuer simply removes the key from PIKAs it publishes.  With explicit
revocation, the issuer adds a <tt>revoked</tt> field to the key, as described in
<xref target="OIDC-Federation"/>.  In either case, the key will no longer be used by
verifiers once all PIKAs positively authorizing the key have expired.</t>
        <t>The above properties imply an operational trade-off for issuers.  On the one
hand, having shorter PIKA validity times means that the issuer can revoke keys
more quickly.  On the other hand, having short PIKA validity times will require
PIKAs to be signed more often, and result in higher load on endpoints by which
PIKAs are distributed.</t>
      </section>
      <section anchor="signing-key-compromise">
        <name>Signing Key Compromise</name>
        <t>A related problem arises from the fact that PIKAs are signed with the same sort
of certificates that are used in HTTPS, i.e., certficiates that attest to domain
names.  An OP's web servers will be facing the Internet, and thus at greater
risk of compromise than a more highly protected server in the OP's
infrastructure.  Compromising an OP's web server could provide the attacker with
access to the signing key with which they could issue a bogus PIKA for the OP,
containing an attacker-chosen public key.</t>
        <ul empty="true">
          <li>
            <t><strong>NOTE:</strong> There are several ways to mitigate this risk:</t>
            <ul spacing="normal">
              <li>
                <t>We could make PIKA-signing certificates distinct from HTTPS certs, e.g., by
means of a new extKeyUsage (EKU) value.  This would be a significant
deployment barrier, since CAs would have to be willing to issue the
PIKA-compatible certificates.</t>
              </li>
              <li>
                <t>We could use a distinct domain name for PIKA-signing certs, so that an OP
would be unlikely to create a cert for that domain name other than for PIKA
signing.  For example, the validation rules could require the certificate to
authenticate <tt>_pika.example.com</tt> instead of <tt>example.com</tt> for the issuer URL
<tt>https://example.com/oauth2/</tt>.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="OIDC-Federation" target="https://openid.net/specs/openid-federation-1_0.html">
          <front>
            <title>OpenID Federation 1.0 - draft 33</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="February" day="23"/>
          </front>
        </reference>
        <reference anchor="RFC7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="OIDC-Discovery" target="https://openid.net/specs/openid-connect-discovery-1_0.html">
          <front>
            <title>OpenID Connect Discovery 1.0 incorporating errata set 2</title>
            <author>
              <organization/>
            </author>
            <date year="2023" month="December" day="15"/>
          </front>
        </reference>
        <reference anchor="OpenPubkey" target="https://www.bastionzero.com/openpubkey">
          <front>
            <title>OpenPubkey</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="I-D.ietf-oauth-sd-jwt-vc">
          <front>
            <title>SD-JWT-based Verifiable Credentials (SD-JWT VC)</title>
            <author fullname="Oliver Terbu" initials="O." surname="Terbu">
              <organization>MATTR</organization>
            </author>
            <author fullname="Daniel Fett" initials="D." surname="Fett">
              <organization>Authlete Inc.</organization>
            </author>
            <author fullname="Brian Campbell" initials="B." surname="Campbell">
              <organization>Ping Identity</organization>
            </author>
            <date day="8" month="July" year="2024"/>
            <abstract>
              <t>   This specification describes data formats as well as validation and
   processing rules to express Verifiable Credentials with JSON payloads
   with and without selective disclosure based on the SD-JWT
   [I-D.ietf-oauth-selective-disclosure-jwt] format.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-sd-jwt-vc-04"/>
        </reference>
        <reference anchor="I-D.barnes-mls-addl-creds">
          <front>
            <title>Additional MLS Credentials</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <date day="4" month="March" year="2024"/>
            <abstract>
              <t>   This specification defines two new kinds of credentials for use
   within the Message Layer Security (MLS) credential framework:
   UserInfo Verifiable Credentials and multi-credentials.  UserInfo
   Verifiable Credentials allow clients to present credentials that
   associate OpenID Connect attributes to a signature key pair held by
   the client.  Multi-credentials allow clients to present authenticated
   attributes from multiple sources, or to present credentials in
   different formats to support groups with heterogeneous credential
   support.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-barnes-mls-addl-creds-01"/>
        </reference>
      </references>
    </references>
    <?line 405?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
JyhrOI3zQ+GgmQEZ08iM6XE6Z7FN627EGogXJQm7mihrSZKx3UV9pdO6Tgkk
wtQHS4WOOpl/c3bMGAz4pV2tFdIvTs4P9XOpF7uDWxEu7+vjTuxYcJ6dXjbn
nRJAEg55an2DR+nDiq+XsBEUgay7HWsKxDhTHdxnhSuHw0S04pho2/oyeX3+
Gm8uqbxRLpy8QOvSTrlMCITi3n8E/9R65DdOhSsHeAKWa1FdRtnIn8KKqIL9
knsckdFfjf1dAZZfk8xox1F4c+oIhyLzGkonAEKwDbBfMeByZ7jOOtaoZqO+
UhRqPxM2KUVyO3HlmGU06tSNiydU6xWGhZAIh/GvNRUdoACpS5DdG4LnyxZu
Xi/w1obdwSt4Oipmu0SW+8cQqyjs2Br2ht6HZOKuQchQ6ae/THE3g44US6ur
i3Fa1e6MWoRWtXaXbzgUkRKD2VWfscUOTruzqzuH59s7/0S4xpNqMaEnGCm/
sRH8/rXz6uio3+93flM3ismcCkeODl1wBx1W7lLPsUkdLEIMDgbDtrbvP/oO
/3+w/d02P4b8+fGDzc37j+5v+sfk1jrSI/Oruzr4XF8hdK6rBbO+z6Tdw7ic
0cPTnt+Pe97aZ/P4Iz38PX328nj+09mL8Yuz93snP07enTz/6finnenPR8NP
s9P5wbR8Nxv/8mQ+m4ckefV08jBfTI8nL3ZeT8r0l0/7b1+mzzYvKvP76avr
8tPw9cmbHx/+/Mk8S66DZeGVafL287x4en7/53z/UfUh3Y/S2dW747dvXtzf
+zh/9uzT+0cPp2dPo99fHR7acOElIT4UabmXXpR4+eD+ox0Mce9uureK8Ox8
L6Sf07N8tPOhpAMPadOLvR+pd3FlLw9fft1eXrwo/+ZeHjR70XQnMkMiTks3
+2kevw/IPni0sxWS5VGRLXibULF9OLcSJmRNZ82g9zFyIqJVv7pR4X9re6iL
X7tqY6P5JbWLxu7Yovd9GLbu4oRDI2Cspj6V1g1Y6DT8FRgy09oBfAm38e3X
nqttGNesUZrYUILrLhHE4foMnZuOKEfmqjoHnybSU8pGcX2rTw6YATxPpgQ7
K0jsejrxPT+5i32gPEV2v9RTRqLjN97ltRo/8iY+pb56Q1DMOWQqYFPZi4hQ
zc/dEoH1PjP3dql/zROKpyUVfZEX8HYh/jhGUuRqR1SOEQC0DJfWU10FBquu
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

-->

</rfc>
