<?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.6.36 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-looker-oauth-jwt-cwt-status-list-01" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title>JWT and CWT Status List</title>
    <seriesInfo name="Internet-Draft" value="draft-looker-oauth-jwt-cwt-status-list-01"/>
    <author fullname="Tobias Looker">
      <organization>MATTR</organization>
      <address>
        <email>tobias.looker@mattr.global</email>
      </address>
    </author>
    <author fullname="Paul Bastian">
      <organization/>
      <address>
        <email>paul.bastian@posteo.de</email>
      </address>
    </author>
    <date year="2023" month="July" day="10"/>
    <abstract>
      <?line 31?>

<t>This specification defines status list data structures for representing the status of JSON Web Tokens (JWTs) <xref target="RFC7519"/> and CBOR Web Tokens (CWTs) <xref target="RFC8392"/>.
The status list data structures themselves are also represented as JWTs or CWTs.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://vcstuff.github.io/draft-looker-oauth-jwt-cwt-status-list/draft-looker-oauth-jwt-cwt-status-list.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-looker-oauth-jwt-cwt-status-list/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/vcstuff/draft-looker-oauth-jwt-cwt-status-list"/>.</t>
    </note>
  </front>
  <middle>
    <?line 36?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>JSON Web Tokens (JWTs) <xref target="RFC7519"/> and CBOR Web Tokens (CWTs) <xref target="RFC8392"/> as secure token formats, have vast possible applications. Some of these applications can involve issuing a token whereby certain semantics about the token can change over time, which are important to be able to communicate to relying parties in an interoperable manner, such as whether the token is considered invalidated or suspended by its issuer.</t>
      <t>This document defines Status List representations in JWT and CWT formats that describe the individual statuses of multiple Referenced Tokens, which themselves are also JWTs or CWTs. The statuses of all Referenced Tokens are conveyed via a bit array in the Status List. Each Referenced Token is allocated an index during issuance that represents its position within this bit array. The value of the bit(s) at this position correspond to the Referenced Token's status. The document also defines how an issuer of a Referenced Token references a Status List Token. Status Lists may be composed for expressing a range of Status Types. This document defines basic Status Types for the most common use cases as well as an extensibility mechanism for custom Status Types. The Status List Token may be used by an issuer in the Issuer-Holder-Verifier model to express the status of verifiable credentials (Referenced Tokens) issued by an issuer.</t>
      <t>The following diagram depicts the basic conceptual relationship.</t>
      <artwork type="ascii-art"><![CDATA[
+------------------+                    +-------------------+
|                  |     References     |                   |
|                  |------------------->|                   |
| Referenced Token |                    | Status List Token |
|   (JWT or CWT)   |                    |    (JWT or CWT)   |
|                  |  Describes Status  |                   |
|                  |<-------------------|                   |
+------------------+                    +-------------------+
]]></artwork>
      <section anchor="rationale">
        <name>Rationale</name>
        <t>Revocation mechanisms are an essential part for most identity ecosystems. In the past, revocation of X.509 TLS certificates has been proven difficult. Traditional certificate revocation lists (CRLs) have limited scalability; Online Certificate Status Protocol (OCSP) has additional privacy risks, since the client is leaking the requested website to a third party. OCSP stapling is addressing some of these problems at the cost of less up-to-date data. Modern approaches use accumulator-based revocation registries and Zero-Knowledge-Proofs to accommodate for this privacy gap, but face scalability issues again.</t>
        <t>This specification seeks to find a balance between scalability, security, and privacy by minimizing the status information to mere bits (often a single bit) and compressing the resulting binary data. Thereby, a Status List may contain statuses of 100,000 or more Referenced Tokens, but still remain relatively small. Placing large amounts of Referenced Tokens into the same list also enables herd privacy relative to the Issuer.</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="terminology">
      <name>Terminology</name>
      <dl>
        <dt>Status List:</dt>
        <dd>
          <t>A bit array that lists the statuses of many Referenced Tokens.</t>
        </dd>
        <dt>Status List Token:</dt>
        <dd>
          <t>A token in JWT or CWT representation that contains a Status List.</t>
        </dd>
        <dt>Referenced Token:</dt>
        <dd>
          <t>A token in JWT or CWT representation which contains a reference to a Status List Token. The information from the contained Status List may give a verifier additional information about up-to-date status of the Referenced Token.</t>
        </dd>
      </dl>
    </section>
    <section anchor="json-web-token-representation">
      <name>JSON Web Token Representation</name>
      <section anchor="jwt-referenced-token">
        <name>Referenced Token Format and Processing Requirements</name>
        <t>The following rules apply to validating a Referenced Token in JWT representation, which references a Status List Token. Application of additional restrictions and policy are at the discretion of the verifying party.</t>
        <ol spacing="normal" type="1"><li>The JWT <bcp14>MUST</bcp14> contain an "iss" (issuer) claim that contains a unique string identifier for the entity that issued the JWT. In the absence of an application profile specifying otherwise, compliant applications <bcp14>MUST</bcp14> compare issuer values using the Simple String Comparison method defined in Section 6.2.1 of <xref target="RFC3986"/>. The value <bcp14>MUST</bcp14> be equal to that of the "iss" claim contained within the referenced Status List Token.</li>
          <li>The JWT <bcp14>MUST</bcp14> contain an "status" (status) claim conforming to the rules outlined in <xref target="jwt-referenced-token-status"/></li>
        </ol>
        <t>The following example is the decoded header and payload of a JWT meeting the processing rules as defined above.</t>
        <artwork type="ascii-art"><![CDATA[
{
  "alg": "ES256",
  "kid": "11"
}
.
{
  "iss": "https://example.com",
  "status": {
    "idx": 0,
    "uri": "https://example.com/statuslists/1"
  }
}
]]></artwork>
        <section anchor="jwt-referenced-token-status">
          <name>Status Claim Format</name>
          <t>The following rules apply to validating the "status" (status) claim</t>
          <ol spacing="normal" type="1"><li>The claim value <bcp14>MUST</bcp14> be a valid JSON object.</li>
            <li>The claim value object <bcp14>MUST</bcp14> contain an "idx" (index) member with a numeric value that represents the index to check for status information in the Status List for the current JWT. The value of this member <bcp14>MUST</bcp14> be a non-negative number, containing a value of zero or greater.</li>
            <li>The claim value object <bcp14>MUST</bcp14> contain a "uri" member with a string value that identifies the Status List containing the status information for the JWT. The value of this member <bcp14>MUST</bcp14> be a uri conforming to <xref target="RFC3986"/>.</li>
          </ol>
        </section>
      </section>
      <section anchor="jwt-status-list-format-and-processing">
        <name>Status List JWT Format and Processing Requirements</name>
        <t>The following rules apply to validating a JWT-based Status List Token. Application of additional restrictions and policy are at the discretion of the verifying party.</t>
        <ol spacing="normal" type="1"><li>The JWT <bcp14>MUST</bcp14> contain an "iss" (issuer) claim that contains a unique string identifier for the entity that issued the JWT. In the absence of an application profile specifying otherwise, compliant applications <bcp14>MUST</bcp14> compare issuer values using the Simple String Comparison method defined in Section 6.2.1 of <xref target="RFC3986"/>. The value <bcp14>MUST</bcp14> be equal to that of the "iss" claim contained within the Referenced Token.</li>
          <li>The JWT <bcp14>MUST</bcp14> contain a "sub" (subject) claim that contains an unique string identifier for that Referenced Token. The value <bcp14>MUST</bcp14> be equal to that of the "uri" claim contained in the "status" claim of the Referenced Token.</li>
          <li>The JWT <bcp14>MUST</bcp14> contain an "iat" (issued at) claim that identifies the time at which it was issued.</li>
          <li>The JWT <bcp14>MUST</bcp14> contain an "status_list" (status list) claim conforming to the rules outlined in <xref target="jwt-status-list-claim-format"/>.</li>
          <li>The JWT <bcp14>MAY</bcp14> contain an "exp" (expiration time) claim that conveys when it is considered expired by its issuer.</li>
          <li>The JWT <bcp14>MAY</bcp14> contain other claims.</li>
          <li>The JWT <bcp14>MUST</bcp14> be digitally signed using an asymmetric cryptographic algorithm. Relying parties <bcp14>MUST</bcp14> reject the JWT if it is using a Message Authentication Code (MAC) algorithm. Relying parties <bcp14>MUST</bcp14> reject JWTs with an invalid signature.</li>
          <li>Relying parties <bcp14>MUST</bcp14> reject JWTs that are not valid in all other respects per "JSON Web Token (JWT)" <xref target="RFC7519"/>.</li>
        </ol>
        <artwork type="ascii-art"><![CDATA[
{
  "typ": "statuslist+jwt",
  "alg": "ES256",
  "kid": "11"
}
.
{
  "iss": "https://example.com",
  "sub": "https://example.com/statuslists/1",
  "iat": 1683560915,
  "exp": 1686232115,
  "status_list": {
    "bits": 1,
    "lst": "H4sIAMo_jGQC_9u5GABc9QE7AgAAAA"
  }
}
]]></artwork>
        <section anchor="jwt-status-list-claim-format">
          <name>Status List Claim Format</name>
          <t>The following rules apply to validating the "status_list" (status list) claim</t>
          <ol spacing="normal" type="1"><li>The claim value <bcp14>MUST</bcp14> be a valid JSON object.</li>
            <li>The claim value object <bcp14>MUST</bcp14> contain a "bits" (bit size) member with an numeric value that represents the number of bits per Referenced Token in the Status List ("lst") of the Status List JWT. The allowed values for "bits" are 1,2,4 and 8.</li>
            <li>The claim value object <bcp14>MUST</bcp14> contain a "lst" (list) member with a string value that represents the status values for all the tokens it conveys statuses for. The value <bcp14>MUST</bcp14> be computed using the algorithm described in <xref target="jwt-status-list-claim-encoding"/>.</li>
          </ol>
        </section>
        <section anchor="jwt-status-list-claim-encoding">
          <name>Status List Encoding</name>
          <t>Each status of a Referenced Token <bcp14>MUST</bcp14> be represented with a bit size of 1,2,4, or 8. Therefore up to 2,4,16, or 256 statuses for a Referenced Token are possible, depending on the bit size. This limitation is intended to limit bit manipulation necessary to a single byte for every operation and thus keeping implementations simpler and less error prone.</t>
          <ol spacing="normal" type="1"><li>The overall Status List is encoded as a byte array. Depending on the bitsize, each byte corresponds to 8/(#bit-size) statuses (8,4,2, or 1). The status of each Referenced Token is identified using the index that maps to one or more specific bits within the byte array. The index starts counting at 0 and ends with "size" - 1 (being the last valid entry). The bits within an array are counted from least significant bit "0" to the most significant bit ("7"). All bits of the byte array at a particular index are set to a status value.</li>
            <li>The complete byte array is compressed using gZIP <xref target="RFC1952"/>.</li>
            <li>The result of the gZIP compression is then base64url-encoded, as defined in Section 2 of <xref target="RFC7515"/>.</li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="status-types">
      <name>Status Types</name>
      <t>This document defines potential statuses of Referenced Tokens as Status Type values. If the Status List contains more than one bit per token (as defined by "bits" in the Status List), then the whole value of bits <bcp14>MUST</bcp14> describe one value. A Status List can not represent multiple statuses per Referenced Token.</t>
      <t>The registry in this document describes the basic Status Type values required for the most common use cases.
Additional values may defined for particular use cases.</t>
      <section anchor="status-types-values">
        <name>Status Types Values</name>
        <t>A status describes the state, mode, condition or stage of an entity that is described by the status list. Status Types <bcp14>MUST</bcp14> be numeric values between 0 and 255.
Status types described by this specification comprise:
 - 0x00 - "VALID" - The status of the Token is valid, correct or legal.
 - 0x01 - "INVALID" - The status of the Token is revoked, annulled, taken back, recalled or cancelled. This state is irreversible.
 - 0x02 - "SUSPENDED" - The status of the Token is temporarily invalid, hanging, debarred from privilege. This state is reversible.</t>
        <t>The issuer of the Status List Token <bcp14>MUST</bcp14> choose an adequate "bits" (bit size) to be able to describe the required Status Types for the application.</t>
      </section>
    </section>
    <section anchor="example-jwt-status-lists">
      <name>Example JWT Status Lists</name>
      <section anchor="example-status-list-with-1-bit-status-values">
        <name>Example Status List with 1-Bit Status Values</name>
        <t>In this example, the Status List is used as a revocation list. It only requires the Status Types "VALID" and "INVALID"; therefore a "bits" of 1 is sufficient.</t>
        <t>This example Status List represents the statuses of 16 Referenced Tokens, requiring 16 bits (2 bytes) of status.</t>
        <artwork type="ascii-art"><![CDATA[
status[0] = 1
status[1] = 0
status[2] = 0
status[3] = 1
status[4] = 1
status[5] = 1
status[6] = 0
status[7] = 1
status[8] = 1
status[9] = 1
status[10] = 0
status[11] = 0
status[12] = 0
status[13] = 1
status[14] = 0
status[15] = 1
]]></artwork>
        <t>These bits are concatenated:</t>
        <artwork type="ascii-art"><![CDATA[
byte             0                  1               2
bit       7 6 5 4 3 2 1 0    7 6 5 4 3 2 1 0    7
         +-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+  +-+...
values   |1|0|1|1|1|0|0|1|  |1|0|1|0|0|0|1|1|  |0|...
         +-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+  +-+...
index     7 6 5 4 3 2 1 0   15   ...  10 9 8   23
         \_______________/  \_______________/
                0xB9               0xA3

]]></artwork>
        <t>Resulting in the byte array:</t>
        <artwork type="ascii-art"><![CDATA[
byte_array = [0xB9, 0xA3]
]]></artwork>
        <t>After compression and base64url encoding, the generated Status List is:</t>
        <artwork type="ascii-art"><![CDATA[
"status_list": {
   "bits": 1,
   "lst": "H4sIAMo_jGQC_9u5GABc9QE7AgAAAA"
}
]]></artwork>
      </section>
      <section anchor="example-status-list-with-2-bit-status-values">
        <name>Example Status List with 2-Bit Status Values</name>
        <t>In thisexample, the Status List additionally includes the Status Type "SUSPENDED. As the Status Type value for "SUSPENDED" is 0x02 and does not fit into 1 bit, the "bits" is required to be 2.</t>
        <t>This example Status List represents the status of 12 Referenced Tokens, requiring 24 bits (3 bytes) of status.</t>
        <artwork type="ascii-art"><![CDATA[
status[0] = 1
status[1] = 2
status[2] = 0
status[3] = 3
status[4] = 0
status[5] = 1
status[6] = 0
status[7] = 1
status[8] = 1
status[9] = 2
status[10] = 3
status[11] = 3
]]></artwork>
        <t>These bits are concatenated:</t>
        <artwork type="ascii-art"><![CDATA[
byte             0                  1                  2
bit       7 6 5 4 3 2 1 0    7 6 5 4 3 2 1 0    7 6 5 4 3 2 1 0
         +-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+
values   |1|1|0|0|1|0|0|1|  |0|1|0|0|0|1|0|0|  |1|1|1|1|1|0|0|1|
         +-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+
          \ / \ / \ / \ /    \ / \ / \ / \ /    \ / \ / \ / \ /
status     3   0   2   1      1   0   1   0      3   3   2   1
index      3   2   1   0      7   6   5   4      11  10  9   8
           \___________/      \___________/      \___________/
                0xC9               0x44               0xF9

]]></artwork>
        <t>Resulting in the byte array:</t>
        <artwork type="ascii-art"><![CDATA[
byte_array = [0xC9, 0x44, 0xF9]
]]></artwork>
        <t>After compression and base64url encoding, the generated Status List is:</t>
        <artwork type="ascii-art"><![CDATA[
"status_list": {
   "bits": 2,
   "lst": "H4sIAMo_jGQC_zvp8hMAZLRLMQMAAAA"
}
]]></artwork>
      </section>
    </section>
    <section anchor="cwt-representations">
      <name>CWT Representations</name>
      <t>TBD Define parallel CWT representations for Status Lists and Referenced Tokens.</t>
      <t>TBD Declare whether JWT and CWT representations can be used interchangeably by the same issuer.  For instance, declare whether a status list can reference both JWT and CWT tokens.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="correct-decoding-and-parsing-of-the-encoded-status-list">
        <name>Correct decoding and parsing of the encoded status list</name>
        <t>TODO elaborate on risks of incorrect parsing/decoding leading to erroneous status data</t>
      </section>
      <section anchor="cached-and-stale-status-lists">
        <name>Cached and Stale status lists</name>
        <t>TODO consumers/Verifiers of the status list should be aware if they fetch the up-to-date data</t>
      </section>
      <section anchor="authorized-access-to-the-status-list">
        <name>Authorized access to the Status List</name>
        <t>TODO elaborate on authorization mechanisms preventing misuse and profiling as described in privacy section</t>
      </section>
      <section anchor="history">
        <name>History</name>
        <t>TODO elaborate on status list only providing the up-to date/latest status, no historical data, may be provided by the underlying hosting architecture</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <section anchor="herd-privacy">
        <name>Herd Privacy</name>
        <t>TODO elaborate on herd privacy, size of the status list</t>
      </section>
      <section anchor="profiling">
        <name>Profiling</name>
        <t>TODO elaborate on Verifiers regularly fetching the status list to create a profile, possible countermeasures with authorized access to the status list</t>
      </section>
      <section anchor="correlation-risks-and-tracking">
        <name>Correlation Risks and Tracking</name>
        <t>TODO elaborate on Issuer-Verifier correlation and Verifier-Verifier correlation as the status list introduces unique,trackable data
TODO elaborate on issuers avoiding sequential usage of indices and status lists
TODO elaborate that a status list only gives information about the maximum number of possible statuses that a list conveys, issuers are recommended to pre-allocate lists, use dead entries that are never assigned or other obfuscation mechanisms</t>
      </section>
      <section anchor="malicious-issuers">
        <name>Malicious Issuers</name>
        <t>TODO elaborate on issuers generating unique status lists per Referenced Token that do not offer herd privacy</t>
      </section>
      <section anchor="hosting-service-whats-a-better-name-here">
        <name>Hosting Service (what's a better name here?)</name>
        <t>TODO elaborate on increased privacy if the status list is hosted by a third party instead of the issuer reducing tracking possiblities
TODO evaluate deifnition of Status List Provider?
 An entity that hosts the Status List as a resource for potential verifiers. The Status List Provider may be the issuer of the Status List but may also be outsourced to a trusted third party.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document specifies no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <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="RFC8392">
        <front>
          <title>CBOR Web Token (CWT)</title>
          <author fullname="M. Jones" initials="M." surname="Jones"/>
          <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
          <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
          <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
          <date month="May" year="2018"/>
          <abstract>
            <t>CBOR Web Token (CWT) is a compact means of representing claims to be transferred between two parties. The claims in a CWT are encoded in the Concise Binary Object Representation (CBOR), and CBOR Object Signing and Encryption (COSE) is used for added application-layer security protection. A claim is a piece of information asserted about a subject and is represented as a name/value pair consisting of a claim name and a claim value. CWT is derived from JSON Web Token (JWT) but uses CBOR rather than JSON.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8392"/>
        <seriesInfo name="DOI" value="10.17487/RFC8392"/>
      </reference>
      <reference anchor="RFC3986">
        <front>
          <title>Uniform Resource Identifier (URI): Generic Syntax</title>
          <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
          <author fullname="R. Fielding" initials="R." surname="Fielding"/>
          <author fullname="L. Masinter" initials="L." surname="Masinter"/>
          <date month="January" year="2005"/>
          <abstract>
            <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="66"/>
        <seriesInfo name="RFC" value="3986"/>
        <seriesInfo name="DOI" value="10.17487/RFC3986"/>
      </reference>
      <reference anchor="RFC1952">
        <front>
          <title>GZIP file format specification version 4.3</title>
          <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
          <date month="May" year="1996"/>
          <abstract>
            <t>This specification defines a lossless compressed data format that is compatible with the widely used GZIP utility. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="1952"/>
        <seriesInfo name="DOI" value="10.17487/RFC1952"/>
      </reference>
      <reference anchor="RFC7515">
        <front>
          <title>JSON Web Signature (JWS)</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 Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7515"/>
        <seriesInfo name="DOI" value="10.17487/RFC7515"/>
      </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>
    <?line 373?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>We would like to thank
Christian Bormann,
Michael B. Jones,
Torsten Lodderstedt,
and
Kristina Yasuda
for their valuable contributions to this specification.</t>
    </section>
    <section numbered="false" anchor="document-history">
      <name>Document History</name>
      <t>-01</t>
      <ul spacing="normal">
        <li>Applied editorial improvements suggested by Michael Jones.</li>
      </ul>
      <t>-00</t>
      <ul spacing="normal">
        <li>Initial draft</li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
zuH/uMH7L3YGmpcGQwAA

-->

</rfc>
