<?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.35 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-looker-oauth-jwt-cwt-status-list-00" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.3 -->
  <front>
    <title>JWT and CWT Status List</title>
    <seriesInfo name="Internet-Draft" value="draft-looker-oauth-jwt-cwt-status-list-00"/>
    <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="June" day="19"/>
    <abstract>
      <?line 31?>

<t>This specification defines a status list representation and processing rules for usage with JSON Web Tokens <xref target="RFC7519"/> and CBOR Web Tokens <xref target="RFC8392"/>.</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 35?>

<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 a Status List in JWT and CWT representations that describes the individual statuses of multiple Referenced Tokens. 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 which represents a position within this bit array and 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 in JWT or CWT representation references a Status List Token. Status Lists may be composed for expressing a range of Status Types, the 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, as described in (XXX) 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/CWT Based)  |                    |  (JWT/CWT Based)  |
|                  |  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 as traditional certificate revocation lists (CRLs) have limited scalability and the Online Certificate Status Protocol (OCSP) has additional privacy risks as 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>The approach of this specification seeks to find a balance between scalability, security and privacy by minimizing the status information to mere bits 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 a herd privacy towards 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>
      <t>Status List
 A bit array that lists the statuses of many Referenced Tokens.</t>
      <t>Status List Token
 A token in JWT or CWT representation that contains a Status List.</t>
      <t>Referenced Token
 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>
    </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 based 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": {
    "bits": 1,
    "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) attribute with a numeric based value that represents the index to check for status information in the Status List for the current JWT. The value of this attribute <bcp14>MUST</bcp14> be a non-negative number, containing a value of zero or greater. Refer to xx for details on the validation procedure.</li>
            <li>The claim value object <bcp14>MUST</bcp14> contain a "uri" attribute with a string based value that identifies the Status List containing the status information for the JWT. The value of this attribute <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 based 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 based 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 convey's 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) based algorithm. Relying parties <bcp14>MUST</bcp14> reject JWTs with an invalid signature.</li>
          <li>Relying parties <bcp14>MUST</bcp14> reject a JWT that is 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_zvp..MAZLRLMQMAAAA"
  }
}
]]></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) attribute with an numeric based 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) attribute with a string based 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, depending on the bit-size, are possible. 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 "bit-size" 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 encoded as URL-safe base64 encoding without padding encoding as defined in Section 2 of <xref target="RFC7515"/> and stored as a string.</li>
          </ol>
          <t>Example of a Status List representing the statuses of 16 Referenced Tokens (1-bit status type) with indices 0 to 15 (2 bytes):</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>
          <t>Example of a more complex status list of length 12 using 2 bit statuses (3 bytes):</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>
    <section anchor="status-types">
      <name>Status Types</name>
      <t>This document defines the possible 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 encompass multiple statuses per individual bits for a Reference Token.</t>
      <t>The registry in this document describes the basic Status Type values required for the most common use cases. The registry may be extended as describes in XXX.</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 based 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.ST be used for the "typ" attribute within the "status_list".</t>
        <section anchor="examples">
          <name>Examples</name>
          <t>In the first example the Status List shall be used as a revocation list. It only requires the Status Types "VALID" and "INVALID", therefore a "bits" of 1 is sufficient.</t>
          <t>In the second example the Status List shall additionally include the Status Type "SUSPENDED. As the Status Type value for "SUSPENDED" is 0x02 and doe snot fit into 1 bit, the "bits" is required to be 2.</t>
        </section>
      </section>
      <section anchor="extended-status-list-types">
        <name>Extended Status List Types</name>
      </section>
    </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 has 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 368?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
    <section numbered="false" anchor="document-history">
      <name>Document History</name>
      <t>-00</t>
      <ul spacing="normal">
        <li>Initial draft</li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
4P1FnOKBoFHA/0eA919fDMwacUEAAA==

-->

</rfc>
