<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" ipr="trust200902" docName="draft-ietf-ace-revoked-token-notification-09" number="9770" category="std" updates="" obsoletes="" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" xml:lang="en" prepTime="2025-06-13T10:28:07" indexInclude="true" scripts="Common,Latin" tocDepth="3">
  <link href="https://datatracker.ietf.org/doc/draft-ietf-ace-revoked-token-notification-09" rel="prev"/>
  <link href="https://dx.doi.org/10.17487/rfc9770" rel="alternate"/>
  <link href="urn:issn:2070-1721" rel="alternate"/>
  <front>
    <title abbrev="Notification of Revoked Tokens in ACE">Notification of Revoked Access Tokens in the Authentication and Authorization for Constrained Environments (ACE) Framework</title>
    <seriesInfo name="RFC" value="9770" stream="IETF"/>
    <author initials="M." surname="Tiloca" fullname="Marco Tiloca">
      <organization showOnFrontPage="true">RISE AB</organization>
      <address>
        <postal>
          <street>Isafjordsgatan 22</street>
          <city>Kista</city>
          <code>164 40</code>
          <country>Sweden</country>
        </postal>
        <email>marco.tiloca@ri.se</email>
      </address>
    </author>
    <author initials="F." surname="Palombini" fullname="Francesca Palombini">
      <organization showOnFrontPage="true">Ericsson AB</organization>
      <address>
        <postal>
          <street>Torshamnsgatan 23</street>
          <city>Kista</city>
          <code>164 40</code>
          <country>Sweden</country>
        </postal>
        <email>francesca.palombini@ericsson.com</email>
      </address>
    </author>
    <author initials="S." surname="Echeverria" fullname="Sebastian Echeverria">
      <organization showOnFrontPage="true">CMU SEI</organization>
      <address>
        <postal>
          <street>4500 Fifth Avenue</street>
          <city>Pittsburgh</city>
          <region>PA</region>
          <code>15213-2612</code>
          <country>United States of America</country>
        </postal>
        <email>secheverria@sei.cmu.edu</email>
      </address>
    </author>
    <author initials="G." surname="Lewis" fullname="Grace Lewis">
      <organization showOnFrontPage="true">CMU SEI</organization>
      <address>
        <postal>
          <street>4500 Fifth Avenue</street>
          <city>Pittsburgh</city>
          <region>PA</region>
          <code>15213-2612</code>
          <country>United States of America</country>
        </postal>
        <email>glewis@sei.cmu.edu</email>
      </address>
    </author>
    <date month="06" year="2025"/>
    <area>SEC</area>
    <workgroup>ace</workgroup>
    <abstract pn="section-abstract">
      <t indent="0" pn="section-abstract-1">This document specifies a method of the Authentication and Authorization for Constrained  Environments (ACE) framework, which allows an authorization server to notify clients and resource servers (i.e., registered devices) about revoked access tokens. As specified in this document, the method allows clients and resource servers (RSs) to access a Token Revocation List (TRL) on the authorization server by using the Constrained Application Protocol (CoAP), with the possible additional use of resource observation. Resulting (unsolicited) notifications of revoked access tokens complement alternative approaches such as token introspection, while not requiring additional endpoints on clients and RSs.</t>
    </abstract>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t indent="0" pn="section-boilerplate.1-1">
            This is an Internet Standards Track document.
        </t>
        <t indent="0" pn="section-boilerplate.1-2">
            This document is a product of the Internet Engineering Task Force
            (IETF).  It represents the consensus of the IETF community.  It has
            received public review and has been approved for publication by
            the Internet Engineering Steering Group (IESG).  Further
            information on Internet Standards is available in Section 2 of 
            RFC 7841.
        </t>
        <t indent="0" pn="section-boilerplate.1-3">
            Information about the current status of this document, any
            errata, and how to provide feedback on it may be obtained at
            <eref target="https://www.rfc-editor.org/info/rfc9770" brackets="none"/>.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t indent="0" pn="section-boilerplate.2-1">
            Copyright (c) 2025 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t indent="0" pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Revised BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Revised BSD License.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2">
              <li pn="section-toc.1-1.1.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-terminology">Terminology</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.2">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-protocol-overview">Protocol Overview</xref></t>
          </li>
          <li pn="section-toc.1-1.3">
            <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-issuing-of-access-tokens-at">Issuing of Access Tokens at the AS</xref></t>
          </li>
          <li pn="section-toc.1-1.4">
            <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-token-hash">Token Hash</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2">
              <li pn="section-toc.1-1.4.2.1">
                <t indent="0" pn="section-toc.1-1.4.2.1.1"><xref derivedContent="4.1" format="counter" sectionFormat="of" target="section-4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-motivation-for-the-used-con">Motivation for the Used Construction</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2.1.2">
                  <li pn="section-toc.1-1.4.2.1.2.1">
                    <t indent="0" pn="section-toc.1-1.4.2.1.2.1.1"><xref derivedContent="4.1.1" format="counter" sectionFormat="of" target="section-4.1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-issuing-of-the-access-token">Issuing of the Access Token to the Client</xref></t>
                  </li>
                  <li pn="section-toc.1-1.4.2.1.2.2">
                    <t indent="0" pn="section-toc.1-1.4.2.1.2.2.1"><xref derivedContent="4.1.2" format="counter" sectionFormat="of" target="section-4.1.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-provisioning-of-access-toke">Provisioning of Access Tokens to the RS</xref></t>
                  </li>
                  <li pn="section-toc.1-1.4.2.1.2.3">
                    <t indent="0" pn="section-toc.1-1.4.2.1.2.3.1"><xref derivedContent="4.1.3" format="counter" sectionFormat="of" target="section-4.1.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-design-rationale">Design Rationale</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.4.2.2">
                <t indent="0" pn="section-toc.1-1.4.2.2.1"><xref derivedContent="4.2" format="counter" sectionFormat="of" target="section-4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-hash-input-on-the-client-an">Hash Input on the Client and the AS</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2.2.2">
                  <li pn="section-toc.1-1.4.2.2.2.1">
                    <t indent="0" pn="section-toc.1-1.4.2.2.2.1.1"><xref derivedContent="4.2.1" format="counter" sectionFormat="of" target="section-4.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-as-to-client-response-encod">AS-to-Client Response Encoded in CBOR</xref></t>
                  </li>
                  <li pn="section-toc.1-1.4.2.2.2.2">
                    <t indent="0" pn="section-toc.1-1.4.2.2.2.2.1"><xref derivedContent="4.2.2" format="counter" sectionFormat="of" target="section-4.2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-as-to-client-response-encode">AS-to-Client Response Encoded in JSON</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.4.2.3">
                <t indent="0" pn="section-toc.1-1.4.2.3.1"><xref derivedContent="4.3" format="counter" sectionFormat="of" target="section-4.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-hash_input-on-the-rs">HASH_INPUT on the RS</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2.3.2">
                  <li pn="section-toc.1-1.4.2.3.2.1">
                    <t indent="0" pn="section-toc.1-1.4.2.3.2.1.1"><xref derivedContent="4.3.1" format="counter" sectionFormat="of" target="section-4.3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-access-tokens-as-cwts">Access Tokens as CWTs</xref></t>
                  </li>
                  <li pn="section-toc.1-1.4.2.3.2.2">
                    <t indent="0" pn="section-toc.1-1.4.2.3.2.2.1"><xref derivedContent="4.3.2" format="counter" sectionFormat="of" target="section-4.3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-access-tokens-as-jwts">Access Tokens as JWTs</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.4.2.4">
                <t indent="0" pn="section-toc.1-1.4.2.4.1"><xref derivedContent="4.4" format="counter" sectionFormat="of" target="section-4.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-computing-the-token-hash">Computing the Token Hash</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.5">
            <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-token-revocation-list-trl">Token Revocation List (TRL)</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.5.2">
              <li pn="section-toc.1-1.5.2.1">
                <t indent="0" pn="section-toc.1-1.5.2.1.1"><xref derivedContent="5.1" format="counter" sectionFormat="of" target="section-5.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-update-of-the-trl">Update of the TRL</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.6">
            <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-the-trl-endpoint">The TRL Endpoint</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2">
              <li pn="section-toc.1-1.6.2.1">
                <t indent="0" pn="section-toc.1-1.6.2.1.1"><xref derivedContent="6.1" format="counter" sectionFormat="of" target="section-6.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-error-responses-with-proble">Error Responses with Problem Details</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.2">
                <t indent="0" pn="section-toc.1-1.6.2.2.1"><xref derivedContent="6.2" format="counter" sectionFormat="of" target="section-6.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-supporting-diff-queries">Supporting Diff Queries</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2.2.2">
                  <li pn="section-toc.1-1.6.2.2.2.1">
                    <t indent="0" pn="section-toc.1-1.6.2.2.2.1.1"><xref derivedContent="6.2.1" format="counter" sectionFormat="of" target="section-6.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-supporting-the-cursor-exten">Supporting the "Cursor" Extension</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.6.2.3">
                <t indent="0" pn="section-toc.1-1.6.2.3.1"><xref derivedContent="6.3" format="counter" sectionFormat="of" target="section-6.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-query-parameters">Query Parameters</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.7">
            <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter" sectionFormat="of" target="section-7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-full-query-of-the-trl">Full Query of the TRL</xref></t>
          </li>
          <li pn="section-toc.1-1.8">
            <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" format="counter" sectionFormat="of" target="section-8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-diff-query-of-the-trl">Diff Query of the TRL</xref></t>
          </li>
          <li pn="section-toc.1-1.9">
            <t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" format="counter" sectionFormat="of" target="section-9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-response-messages-when-usin">Response Messages when Using the "Cursor" Extension</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.9.2">
              <li pn="section-toc.1-1.9.2.1">
                <t indent="0" pn="section-toc.1-1.9.2.1.1"><xref derivedContent="9.1" format="counter" sectionFormat="of" target="section-9.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-response-to-full-query">Response to Full Query</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.2">
                <t indent="0" pn="section-toc.1-1.9.2.2.1"><xref derivedContent="9.2" format="counter" sectionFormat="of" target="section-9.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-response-to-diff-query">Response to Diff Query</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.9.2.2.2">
                  <li pn="section-toc.1-1.9.2.2.2.1">
                    <t indent="0" pn="section-toc.1-1.9.2.2.2.1.1"><xref derivedContent="9.2.1" format="counter" sectionFormat="of" target="section-9.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-empty-update-collection">Empty Update Collection</xref></t>
                  </li>
                  <li pn="section-toc.1-1.9.2.2.2.2">
                    <t indent="0" pn="section-toc.1-1.9.2.2.2.2.1"><xref derivedContent="9.2.2" format="counter" sectionFormat="of" target="section-9.2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-cursor-not-included-in-the-">Cursor Not Included in the Diff Query Request</xref></t>
                  </li>
                  <li pn="section-toc.1-1.9.2.2.2.3">
                    <t indent="0" pn="section-toc.1-1.9.2.2.2.3.1"><xref derivedContent="9.2.3" format="counter" sectionFormat="of" target="section-9.2.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-cursor-included-in-the-diff">Cursor Included in the Diff Query Request</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.10">
            <t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="10" format="counter" sectionFormat="of" target="section-10"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-registration-at-the-authori">Registration at the Authorization Server</xref></t>
          </li>
          <li pn="section-toc.1-1.11">
            <t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="11" format="counter" sectionFormat="of" target="section-11"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-notification-of-revoked-acc">Notification of Revoked Access Tokens</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.11.2">
              <li pn="section-toc.1-1.11.2.1">
                <t indent="0" pn="section-toc.1-1.11.2.1.1"><xref derivedContent="11.1" format="counter" sectionFormat="of" target="section-11.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-handling-of-revoked-access-">Handling of Revoked Access Tokens and Token Hashes</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.12">
            <t indent="0" pn="section-toc.1-1.12.1"><xref derivedContent="12" format="counter" sectionFormat="of" target="section-12"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-ace-token-revocation-list-p">ACE Token Revocation List Parameters</xref></t>
          </li>
          <li pn="section-toc.1-1.13">
            <t indent="0" pn="section-toc.1-1.13.1"><xref derivedContent="13" format="counter" sectionFormat="of" target="section-13"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-ace-token-revocation-list-e">ACE Token Revocation List Error Identifiers</xref></t>
          </li>
          <li pn="section-toc.1-1.14">
            <t indent="0" pn="section-toc.1-1.14.1"><xref derivedContent="14" format="counter" sectionFormat="of" target="section-14"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-security-considerations">Security Considerations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.14.2">
              <li pn="section-toc.1-1.14.2.1">
                <t indent="0" pn="section-toc.1-1.14.2.1.1"><xref derivedContent="14.1" format="counter" sectionFormat="of" target="section-14.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-content-retrieval-from-the-">Content Retrieval from the TRL</xref></t>
              </li>
              <li pn="section-toc.1-1.14.2.2">
                <t indent="0" pn="section-toc.1-1.14.2.2.1"><xref derivedContent="14.2" format="counter" sectionFormat="of" target="section-14.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-size-of-the-trl">Size of the TRL</xref></t>
              </li>
              <li pn="section-toc.1-1.14.2.3">
                <t indent="0" pn="section-toc.1-1.14.2.3.1"><xref derivedContent="14.3" format="counter" sectionFormat="of" target="section-14.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-communication-patterns">Communication Patterns</xref></t>
              </li>
              <li pn="section-toc.1-1.14.2.4">
                <t indent="0" pn="section-toc.1-1.14.2.4.1"><xref derivedContent="14.4" format="counter" sectionFormat="of" target="section-14.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-request-of-new-access-token">Request of New Access Tokens</xref></t>
              </li>
              <li pn="section-toc.1-1.14.2.5">
                <t indent="0" pn="section-toc.1-1.14.2.5.1"><xref derivedContent="14.5" format="counter" sectionFormat="of" target="section-14.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-vulnerable-time-window-at-t">Vulnerable Time Window at the RS</xref></t>
              </li>
              <li pn="section-toc.1-1.14.2.6">
                <t indent="0" pn="section-toc.1-1.14.2.6.1"><xref derivedContent="14.6" format="counter" sectionFormat="of" target="section-14.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-preventing-unnoticed-manipu">Preventing Unnoticed Manipulation of Access Tokens</xref></t>
              </li>
              <li pn="section-toc.1-1.14.2.7">
                <t indent="0" pn="section-toc.1-1.14.2.7.1"><xref derivedContent="14.7" format="counter" sectionFormat="of" target="section-14.7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-two-token-hashes-at-the-rs-">Two Token Hashes at the RS Using JWTs</xref></t>
              </li>
              <li pn="section-toc.1-1.14.2.8">
                <t indent="0" pn="section-toc.1-1.14.2.8.1"><xref derivedContent="14.8" format="counter" sectionFormat="of" target="section-14.8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-additional-security-measure">Additional Security Measures</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.15">
            <t indent="0" pn="section-toc.1-1.15.1"><xref derivedContent="15" format="counter" sectionFormat="of" target="section-15"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.15.2">
              <li pn="section-toc.1-1.15.2.1">
                <t indent="0" pn="section-toc.1-1.15.2.1.1"><xref derivedContent="15.1" format="counter" sectionFormat="of" target="section-15.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-media-type-registrations">Media Type Registrations</xref></t>
              </li>
              <li pn="section-toc.1-1.15.2.2">
                <t indent="0" pn="section-toc.1-1.15.2.2.1"><xref derivedContent="15.2" format="counter" sectionFormat="of" target="section-15.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-coap-content-formats-regist">CoAP Content-Formats Registry</xref></t>
              </li>
              <li pn="section-toc.1-1.15.2.3">
                <t indent="0" pn="section-toc.1-1.15.2.3.1"><xref derivedContent="15.3" format="counter" sectionFormat="of" target="section-15.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-custom-problem-detail-keys-">Custom Problem Detail Keys Registry</xref></t>
              </li>
              <li pn="section-toc.1-1.15.2.4">
                <t indent="0" pn="section-toc.1-1.15.2.4.1"><xref derivedContent="15.4" format="counter" sectionFormat="of" target="section-15.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-ace-token-revocation-list-pa">ACE Token Revocation List Parameters Registry</xref></t>
              </li>
              <li pn="section-toc.1-1.15.2.5">
                <t indent="0" pn="section-toc.1-1.15.2.5.1"><xref derivedContent="15.5" format="counter" sectionFormat="of" target="section-15.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-ace-token-revocation-list-err">ACE Token Revocation List Errors</xref></t>
              </li>
              <li pn="section-toc.1-1.15.2.6">
                <t indent="0" pn="section-toc.1-1.15.2.6.1"><xref derivedContent="15.6" format="counter" sectionFormat="of" target="section-15.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-expert-review-instructions">Expert Review Instructions</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.16">
            <t indent="0" pn="section-toc.1-1.16.1"><xref derivedContent="16" format="counter" sectionFormat="of" target="section-16"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.16.2">
              <li pn="section-toc.1-1.16.2.1">
                <t indent="0" pn="section-toc.1-1.16.2.1.1"><xref derivedContent="16.1" format="counter" sectionFormat="of" target="section-16.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.16.2.2">
                <t indent="0" pn="section-toc.1-1.16.2.2.1"><xref derivedContent="16.2" format="counter" sectionFormat="of" target="section-16.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.17">
            <t indent="0" pn="section-toc.1-1.17.1"><xref derivedContent="Appendix A" format="default" sectionFormat="of" target="section-appendix.a"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-on-using-the-series-transfe">On Using the Series Transfer Pattern</xref></t>
          </li>
          <li pn="section-toc.1-1.18">
            <t indent="0" pn="section-toc.1-1.18.1"><xref derivedContent="Appendix B" format="default" sectionFormat="of" target="section-appendix.b"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-local-supportive-parameters">Local Supportive Parameters of the TRL Endpoint</xref></t>
          </li>
          <li pn="section-toc.1-1.19">
            <t indent="0" pn="section-toc.1-1.19.1"><xref derivedContent="Appendix C" format="default" sectionFormat="of" target="section-appendix.c"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-interaction-examples">Interaction Examples</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.19.2">
              <li pn="section-toc.1-1.19.2.1">
                <t indent="0" pn="section-toc.1-1.19.2.1.1"><xref derivedContent="C.1" format="counter" sectionFormat="of" target="section-appendix.c.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-full-query-with-observe">Full Query with Observe</xref></t>
              </li>
              <li pn="section-toc.1-1.19.2.2">
                <t indent="0" pn="section-toc.1-1.19.2.2.1"><xref derivedContent="C.2" format="counter" sectionFormat="of" target="section-appendix.c.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-diff-query-with-observe">Diff Query with Observe</xref></t>
              </li>
              <li pn="section-toc.1-1.19.2.3">
                <t indent="0" pn="section-toc.1-1.19.2.3.1"><xref derivedContent="C.3" format="counter" sectionFormat="of" target="section-appendix.c.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-full-query-with-observe-and">Full Query with Observe and Diff Query</xref></t>
              </li>
              <li pn="section-toc.1-1.19.2.4">
                <t indent="0" pn="section-toc.1-1.19.2.4.1"><xref derivedContent="C.4" format="counter" sectionFormat="of" target="section-appendix.c.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-diff-query-with-observe-and">Diff Query with Observe and "Cursor" Extension</xref></t>
              </li>
              <li pn="section-toc.1-1.19.2.5">
                <t indent="0" pn="section-toc.1-1.19.2.5.1"><xref derivedContent="C.5" format="counter" sectionFormat="of" target="section-appendix.c.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-full-query-with-observe-and-">Full Query with Observe and Diff Query with "Cursor" Extension</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.20">
            <t indent="0" pn="section-toc.1-1.20.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.d"/><xref derivedContent="" format="title" sectionFormat="of" target="name-acknowledgments">Acknowledgments</xref></t>
          </li>
          <li pn="section-toc.1-1.21">
            <t indent="0" pn="section-toc.1-1.21.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.e"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-addresses">Authors' Addresses</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="intro" numbered="true" removeInRFC="false" toc="include" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t indent="0" pn="section-1-1">Authentication and Authorization for Constrained Environments (ACE) <xref target="RFC9200" format="default" sectionFormat="of" derivedContent="RFC9200"/> is a framework that enforces access control on Internet of Things (IoT) devices acting as resource servers (RSs). In order to use ACE, both clients and RSs have to register with an authorization server (AS) and become registered devices. Once registered, a client can send a request to the AS to obtain an access token for an RS. For a client to access the RS, the client must present the issued access token at the RS, which then validates it before storing it (see <xref section="5.10.1.1" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.10.1.1" derivedContent="RFC9200"/>).</t>
      <t indent="0" pn="section-1-2">Even though access tokens have expiration times, there are circumstances by which an access token may need to be revoked before its expiration time, such as when:</t>
      <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-1-3">
	<li pn="section-1-3.1" derivedCounter="1.">a registered device has been compromised or is suspected of being compromised;</li>
        <li pn="section-1-3.2" derivedCounter="2.">a registered device is decommissioned;</li>
        <li pn="section-1-3.3" derivedCounter="3.">there has been a change in the ACE profile for a registered device;</li>
        <li pn="section-1-3.4" derivedCounter="4.">there has been a change in access policies for a registered device; or</li>
        <li pn="section-1-3.5" derivedCounter="5.">there has been a change in the outcome of policy evaluation for a registered device (e.g., if policy assessment depends on dynamic conditions in the execution environment, the user context, or the resource utilization).</li>
      </ol>
      <t indent="0" pn="section-1-4">As discussed in <xref section="6.1" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-6.1" derivedContent="RFC9200"/>, only client-initiated revocation is currently specified <xref target="RFC7009" format="default" sectionFormat="of" derivedContent="RFC7009"/> for OAuth 2.0 <xref target="RFC6749" format="default" sectionFormat="of" derivedContent="RFC6749"/>, based on the assumption that access tokens in OAuth are issued with a relatively short lifetime. However, this is not expected to be the case for constrained, intermittently connected devices that need access tokens with relatively long lifetimes.</t>
      <t indent="0" pn="section-1-5">This document specifies a method for allowing registered devices to access and possibly subscribe to a Token Revocation List (TRL) on the AS in order to obtain updated information about pertaining access tokens that were revoked prior to their expiration. As specified in this document, the registered devices use the Constrained Application Protocol (CoAP) <xref target="RFC7252" format="default" sectionFormat="of" derivedContent="RFC7252"/> to communicate with the AS and with one another and can subscribe to the TRL on the AS by using resource observation for CoAP <xref target="RFC7641" format="default" sectionFormat="of" derivedContent="RFC7641"/>. Underlying protocols other than CoAP are not prohibited from being supported in the future, if they are defined to be used in the ACE framework.</t>
      <t indent="0" pn="section-1-6">Unlike in the case of token introspection (see <xref section="5.9" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.9" derivedContent="RFC9200"/>), a registered device does not provide an owned access token to the AS for inquiring about its current state. Instead, registered devices simply obtain updated information about pertaining access tokens that were revoked prior to their expiration as efficiently identified by corresponding hash values.</t>
      <t indent="0" pn="section-1-7">The benefits of this method are that it complements token introspection and does not require the registered devices to support any additional endpoints (see <xref target="terminology" format="default" sectionFormat="of" derivedContent="Section 1.1"/>). The only additional requirements for registered devices are a request/response interaction with the AS to access and possibly subscribe to the TRL (see <xref target="sec-overview" format="default" sectionFormat="of" derivedContent="Section 2"/>) and the lightweight computation of hash values to use as access token identifiers (see <xref target="sec-token-name" format="default" sectionFormat="of" derivedContent="Section 4"/>).</t>
      <t indent="0" pn="section-1-8">The process by which access tokens are declared revoked is out of the scope of this document.  The method by which the AS determines or is notified of revoked access
tokens, according to which the AS consequently updates the TRL as
specified in this document, is also out of scope.</t>
      <section anchor="terminology" numbered="true" removeInRFC="false" toc="include" pn="section-1.1">
        <name slugifiedName="name-terminology">Terminology</name>
        <t indent="0" pn="section-1.1-1">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" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t indent="0" pn="section-1.1-2">Readers are expected to be familiar with the terms and concepts described in the ACE framework <xref target="RFC9200" format="default" sectionFormat="of" derivedContent="RFC9200"/>, as well as with terms and concepts related to CBOR Web Tokens (CWTs) <xref target="RFC8392" format="default" sectionFormat="of" derivedContent="RFC8392"/> and JSON Web Tokens (JWTs) <xref target="RFC7519" format="default" sectionFormat="of" derivedContent="RFC7519"/>.</t>
        <t indent="0" pn="section-1.1-3">The terminology for entities in the considered architecture is defined in OAuth 2.0 <xref target="RFC6749" format="default" sectionFormat="of" derivedContent="RFC6749"/>. In particular, this includes client, RS, and authorization server (AS).</t>
        <t indent="0" pn="section-1.1-4">Readers are also expected to be familiar with the terms and concepts related to the Concise Data Definition Language (CDDL) <xref target="RFC8610" format="default" sectionFormat="of" derivedContent="RFC8610"/>, Concise Binary Object Representation (CBOR) <xref target="RFC8949" format="default" sectionFormat="of" derivedContent="RFC8949"/>, JSON <xref target="RFC8259" format="default" sectionFormat="of" derivedContent="RFC8259"/>, CBOR Object Signing and Encryption (COSE) <xref target="RFC9052" format="default" sectionFormat="of" derivedContent="RFC9052"/>, CoAP <xref target="RFC7252" format="default" sectionFormat="of" derivedContent="RFC7252"/>, CoAP Observe <xref target="RFC7641" format="default" sectionFormat="of" derivedContent="RFC7641"/>, and the use of hash functions to name objects as defined in <xref target="RFC6920" format="default" sectionFormat="of" derivedContent="RFC6920"/>.</t>
        <t indent="0" pn="section-1.1-5">Note that the term "endpoint" is used here following its OAuth definition <xref target="RFC6749" format="default" sectionFormat="of" derivedContent="RFC6749"/>, aimed at denoting resources such as /token and /introspect at the AS, and /authz-info at the RS.  The CoAP definition, which is "[a]n entity participating in the CoAP protocol" <xref target="RFC7252" format="default" sectionFormat="of" derivedContent="RFC7252"/>, is not used in this document.</t>
        <t indent="0" pn="section-1.1-6">This specification also uses the following terminology:</t>
        <dl spacing="normal" indent="3" newline="false" pn="section-1.1-7">
          <dt pn="section-1.1-7.1">Token hash:</dt>
          <dd pn="section-1.1-7.2">identifier of an access token, in binary
            format encoding. The token hash has no relation to other access
            token identifiers possibly used, such as the 'cti' (CWT ID) claim
            of CBOR Web Tokens (CWTs) <xref target="RFC8392" format="default" sectionFormat="of" derivedContent="RFC8392"/>.</dd>
          <dt pn="section-1.1-7.3">Token Revocation List (TRL):</dt>
          <dd pn="section-1.1-7.4">a collection of token
            hashes such that the corresponding access tokens have been revoked
            but are not expired yet.</dd>
          <dt pn="section-1.1-7.5">TRL endpoint:</dt>
          <dd pn="section-1.1-7.6">an endpoint at the AS with a TRL as its
            representation. The default name of the TRL endpoint in a url-path
            is '/revoke/trl'. Implementations are not required to use this
            name and can define their own instead.</dd>
          <dt pn="section-1.1-7.7">Registered device:</dt>
          <dd pn="section-1.1-7.8">a device registered at the AS,
            i.e., as a client, an RS, or both. A registered device acts as
            a requester towards the TRL endpoint.</dd>
          <dt pn="section-1.1-7.9">Administrator:</dt>
          <dd pn="section-1.1-7.10">
            <t indent="0" pn="section-1.1-7.10.1">an entity that is authorized to get full access
            to the TRL at the AS and that acts as a requester towards the TRL
            endpoint. An administrator is not necessarily a registered device
            as defined above, i.e., a client requesting access tokens or an RS
            consuming access tokens.  </t>
            <t indent="0" pn="section-1.1-7.10.2">An administrator might also be authorized to perform further
            administrative operations at the AS, e.g., through a dedicated
            admin interface that is out of the scope of this document. By
            considering the token hashes retrieved from the TRL together with
            other information obtained from the AS, the administrator becomes
            able to derive additional information, e.g., the fact that
            accesses have been revoked for specific registered devices.</t>
          </dd>
          <dt pn="section-1.1-7.11">Pertaining access token:</dt>
          <dd pn="section-1.1-7.12">
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-1.1-7.12.1">
              <li pn="section-1.1-7.12.1.1">
                <t indent="0" pn="section-1.1-7.12.1.1.1">With reference to an administrator, an access token
                issued by the AS.</t>
              </li>
              <li pn="section-1.1-7.12.1.2">
                <t indent="0" pn="section-1.1-7.12.1.2.1">With reference to a registered device, an access token
		intended to be owned by that device. An access token pertains
		to a client if the AS has issued the access token for that
		client following its request. An access token pertains to an
		RS if the AS has issued the access token to be consumed by
		that RS.</t>
              </li>
            </ul>
          </dd>
          <dt pn="section-1.1-7.13">Token hash pertaining to a requester:</dt>
          <dd pn="section-1.1-7.14">a token hash
            corresponding to an access token pertaining to that requester,
            i.e., an administrator or a registered device.</dd>
          <dt pn="section-1.1-7.15">TRL update pertaining to a requester:</dt>
          <dd pn="section-1.1-7.16">an update to the
            TRL through which token hashes pertaining to that requester have
            been added to or removed from the TRL.</dd>
          <dt pn="section-1.1-7.17">Full query:</dt>
          <dd pn="section-1.1-7.18">a type of query to the TRL where the AS
            returns the token hashes of the revoked access tokens currently in
            the TRL and pertaining to the requester. Further details are
            specified in Sections <xref target="sec-trl-endpoint" format="counter" sectionFormat="of" derivedContent="6"/> and <xref target="ssec-trl-full-query" format="counter" sectionFormat="of" derivedContent="7"/>.</dd>
          <dt pn="section-1.1-7.19">Diff query:</dt>
          <dd pn="section-1.1-7.20">a type of query to the TRL where the AS
            returns a list of diff entries, each related to one update
            that occurred to the TRL and containing a set of token hashes
            pertaining to the requester. Further details are specified in
            Sections <xref target="sec-trl-endpoint" format="counter" sectionFormat="of" derivedContent="6"/> and <xref target="ssec-trl-diff-query" format="counter" sectionFormat="of" derivedContent="8"/>.</dd>
        </dl>
        <t indent="0" pn="section-1.1-8">See <xref target="sec-token-name" format="default" sectionFormat="of" derivedContent="Section 4"/> for further terminology used throughout that section.</t>
        <t indent="0" pn="section-1.1-9">Examples throughout this document are expressed in CBOR diagnostic notation as defined in <xref section="8" sectionFormat="of" target="RFC8949" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8949#section-8" derivedContent="RFC8949"/> and <xref section="G" sectionFormat="of" target="RFC8610" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8610#appendix-G" derivedContent="RFC8610"/>. Diagnostic notation comments are often used to provide a textual representation of the numeric parameter names and values.</t>
      </section>
    </section>
    <section anchor="sec-overview" numbered="true" removeInRFC="false" toc="include" pn="section-2">
      <name slugifiedName="name-protocol-overview">Protocol Overview</name>
      <t indent="0" pn="section-2-1">This protocol defines how a CoAP-based AS informs clients and RSs, i.e., registered devices, about pertaining revoked access tokens. How the relationship between a registered device and the AS is established is out of the scope of this specification.</t>
      <t indent="0" pn="section-2-2">At a high level, the steps of this protocol are as follows:</t>
      <ol spacing="normal" indent="adaptive" start="1" type="1" pn="section-2-3">
        <li pn="section-2-3.1" derivedCounter="1.">
          <t indent="0" pn="section-2-3.1.1">Upon startup, the AS creates a single TRL accessible through the TRL endpoint. At any point in time, the TRL represents the list of all revoked access tokens issued by the AS that are not expired yet.</t>
        </li>
        <li pn="section-2-3.2" derivedCounter="2.">
          <t indent="0" pn="section-2-3.2.1">When a device registers at the AS, it also receives the url-path to the TRL endpoint.  </t>
          <t indent="0" pn="section-2-3.2.2">
At any time after the registration procedure is finished, the registered device can send a GET request to the TRL endpoint at the AS. When doing so, it can request the following: the current list of pertaining revoked access tokens (see <xref target="ssec-trl-full-query" format="default" sectionFormat="of" derivedContent="Section 7"/>) or the most recent updates that occurred over the list of pertaining revoked access tokens (see <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>).  </t>
          <t indent="0" pn="section-2-3.2.3">

  
In particular, the registered device can rely on Observation for CoAP <xref target="RFC7641" format="default" sectionFormat="of" derivedContent="RFC7641"/>. In such a case, the GET request sent to the TRL endpoint includes the CoAP Observe Option set to 0 (register), i.e., it is an Observation Request. By doing so, the registered device effectively subscribes to the TRL,
as the device is interested in receiving notifications about the TRL's
update. Upon receiving the Observation Request, the AS adds the registered device to the list of observers of the TRL endpoint.</t>
        </li>
        <li pn="section-2-3.3" derivedCounter="3.">
          <t indent="0" pn="section-2-3.3.1">When an access token is revoked, the AS adds the corresponding token hash to the TRL. Also, when a revoked access token eventually expires, the AS removes the corresponding token hash from the TRL.  </t>
          <t indent="0" pn="section-2-3.3.2">
	    
In either case, after updating the TRL, the AS sends Observe notifications as per <xref target="RFC7641" format="default" sectionFormat="of" derivedContent="RFC7641"/>.  That is, an Observe notification is sent to each registered device that is subscribed to the TRL and to which the access token pertains.  </t>
          <t indent="0" pn="section-2-3.3.3">
Depending on the specific subscription established through the
Observation Request, the notification provides either the current
updated list of revoked access tokens in the subset of the TRL
pertaining to that device (see <xref target="ssec-trl-full-query" format="default" sectionFormat="of" derivedContent="Section 7"/>) or the most recent TRL
updates that occurred over that list of pertaining revoked access
tokens (see <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>).  </t>
          <t indent="0" pn="section-2-3.3.4">
Further Observe notifications may be sent, consistent with ongoing additional observations of the TRL endpoint.</t>
        </li>
        <li pn="section-2-3.4" derivedCounter="4.">
          <t indent="0" pn="section-2-3.4.1">An administrator can access and subscribe to the TRL like a registered device while getting the content of the whole TRL (see <xref target="ssec-trl-full-query" format="default" sectionFormat="of" derivedContent="Section 7"/>) or the most recent updates that occurred to the whole TRL (see <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>).</t>
        </li>
      </ol>
      <t indent="0" pn="section-2-4"><xref target="fig-protocol-overview" format="default" sectionFormat="of" derivedContent="Figure 1"/> shows a high-level overview of the service provided by this protocol. For the sake of simplicity, the example shown in the figure considers the simultaneous revocation of the three access tokens t1, t2, and t3 whose corresponding token hashes are th1, th2, and th3, respectively. Consequently, the AS adds the three token hashes to the TRL at once and sends Observe notifications to one administrator and four registered devices. Each dotted line associated with a pair of registered devices indicates the access token that they both own.</t>
      <figure anchor="fig-protocol-overview" align="left" suppress-title="false" pn="figure-1">
        <name slugifiedName="name-protocol-overview-2">Protocol Overview</name>
        <artset pn="section-2-5.1">
          <artwork type="svg" align="center" pn="section-2-5.1.1"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="560" viewBox="0 0 560 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,176 L 8,224" fill="none" stroke="black"/>
              <path d="M 16,112 L 16,168" fill="none" stroke="black"/>
              <path d="M 136,176 L 136,224" fill="none" stroke="black"/>
              <path d="M 152,176 L 152,224" fill="none" stroke="black"/>
              <path d="M 160,112 L 160,168" fill="none" stroke="black"/>
              <path d="M 168,32 L 168,64" fill="none" stroke="black"/>
              <path d="M 240,176 L 240,224" fill="none" stroke="black"/>
              <path d="M 256,176 L 256,224" fill="none" stroke="black"/>
              <path d="M 264,64 L 264,168" fill="none" stroke="black"/>
              <path d="M 344,176 L 344,224" fill="none" stroke="black"/>
              <path d="M 352,32 L 352,64" fill="none" stroke="black"/>
              <path d="M 360,176 L 360,224" fill="none" stroke="black"/>
              <path d="M 368,112 L 368,168" fill="none" stroke="black"/>
              <path d="M 448,176 L 448,224" fill="none" stroke="black"/>
              <path d="M 464,176 L 464,224" fill="none" stroke="black"/>
              <path d="M 472,112 L 472,168" fill="none" stroke="black"/>
              <path d="M 552,176 L 552,224" fill="none" stroke="black"/>
              <path d="M 168,32 L 352,32" fill="none" stroke="black"/>
              <path d="M 168,64 L 256,64" fill="none" stroke="black"/>
              <path d="M 272,64 L 352,64" fill="none" stroke="black"/>
              <path d="M 16,112 L 472,112" fill="none" stroke="black"/>
              <path d="M 8,176 L 136,176" fill="none" stroke="black"/>
              <path d="M 152,176 L 240,176" fill="none" stroke="black"/>
              <path d="M 256,176 L 344,176" fill="none" stroke="black"/>
              <path d="M 360,176 L 448,176" fill="none" stroke="black"/>
              <path d="M 464,176 L 552,176" fill="none" stroke="black"/>
              <path d="M 8,224 L 136,224" fill="none" stroke="black"/>
              <path d="M 152,224 L 240,224" fill="none" stroke="black"/>
              <path d="M 256,224 L 344,224" fill="none" stroke="black"/>
              <path d="M 360,224 L 448,224" fill="none" stroke="black"/>
              <path d="M 464,224 L 552,224" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="480,168 468,162.4 468,173.6" fill="black" transform="rotate(90,472,168)"/>
              <polygon class="arrowhead" points="376,168 364,162.4 364,173.6" fill="black" transform="rotate(90,368,168)"/>
              <polygon class="arrowhead" points="272,168 260,162.4 260,173.6" fill="black" transform="rotate(90,264,168)"/>
              <polygon class="arrowhead" points="168,168 156,162.4 156,173.6" fill="black" transform="rotate(90,160,168)"/>
              <polygon class="arrowhead" points="24,168 12,162.4 12,173.6" fill="black" transform="rotate(90,16,168)"/>
              <circle cx="264" cy="64" r="6" class="opendot" fill="white" stroke="black"/>
              <g class="text">
                <text x="232" y="52">Authorization</text>
                <text x="316" y="52">server</text>
                <text x="192" y="84">/revoke/trl</text>
                <text x="308" y="84">TRL:</text>
                <text x="384" y="84">(th1,th2,th3)</text>
                <text x="72" y="148">th1,th2,th3</text>
                <text x="200" y="148">th1,th2</text>
                <text x="288" y="148">th1</text>
                <text x="392" y="148">th3</text>
                <text x="512" y="148">th2,th3</text>
                <text x="72" y="196">Administrator</text>
                <text x="188" y="196">Client</text>
                <text x="224" y="196">1</text>
                <text x="300" y="196">Resource</text>
                <text x="396" y="196">Client</text>
                <text x="432" y="196">2</text>
                <text x="508" y="196">Resource</text>
                <text x="292" y="212">server</text>
                <text x="328" y="212">1</text>
                <text x="500" y="212">server</text>
                <text x="536" y="212">2</text>
                <text x="176" y="244">:</text>
                <text x="216" y="244">:</text>
                <text x="288" y="244">:</text>
                <text x="384" y="244">:</text>
                <text x="488" y="244">:</text>
                <text x="528" y="244">:</text>
                <text x="176" y="260">:</text>
                <text x="216" y="260">:</text>
                <text x="252" y="260">t1</text>
                <text x="288" y="260">:</text>
                <text x="384" y="260">:</text>
                <text x="436" y="260">t3</text>
                <text x="488" y="260">:</text>
                <text x="528" y="260">:</text>
                <text x="176" y="276">:</text>
                <text x="252" y="276">:........:</text>
                <text x="436" y="276">:............:</text>
                <text x="528" y="276">:</text>
                <text x="176" y="292">:</text>
                <text x="340" y="292">t2</text>
                <text x="528" y="292">:</text>
                <text x="352" y="308">:...........................................:</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art" align="center" pn="section-2-5.1.2">
                    +----------------------+
                    | Authorization server |
                    +-----------o----------+
                  /revoke/trl   |   TRL: (th1,th2,th3)
                                |
 +-----------------+------------+------------+------------+
 |                 |            |            |            |
 | th1,th2,th3     | th1,th2    | th1        | th3        | th2,th3
 v                 v            v            v            v
+---------------+ +----------+ +----------+ +----------+ +----------+
| Administrator | | Client 1 | | Resource | | Client 2 | | Resource |
|               | |          | | server 1 | |          | | server 2 |
+---------------+ +----------+ +----------+ +----------+ +----------+
                     :    :        :           :            :    :
                     :    :   t1   :           :     t3     :    :
                     :    :........:           :............:    :
                     :                   t2                      :
                     :...........................................:
</artwork>
        </artset>
      </figure>
      <t indent="0" pn="section-2-6"><xref target="sec-RS-examples" format="default" sectionFormat="of" derivedContent="Appendix C"/> provides examples of the protocol flow and message exchanges between the AS and a registered device.</t>
    </section>
    <section anchor="sec-issuing-access-tokens-as" numbered="true" removeInRFC="false" toc="include" pn="section-3">
      <name slugifiedName="name-issuing-of-access-tokens-at">Issuing of Access Tokens at the AS</name>
      <t indent="0" pn="section-3-1">An AS that supports the method defined in this document <bcp14>MUST</bcp14> adhere to the following rules when issuing an access token:</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3-2">
        <li pn="section-3-2.1">
          <t indent="0" pn="section-3-2.1.1">All the intended header parameters in the access token <bcp14>MUST</bcp14> be specified within integrity-protected fields.</t>
        </li>
        <li pn="section-3-2.2">
          <t indent="0" pn="section-3-2.2.1">If the access token is a CWT, the following applies:  </t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3-2.2.2">
            <li pn="section-3-2.2.2.1">
              <t indent="0" pn="section-3-2.2.2.1.1">Any "unprotected" field <bcp14>MUST</bcp14> be empty, i.e., its value <bcp14>MUST</bcp14> be encoded as the empty CBOR map (0xa0). This applies to the top-level "unprotected" field of the COSE object used for the CWT, the "unprotected" field of each element of the "signatures" array, and the "unprotected" field of each element of any "recipients" array (see Sections <xref target="RFC9052" section="2" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9052#section-2" derivedContent="RFC9052"/>, <xref target="RFC9052" section="3" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9052#section-3" derivedContent="RFC9052"/>, <xref target="RFC9052" section="4" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9052#section-4" derivedContent="RFC9052"/>, <xref target="RFC9052" section="5" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9052#section-5" derivedContent="RFC9052"/>, and <xref target="RFC9052" section="6" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9052#section-6" derivedContent="RFC9052"/> of <xref target="RFC9052" format="default" sectionFormat="of" derivedContent="RFC9052"/>).</t>
            </li>
            <li pn="section-3-2.2.2.2">
              <t indent="0" pn="section-3-2.2.2.2.1">Consistent with the specific COSE object used for the CWT, the corresponding tagged structure in the set COSE_Tagged_Message <bcp14>MUST</bcp14> be used (see <xref section="2" sectionFormat="of" target="RFC9052" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9052#section-2" derivedContent="RFC9052"/>). That is, the CBOR array that encodes the CWT <bcp14>MUST</bcp14> be tagged by using the COSE CBOR tag corresponding to the used COSE object. Table 1 in <xref section="2" sectionFormat="of" target="RFC9052" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9052#section-2" derivedContent="RFC9052"/> specifies the tag numbers in question.      </t>
              <t indent="0" pn="section-3-2.2.2.2.2">
In turn, the resulting tagged data item <bcp14>MUST</bcp14> be tagged by using the CWT CBOR tag with tag number 61 (see <xref section="6" sectionFormat="of" target="RFC8392" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8392#section-6" derivedContent="RFC8392"/>). After that, the resulting data item <bcp14>MUST NOT</bcp14> be further tagged.      </t>
              <t indent="0" pn="section-3-2.2.2.2.3">
Encoding of the tag numbers <bcp14>MUST</bcp14> be done using definite lengths, and the length of the encoded tag numbers <bcp14>MUST</bcp14> be the minimum possible length. This means that tag number 16 is encoded as 0xd0 and not as 0xd810.      </t>
              <t indent="0" pn="section-3-2.2.2.2.4">
The example in <xref target="fig-cwt-cose-encrypt0" format="default" sectionFormat="of" derivedContent="Figure 2"/> shows a CWT that uses the COSE object COSE_Encrypt0 (see <xref section="5.2" sectionFormat="of" target="RFC9052" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9052#section-5.2" derivedContent="RFC9052"/>).</t>
            </li>
          </ul>
        </li>
        <li pn="section-3-2.3">
          <t indent="0" pn="section-3-2.3.1">If, like for JWTs <xref target="RFC7519" format="default" sectionFormat="of" derivedContent="RFC7519"/>, the access token relies on a JSON object for encoding its claims, the following applies:  </t>
          <t indent="0" pn="section-3-2.3.2">
Consistent with the ACE framework <xref target="RFC9200" format="default" sectionFormat="of" derivedContent="RFC9200"/>, this document specifically considers JWTs, which are always represented using the  JSON Web Signature (JWS) Compact Serialization from <xref target="RFC7515" format="default" sectionFormat="of" derivedContent="RFC7515"/> or the JSON Web Encryption (JWE) Compact Serialization from <xref target="RFC7516" format="default" sectionFormat="of" derivedContent="RFC7516"/>. Consequently, all the header parameters are specified within integrity-protected fields.  </t>
          <t indent="0" pn="section-3-2.3.3">
In case alternative access tokens were used, the following applies:  </t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3-2.3.4">
            <li pn="section-3-2.3.4.1">
              <t indent="0" pn="section-3-2.3.4.1.1">If the access token uses the JWS JSON Serialization from <xref target="RFC7515" format="default" sectionFormat="of" derivedContent="RFC7515"/>, it <bcp14>MUST NOT</bcp14> include the JWS Unprotected Header.</t>
            </li>
            <li pn="section-3-2.3.4.2">
              <t indent="0" pn="section-3-2.3.4.2.1">If the access token uses the JWE JSON Serialization from <xref target="RFC7516" format="default" sectionFormat="of" derivedContent="RFC7516"/>, it <bcp14>MUST NOT</bcp14> include the JWE Shared Unprotected Header and it <bcp14>MUST NOT</bcp14> include the "header" member in any of the elements of the "recipients" array.</t>
            </li>
          </ul>
        </li>
      </ul>
      <figure anchor="fig-cwt-cose-encrypt0" align="left" suppress-title="false" pn="figure-2">
        <name slugifiedName="name-example-of-cwt-using-cose_e">Example of CWT Using COSE_Encrypt0</name>
        <sourcecode type="cbor-diag" markers="false" pn="section-3-3.1">
/ CWT CBOR tag / 61(
  / COSE_Encrypt0 CBOR tag / 16(
    / COSE_Encrypt0 object / [
      / protected /   h'a3010a044c53796d6d65747269633132
                        38054d99a0d7846e762c49ffe8a63e0b',
      / unprotected / {},
      / ciphertext /  h'b918a11fd81e438b7f973d9e2e119bcb
                        22424ba0f38a80f27562f400ee1d0d6c
                        0fdb559c02421fd384fc2ebe22d70713
                        78b0ea7428fff157444d45f7e6afcda1
                        aae5f6495830c58627087fc5b4974f31
                        9a8707a635dd643b'
    ]
  )
)
</sourcecode>
      </figure>
      <t indent="0" pn="section-3-4"><xref target="sec-seccons-token-manipulation" format="default" sectionFormat="of" derivedContent="Section 14.6"/> discusses how adhering to the rules above neutralizes an attack against the RS where an active adversary can induce the RS to compute a token hash different from the correct one.</t>
    </section>
    <section anchor="sec-token-name" numbered="true" removeInRFC="false" toc="include" pn="section-4">
      <name slugifiedName="name-token-hash">Token Hash</name>
      <t indent="0" pn="section-4-1">This section specifies how token hashes are computed.</t>
      <t indent="0" pn="section-4-2">First, <xref target="sec-token-hash-input-motivation" format="default" sectionFormat="of" derivedContent="Section 4.1"/> provides the motivation for the used construction.</t>
      <t indent="0" pn="section-4-3">Building on that, the value used as input to compute a token hash is defined in <xref target="sec-token-hash-input-c-as" format="default" sectionFormat="of" derivedContent="Section 4.2"/> for the client and the AS and in <xref target="sec-token-hash-input-rs" format="default" sectionFormat="of" derivedContent="Section 4.3"/> for the RS. Finally, <xref target="sec-token-hash-output" format="default" sectionFormat="of" derivedContent="Section 4.4"/> defines how such an input is used for computing the token hash.</t>
      <t indent="0" pn="section-4-4">The process outlined below refers to the base64url encoding and decoding without padding (see <xref section="5" sectionFormat="of" target="RFC4648" format="default" derivedLink="https://rfc-editor.org/rfc/rfc4648#section-5" derivedContent="RFC4648"/>) and denotes as "binary representation" of a text string the corresponding UTF-8 encoding <xref target="RFC3629" format="default" sectionFormat="of" derivedContent="RFC3629"/>, which is the implied charset used in JSON (see <xref section="8.1" sectionFormat="of" target="RFC8259" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8259#section-8.1" derivedContent="RFC8259"/>).</t>
      <t indent="0" pn="section-4-5">Consistent with <xref section="3.4" sectionFormat="of" target="RFC8949" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8949#section-3.4" derivedContent="RFC8949"/>, the term "tag" is used for the entire CBOR data item consisting of both a tag number and the tag content: the tag content is the CBOR data item that is being tagged.</t>
      <t indent="0" pn="section-4-6">Also, "tagged access token" is used to denote nested CBOR tags (possibly a single one), with the innermost tag content being a CWT.</t>
      <section anchor="sec-token-hash-input-motivation" numbered="true" removeInRFC="false" toc="include" pn="section-4.1">
        <name slugifiedName="name-motivation-for-the-used-con">Motivation for the Used Construction</name>
        <t indent="0" pn="section-4.1-1">An access token can have one among different formats. The most expected formats are CWT <xref target="RFC8392" format="default" sectionFormat="of" derivedContent="RFC8392"/> and JWT <xref target="RFC7519" format="default" sectionFormat="of" derivedContent="RFC7519"/>, with the former being the default format to use in the ACE framework (see <xref section="3" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-3" derivedContent="RFC9200"/>). While access tokens are opaque to clients, an RS is aware of whether access tokens that are issued for it to consume are either CWTs or JWTs.</t>
        <section anchor="issuing-of-the-access-token-to-the-client" numbered="true" removeInRFC="false" toc="include" pn="section-4.1.1">
          <name slugifiedName="name-issuing-of-the-access-token">Issuing of the Access Token to the Client</name>
          <t indent="0" pn="section-4.1.1-1">There are two possible encodings that the AS can use for the AS-to-Client response (see <xref section="5.8.2" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.8.2" derivedContent="RFC9200"/>) where the issued access token is included and provided to the requester client. The RS may not be aware of which encoding is used for that response to that particular requester client.</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.1.1-2">
            <li pn="section-4.1.1-2.1">
              <t indent="0" pn="section-4.1.1-2.1.1">One method of encoding relies on CBOR, which is required if CoAP is used (see <xref section="5" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5" derivedContent="RFC9200"/>) and is recommended otherwise (see <xref section="3" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-3" derivedContent="RFC9200"/>). That is, the AS-to-Client response has media-type "application/ace+cbor".  </t>
              <t indent="0" pn="section-4.1.1-2.1.2">
This implies that, within the CBOR map specified as message payload, the 'access_token' parameter is a CBOR data item of type CBOR byte string and with a value of BYTES. In particular:  </t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.1.1-2.1.3">
                <li pn="section-4.1.1-2.1.3.1">
                  <t indent="0" pn="section-4.1.1-2.1.3.1.1">If the access token is a CWT, then BYTES is the binary representation of the CWT (i.e., of the CBOR array that encodes the untagged CWT) or of a tagged access token with the CWT as the innermost tag content.</t>
                </li>
                <li pn="section-4.1.1-2.1.3.2">
                  <t indent="0" pn="section-4.1.1-2.1.3.2.1">If the access token is a JWT, then BYTES is the binary representation of the JWT (i.e., of the text string that encodes the JWT).</t>
                </li>
              </ul>
            </li>
            <li pn="section-4.1.1-2.2">
              <t indent="0" pn="section-4.1.1-2.2.1">An alternative method of encoding relies on JSON. That is, the AS-to-Client response has media-type "application/ace+json".  </t>
              <t indent="0" pn="section-4.1.1-2.2.2">
This implies that, within the JSON object specified as message payload, the 'access_token' parameter has as a value a text string TEXT. In particular:  </t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.1.1-2.2.3">
                <li pn="section-4.1.1-2.2.3.1">
                  <t indent="0" pn="section-4.1.1-2.2.3.1.1">If the access token is a JWT, then TEXT is the text string that encodes the JWT.</t>
                </li>
                <li pn="section-4.1.1-2.2.3.2">
                  <t indent="0" pn="section-4.1.1-2.2.3.2.1">If the access token is a CWT, then TEXT is the base64url-encoded text string of BYTES, which is the binary representation of the CWT (i.e., of the CBOR array that encodes the untagged CWT) or of a tagged access token with the CWT as the innermost tag content.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="sec-token-hash-input-motivation-rs" numbered="true" removeInRFC="false" toc="include" pn="section-4.1.2">
          <name slugifiedName="name-provisioning-of-access-toke">Provisioning of Access Tokens to the RS</name>
          <t indent="0" pn="section-4.1.2-1">In accordance with the used transport profile of ACE (e.g., <xref target="RFC9202" format="default" sectionFormat="of" derivedContent="RFC9202"/>, <xref target="RFC9203" format="default" sectionFormat="of" derivedContent="RFC9203"/>, <xref target="RFC9431" format="default" sectionFormat="of" derivedContent="RFC9431"/>), the RS receives a piece of token-related information hereafter denoted as TOKEN_INFO.</t>
          <t indent="0" pn="section-4.1.2-2">In particular:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.1.2-3">
            <li pn="section-4.1.2-3.1">
              <t indent="0" pn="section-4.1.2-3.1.1">If the AS-to-Client response was encoded in CBOR, then TOKEN_INFO is the value of the CBOR byte string conveyed by the 'access_token' parameter of that response. That is, TOKEN_INFO is the binary representation of the access token.</t>
            </li>
            <li pn="section-4.1.2-3.2">
              <t indent="0" pn="section-4.1.2-3.2.1">If the AS-to-Client response was encoded in JSON and the access token is a JWT, then TOKEN_INFO is the binary representation of the text string conveyed by the 'access_token' parameter of that response. That is, TOKEN_INFO is the binary representation of the access token.</t>
            </li>
            <li pn="section-4.1.2-3.3">
              <t indent="0" pn="section-4.1.2-3.3.1">If the AS-to-Client response was encoded in JSON and the access token is a CWT, then TOKEN_INFO is the binary representation of the base64url-encoded text string that encodes the binary representation of the  access token. That is, TOKEN_INFO is the binary representation of the base64url-encoded text string conveyed by the 'access_token' parameter.</t>
            </li>
          </ul>
          <t indent="0" pn="section-4.1.2-4">The following overviews how the above specifically applies to the existing transport profiles of ACE:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.1.2-5">
            <li pn="section-4.1.2-5.1">
              <t indent="0" pn="section-4.1.2-5.1.1">The access token can be uploaded to the RS by means of a POST request to the /authz-info endpoint (see <xref section="5.10.1" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.10.1" derivedContent="RFC9200"/>), using a CoAP Content-Format or HTTP media-type that reflects the format of the access token, if available (e.g., "application/cwt" for CWTs), or "application/octet-stream" otherwise. When doing so (e.g., like in <xref target="RFC9202" format="default" sectionFormat="of" derivedContent="RFC9202"/>), TOKEN_INFO is the payload of the POST request.</t>
            </li>
            <li pn="section-4.1.2-5.2">
              <t indent="0" pn="section-4.1.2-5.2.1">The access token can be uploaded to the RS by means of a POST request to the /authz-info endpoint, using the media-type "application/ace+cbor". When doing so (e.g., like in <xref target="RFC9203" format="default" sectionFormat="of" derivedContent="RFC9203"/>), TOKEN_INFO is the value of the CBOR byte string conveyed by the 'access_token' parameter, within the CBOR map specified as payload of the POST request.</t>
            </li>
            <li pn="section-4.1.2-5.3">
              <t indent="0" pn="section-4.1.2-5.3.1">The access token can be uploaded to the RS during a DTLS session establishment, e.g., like it is defined in <xref section="3.3.2" sectionFormat="of" target="RFC9202" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9202#section-3.3.2" derivedContent="RFC9202"/>. When doing so, TOKEN_INFO is the value of the 'psk_identity' field of the ClientKeyExchange message (when using DTLS 1.2 <xref target="RFC6347" format="default" sectionFormat="of" derivedContent="RFC6347"/>) or of the 'identity' field of a PSKIdentity, within the PreSharedKeyExtension of a ClientHello message (when using DTLS 1.3 <xref target="RFC9147" format="default" sectionFormat="of" derivedContent="RFC9147"/>).</t>
            </li>
            <li pn="section-4.1.2-5.4">
              <t indent="0" pn="section-4.1.2-5.4.1">The access token can be uploaded to the RS within the MQTT CONNECT packet, e.g., like it is defined in <xref section="2.2.4.1" sectionFormat="of" target="RFC9431" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9431#section-2.2.4.1" derivedContent="RFC9431"/>. When doing so, TOKEN_INFO is specified within the 'Authentication Data' field of the MQTT CONNECT packet, following the property identifier 22 (0x16) and the token length.</t>
            </li>
          </ul>
          <t indent="0" pn="section-4.1.2-6"> Note that, if the access token is a CWT, it is specifically tagged as defined in <xref target="sec-issuing-access-tokens-as" format="default" sectionFormat="of" derivedContent="Section 3"/>.</t>
        </section>
        <section anchor="design-rationale" numbered="true" removeInRFC="false" toc="include" pn="section-4.1.3">
          <name slugifiedName="name-design-rationale">Design Rationale</name>
          <t indent="0" pn="section-4.1.3-1">Considering the possible variants discussed above, it must always be ensured that the same HASH_INPUT value is used as input for generating the token hash of a given access token, by the AS that has issued the access token and by the registered devices to which the access token pertains (both client and RS).</t>
          <t indent="0" pn="section-4.1.3-2">This is achieved by building HASH_INPUT according to the content of the 'access_token' parameter in the AS-to-Client responses because that is what the AS, the client, and the RS are all able to see.</t>
        </section>
      </section>
      <section anchor="sec-token-hash-input-c-as" numbered="true" removeInRFC="false" toc="include" pn="section-4.2">
        <name slugifiedName="name-hash-input-on-the-client-an">Hash Input on the Client and the AS</name>
        <t indent="0" pn="section-4.2-1">The client and the AS consider the content of the 'access_token' parameter in the AS-to-Client response, in which the access token is included and provided to the requester client.  Note that, if the access token is a CWT, it is specifically tagged as defined in <xref target="sec-issuing-access-tokens-as" format="default" sectionFormat="of" derivedContent="Section 3"/>.</t>
        <t indent="0" pn="section-4.2-2">The following defines how the client and the AS determine the HASH_INPUT value to use as input for computing the token hash of the conveyed access token, depending on the AS-to-Client response being encoded in CBOR (see <xref target="sec-token-hash-input-c-as-cbor" format="default" sectionFormat="of" derivedContent="Section 4.2.1"/>) or in JSON (see <xref target="sec-token-hash-input-c-as-json" format="default" sectionFormat="of" derivedContent="Section 4.2.2"/>).</t>
        <t indent="0" pn="section-4.2-3">Once HASH_INPUT is determined, the client and the AS use it to compute the token hash of the conveyed access token as defined in <xref target="sec-token-hash-output" format="default" sectionFormat="of" derivedContent="Section 4.4"/>.</t>
        <section anchor="sec-token-hash-input-c-as-cbor" numbered="true" removeInRFC="false" toc="include" pn="section-4.2.1">
          <name slugifiedName="name-as-to-client-response-encod">AS-to-Client Response Encoded in CBOR</name>
          <t indent="0" pn="section-4.2.1-1">If the AS-to-Client response is encoded in CBOR, then HASH_INPUT is defined as follows:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.2.1-2">
            <li pn="section-4.2.1-2.1">
              <t indent="0" pn="section-4.2.1-2.1.1">BYTES denotes the value of the CBOR byte string conveyed in the 'access_token' parameter.  </t>
              <t indent="0" pn="section-4.2.1-2.1.2">
With reference to the example in <xref target="fig-as-response-cbor" format="default" sectionFormat="of" derivedContent="Figure 3"/>, BYTES is the bytes {0xd8, 0x3d, 0xd0, ..., 0x64, 0x3b}.  </t>
              <t indent="0" pn="section-4.2.1-2.1.3">
Note that BYTES is the binary representation of the tagged access token if this is a CWT (as per <xref target="sec-issuing-access-tokens-as" format="default" sectionFormat="of" derivedContent="Section 3"/>) or of the access token if this is a JWT.</t>
            </li>
            <li pn="section-4.2.1-2.2">
              <t indent="0" pn="section-4.2.1-2.2.1">HASH_INPUT_TEXT is the base64url-encoded text string that encodes BYTES.</t>
            </li>
            <li pn="section-4.2.1-2.3">
              <t indent="0" pn="section-4.2.1-2.3.1">HASH_INPUT is the binary representation of HASH_INPUT_TEXT.</t>
            </li>
          </ul>
          <figure anchor="fig-as-response-cbor" align="left" suppress-title="false" pn="figure-3">
            <name slugifiedName="name-example-of-as-to-client-coa">Example of AS-to-Client CoAP Response Using CBOR</name>
            <sourcecode type="coap" markers="false" pn="section-4.2.1-3.1">
Header: Created (Code=2.01)
Content-Format: 19 (application/ace+cbor)
Max-Age: 85800
Payload:
{
   / access_token / 1 : h'd83dd0835820a3010a044c53796d6d
                          6574726963313238054d99a0d7846e
                          762c49ffe8a63e0ba05858b918a11f
                          d81e438b7f973d9e2e119bcb22424b
                          a0f38a80f27562f400ee1d0d6c0fdb
                          559c02421fd384fc2ebe22d7071378
                          b0ea7428fff157444d45f7e6afcda1
                          aae5f6495830c58627087fc5b4974f
                          319a8707a635dd643b',
   / token_type /  34 : 2 / PoP /,
   / expires_in /   2 : 86400,
   / ace_profile / 38 : 1 / coap_dtls /
   / (remainder of the response omitted for brevity) /
}
</sourcecode>
          </figure>
        </section>
        <section anchor="sec-token-hash-input-c-as-json" numbered="true" removeInRFC="false" toc="include" pn="section-4.2.2">
          <name slugifiedName="name-as-to-client-response-encode">AS-to-Client Response Encoded in JSON</name>
          <t indent="0" pn="section-4.2.2-1">If the AS-to-Client response is encoded in JSON, then HASH_INPUT is the binary representation of the text string conveyed by the 'access_token' parameter.</t>
          <t indent="0" pn="section-4.2.2-2">With reference to the example in <xref target="fig-as-response-json" format="default" sectionFormat="of" derivedContent="Figure 4"/>, HASH_INPUT is the binary representation of "eyJh...YFiA". When showing the access token, <xref target="fig-as-response-json" format="default" sectionFormat="of" derivedContent="Figure 4"/> uses line breaks for display purposes only.</t>
          <t indent="0" pn="section-4.2.2-3">Note that:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.2.2-4">
            <li pn="section-4.2.2-4.1">
              <t indent="0" pn="section-4.2.2-4.1.1">If the access token is a JWT, then HASH_INPUT is the binary representation of the JWT.</t>
            </li>
            <li pn="section-4.2.2-4.2">
              <t indent="0" pn="section-4.2.2-4.2.1">If the access token is a CWT, then HASH_INPUT is the binary representation of a base64url-encoded text string, which encodes the binary representation of a tagged access token with the CWT as the innermost tag content (as per <xref target="sec-issuing-access-tokens-as" format="default" sectionFormat="of" derivedContent="Section 3"/>).</t>
            </li>
          </ul>
          <figure anchor="fig-as-response-json" align="left" suppress-title="false" pn="figure-4">
            <name slugifiedName="name-example-of-as-to-client-htt">Example of AS-to-Client HTTP Response Using JSON</name>
            <sourcecode type="json" markers="false" pn="section-4.2.2-5.1">
HTTP/1.1 200 OK
Content-Type: application/ace+json
Cache-Control: no-store
Pragma: no-cache
Payload:
{
   "access_token" : "eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJB
                     MTI4Q0JDLUhTMjU2In0.
                     QR1Owv2ug2WyPBnbQrRARTeEk9kDO2w8
                     qDcjiHnSJflSdv1iNqhWXaKH4MqAkQtM
                     oNfABIPJaZm0HaA415sv3aeuBWnD8J-U
                     i7Ah6cWafs3ZwwFKDFUUsWHSK-IPKxLG
                     TkND09XyjORj_CHAgOPJ-Sd8ONQRnJvW
                     n_hXV1BNMHzUjPyYwEsRhDhzjAD26ima
                     sOTsgruobpYGoQcXUwFDn7moXPRfDE8-
                     NoQX7N7ZYMmpUDkR-Cx9obNGwJQ3nM52
                     YCitxoQVPzjbl7WBuB7AohdBoZOdZ24W
                     lN1lVIeh8v1K4krB8xgKvRU8kgFrEn_a
                     1rZgN5TiysnmzTROF869lQ.
                     AxY8DCtDaGlsbGljb3RoZQ.
                     MKOle7UQrG6nSxTLX6Mqwt0orbHvAKeW
                     nDYvpIAeZ72deHxz3roJDXQyhxx0wKaM
                     HDjUEOKIwrtkHthpqEanSBNYHZgmNOV7
                     sln1Eu9g3J8.
                     fiK51VwhsxJ-siBMR-YFiA",
   "token_type"   : "PoP",
   "expires_in"   : 86400,
   "ace_profile"  : "coap_dtls"
}
</sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="sec-token-hash-input-rs" numbered="true" removeInRFC="false" toc="include" pn="section-4.3">
        <name slugifiedName="name-hash_input-on-the-rs">HASH_INPUT on the RS</name>
        <t indent="0" pn="section-4.3-1">The following defines how the RS determines the HASH_INPUT value to use as input for computing the token hash of an access token, depending on the RS using either CWTs (see <xref target="sec-token-hash-input-rs-cwt" format="default" sectionFormat="of" derivedContent="Section 4.3.1"/>) or JWTs (see <xref target="sec-token-hash-input-rs-jwt" format="default" sectionFormat="of" derivedContent="Section 4.3.2"/>).</t>
        <section anchor="sec-token-hash-input-rs-cwt" numbered="true" removeInRFC="false" toc="include" pn="section-4.3.1">
          <name slugifiedName="name-access-tokens-as-cwts">Access Tokens as CWTs</name>
          <t indent="0" pn="section-4.3.1-1">If the RS expects access tokens to be CWTs, then the RS performs the following steps:</t>
          <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-4.3.1-2"><li pn="section-4.3.1-2.1" derivedCounter="1.">
              <t indent="0" pn="section-4.3.1-2.1.1">The RS receives the token-related information TOKEN_INFO, in accordance with what is specified by the used profile of ACE (see <xref target="sec-token-hash-input-motivation-rs" format="default" sectionFormat="of" derivedContent="Section 4.1.2"/>).</t>
            </li>
            <li pn="section-4.3.1-2.2" derivedCounter="2.">
              <t indent="0" pn="section-4.3.1-2.2.1">The RS assumes that the client received the access token in an AS-to-Client response encoded in CBOR (see <xref target="sec-token-hash-input-c-as-cbor" format="default" sectionFormat="of" derivedContent="Section 4.2.1"/>). Hence, the RS assumes TOKEN_INFO to be the binary representation of the tagged access token with the CWT as the innermost tag content (as per <xref target="sec-issuing-access-tokens-as" format="default" sectionFormat="of" derivedContent="Section 3"/>).</t>
            </li>
            <li pn="section-4.3.1-2.3" derivedCounter="3.">
              <t indent="0" pn="section-4.3.1-2.3.1">The RS verifies the access token as per <xref section="5.10.1.1" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.10.1.1" derivedContent="RFC9200"/>. If the verification fails, then the RS does not discard the access token yet; instead, it moves to Step 4.</t>
              <t indent="0" pn="section-4.3.1-2.3.2">
Otherwise, the RS stores the access token and computes the corresponding token hash as defined in <xref target="sec-token-hash-output" format="default" sectionFormat="of" derivedContent="Section 4.4"/>. In particular, the RS considers HASH_INPUT_TEXT as the base64url-encoded text string that encodes TOKEN_INFO. Then, HASH_INPUT is the binary representation of HASH_INPUT_TEXT.  </t>
              <t indent="0" pn="section-4.3.1-2.3.3">
After that, the RS stores the computed token hash as associated with the access token; then, it terminates this algorithm.</t>
            </li>
            <li pn="section-4.3.1-2.4" derivedCounter="4.">
              <t indent="0" pn="section-4.3.1-2.4.1">The RS assumes that the client received the access token in an AS-to-Client response encoded in JSON (see <xref target="sec-token-hash-input-c-as-json" format="default" sectionFormat="of" derivedContent="Section 4.2.2"/>). Hence, the RS assumes TOKEN_INFO to be the binary representation of HASH_INPUT_TEXT. In turn, HASH_INPUT_TEXT is the base64url-encoded text string that encodes the binary representation of the tagged access token with the CWT as the innermost tag content (as per <xref target="sec-issuing-access-tokens-as" format="default" sectionFormat="of" derivedContent="Section 3"/>).</t>
            </li>
            <li pn="section-4.3.1-2.5" derivedCounter="5.">
              <t indent="0" pn="section-4.3.1-2.5.1">The RS performs the base64url decoding of HASH_INPUT_TEXT and considers the result to be the binary representation of the tagged access token.</t>
            </li>
            <li pn="section-4.3.1-2.6" derivedCounter="6.">
              <t indent="0" pn="section-4.3.1-2.6.1">The RS verifies the access token as per <xref section="5.10.1.1" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.10.1.1" derivedContent="RFC9200"/>. If the verification fails, then the RS terminates this algorithm.  </t>
              <t indent="0" pn="section-4.3.1-2.6.2">
Otherwise, the RS stores the access token and computes the corresponding token hash as defined in <xref target="sec-token-hash-output" format="default" sectionFormat="of" derivedContent="Section 4.4"/>. In particular, HASH_INPUT is TOKEN_INFO.  </t>
              <t indent="0" pn="section-4.3.1-2.6.3">
After that, the RS stores the computed token hash as associated with the access token.</t>
            </li>
          </ol>
        </section>
        <section anchor="sec-token-hash-input-rs-jwt" numbered="true" removeInRFC="false" toc="include" pn="section-4.3.2">
          <name slugifiedName="name-access-tokens-as-jwts">Access Tokens as JWTs</name>
          <t indent="0" pn="section-4.3.2-1">If the RS expects access tokens to be JWTs, then the RS performs the following steps:</t>
          <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-4.3.2-2"><li pn="section-4.3.2-2.1" derivedCounter="1.">
              <t indent="0" pn="section-4.3.2-2.1.1">The RS receives the token-related information TOKEN_INFO, in accordance with what is specified by the used profile of ACE (see <xref target="sec-token-hash-input-motivation-rs" format="default" sectionFormat="of" derivedContent="Section 4.1.2"/>).</t>
            </li>
            <li pn="section-4.3.2-2.2" derivedCounter="2.">
              <t indent="0" pn="section-4.3.2-2.2.1">The RS verifies the access token as per <xref section="5.10.1.1" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.10.1.1" derivedContent="RFC9200"/>. If the verification fails, then the RS terminates this algorithm. Otherwise, the RS stores the access token.</t>
            </li>
            <li pn="section-4.3.2-2.3" derivedCounter="3.">
              <t indent="0" pn="section-4.3.2-2.3.1">The RS computes a first token hash associated with the access token as defined in <xref target="sec-token-hash-output" format="default" sectionFormat="of" derivedContent="Section 4.4"/>.  </t>
              <t indent="0" pn="section-4.3.2-2.3.2">
In particular, the RS assumes that the client received the access token in an AS-to-Client response encoded in JSON (see <xref target="sec-token-hash-input-c-as-json" format="default" sectionFormat="of" derivedContent="Section 4.2.2"/>). Hence, HASH_INPUT is TOKEN_INFO.  </t>
              <t indent="0" pn="section-4.3.2-2.3.3">
After that, the RS stores the computed token hash as associated with the access token.</t>
            </li>
            <li pn="section-4.3.2-2.4" derivedCounter="4.">
              <t indent="0" pn="section-4.3.2-2.4.1">The RS computes a second token hash associated with the access token as defined in <xref target="sec-token-hash-output" format="default" sectionFormat="of" derivedContent="Section 4.4"/>.  </t>
              <t indent="0" pn="section-4.3.2-2.4.2">
In particular, the RS assumes that the client received the access token in an AS-to-Client response encoded in CBOR (see <xref target="sec-token-hash-input-c-as-cbor" format="default" sectionFormat="of" derivedContent="Section 4.2.1"/>). Hence, HASH_INPUT is the binary representation of HASH_INPUT_TEXT, which, in turn, is the base64url-encoded text string that encodes TOKEN_INFO.  </t>
              <t indent="0" pn="section-4.3.2-2.4.3">
After that, the RS stores the computed token hash as associated with the access token.</t>
            </li>
          </ol>
          <t indent="0" pn="section-4.3.2-3">The RS skips Step 3 only if it is certain that all its pertaining access tokens are provided to any client by means of AS-to-Client responses encoded as CBOR messages. Otherwise, the RS <bcp14>MUST</bcp14> perform Step 3.</t>
          <t indent="0" pn="section-4.3.2-4">The RS skips Step 4 only if it is certain that all its pertaining access tokens are provided to any client by means of AS-to-Client responses encoded as JSON messages. Otherwise, the RS <bcp14>MUST</bcp14> perform Step 4.</t>
          <t indent="0" pn="section-4.3.2-5">If the RS performs both Steps 3 and 4 above, then the RS <bcp14>MUST</bcp14> store, maintain, and rely on both token hashes as associated with the access token, consistent with what is specified in <xref target="sec-handling-token-hashes" format="default" sectionFormat="of" derivedContent="Section 11.1"/>.</t>
          <t indent="0" pn="section-4.3.2-6"><xref target="sec-seccons-two-hashes-jwt" format="default" sectionFormat="of" derivedContent="Section 14.7"/> discusses how computing and storing both token hashes neutralizes an attack against the RS, where a dishonest client can induce the RS to compute a token hash different from the correct one.</t>
        </section>
      </section>
      <section anchor="sec-token-hash-output" numbered="true" removeInRFC="false" toc="include" pn="section-4.4">
        <name slugifiedName="name-computing-the-token-hash">Computing the Token Hash</name>
        <t indent="0" pn="section-4.4-1">Once HASH_INPUT is determined as defined in Sections <xref target="sec-token-hash-input-c-as" format="counter" sectionFormat="of" derivedContent="4.2"/> and <xref target="sec-token-hash-input-rs" format="counter" sectionFormat="of" derivedContent="4.3"/>, a hash value of HASH_INPUT is generated as per <xref section="6" sectionFormat="of" target="RFC6920" format="default" derivedLink="https://rfc-editor.org/rfc/rfc6920#section-6" derivedContent="RFC6920"/>. The resulting output in binary format is used as the token hash. Note that the used binary format embeds the identifier of the used hash function in the first byte of the computed token hash.</t>
        <t indent="0" pn="section-4.4-2">The specific hash function used <bcp14>MUST</bcp14> be collision resistant on byte strings and <bcp14>MUST</bcp14> be selected from the "Named Information Hash Algorithm Registry" <xref target="IANA.Hash.Algorithms" format="default" sectionFormat="of" derivedContent="IANA.Hash.Algorithms"/>. Consistent with the compliance requirements in <xref section="2" sectionFormat="of" target="RFC6920" format="default" derivedLink="https://rfc-editor.org/rfc/rfc6920#section-2" derivedContent="RFC6920"/>, the hash function sha-256 as specified in <xref target="SHA-256" format="default" sectionFormat="of" derivedContent="SHA-256"/> is mandatory to implement.</t>
        <t indent="0" pn="section-4.4-3">The AS specifies the used hash function to registered devices during their registration procedure (see <xref target="sec-registration" format="default" sectionFormat="of" derivedContent="Section 10"/>).</t>
      </section>
    </section>
    <section anchor="sec-trl-resource" numbered="true" removeInRFC="false" toc="include" pn="section-5">
      <name slugifiedName="name-token-revocation-list-trl">Token Revocation List (TRL)</name>
      <t indent="0" pn="section-5-1">Upon startup, the AS creates a single Token Revocation List (TRL) encoded as a CBOR array.</t>
      <t indent="0" pn="section-5-2">Each element of the array is a CBOR byte string, whose value is the token hash of an access token. The CBOR array <bcp14>MUST</bcp14> be treated as a set, i.e., the order of its elements has no meaning.</t>
      <t indent="0" pn="section-5-3">The TRL is initialized as empty, i.e., its initial content <bcp14>MUST</bcp14> be the empty CBOR array. The TRL is accessible through the TRL endpoint at the AS.</t>
      <section anchor="ssec-trl-update" numbered="true" removeInRFC="false" toc="include" pn="section-5.1">
        <name slugifiedName="name-update-of-the-trl">Update of the TRL</name>
        <t indent="0" pn="section-5.1-1">The AS updates the TRL in the following two cases:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.1-2">
          <li pn="section-5.1-2.1">
            <t indent="0" pn="section-5.1-2.1.1">When a non-expired access token is revoked, the token hash of the access token is added to the TRL. That is, a CBOR byte string with the token hash as its value is added to the CBOR array encoding the TRL.</t>
          </li>
          <li pn="section-5.1-2.2">
            <t indent="0" pn="section-5.1-2.2.1">When a revoked access token expires, the token hash of the access token is removed from the TRL. That is, the CBOR byte string with the token hash as its value is removed from the CBOR array encoding the TRL.</t>
          </li>
        </ul>
        <t indent="0" pn="section-5.1-3">The AS <bcp14>MAY</bcp14> perform a single update to the TRL such that one or more token hashes are added or removed at once. For example, this can be the case if multiple access tokens are revoked or expire at the same time or within an acceptably narrow time frame.</t>
      </section>
    </section>
    <section anchor="sec-trl-endpoint" numbered="true" removeInRFC="false" toc="include" pn="section-6">
      <name slugifiedName="name-the-trl-endpoint">The TRL Endpoint</name>
      <t indent="0" pn="section-6-1">Consistent with <xref section="6.5" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-6.5" derivedContent="RFC9200"/>, all communications between the AS and a requester interacting with the TRL endpoint at the AS <bcp14>MUST</bcp14> be encrypted, as well as integrity and replay protected. Furthermore, responses from the AS to the requester <bcp14>MUST</bcp14> be bound to the corresponding requests.</t>
      <t indent="0" pn="section-6-2">Following a request to the TRL endpoint, the corresponding success response messages sent by the AS use Content-Format "application/ace-trl+cbor". Their payload is formatted as a CBOR map, and the CBOR values used to abbreviate the parameters included therein are defined in <xref target="trl-registry-parameters" format="default" sectionFormat="of" derivedContent="Section 12"/>.</t>
      <t indent="0" pn="section-6-3">The AS <bcp14>MUST</bcp14> implement measures to prevent access to the TRL endpoint by entities other than registered devices and authorized administrators (see <xref target="sec-registration" format="default" sectionFormat="of" derivedContent="Section 10"/>).</t>
      <t indent="0" pn="section-6-4">The TRL endpoint supports only the GET method, and allows two types of queries of the TRL:</t>
      <ol spacing="normal" indent="adaptive" start="1" type="1" pn="section-6-5">
        <li pn="section-6-5.1" derivedCounter="1.">
          <t indent="0" pn="section-6-5.1.1">Full query: the AS returns the token hashes of the revoked access tokens currently in the TRL and pertaining to the requester.  </t>
          <t indent="0" pn="section-6-5.1.2">
The AS <bcp14>MUST</bcp14> support this type of query. The processing of a full query and the related response format are defined in <xref target="ssec-trl-full-query" format="default" sectionFormat="of" derivedContent="Section 7"/>.</t>
        </li>
        <li pn="section-6-5.2" derivedCounter="2.">
          <t indent="0" pn="section-6-5.2.1">Diff query: the AS returns a list of diff entries. Each diff entry is related to one update that occurred to the TRL, and it contains a set of token hashes pertaining to the requester. In particular, all such token hashes were added to the TRL or removed from the TRL at the update related to the diff entry in question.  </t>
          <t indent="0" pn="section-6-5.2.2">
The AS <bcp14>MAY</bcp14> support this type of query. In such a case, the AS maintains the history of updates to the TRL as defined in <xref target="sec-trl-endpoint-supporting-diff-queries" format="default" sectionFormat="of" derivedContent="Section 6.2"/>. The processing of a diff query and the related response format are defined in <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>.</t>
        </li>
      </ol>
      <t indent="0" pn="section-6-6">If it supports diff queries, the AS <bcp14>MAY</bcp14> additionally support the related "Cursor" extension, which has two benefits:</t>
      <ol indent="adaptive" spacing="normal" start="1" type="1" pn="section-6-7">
	<li pn="section-6-7.1" derivedCounter="1.">The AS can avoid excessively long messages when several diff entries have to be transferred by delivering several diff query responses, each containing one adjacent subset of diff entries at a time.</li>
        <li pn="section-6-7.2" derivedCounter="2.">A requester can retrieve diff entries associated with TRL updates that, even if not the most recent ones, occurred after a TRL update associated with a diff entry indicated as a reference point.</li>
      </ol>
      <t indent="0" pn="section-6-8">If it supports the "Cursor" extension, the AS stores additional information when maintaining the history of updates to the TRL as defined in <xref target="sec-trl-endpoint-supporting-cursor" format="default" sectionFormat="of" derivedContent="Section 6.2.1"/>. Also, the processing of full query requests and diff query requests, as well as the related response format, are further extended as defined in <xref target="sec-using-cursor" format="default" sectionFormat="of" derivedContent="Section 9"/>.</t>
      <t indent="0" pn="section-6-9"><xref target="sec-trl-parameteters" format="default" sectionFormat="of" derivedContent="Appendix B"/> provides an aggregated overview of the local supportive parameters that the AS internally uses at its TRL endpoint when supporting diff queries and the "Cursor" extension.</t>
      <section anchor="sec-error-responses" numbered="true" removeInRFC="false" toc="include" pn="section-6.1">
        <name slugifiedName="name-error-responses-with-proble">Error Responses with Problem Details</name>
        <t indent="0" pn="section-6.1-1">Some error responses from the TRL endpoint at the AS can convey error-specific information according to the problem-details format defined in <xref target="RFC9290" format="default" sectionFormat="of" derivedContent="RFC9290"/>. Such error responses <bcp14>MUST</bcp14> have Content-Format set to "application/concise-problem-details+cbor". The payload of these error responses <bcp14>MUST</bcp14> be a CBOR map specifying a Concise Problem Details data item (see <xref section="2" sectionFormat="of" target="RFC9290" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9290#section-2" derivedContent="RFC9290"/>). The CBOR map is formatted as follows:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.1-2">
          <li pn="section-6.1-2.1">
            <t indent="0" pn="section-6.1-2.1.1">It <bcp14>MUST</bcp14> include the Custom Problem Detail entry 'ace-trl-error' registered in <xref target="iana-custom-problem-details" format="default" sectionFormat="of" derivedContent="Section 15.3"/> of this document. This entry is formatted as a CBOR map, which includes the following fields:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.1-2.1.2">
              <li pn="section-6.1-2.1.2.1">
                <t indent="0" pn="section-6.1-2.1.2.1.1">The 'error-id' field <bcp14>MUST</bcp14> be present. The map key used for this field is the CBOR unsigned integer with a value of 0. The value of this field is a CBOR integer specifying the error that occurred at the AS. This value is taken from the 'Value' column of the "ACE Token Revocation List Errors" registry defined in <xref target="iana-token-revocation-list-errors" format="default" sectionFormat="of" derivedContent="Section 15.5"/> of this document.</t>
              </li>
              <li pn="section-6.1-2.1.2.2">
                <t indent="0" pn="section-6.1-2.1.2.2.1">The 'cursor' field <bcp14>MAY</bcp14> be present. The map key used for this field is the CBOR unsigned integer with a value of 1. The value of this field is a CBOR unsigned integer or the CBOR simple value <tt>null</tt> (0xf6). The use of this field is defined in <xref target="sec-trl-endpoint-query-parameters" format="default" sectionFormat="of" derivedContent="Section 6.3"/>.</t>
              </li>
            </ul>
            <t indent="0" pn="section-6.1-2.1.3">
The CDDL notation <xref target="RFC8610" format="default" sectionFormat="of" derivedContent="RFC8610"/> of the 'ace-trl-error' entry is given below:</t>
            <sourcecode type="cddl" markers="false" pn="section-6.1-2.1.4">
   ace-trl-error = {
       0: int,        ; error-id
     ? 1: uint / null ; cursor
   }
</sourcecode>
          </li>
          <li pn="section-6.1-2.2">
            <t indent="0" pn="section-6.1-2.2.1">It <bcp14>MAY</bcp14> include further Standard Problem Detail entries or Custom Problem Detail entries (see <xref target="RFC9290" format="default" sectionFormat="of" derivedContent="RFC9290"/>).  </t>
            <t indent="0" pn="section-6.1-2.2.2">
In particular, it can include the Standard Problem Detail entry 'detail' (map key -2), whose value is a CBOR text string that specifies a human-readable diagnostic description of the error that occurred at the AS. The diagnostic text is intended for software engineers as well as for device and network operators in order to aid in debugging and provide context for possible intervention. The diagnostic message <bcp14>SHOULD</bcp14> be logged by the AS. The 'detail' entry is unlikely to be relevant in an unattended setup where human intervention is not expected.</t>
          </li>
        </ul>
        <t indent="0" pn="section-6.1-3">An example of an error response using the problem-details format is shown in <xref target="fig-example-error-response" format="default" sectionFormat="of" derivedContent="Figure 5"/>.</t>
        <figure anchor="fig-example-error-response" align="left" suppress-title="false" pn="figure-5">
          <name slugifiedName="name-example-of-error-response-w">Example of Error Response with Problem Details</name>
          <sourcecode type="" markers="false" pn="section-6.1-4.1">
Header: Bad Request (Code=4.00)
Content-Format: 257 (application/concise-problem-details+cbor)
Payload:
{
  / title /         -1: "Invalid parameter value",
  / detail /        -2: "Invalid value for 'cursor': -53",
  / ace-trl-error /  1: {
    / error-id / 0: 0 / "Invalid parameter value" /,
    / cursor /   1: 42
  }
}
</sourcecode>
        </figure>
        <t indent="0" pn="section-6.1-5">The problem-details format in general and the Custom Problem Detail entry 'ace-trl-error' in particular are <bcp14>OPTIONAL</bcp14> to support for registered devices. A registered device supporting the entry 'ace-trl-error' and that is able to understand the specified error may use that information to determine what actions to take next.</t>
      </section>
      <section anchor="sec-trl-endpoint-supporting-diff-queries" numbered="true" removeInRFC="false" toc="include" pn="section-6.2">
        <name slugifiedName="name-supporting-diff-queries">Supporting Diff Queries</name>
        <t indent="0" pn="section-6.2-1">If the AS supports diff queries, it is able to transfer a list of diff entries, each of which is related to one update that occurred to the TRL (see <xref target="sec-trl-endpoint" format="default" sectionFormat="of" derivedContent="Section 6"/>). That is, when replying to a diff query performed for a requester, the AS provides the diff entries related to the most recent TRL updates pertaining to the requester.</t>
        <t indent="0" pn="section-6.2-2">The following defines how the AS builds and maintains an ordered list of diff entries, for each registered device and administrator, hereafter referred to as "requesters". In particular, a requester's diff entry associated with a TRL update contains a set of token hashes pertaining to that requester, each of which was added to the TRL or removed from the TRL at that update.</t>
        <t indent="0" pn="section-6.2-3">The AS defines the single constant positive integer MAX_N &gt;= 1. For each requester, the AS maintains an update collection of maximum MAX_N series items, each of which is a diff entry. For each requester, the AS <bcp14>MUST</bcp14> keep track of the MAX_N most recent TRL updates pertaining to the requester. If the AS supports diff queries, the AS <bcp14>MUST</bcp14> provide requesters with the value of MAX_N upon their registration (see <xref target="sec-registration" format="default" sectionFormat="of" derivedContent="Section 10"/>).</t>
        <t indent="0" pn="section-6.2-4">The series of items in the update collection <bcp14>MUST</bcp14> be strictly chronologically ordered. That is, at any point in time, the first series item is the one least recently added to the update collection and still retained by the AS; the last series item is the one most recently added to the update collection. The particular method used to achieve this is implementation specific.</t>
        <t indent="0" pn="section-6.2-5">Each time the TRL changes, the AS performs the following operations for each requester:</t>
        <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-6.2-6"><li pn="section-6.2-6.1" derivedCounter="1.">
            <t indent="0" pn="section-6.2-6.1.1">The AS considers the subset of the TRL pertaining to that requester. If the TRL subset is not affected by this TRL update, the AS stops the processing for that requester. Otherwise, the AS moves to Step 2.</t>
          </li>
          <li pn="section-6.2-6.2" derivedCounter="2.">
            <t indent="0" pn="section-6.2-6.2.1">The AS creates two trl_patch sets of token hashes, i.e., one  'removed' set and one 'added' set, as related to this TRL update.</t>
          </li>
          <li pn="section-6.2-6.3" derivedCounter="3.">
            <t indent="0" pn="section-6.2-6.3.1">The AS fills the two sets with the token hashes of the removed and added access tokens, respectively, from/to the TRL subset considered at Step 1.</t>
          </li>
          <li pn="section-6.2-6.4" derivedCounter="4.">
            <t indent="0" pn="section-6.2-6.4.1">The AS creates a new series item that includes the two sets from Step 3.</t>
          </li>
          <li pn="section-6.2-6.5" derivedCounter="5.">
            <t indent="0" pn="section-6.2-6.5.1">If the update collection associated with the requester currently includes MAX_N series items, the AS <bcp14>MUST</bcp14> delete the oldest series item in the update collection.</t>
          </li>
          <li pn="section-6.2-6.6" derivedCounter="6.">
            <t indent="0" pn="section-6.2-6.6.1">The AS adds the series item to the update collection associated with the requester as the last (most recent) series item.</t>
          </li>
        </ol>
        <section anchor="sec-trl-endpoint-supporting-cursor" numbered="true" removeInRFC="false" toc="include" pn="section-6.2.1">
          <name slugifiedName="name-supporting-the-cursor-exten">Supporting the "Cursor" Extension</name>
          <t indent="0" pn="section-6.2.1-1">If it supports the "Cursor" extension for diff queries, the AS also performs the following actions:</t>
          <t indent="0" pn="section-6.2.1-2">The AS defines the single constant unsigned integer MAX_INDEX &lt;= ((2<sup>64</sup>) - 1).  The value of MAX_INDEX is <bcp14>REQUIRED</bcp14> to be at least (MAX_N - 1) and is <bcp14>RECOMMENDED</bcp14> to be at least ((2<sup>32</sup>) - 1). MAX_INDEX <bcp14>SHOULD</bcp14> be orders of magnitude greater than MAX_N.</t>
          <t indent="0" pn="section-6.2.1-3">The following applies separately for each requester's update collection:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.2.1-4">
            <li pn="section-6.2.1-4.1">
              <t indent="0" pn="section-6.2.1-4.1.1">Each series item X in the update collection is also associated with an unsigned integer 'index', whose minimum value is 0 and whose maximum value is MAX_INDEX. The first series item ever added to the update collection <bcp14>MUST</bcp14> have an 'index' with a value of 0.  </t>
              <t indent="0" pn="section-6.2.1-4.1.2">
If i_X is the value of 'index' associated with a series item X, then the following series item Y will take 'index' with a value of i_Y = (i_X + 1) % (MAX_INDEX + 1). That is, after having added a series item whose associated 'index' has a value of MAX_INDEX, the next added series item will result in a wraparound of the 'index' value; thus, it will take an 'index' with a value of 0.  </t>
              <t indent="0" pn="section-6.2.1-4.1.3">
For example, assuming MAX_N = 3, the values of 'index' in the update collection chronologically evolve as follows, as new series items are added and old series items are deleted:  </t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.2.1-4.1.4">
                <li pn="section-6.2.1-4.1.4.1">
                  <t indent="0" pn="section-6.2.1-4.1.4.1.1">...</t>
                </li>
                <li pn="section-6.2.1-4.1.4.2">
                  <t indent="0" pn="section-6.2.1-4.1.4.2.1">(i_A = MAX_INDEX - 2, i_B = MAX_INDEX - 1, i_C = MAX_INDEX)</t>
                </li>
                <li pn="section-6.2.1-4.1.4.3">
                  <t indent="0" pn="section-6.2.1-4.1.4.3.1">(i_B = MAX_INDEX - 1, i_C = MAX_INDEX, i_D = 0)</t>
                </li>
                <li pn="section-6.2.1-4.1.4.4">
                  <t indent="0" pn="section-6.2.1-4.1.4.4.1">(i_C = MAX_INDEX, i_D = 0, i_E = 1)</t>
                </li>
                <li pn="section-6.2.1-4.1.4.5">
                  <t indent="0" pn="section-6.2.1-4.1.4.5.1">(i_D = 0, i_E = 1, i_F = 2)</t>
                </li>
                <li pn="section-6.2.1-4.1.4.6">
                  <t indent="0" pn="section-6.2.1-4.1.4.6.1">...</t>
                </li>
              </ul>
            </li>
            <li pn="section-6.2.1-4.2">
              <t indent="0" pn="section-6.2.1-4.2.1">The unsigned integer 'last_index' is also defined, with minimum value 0 and maximum value MAX_INDEX.  </t>
              <t indent="0" pn="section-6.2.1-4.2.2">
If the update collection is empty (i.e., no series items have been added yet), the value of 'last_index' is not defined. If the update collection is not empty, 'last_index' has the value of 'index' currently associated with the last series item in the update collection.  </t>
              <t indent="0" pn="section-6.2.1-4.2.3">
That is, after having added V series items to the update collection, the last and most recently added series item has an 'index' with a value of 'last_index' = (V - 1) % (MAX_INDEX + 1).  </t>
              <t indent="0" pn="section-6.2.1-4.2.4">
As long as a wraparound of the 'index' value has not occurred, the value of 'last_index' is the absolute counter of series items added to that update collection, minus 1.</t>
            </li>
          </ul>
          <t indent="0" pn="section-6.2.1-5">When processing a diff query using the "Cursor" extension, the values of 'index' are used as cursor information, as defined in <xref target="sec-using-cursor-diff-query-response" format="default" sectionFormat="of" derivedContent="Section 9.2"/>.</t>
          <t indent="0" pn="section-6.2.1-6">For each requester's update collection, the AS also defines a constant positive integer MAX_DIFF_BATCH &lt;= MAX_N, whose value specifies the maximum number of diff entries to be included in a single diff query response. The specific value <bcp14>MAY</bcp14> depend on the specific registered device or administrator associated with the update collection in question. If supporting the "Cursor" extension, the AS <bcp14>MUST</bcp14> provide registered devices and administrators with the corresponding value of MAX_DIFF_BATCH upon their registration (see <xref target="sec-registration" format="default" sectionFormat="of" derivedContent="Section 10"/>).</t>
        </section>
      </section>
      <section anchor="sec-trl-endpoint-query-parameters" numbered="true" removeInRFC="false" toc="include" pn="section-6.3">
        <name slugifiedName="name-query-parameters">Query Parameters</name>
        <t indent="0" pn="section-6.3-1">A GET request to the TRL endpoint can include the following query parameters. The AS <bcp14>MUST</bcp14> silently ignore unknown query parameters.</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.3-2">
          <li pn="section-6.3-2.1">
            <t indent="0" pn="section-6.3-2.1.1">'diff': if included, it asks the AS to perform a diff query of the TRL (see <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>). Its value <bcp14>MUST</bcp14> be either:  </t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.3-2.1.2">
              <li pn="section-6.3-2.1.2.1">
                <t indent="0" pn="section-6.3-2.1.2.1.1">the integer 0, indicating that a (notification) response should include as many diff entries as the AS can provide in the response; or</t>
              </li>
              <li pn="section-6.3-2.1.2.2">
                <t indent="0" pn="section-6.3-2.1.2.2.1">a positive integer strictly greater than 0, indicating the maximum number of diff entries that a (notification) response should include.</t>
              </li>
            </ul>
            <t indent="0" pn="section-6.3-2.1.3">
If the AS does not support diff queries, it ignores the 'diff' query parameter when present in the GET request and proceeds like when performing a full query of the TRL (see <xref target="ssec-trl-full-query" format="default" sectionFormat="of" derivedContent="Section 7"/>).  </t>
            <t indent="0" pn="section-6.3-2.1.4">
Otherwise, the AS <bcp14>MUST</bcp14> return a 4.00 (Bad Request) response in case the 'diff' query parameter of the GET request has a value that is neither 0 nor a positive integer, irrespective of the presence of the 'cursor' query parameter and its value (see below). The response <bcp14>MUST</bcp14> have Content-Format set to "application/concise-problem-details+cbor", and its payload is formatted as defined in <xref target="sec-error-responses" format="default" sectionFormat="of" derivedContent="Section 6.1"/>. Within the Custom Problem Detail entry 'ace-trl-error', the value of the 'error-id' field <bcp14>MUST</bcp14> be set to 0 ("Invalid parameter value"), and the 'cursor' field <bcp14>MUST NOT</bcp14> be present.</t>
          </li>
          <li pn="section-6.3-2.2">
            <t indent="0" pn="section-6.3-2.2.1">'cursor': if included, it asks the AS to perform a diff query of the TRL together with the "Cursor" extension, as defined in <xref target="sec-using-cursor-diff-query-response" format="default" sectionFormat="of" derivedContent="Section 9.2"/>. Its value <bcp14>MUST</bcp14> be either 0 or a positive integer. If the 'cursor' query parameter is included, then the 'diff' query parameter <bcp14>MUST</bcp14> also be included.  </t>
            <t indent="0" pn="section-6.3-2.2.2">
If included, the 'cursor' query parameter has an unsigned integer value that was provided by the AS in a previous response from the TRL endpoint (see Sections <xref target="sec-using-cursor-full-query-response" format="counter" sectionFormat="of" derivedContent="9.1"/>, <xref target="sec-using-cursor-diff-query-response-no-cursor" format="counter" sectionFormat="of" derivedContent="9.2.2"/>, and <xref target="sec-using-cursor-diff-query-response-cursor" format="counter" sectionFormat="of" derivedContent="9.2.3"/>).  </t>
            <t indent="0" pn="section-6.3-2.2.3">
	    If the AS does not support the "Cursor" extension, it ignores the 'cursor' query parameter when present in the GET request. In such a case, the AS proceeds as specified elsewhere in this document, that is:</t>
            <ol indent="adaptive" spacing="normal" start="1" type="1" pn="section-6.3-2.2.4">
	      <li pn="section-6.3-2.2.4.1" derivedCounter="1.">it performs a diff query of the TRL (see <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>), if it supports diff queries and the 'diff' query parameter is present in the GET request; otherwise,</li>
              <li pn="section-6.3-2.2.4.2" derivedCounter="2.">it performs a full query of the TRL (see <xref target="ssec-trl-full-query" format="default" sectionFormat="of" derivedContent="Section 7"/>).  </li>
            </ol>
            <t indent="0" pn="section-6.3-2.2.5">
If the AS supports both diff queries and the "Cursor" extension, and the GET request includes the 'cursor' query parameter, then the AS <bcp14>MUST</bcp14> return a 4.00 (Bad Request) response in case any of the conditions below holds.  </t>
            <t indent="0" pn="section-6.3-2.2.6">
The 4.00 (Bad Request) response <bcp14>MUST</bcp14> have Content-Format set to "application/concise-problem-details+cbor", and its payload is formatted as defined in <xref target="sec-error-responses" format="default" sectionFormat="of" derivedContent="Section 6.1"/>.  </t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.3-2.2.7">
              <li pn="section-6.3-2.2.7.1">
                <t indent="0" pn="section-6.3-2.2.7.1.1">The GET request does not include the 'diff' query parameter, irrespective of the value of the 'cursor' query parameter.      </t>
                <t indent="0" pn="section-6.3-2.2.7.1.2">
Within the Custom Problem Detail entry 'ace-trl-error', the value of the 'error-id' field <bcp14>MUST</bcp14> be set to 1 ("Invalid set of parameters"), and the 'cursor' field <bcp14>MUST NOT</bcp14> be present.</t>
              </li>
              <li pn="section-6.3-2.2.7.2">
                <t indent="0" pn="section-6.3-2.2.7.2.1">The 'cursor' query parameter has a value that is neither 0 nor a positive integer; or it has a value strictly greater than MAX_INDEX (see <xref target="sec-trl-endpoint-supporting-cursor" format="default" sectionFormat="of" derivedContent="Section 6.2.1"/>).      </t>
                <t indent="0" pn="section-6.3-2.2.7.2.2">
		Within the Custom Problem Detail entry 'ace-trl-error', the value of the 'error-id' field <bcp14>MUST</bcp14> be set to 0 ("Invalid parameter value"). The entry 'ace-trl-error' <bcp14>MUST</bcp14> include the 'cursor' field, whose value is either:</t>
                <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-6.3-2.2.7.2.3">
                  <li pn="section-6.3-2.2.7.2.3.1">the CBOR simple value <tt>null</tt> (0xf6), if the update collection associated with the requester is empty; or, otherwise</li>
                  <li pn="section-6.3-2.2.7.2.3.2">the corresponding current value of 'last_index'.</li>
                </ul>
              </li>
              <li pn="section-6.3-2.2.7.3">
                <t indent="0" pn="section-6.3-2.2.7.3.1">All of the following hold: the update collection associated with the requester is not empty; no wraparound of the 'index' value has occurred; and the 'cursor' query parameter has a value strictly greater than the current 'last_index' on the update collection (see <xref target="sec-trl-endpoint-supporting-cursor" format="default" sectionFormat="of" derivedContent="Section 6.2.1"/>).      </t>
                <t indent="0" pn="section-6.3-2.2.7.3.2">
Within the Custom Problem Detail entry 'ace-trl-error', the value of the 'error-id' field <bcp14>MUST</bcp14> be set to 2 ("Out of bound cursor value"), and the 'cursor' field <bcp14>MUST NOT</bcp14> be present.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="ssec-trl-full-query" numbered="true" removeInRFC="false" toc="include" pn="section-7">
      <name slugifiedName="name-full-query-of-the-trl">Full Query of the TRL</name>
      <t indent="0" pn="section-7-1">In order to produce a (notification) response to a GET request asking for a full query of the TRL, the AS performs the following actions:</t>
      <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-7-2"><li pn="section-7-2.1" derivedCounter="1.">
          <t indent="0" pn="section-7-2.1.1">From the TRL, the AS builds a HASHES set such that:  </t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-7-2.1.2">
            <li pn="section-7-2.1.2.1">
              <t indent="0" pn="section-7-2.1.2.1.1">If the requester is a registered device, HASHES specifies the token hashes currently in the TRL and associated with the access tokens pertaining to that registered device. The AS can always use the authenticated identity of the registered device to perform the necessary filtering on the TRL content.</t>
            </li>
            <li pn="section-7-2.1.2.2">
              <t indent="0" pn="section-7-2.1.2.2.1">If the requester is an administrator, HASHES specifies all the token hashes currently in the TRL.</t>
            </li>
          </ul>
        </li>
        <li pn="section-7-2.2" derivedCounter="2.">
          <t indent="0" pn="section-7-2.2.1">The AS sends a 2.05 (Content) response to the requester. The response <bcp14>MUST</bcp14> have Content-Format set to "application/ace-trl+cbor". The payload of the response is a CBOR map, which <bcp14>MUST</bcp14> be formatted as follows.  </t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-7-2.2.2">
            <li pn="section-7-2.2.2.1">
              <t indent="0" pn="section-7-2.2.2.1.1">The 'full_set' parameter <bcp14>MUST</bcp14> be included and <bcp14>MUST</bcp14> encode a CBOR array 'full_set_value'. Each element of 'full_set_value' is a CBOR byte string, whose value is one of the token hashes from the HASHES set. If the HASHES set is empty, the 'full_set' parameter specifies the empty CBOR array.      </t>
              <t indent="0" pn="section-7-2.2.2.1.2">
The CBOR array <bcp14>MUST</bcp14> be treated as a set, i.e., the order of its elements has no meaning.</t>
            </li>
            <li pn="section-7-2.2.2.2">
              <t indent="0" pn="section-7-2.2.2.2.1">The 'cursor' parameter <bcp14>MUST</bcp14> be included if the AS supports both diff queries and the related "Cursor" extension (see Sections <xref target="sec-trl-endpoint-supporting-diff-queries" format="counter" sectionFormat="of" derivedContent="6.2"/> and <xref target="sec-trl-endpoint-supporting-cursor" format="counter" sectionFormat="of" derivedContent="6.2.1"/>). Its value is set as specified in <xref target="sec-using-cursor-full-query-response" format="default" sectionFormat="of" derivedContent="Section 9.1"/> and provides the requester with information for sending a new request that asks the AS to perform a follow-up diff query using the "Cursor" extension (see <xref target="sec-using-cursor-diff-query-response" format="default" sectionFormat="of" derivedContent="Section 9.2"/>).      </t>
              <t indent="0" pn="section-7-2.2.2.2.2">
If the AS does not support both diff queries and the "Cursor" extension, this parameter <bcp14>MUST NOT</bcp14> be included. In case the requester does not support both diff queries and the "Cursor" extension, it <bcp14>MUST</bcp14> silently ignore the 'cursor' parameter if present.</t>
            </li>
          </ul>
        </li>
      </ol>
      <t indent="0" pn="section-7-3"><xref target="cddl-full" format="default" sectionFormat="of" derivedContent="Figure 6"/> provides the CDDL definition <xref target="RFC8610" format="default" sectionFormat="of" derivedContent="RFC8610"/> of the CBOR array 'full_set_value' specified in the response from the AS as the value of the 'full_set' parameter.</t>
      <figure anchor="cddl-full" align="left" suppress-title="false" pn="figure-6">
        <name slugifiedName="name-cddl-definition-of-full_set">CDDL Definition of 'full_set_value'</name>
        <sourcecode type="cddl" markers="false" pn="section-7-4.1">
token_hash = bytes
full_set_value = [* token_hash]
</sourcecode>
      </figure>
      <t indent="0" pn="section-7-5"><xref target="response-full" format="default" sectionFormat="of" derivedContent="Figure 7"/> shows an example of a response from the AS following a full query request to the TRL endpoint. In this example, the AS does not support diff queries nor the "Cursor" extension; hence the 'cursor' parameter is not included in the payload of the response. Also, full token hashes are omitted for brevity.</t>
      <figure anchor="response-full" align="left" suppress-title="false" pn="figure-7">
        <name slugifiedName="name-example-of-a-response-follo">Example of a Response Following a Full Query Request to the TRL Endpoint</name>
        <sourcecode type="" markers="false" pn="section-7-6.1">
Header: Content (Code=2.05)
Content-Format: 262 (application/ace-trl+cbor)
Payload:
{
   / full_set / 0: [
     h'01fa51cc...4819', / elided for brevity /
     h'01748190...223d'  / elided for brevity /
   ]
}
</sourcecode>
      </figure>
    </section>
    <section anchor="ssec-trl-diff-query" numbered="true" removeInRFC="false" toc="include" pn="section-8">
      <name slugifiedName="name-diff-query-of-the-trl">Diff Query of the TRL</name>
      <t indent="0" pn="section-8-1">In order to produce a (notification) response to a GET request asking for a diff query of the TRL, the AS performs the following actions:</t>
      <t indent="0" pn="section-8-2">Note that, if the AS supports both diff queries and the related "Cursor" extension, Steps 3 and 4 defined below are extended as defined in <xref target="sec-using-cursor-diff-query-response" format="default" sectionFormat="of" derivedContent="Section 9.2"/>.</t>
      <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-8-3"><li pn="section-8-3.1" derivedCounter="1.">
          <t indent="0" pn="section-8-3.1.1">The AS defines the positive integer NUM as follows: if the value N specified in the 'diff' query parameter in the GET request is equal to 0 or greater than the predefined positive integer MAX_N (see <xref target="sec-trl-endpoint-supporting-diff-queries" format="default" sectionFormat="of" derivedContent="Section 6.2"/>), then NUM takes the value of MAX_N. Otherwise, NUM takes N.</t>
        </li>
        <li pn="section-8-3.2" derivedCounter="2.">
          <t indent="0" pn="section-8-3.2.1">The AS determines U = min(NUM, SIZE), where SIZE &lt;= MAX_N. In particular, SIZE is the number of diff entries currently stored in the requester's update collection.</t>
        </li>
        <li pn="section-8-3.3" derivedCounter="3.">
          <t indent="0" pn="section-8-3.3.1">The AS prepares U diff entries. If U is equal to 0 (e.g., because SIZE is equal to 0 at Step 2), then no diff entries are prepared.  </t>
          <t indent="0" pn="section-8-3.3.2">
The prepared diff entries are related to the U most recent TRL updates pertaining to the requester, as maintained in the update collection for that requester (see <xref target="sec-trl-endpoint-supporting-diff-queries" format="default" sectionFormat="of" derivedContent="Section 6.2"/>). In particular, the first diff entry refers to the most recent of such updates, the second diff entry refers to the second-to-last of such updates, and so on.  </t>
          <t indent="0" pn="section-8-3.3.3">
	  Each diff entry is a CBOR array 'diff_entry', which includes the following two elements:</t>
          <ol type="a" spacing="normal" indent="adaptive" start="1" pn="section-8-3.3.4">
            <li pn="section-8-3.3.4.1" derivedCounter="a.">
              <t indent="0" pn="section-8-3.3.4.1.1">A trl_patch set of token hashes encoded as a CBOR array 'removed'. Each element of the array is a CBOR byte string, whose value is the token hash of an access token such that it pertains to the requester and was removed from the TRL during the update associated with the diff entry.</t>
            </li>
            <li pn="section-8-3.3.4.2" derivedCounter="b.">
              <t indent="0" pn="section-8-3.3.4.2.1">A trl_patch set of token hashes encoded as a CBOR array 'added'. Each element of the array is a CBOR byte string, whose value is the token hash of an access token such that it pertains to the requester and was added to the TRL during the update associated with the diff entry.</t>
            </li>
          </ol>
          <t indent="0" pn="section-8-3.3.5">
The CBOR arrays 'removed' and 'added' <bcp14>MUST</bcp14> be treated as sets, i.e., the order of their elements has no meaning.</t>
        </li>
        <li pn="section-8-3.4" derivedCounter="4.">
          <t indent="0" pn="section-8-3.4.1">The AS prepares a 2.05 (Content) response for the requester. The response <bcp14>MUST</bcp14> have Content-Format set to "application/ace-trl+cbor". The payload of the response is a CBOR map, which <bcp14>MUST</bcp14> be formatted as follows:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-8-3.4.2">
            <li pn="section-8-3.4.2.1">
              <t indent="0" pn="section-8-3.4.2.1.1">The 'diff_set' parameter <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> encode a CBOR array 'diff_set_value' of U elements. Each element of 'diff_set_value' specifies one of the CBOR arrays 'diff_entry' prepared above as a diff entry. Note that U might have a value of 0; in this case, 'diff_set_value' is the empty CBOR array.      </t>
              <t indent="0" pn="section-8-3.4.2.1.2">
Within 'diff_set_value', the 'diff_entry' CBOR arrays <bcp14>MUST</bcp14> be sorted to reflect the corresponding updates to the TRL in reverse chronological order. That is, the first 'diff_entry' element of 'diff_set_value' relates to the most recent TRL update pertaining to the requester. The second 'diff_entry' element relates to the second-to-last most recent TRL update pertaining to the requester, and so on.</t>
            </li>
            <li pn="section-8-3.4.2.2">
              <t indent="0" pn="section-8-3.4.2.2.1">The 'cursor' parameter and the 'more' parameter <bcp14>MUST</bcp14> be included if the AS supports both diff queries and the related "Cursor" extension (see <xref target="sec-trl-endpoint-supporting-cursor" format="default" sectionFormat="of" derivedContent="Section 6.2.1"/>). Their values are set as specified in <xref target="sec-using-cursor-diff-query-response" format="default" sectionFormat="of" derivedContent="Section 9.2"/> and provide the requester with information for sending a new request that asks the AS to perform a follow-up query of the TRL (see <xref target="sec-using-cursor-diff-query-response" format="default" sectionFormat="of" derivedContent="Section 9.2"/>).      </t>
              <t indent="0" pn="section-8-3.4.2.2.2">
In case the AS supports diff queries but not the "Cursor" extension, these parameters <bcp14>MUST NOT</bcp14> be included.  In case the requester supports diff queries but not the "Cursor" extension, the requester <bcp14>MUST</bcp14> silently ignore the 'cursor' parameter and the 'more' parameter, if present.</t>
            </li>
          </ul>
        </li>
      </ol>
      <t indent="0" pn="section-8-4"><xref target="cddl-diff" format="default" sectionFormat="of" derivedContent="Figure 8"/> provides the CDDL definition <xref target="RFC8610" format="default" sectionFormat="of" derivedContent="RFC8610"/> of the CBOR array 'diff_set_value' specified in the response from the AS, as the value of the 'diff_set' parameter.</t>
      <figure anchor="cddl-diff" align="left" suppress-title="false" pn="figure-8">
        <name slugifiedName="name-cddl-definition-of-diff_set">CDDL Definition of 'diff_set_value'</name>
        <sourcecode type="cddl" markers="false" pn="section-8-5.1">
   token_hash = bytes
   trl_patch = [* token_hash]
   diff_entry = [removed: trl_patch, added: trl_patch]
   diff_set_value = [* diff_entry]
</sourcecode>
      </figure>
      <t indent="0" pn="section-8-6"><xref target="response-diff" format="default" sectionFormat="of" derivedContent="Figure 9"/> shows an example of a response from the AS following a diff query request to the TRL endpoint, where U = 3 diff entries are included. In this example, the AS does not support the "Cursor" extension; hence, the 'cursor' parameter and the 'more' parameter are not included in the payload of the response. Also, full token hashes are omitted for brevity.</t>
      <figure anchor="response-diff" align="left" suppress-title="false" pn="figure-9">
        <name slugifiedName="name-example-of-response-followi">Example of Response Following a Diff Query Request to the TRL Endpoint</name>
        <sourcecode type="" markers="false" pn="section-8-7.1">
Header: Content (Code=2.05)
Content-Format: 262 (application/ace-trl+cbor)
Payload:
{
   / diff_set / 1: [
     [
       [ h'01fa51cc...0f6a', / elided for brevity /
         h'01748190...8bce'  / elided for brevity /
       ],
       [ h'01cdf1ca...563d', / elided for brevity /
         h'01be41a6...a057'  / elided for brevity /
       ]
     ],
     [
       [ h'0144dd12...77bc', / elided for brevity /
         h'01231fff...a2ce'  / elided for brevity /
       ],
       []
     ],
     [
       [],
       [ h'01ca986f...ffc1', / elided for brevity /
         h'01fe1a2b...def0'  / elided for brevity /
       ]
     ]
   ]
}
</sourcecode>
      </figure>
      <t indent="0" pn="section-8-8"><xref target="sec-series-pattern" format="default" sectionFormat="of" derivedContent="Appendix A"/> discusses how performing a diff query of the TRL is, in fact, a usage example of the Series Transfer Pattern defined in <xref target="I-D.bormann-t2trg-stp" format="default" sectionFormat="of" derivedContent="STP"/>.</t>
    </section>
    <section anchor="sec-using-cursor" numbered="true" removeInRFC="false" toc="include" pn="section-9">
      <name slugifiedName="name-response-messages-when-usin">Response Messages when Using the "Cursor" Extension</name>
      <t indent="0" pn="section-9-1">If the AS supports both diff queries and the "Cursor" extension, it composes a response to a full query request or diff query request as defined in Sections <xref target="sec-using-cursor-full-query-response" format="counter" sectionFormat="of" derivedContent="9.1"/> and <xref target="sec-using-cursor-diff-query-response" format="counter" sectionFormat="of" derivedContent="9.2"/>, respectively.</t>
      <t indent="0" pn="section-9-2">The exact format of the response depends on:</t>
      <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-9-3">
        <li pn="section-9-3.1">the request being a full query or diff query request,</li>
        <li pn="section-9-3.2">the presence of the 'diff' and 'cursor' query parameters and their values in the diff query request, and</li>
        <li pn="section-9-3.3">the current status of the update collection associated with the requester.</li>
      </ul>
      <t indent="0" pn="section-9-4">Error handling and the possible resulting error responses are as defined in <xref target="sec-trl-endpoint-query-parameters" format="default" sectionFormat="of" derivedContent="Section 6.3"/>.</t>
      <section anchor="sec-using-cursor-full-query-response" numbered="true" removeInRFC="false" toc="include" pn="section-9.1">
        <name slugifiedName="name-response-to-full-query">Response to Full Query</name>
        <t indent="0" pn="section-9.1-1">When processing a full query request to the TRL endpoint, the AS composes a response as defined in <xref target="ssec-trl-full-query" format="default" sectionFormat="of" derivedContent="Section 7"/>.</t>
        <t indent="0" pn="section-9.1-2">In particular, the 'cursor' parameter included in the CBOR map carried in the response payload specifies either the CBOR simple value <tt>null</tt> (0xf6) or a CBOR unsigned integer.</t>
        <t indent="0" pn="section-9.1-3">The 'cursor' parameter <bcp14>MUST</bcp14> encode the CBOR simple value <tt>null</tt> (0xf6) in case there are currently no TRL updates pertaining to the requester, i.e., the update collection for that requester is empty. This is the case from when the requester registers at the AS until the first update pertaining to that requester occurs to the TRL.</t>
        <t indent="0" pn="section-9.1-4">Otherwise, the 'cursor' parameter <bcp14>MUST</bcp14> encode a CBOR unsigned integer. The unsigned integer <bcp14>MUST</bcp14> take the 'index' value of the last series item in the update collection associated with the requester (see <xref target="sec-trl-endpoint-supporting-cursor" format="default" sectionFormat="of" derivedContent="Section 6.2.1"/>) as corresponding to the most recent TRL update pertaining to the requester. In fact, such a value is the current value of 'last_index' for the update collection associated with the requester.</t>
      </section>
      <section anchor="sec-using-cursor-diff-query-response" numbered="true" removeInRFC="false" toc="include" pn="section-9.2">
        <name slugifiedName="name-response-to-diff-query">Response to Diff Query</name>
        <t indent="0" pn="section-9.2-1">When processing a diff query request to the TRL endpoint, the AS composes a response as defined in the following subsections.</t>
        <section anchor="sec-using-cursor-diff-query-response-empty" numbered="true" removeInRFC="false" toc="include" pn="section-9.2.1">
          <name slugifiedName="name-empty-update-collection">Empty Update Collection</name>
          <t indent="0" pn="section-9.2.1-1">If the update collection associated with the requester has no elements, the AS returns a 2.05 (Content) response. The response <bcp14>MUST</bcp14> have Content-Format set to "application/ace-trl+cbor", and its payload <bcp14>MUST</bcp14> be a CBOR map formatted as follows:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-9.2.1-2">
            <li pn="section-9.2.1-2.1">
              <t indent="0" pn="section-9.2.1-2.1.1">The 'diff_set' parameter <bcp14>MUST</bcp14> be included and <bcp14>MUST</bcp14> encode the empty CBOR array.</t>
            </li>
            <li pn="section-9.2.1-2.2">
              <t indent="0" pn="section-9.2.1-2.2.1">The 'cursor' parameter <bcp14>MUST</bcp14> be included and <bcp14>MUST</bcp14> encode the CBOR simple value <tt>null</tt> (0xf6).</t>
            </li>
            <li pn="section-9.2.1-2.3">
              <t indent="0" pn="section-9.2.1-2.3.1">The 'more' parameter <bcp14>MUST</bcp14> be included and <bcp14>MUST</bcp14> encode the CBOR simple value <tt>false</tt> (0xf4).</t>
            </li>
          </ul>
          <t indent="0" pn="section-9.2.1-3">Note that the above applies when the update collection associated with the requester has no elements, regardless of whether or not the 'cursor' query parameter is included in the diff query request and irrespective of the specified unsigned integer value if present.</t>
        </section>
        <section anchor="sec-using-cursor-diff-query-response-no-cursor" numbered="true" removeInRFC="false" toc="include" pn="section-9.2.2">
          <name slugifiedName="name-cursor-not-included-in-the-">Cursor Not Included in the Diff Query Request</name>
          <t indent="0" pn="section-9.2.2-1">If the update collection associated with the requester is not empty and the diff query request does not include the 'cursor' query parameter, the AS performs the actions defined in <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>, with the following differences:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-9.2.2-2">
            <li pn="section-9.2.2-2.1">
              <t indent="0" pn="section-9.2.2-2.1.1">At Step 3, the AS considers the value MAX_DIFF_BATCH (see <xref target="sec-trl-endpoint-supporting-cursor" format="default" sectionFormat="of" derivedContent="Section 6.2.1"/>) and prepares L = min(U, MAX_DIFF_BATCH) diff entries.  </t>
              <t indent="0" pn="section-9.2.2-2.1.2">
If U &lt;= MAX_DIFF_BATCH, the prepared diff entries are the last series items in the update collection associated with the requester, corresponding to the L most recent TRL updates pertaining to the requester.  </t>
              <t indent="0" pn="section-9.2.2-2.1.3">
If U &gt; MAX_DIFF_BATCH, the prepared diff entries are the eldest of the last U series items in the update collection associated with the requester, as corresponding to the first L of the U most recent TRL updates pertaining to the requester.</t>
            </li>
            <li pn="section-9.2.2-2.2">
              <t indent="0" pn="section-9.2.2-2.2.1">At Step 4, the CBOR map to carry in the payload of the 2.05 (Content) response <bcp14>MUST</bcp14> be formatted as follows:  </t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-9.2.2-2.2.2">
                <li pn="section-9.2.2-2.2.2.1">
                  <t indent="0" pn="section-9.2.2-2.2.2.1.1">The 'diff_set' parameter <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> encode a CBOR array 'diff_set_value' of L elements. Each element of 'diff_set_value' specifies one of the CBOR arrays 'diff_entry' prepared as a diff entry.</t>
                </li>
                <li pn="section-9.2.2-2.2.2.2">
                  <t indent="0" pn="section-9.2.2-2.2.2.2.1">The 'cursor' parameter <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> encode a CBOR unsigned integer. The unsigned integer <bcp14>MUST</bcp14> take the 'index' value of the series item of the update collection included as first diff entry in the 'diff_set_value' CBOR array, which is specified by the 'diff_set' parameter. That is, the 'cursor' parameter takes the 'index' value of the series item in the update collection corresponding to the most recent TRL update pertaining to the requester and returned in this diff query response.      </t>
                  <t indent="0" pn="section-9.2.2-2.2.2.2.2">
Note that the 'cursor' parameter takes the same 'index' value of the last series item in the update collection when U &lt;= MAX_DIFF_BATCH.</t>
                </li>
                <li pn="section-9.2.2-2.2.2.3">
                  <t indent="0" pn="section-9.2.2-2.2.2.3.1">The 'more' parameter <bcp14>MUST</bcp14> be present.  The parameter <bcp14>MUST</bcp14> encode the CBOR simple value <tt>false</tt> (0xf4) if U &lt;= MAX_DIFF_BATCH; otherwise, it <bcp14>MUST</bcp14> encode the CBOR simple value <tt>true</tt> (0xf5).</t>
                </li>
              </ul>
            </li>
          </ul>
          <t indent="0" pn="section-9.2.2-3">If the 'more' parameter in the payload of the received 2.05 (Content) response has a value of <tt>true</tt>, the requester can send a follow-up diff query request including the 'cursor' query parameter with the same value of the 'cursor' parameter specified in this diff query response. As defined in <xref target="sec-using-cursor-diff-query-response-cursor" format="default" sectionFormat="of" derivedContent="Section 9.2.3"/>, this would result in the AS transferring the following subset of series items as diff entries, thus resuming from where interrupted in the previous transfer.</t>
        </section>
        <section anchor="sec-using-cursor-diff-query-response-cursor" numbered="true" removeInRFC="false" toc="include" pn="section-9.2.3">
          <name slugifiedName="name-cursor-included-in-the-diff">Cursor Included in the Diff Query Request</name>
          <t indent="0" pn="section-9.2.3-1">If the update collection associated with the requester is not empty and the diff query request includes the 'cursor' query parameter with value P, the AS proceeds as follows, depending on which of the following two cases hold:</t>
          <ol spacing="normal" type="Case %C:" indent="adaptive" start="1" pn="section-9.2.3-2">
            <li pn="section-9.2.3-2.1" derivedCounter="Case A:">
              <t indent="0" pn="section-9.2.3-2.1.1">The series item X with 'index' having value P and the series item Y with 'index' having value (P + 1) % (MAX_INDEX + 1) are both not found in the update collection associated with the requester. This occurs when the item Y (and possibly further ones after it) has been previously removed from the update collection for that requester (see Step 5 at <xref target="sec-trl-endpoint-supporting-diff-queries" format="default" sectionFormat="of" derivedContent="Section 6.2"/>).  </t>
              <t indent="0" pn="section-9.2.3-2.1.2">
In this case, the AS returns a 2.05 (Content) response. The response <bcp14>MUST</bcp14> have Content-Format set to "application/ace-trl+cbor", and its payload <bcp14>MUST</bcp14> be a CBOR map formatted as follows:  </t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-9.2.3-2.1.3">
                <li pn="section-9.2.3-2.1.3.1">
                  <t indent="0" pn="section-9.2.3-2.1.3.1.1">The 'diff_set' parameter <bcp14>MUST</bcp14> be included and <bcp14>MUST</bcp14> encode the empty CBOR array.</t>
                </li>
                <li pn="section-9.2.3-2.1.3.2">
                  <t indent="0" pn="section-9.2.3-2.1.3.2.1">The 'cursor' parameter <bcp14>MUST</bcp14> be included and <bcp14>MUST</bcp14> encode the CBOR simple value <tt>null</tt> (0xf6).</t>
                </li>
                <li pn="section-9.2.3-2.1.3.3">
                  <t indent="0" pn="section-9.2.3-2.1.3.3.1">The 'more' parameter <bcp14>MUST</bcp14> be included and <bcp14>MUST</bcp14> encode the CBOR simple value <tt>true</tt> (0xf5).</t>
                </li>
              </ul>
              <t indent="0" pn="section-9.2.3-2.1.4">
With the combination ('cursor', 'more') = (<tt>null</tt>, <tt>true</tt>), the AS is indicating that the update collection is, in fact, not empty, but that one or more series items have been lost due to their removal. These include the item with 'index' value (P + 1) % (MAX_INDEX + 1) that the requester wished to obtain as the first one following the specified reference point with 'index' value P.  </t>
              <t indent="0" pn="section-9.2.3-2.1.5">
When receiving this diff query response, the requester <bcp14>SHOULD</bcp14> send a new full query request to the AS. A successful response provides the requester with the full current pertaining subset of the TRL as well as a valid value of the 'cursor' parameter (see <xref target="sec-using-cursor-full-query-response" format="default" sectionFormat="of" derivedContent="Section 9.1"/>) to be, possibly, used as query parameter in a following diff query request.</t>
            </li>
            <li pn="section-9.2.3-2.2" derivedCounter="Case B:">
              <t indent="0" pn="section-9.2.3-2.2.1">The series item X with 'index' having value P is found in the update collection associated with the requester, or instead the series item X is not found and the series item Y with 'index' having value (P + 1) % (MAX_INDEX + 1) is found in the update collection associated with the requester.  </t>
              <t indent="0" pn="section-9.2.3-2.2.2">
In this case, the AS performs the actions defined in <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/> with the following differences:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-9.2.3-2.2.3">
                <li pn="section-9.2.3-2.2.3.1">
                  <t indent="0" pn="section-9.2.3-2.2.3.1.1">At Step 3, the AS considers the value MAX_DIFF_BATCH (see <xref target="sec-trl-endpoint-supporting-cursor" format="default" sectionFormat="of" derivedContent="Section 6.2.1"/>) and prepares L = min(SUB_U, MAX_DIFF_BATCH) diff entries, where SUB_U = min(NUM, SUB_SIZE) and SUB_SIZE is the number of series items in the update collection starting from and including the series item added immediately after X. If L is equal to 0 (e.g., because SUB_U is equal to 0), then no diff entries are prepared.      </t>
                  <t indent="0" pn="section-9.2.3-2.2.3.1.2">
If SUB_U &lt;= MAX_DIFF_BATCH, the prepared diff entries are the last series items in the update collection associated with the requester, corresponding to the L most recent TRL updates pertaining to the requester.      </t>
                  <t indent="0" pn="section-9.2.3-2.2.3.1.3">
If SUB_U &gt; MAX_DIFF_BATCH, the prepared diff entries are the eldest of the last SUB_U series items in the update collection associated with the requester, corresponding to the first L of the SUB_U most recent TRL updates pertaining to the requester.</t>
                </li>
                <li pn="section-9.2.3-2.2.3.2">
                  <t indent="0" pn="section-9.2.3-2.2.3.2.1">At Step 4, the CBOR map to carry in the payload of the 2.05 (Content) response <bcp14>MUST</bcp14> be formatted as follows:      </t>
                  <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-9.2.3-2.2.3.2.2">
                    <li pn="section-9.2.3-2.2.3.2.2.1">
                      <t indent="0" pn="section-9.2.3-2.2.3.2.2.1.1">The 'diff_set' parameter <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> encode a CBOR array 'diff_set_value' of L elements. Each element of 'diff_set_value' specifies one of the CBOR arrays 'diff_entry' prepared as a diff entry. Note that L might have value 0, in which case 'diff_set_value' is the empty CBOR array.</t>
                    </li>
                    <li pn="section-9.2.3-2.2.3.2.2.2">
                      <t indent="0" pn="section-9.2.3-2.2.3.2.2.2.1">The 'cursor' parameter <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> encode a CBOR unsigned integer. In particular:          </t>
                      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-9.2.3-2.2.3.2.2.2.2">
                        <li pn="section-9.2.3-2.2.3.2.2.2.2.1">
                          <t indent="0" pn="section-9.2.3-2.2.3.2.2.2.2.1.1">If L is equal to 0, i.e., the series item X is the last one in the update collection, then the 'cursor' parameter <bcp14>MUST</bcp14> take the same 'index' value of the last series item in the update collection. In fact, such a value is the current value of 'last_index' for the update collection.</t>
                        </li>
                        <li pn="section-9.2.3-2.2.3.2.2.2.2.2">
                          <t indent="0" pn="section-9.2.3-2.2.3.2.2.2.2.2.1">If L is different than 0, then the 'cursor' parameter <bcp14>MUST</bcp14> take the 'index' value of the series element of the update collection included as first diff entry in the 'diff_set' CBOR array. That is, the 'cursor' parameter takes the 'index' value of the series item in the update collection corresponding to the most recent TRL update pertaining to the requester and returned in this diff query response.</t>
                        </li>
                      </ul>
                      <t indent="0" pn="section-9.2.3-2.2.3.2.2.2.3">
Note that the 'cursor' parameter takes the same 'index' value of the last series item in the update collection when SUB_U &lt;= MAX_DIFF_BATCH.</t>
                    </li>
                    <li pn="section-9.2.3-2.2.3.2.2.3">
                      <t indent="0" pn="section-9.2.3-2.2.3.2.2.3.1">The 'more' parameter <bcp14>MUST</bcp14> be present.  The parameter <bcp14>MUST</bcp14> encode the CBOR simple value <tt>false</tt> (0xf4) if SUB_U &lt;= MAX_DIFF_BATCH; otherwise, it <bcp14>MUST</bcp14> encode the CBOR simple value <tt>true</tt> (0xf5).</t>
                    </li>
                  </ul>
                </li>
              </ul>
              <t indent="0" pn="section-9.2.3-2.2.4">
If the 'more' parameter in the payload of the received 2.05 (Content) response has value <tt>true</tt>, the requester can send a follow-up diff query request including the 'cursor' query parameter with the same value of the 'cursor' parameter specified in this diff query response. This would result in the AS transferring the following subset of series items as diff entries, thus resuming from where interrupted in the previous transfer.</t>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="sec-registration" numbered="true" removeInRFC="false" toc="include" pn="section-10">
      <name slugifiedName="name-registration-at-the-authori">Registration at the Authorization Server</name>
      <t indent="0" pn="section-10-1">During the registration process at the AS, an administrator or a registered device receives the following information as part of the registration response:</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-10-2">
        <li pn="section-10-2.1">
          <t indent="0" pn="section-10-2.1.1">The url-path to the TRL endpoint at the AS.</t>
        </li>
        <li pn="section-10-2.2">
          <t indent="0" pn="section-10-2.2.1">The hash function used to compute token hashes. This is specified by identifying an entry in the "Named Information Hash Algorithm Registry" <xref target="IANA.Hash.Algorithms" format="default" sectionFormat="of" derivedContent="IANA.Hash.Algorithms"/>. The specific means for this is outside the scope of this document.</t>
        </li>
        <li pn="section-10-2.3">
          <t indent="0" pn="section-10-2.3.1">A positive integer MAX_N, if the AS supports diff queries of the TRL (see Sections <xref target="sec-trl-endpoint-supporting-diff-queries" format="counter" sectionFormat="of" derivedContent="6.2"/> and <xref target="ssec-trl-diff-query" format="counter" sectionFormat="of" derivedContent="8"/>).</t>
        </li>
        <li pn="section-10-2.4">
          <t indent="0" pn="section-10-2.4.1">A positive integer MAX_DIFF_BATCH, if the AS supports diff queries of the TRL as well as the related "Cursor" extension (see Sections <xref target="sec-trl-endpoint-supporting-cursor" format="counter" sectionFormat="of" derivedContent="6.2.1"/> and <xref target="sec-using-cursor" format="counter" sectionFormat="of" derivedContent="9"/>).</t>
        </li>
      </ul>
      <t indent="0" pn="section-10-3">Once the registration process is completed, the AS maintains the registration and related information until a possible deregistration occurs, hence keeping track of active administrators and registered devices. The particular way to achieve this is implementation specific. In any case, such a mechanism to maintain registrations is enforced at the AS in order to ensure that requests sent by clients to the /token endpoint (see <xref section="5.8" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.8" derivedContent="RFC9200"/>) and by RSs to the /introspect endpoint (see <xref section="5.9" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.9" derivedContent="RFC9200"/>) are processed as intended.</t>
      <t indent="0" pn="section-10-4">When communicating with one another, the registered devices and the AS have to use a secure communication association and be mutually authenticated (see <xref section="5" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5" derivedContent="RFC9200"/>). </t>
      <t indent="0" pn="section-10-5">In the same spirit, communications between the AS and an administrator <bcp14>MUST</bcp14> be ensured to be mutually authenticated, encrypted, and integrity protected as well as protected against message replay.</t>
      <t indent="0" pn="section-10-6">Before starting its registration process at the AS, an administrator has to establish such a secure communication association with the AS, if they do not share one already. In particular, mutual authentication is <bcp14>REQUIRED</bcp14> during the establishment of the secure association. To this end, the administrator and the AS can rely, e.g., on establishing a TLS or DTLS secure session with mutual authentication (see <xref target="RFC8446" format="default" sectionFormat="of" derivedContent="RFC8446"/> and <xref target="RFC9147" format="default" sectionFormat="of" derivedContent="RFC9147"/>) or an Object Security for Constrained RESTful Environments (OSCORE) Security Context <xref target="RFC8613" format="default" sectionFormat="of" derivedContent="RFC8613"/> by running the authenticated key exchange protocol EDHOC <xref target="RFC9528" format="default" sectionFormat="of" derivedContent="RFC9528"/>.</t>
      <t indent="0" pn="section-10-7">When receiving authenticated requests from the administrator for accessing the TRL endpoint, the AS can always check whether the requester is authorized to take such a role, i.e., to access the content of the whole TRL.</t>
      <t indent="0" pn="section-10-8">To this end, the AS may rely on a local access control list or similar, which specifies the authentication credentials of trusted, authorized administrators. In particular, the AS verifies the requester to the TRL endpoint as an authorized administrator only if the access control list includes the same authentication credential used by the requester when establishing the mutually authenticated secure communication association with the AS.</t>
      <t indent="0" pn="section-10-9">Further details about the registration process at the AS are out of scope for this specification. Note that the registration process is also out of the scope of the ACE framework (see <xref section="5.5" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.5" derivedContent="RFC9200"/>).</t>
    </section>
    <section anchor="sec-notification" numbered="true" removeInRFC="false" toc="include" pn="section-11">
      <name slugifiedName="name-notification-of-revoked-acc">Notification of Revoked Access Tokens</name>
      <t indent="0" pn="section-11-1">Once registered at the AS, the administrator or a registered device can send a GET request to the TRL endpoint at the AS. The request can express the wish for a full query (see <xref target="ssec-trl-full-query" format="default" sectionFormat="of" derivedContent="Section 7"/>) or a diff query (see <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>) of the TRL. Also, the request can include the CoAP Observe Option set to 0 (register) in order to start an observation of the TRL endpoint as per <xref section="3.1" sectionFormat="of" target="RFC7641" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7641#section-3.1" derivedContent="RFC7641"/>.</t>
      <t indent="0" pn="section-11-2">In case the request is successfully processed, the AS replies with a  2.05 (Content) response. In particular, if the AS supports diff queries but not the "Cursor" extension (see Sections <xref target="sec-trl-endpoint-supporting-diff-queries" format="counter" sectionFormat="of" derivedContent="6.2"/> and <xref target="sec-trl-endpoint-supporting-cursor" format="counter" sectionFormat="of" derivedContent="6.2.1"/>), then the payload of the response is formatted as defined in Sections <xref target="ssec-trl-full-query" format="counter" sectionFormat="of" derivedContent="7"/> or <xref target="ssec-trl-diff-query" format="counter" sectionFormat="of" derivedContent="8"/>, in case the GET request has yielded the execution of a full query or of a diff query of the TRL, respectively. Instead, if the AS supports both diff queries and the related "Cursor" extension, then the payload of the response is formatted as defined in <xref target="sec-using-cursor" format="default" sectionFormat="of" derivedContent="Section 9"/>.</t>
      <t indent="0" pn="section-11-3">In case a requester does not receive a response from the TRL endpoint or it receives an error response from the TRL endpoint, the requester does not make any assumptions or draw any conclusions regarding the revocation or expiration of its pertaining access tokens. The requester <bcp14>MAY</bcp14> try again by sending a new request to the TRL endpoint.</t>
      <t indent="0" pn="section-11-4">When the TRL is updated (see <xref target="ssec-trl-update" format="default" sectionFormat="of" derivedContent="Section 5.1"/>), the AS sends Observe notifications to the observers whose pertaining subset of the TRL has changed. Observe notifications are sent as per <xref section="4.2" sectionFormat="of" target="RFC7641" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7641#section-4.2" derivedContent="RFC7641"/>. If supported by the AS, an observer may configure the behavior according to which the AS sends those Observe notifications. To this end, a possible way relies on the conditional control parameter "c.pmax" defined in <xref target="I-D.ietf-core-conditional-attributes" format="default" sectionFormat="of" derivedContent="COND-PARAMETERS"/>, which can be included as a "name=value" query parameter in an Observation Request. This ensures that no more than c.pmax seconds elapse between two consecutive notifications sent to that observer, regardless of whether or not the TRL has changed.</t>
      <t indent="0" pn="section-11-5">Following a first exchange with the AS, an administrator or a registered device can send additional GET requests to the TRL endpoint at any time, analogously to what is defined above. When doing so, the requester towards the TRL endpoint can ask the AS to perform a full query (see <xref target="ssec-trl-full-query" format="default" sectionFormat="of" derivedContent="Section 7"/>) or a diff query (see <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>) of the TRL. In the latter case, the requester can additionally rely on the "Cursor" extension (see Sections <xref target="sec-trl-endpoint-query-parameters" format="counter" sectionFormat="of" derivedContent="6.3"/> and <xref target="sec-using-cursor-diff-query-response" format="counter" sectionFormat="of" derivedContent="9.2"/>).</t>
      <t indent="0" pn="section-11-6">As specified in <xref target="sec-trl-endpoint-supporting-diff-queries" format="default" sectionFormat="of" derivedContent="Section 6.2"/>, an AS supporting diff queries maintains an update collection of maximum MAX_N series items for each administrator or registered device, hereafter referred to as a "requester". In particular, if an update collection includes MAX_N series items, adding a further series item to that update collection results in deleting the oldest series item from that update collection.</t>
      <t indent="0" pn="section-11-7">From then on, the requester associated with the update collection will not be able to retrieve the deleted series item when sending a new diff query request to the TRL endpoint. If that series item reflected the revocation of an access token pertaining to the requester, then the requester will not learn about that when receiving the corresponding diff query response from the AS.</t>
      <t indent="0" pn="section-11-8">Sending a diff query request specifically as an Observation Request, and, thus, relying on Observe notifications, largely reduces the chances for a requester to miss updates that have occurred to its associated update collection. In turn, this relies on the requester successfully receiving the Observe notification responses from the TRL (see also <xref target="sec-security-considerations-comm-patterns" format="default" sectionFormat="of" derivedContent="Section 14.3"/>).</t>
      <t indent="0" pn="section-11-9">In order to limit the amount of time during which the requester is unaware of pertaining access tokens that have been revoked but are not expired yet, a requester <bcp14>SHOULD NOT</bcp14> rely solely on diff query requests. In particular, a requester <bcp14>SHOULD</bcp14> also regularly send a full query request to the TRL endpoint according to a related application policy.</t>
      <section anchor="sec-handling-token-hashes" numbered="true" removeInRFC="false" toc="include" pn="section-11.1">
        <name slugifiedName="name-handling-of-revoked-access-">Handling of Revoked Access Tokens and Token Hashes</name>
        <t indent="0" pn="section-11.1-1">When receiving a response from the TRL endpoint, a registered device <bcp14>MUST</bcp14> expunge every stored access token associated with a token hash specified in the response. In case the registered device is an RS, it <bcp14>MUST NOT</bcp14> delete the stored token hash after having expunged the associated access token.</t>
        <t indent="0" pn="section-11.1-2">If an RS uses the method defined in this document with the AS that has issued an access token, then the RS <bcp14>MUST NOT</bcp14> accept and store that access token if any of the following holds.</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-11.1-3">
          <li pn="section-11.1-3.1">
            <t indent="0" pn="section-11.1-3.1.1">The token hash corresponding to the access token is among the currently stored ones.</t>
          </li>
          <li pn="section-11.1-3.2">
            <t indent="0" pn="section-11.1-3.2.1">The access token is a CWT and any of the following holds:  </t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-11.1-3.2.2">
              <li pn="section-11.1-3.2.2.1">
                <t indent="0" pn="section-11.1-3.2.2.1.1">The access token includes a non-empty "unprotected" field, i.e., the value of the field is not encoded as the empty CBOR map (0xa0). This applies to the top-level "unprotected" field of the COSE object used for the CWT, the "unprotected" field of each element of the "signatures" array, and the "unprotected" field of each element of any "recipients" array.</t>
              </li>
              <li pn="section-11.1-3.2.2.2">
                <t indent="0" pn="section-11.1-3.2.2.2.1">The received CBOR data item that embodies the access token does not comply with what is defined in <xref target="sec-issuing-access-tokens-as" format="default" sectionFormat="of" derivedContent="Section 3"/>. This concerns:</t>
                <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-11.1-3.2.2.2.2">
                  <li pn="section-11.1-3.2.2.2.2.1">the use of exactly two nested CBOR tags, where the outer tag is the CWT CBOR tag and the inner tag is one of the COSE CBOR tags;</li>
                  <li pn="section-11.1-3.2.2.2.2.2">the tag numbers encoded with the minimum possible length; and</li>
                  <li pn="section-11.1-3.2.2.2.2.3">the access token being the innermost tag content of the received CBOR data item.</li>
                </ul>
              </li>
              <li pn="section-11.1-3.2.2.3">
                <t indent="0" pn="section-11.1-3.2.2.3.1">In the received CBOR data item that embodies the access token, the inner tag has a tag number that is not consistent with the actual COSE data item to process. For instance, the inner tag number is 16 (COSE_Encrypt0) but the CWT is actually a COSE_Sign data item.</t>
              </li>
            </ul>
          </li>
          <li pn="section-11.1-3.3">
            <t indent="0" pn="section-11.1-3.3.1">The access token relies on a JSON object for encoding its claims, but it is not a JWT <xref target="RFC7519" format="default" sectionFormat="of" derivedContent="RFC7519"/> and any of the following holds:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-11.1-3.3.2">
              <li pn="section-11.1-3.3.2.1">
                <t indent="0" pn="section-11.1-3.3.2.1.1">The access token uses the JWS JSON Serialization from <xref target="RFC7515" format="default" sectionFormat="of" derivedContent="RFC7515"/> and includes the JWS Unprotected Header.</t>
              </li>
              <li pn="section-11.1-3.3.2.2">
                <t indent="0" pn="section-11.1-3.3.2.2.1">The access token uses the JWE JSON Serialization from <xref target="RFC7516" format="default" sectionFormat="of" derivedContent="RFC7516"/> and includes the JWE Shared Unprotected Header and/or includes the "header" member in any of the elements of the "recipients" array.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t indent="0" pn="section-11.1-4">An RS <bcp14>MUST</bcp14> store the token hash th1 corresponding to an access token t1 until both the following conditions hold:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-11.1-5">
          <li pn="section-11.1-5.1">
            <t indent="0" pn="section-11.1-5.1.1">The RS has received and seen t1, irrespective of having accepted and stored it.</t>
          </li>
          <li pn="section-11.1-5.2">
            <t indent="0" pn="section-11.1-5.2.1">The RS has gained knowledge that t1 has expired. This can be achieved, e.g., through the following means:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-11.1-5.2.2">
              <li pn="section-11.1-5.2.2.1">
                <t indent="0" pn="section-11.1-5.2.2.1.1">A response from the TRL endpoint indicating that t1 has expired after its earlier revocation, i.e., the token hash th1 has been removed from the TRL. This can be indicated, for instance, in a response from the TRL endpoint following a diff query of the TRL (see <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>).</t>
              </li>
              <li pn="section-11.1-5.2.2.2">
                <t indent="0" pn="section-11.1-5.2.2.2.1">The value of the 'exp' claim specified in t1 indicates that t1 has expired.</t>
              </li>
              <li pn="section-11.1-5.2.2.3">
                <t indent="0" pn="section-11.1-5.2.2.3.1">The locally determined expiration time for t1 has passed, based on the time at the RS when t1 was first accepted and on the value of its 'exi' claim.</t>
              </li>
              <li pn="section-11.1-5.2.2.4">
                <t indent="0" pn="section-11.1-5.2.2.4.1">The result of token introspection performed on t1 (see <xref section="5.9" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.9" derivedContent="RFC9200"/>), if supported by both the RS and the AS.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t indent="0" pn="section-11.1-6">The RS <bcp14>MUST NOT</bcp14> delete the stored token hashes whose corresponding access tokens do not fulfill both the two conditions above, unless it becomes necessary due to memory limitations. In such a case, the RS <bcp14>MUST</bcp14> delete the earliest stored token hashes first.</t>
        <t indent="0" pn="section-11.1-7">Retaining the stored token hashes as specified above limits the impact from a (dishonest) client whose pertaining access token:</t>
        <ol indent="adaptive" spacing="normal" start="1" type="1" pn="section-11.1-8">
	  <li pn="section-11.1-8.1" derivedCounter="1.">includes the 'exi' claim,</li>
          <li pn="section-11.1-8.2" derivedCounter="2.">is uploaded at the RS for the first time after it has been revoked and later expired, and</li>
          <li pn="section-11.1-8.3" derivedCounter="3.">has the sequence number encoded in the 'cti' claim (for CWTs) or in the 'jti' claim (for JWTs) greater than the highest sequence number among the expired access tokens including the 'exi' claim for the RS (see <xref section="5.10.3" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.10.3" derivedContent="RFC9200"/>).</li>
        </ol>
        <t indent="0" pn="section-11.1-9">That is, the RS would not accept such a revoked and expired access token as long as it stores the corresponding token hash.</t>
        <t indent="0" pn="section-11.1-10">This risk can be further limited.  Specifically, if token
introspection is implemented by both the RS and the AS, the RS can
introspect the access token (see <xref section="5.9" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.9" derivedContent="RFC9200"/>) when
receiving an access token that includes the 'exi' claim and for which
a corresponding token hash is not stored.</t>
        <t indent="0" pn="section-11.1-11">When, due to the stored and corresponding token hash th2, an access token t2 that includes the 'exi' claim is expunged or is not accepted upon its upload, the RS retrieves the sequence number sn2 encoded in the 'cti' claim (for CWTs) or in the 'jti' claim (for JWTs) (see <xref section="5.10.3" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.10.3" derivedContent="RFC9200"/>). Then, the RS stores sn2 as associated with th2. If expunging or not accepting t2 yields the deletion of th2, then the RS <bcp14>MUST</bcp14> associate sn2 with th2 before continuing with the deletion of th2.</t>
        <t indent="0" pn="section-11.1-12">When deleting any token hash, the RS checks whether the token hash is associated with a sequence number sn_th. In such a case, the RS checks whether sn_th is greater than the highest sequence number sn* among the expired access tokens including the 'exi' claim for the RS. If that is the case, sn* <bcp14>MUST</bcp14> take the value of sn_th.</t>
        <t indent="0" pn="section-11.1-13">By virtue of what is defined in <xref section="5.10.3" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-5.10.3" derivedContent="RFC9200"/>, this ensures that, following the deletion of the token hash associated with an access token including the 'exi' claim and uploaded for the first time after it has been revoked and later expired, the RS will not accept the access token at that point in time or in the future.</t>
      </section>
    </section>
    <section anchor="trl-registry-parameters" numbered="true" removeInRFC="false" toc="include" pn="section-12">
      <name slugifiedName="name-ace-token-revocation-list-p">ACE Token Revocation List Parameters</name>
      <t indent="0" pn="section-12-1">This specification defines a number of parameters that can be transported in the response from the TRL endpoint, when the response payload is a CBOR map. Note that such a response <bcp14>MUST</bcp14> use the Content-Format "application/ace-trl+cbor" defined in <xref target="iana-content-type" format="default" sectionFormat="of" derivedContent="Section 15.2"/> of this specification.</t>
      <t indent="0" pn="section-12-2">The table below summarizes the parameters. For each of them, it specifies the value to use as CBOR key, i.e., as abbreviation in the key of the map pair for the parameter, instead of the parameter's name as a text string.</t>
      <table align="center" anchor="_table-cbor-trl-params" pn="table-1">
        <name slugifiedName="name-cbor-abbreviations-for-the-">CBOR Abbreviations for the ACE Token Revocation List Parameters</name>
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">Name</th>
            <th align="left" colspan="1" rowspan="1">CBOR Key</th>
            <th align="left" colspan="1" rowspan="1">CBOR Type</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">full_set</td>
            <td align="left" colspan="1" rowspan="1">0</td>
            <td align="left" colspan="1" rowspan="1">array</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">diff_set</td>
            <td align="left" colspan="1" rowspan="1">1</td>
            <td align="left" colspan="1" rowspan="1">array</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">cursor</td>
            <td align="left" colspan="1" rowspan="1">2</td>
            <td align="left" colspan="1" rowspan="1">Null or unsigned integer</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">more</td>
            <td align="left" colspan="1" rowspan="1">3</td>
            <td align="left" colspan="1" rowspan="1">True or False</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="error-types" numbered="true" removeInRFC="false" toc="include" pn="section-13">
      <name slugifiedName="name-ace-token-revocation-list-e">ACE Token Revocation List Error Identifiers</name>
      <t indent="0" pn="section-13-1">This specification defines a number of values that the AS can use as error identifiers. These are used in error responses with Content-Format "application/concise-problem-details+cbor", as values of the 'error-id' field within the Custom Problem Detail entry 'ace-trl-error' (see <xref target="sec-error-responses" format="default" sectionFormat="of" derivedContent="Section 6.1"/>).</t>
      <table align="center" anchor="_table-ACE-TRL-Error" pn="table-2">
        <name slugifiedName="name-ace-token-revocation-list-er">ACE Token Revocation List Error Identifiers</name>
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">Value</th>
            <th align="left" colspan="1" rowspan="1">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">0</td>
            <td align="left" colspan="1" rowspan="1">Invalid parameter value</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">1</td>
            <td align="left" colspan="1" rowspan="1">Invalid set of parameters</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">2</td>
            <td align="left" colspan="1" rowspan="1">Out of bound cursor value</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="sec-security-considerations" numbered="true" removeInRFC="false" toc="include" pn="section-14">
      <name slugifiedName="name-security-considerations">Security Considerations</name>
      <t indent="0" pn="section-14-1">The protocol defined in this document inherits the security considerations from the ACE framework <xref target="RFC9200" format="default" sectionFormat="of" derivedContent="RFC9200"/> and those about the usage of CWTs from <xref target="RFC8392" format="default" sectionFormat="of" derivedContent="RFC8392"/>, the usage of JWTs from <xref target="RFC7519" format="default" sectionFormat="of" derivedContent="RFC7519"/> and <xref target="RFC8725" format="default" sectionFormat="of" derivedContent="RFC8725"/>, the usage of CoAP Observe from <xref target="RFC7641" format="default" sectionFormat="of" derivedContent="RFC7641"/>, and the computation of the token hashes from <xref target="RFC6920" format="default" sectionFormat="of" derivedContent="RFC6920"/>. The following considerations also apply.</t>
      <section anchor="content-retrieval-from-the-trl" numbered="true" removeInRFC="false" toc="include" pn="section-14.1">
        <name slugifiedName="name-content-retrieval-from-the-">Content Retrieval from the TRL</name>
        <t indent="0" pn="section-14.1-1">The AS <bcp14>MUST</bcp14> ensure that each registered device can access and retrieve only its pertaining subset of the TRL. To this end, the AS can always perform the required filtering based on the authenticated identity of the registered device, i.e., a (non-public) identifier that the AS can securely relate to the registered device and the secure association that they use to communicate.</t>
        <t indent="0" pn="section-14.1-2">The AS <bcp14>MUST</bcp14> ensure that, other than registered devices accessing their own pertaining subset of the TRL, only authorized and authenticated administrators can access the content of the whole TRL (see <xref target="sec-registration" format="default" sectionFormat="of" derivedContent="Section 10"/>).</t>
        <t indent="0" pn="section-14.1-3">Note that the TRL endpoint supports only the GET method (see <xref target="sec-trl-endpoint" format="default" sectionFormat="of" derivedContent="Section 6"/>). Therefore, as detailed in Sections <xref target="ssec-trl-full-query" format="counter" sectionFormat="of" derivedContent="7"/> and <xref target="ssec-trl-diff-query" format="counter" sectionFormat="of" derivedContent="8"/>, access to the TRL endpoint is performed only by means of protected and authenticated GET requests, which, by definition, are safe in the REST sense and do not alter the content of the TRL. That is, registered devices and administrators can perform exclusively read-only operations when accessing the TRL endpoint.</t>
        <t indent="0" pn="section-14.1-4">In fact, the content of the TRL can be updated only internally by the AS, in the two circumstances described in <xref target="ssec-trl-update" format="default" sectionFormat="of" derivedContent="Section 5.1"/>.  Therefore, an adversary that is not in control of the AS cannot manipulate the content of the TRL, e.g., by removing a token hash and thereby fraudulently allowing a client to access protected resources in spite of a revoked access token or by adding a token hash and thereby fraudulently stopping a client from accessing protected resources in spite of an access token being still valid.</t>
      </section>
      <section anchor="size-of-the-trl" numbered="true" removeInRFC="false" toc="include" pn="section-14.2">
        <name slugifiedName="name-size-of-the-trl">Size of the TRL</name>
        <t indent="0" pn="section-14.2-1">If many non-expired access tokens associated with a registered device are revoked, the pertaining subset of the TRL could grow to a size bigger than what the registered device is prepared to handle upon reception of a response from the TRL endpoint, especially if relying on a full query of the TRL (see <xref target="ssec-trl-full-query" format="default" sectionFormat="of" derivedContent="Section 7"/>).</t>
        <t indent="0" pn="section-14.2-2">This could be exploited by attackers to negatively affect the behavior of a registered device. Therefore, in order to help reduce the size of the TRL, the AS <bcp14>SHOULD</bcp14> refrain from issuing access tokens with an excessively long expiration time.</t>
      </section>
      <section anchor="sec-security-considerations-comm-patterns" numbered="true" removeInRFC="false" toc="include" pn="section-14.3">
        <name slugifiedName="name-communication-patterns">Communication Patterns</name>
        <t indent="0" pn="section-14.3-1">The communication about revoked access tokens presented in this specification is expected to especially rely on CoAP Observe notifications sent from the AS to a requester (i.e., an administrator or a registered device). The suppression of those notifications by an external attacker that has access to the network would prevent requesters from ever knowing that their pertaining access tokens have been revoked.</t>
        <t indent="0" pn="section-14.3-2">In order to avoid this, a requester <bcp14>SHOULD NOT</bcp14> rely solely on the CoAP Observe notifications. In particular, a requester <bcp14>SHOULD</bcp14> also regularly poll the AS for the most current information about revoked access tokens by sending GET requests to the TRL endpoint. Specific strategies and schedules for polling the AS are to be defined by a related application policy and by taking into account the expected operational and availability patterns adopted by the requester (e.g., in the interest of energy saving and other optimizations).</t>
      </section>
      <section anchor="request-of-new-access-tokens" numbered="true" removeInRFC="false" toc="include" pn="section-14.4">
        <name slugifiedName="name-request-of-new-access-token">Request of New Access Tokens</name>
        <t indent="0" pn="section-14.4-1">If a client stores an access token that it still believes to be valid, and it accordingly attempts to access a protected resource at the RS, the client may receive an unprotected 4.01 (Unauthorized) response from the RS.</t>
        <t indent="0" pn="section-14.4-2">This can be due to a number of causes, for example:</t>
        <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-14.4-3">
          <li pn="section-14.4-3.1">the access token has been revoked, the RS has become aware of it, and the RS has expunged the access token, but the client is not aware of this (yet).</li>
          <li pn="section-14.4-3.2">the access token is still valid, but an on-path active adversary might have injected a forged 4.01 (Unauthorized) response or the RS might have deleted the access token from its local storage due to its dedicated storage space being all consumed.</li>
        </ul>
        <t indent="0" pn="section-14.4-4">In either case, if the client believes that the access token is still valid, it <bcp14>SHOULD NOT</bcp14> immediately ask for a new access token to the AS upon receiving a 4.01 (Unauthorized) response from the RS. Instead, the client <bcp14>SHOULD</bcp14> send a request to the TRL endpoint at the AS. If the client gains knowledge that the access token is not valid anymore, the client expunges the access token and can ask for a new one. Otherwise, the client can try again to upload the same access token to the RS or request a new one.</t>
      </section>
      <section anchor="vulnerable-time-window-at-the-rs" numbered="true" removeInRFC="false" toc="include" pn="section-14.5">
        <name slugifiedName="name-vulnerable-time-window-at-t">Vulnerable Time Window at the RS</name>
        <t indent="0" pn="section-14.5-1">A client may attempt to access a protected resource at an RS after the access token allowing such an access has been revoked but before the RS is aware of the revocation.</t>
        <t indent="0" pn="section-14.5-2">In such a case, if the RS is still storing the access token, the client will be able to access the protected resource even though it should not. Such access is a security violation, even if the client is not attempting to be malicious.</t>
        <t indent="0" pn="section-14.5-3">In order to minimize such a risk, if an RS relies solely on polling through individual requests to the TRL endpoint to learn of revoked access tokens, the RS <bcp14>SHOULD</bcp14> implement an adequate trade-off between the polling frequency and the maximum length of the vulnerable time window.</t>
      </section>
      <section anchor="sec-seccons-token-manipulation" numbered="true" removeInRFC="false" toc="include" pn="section-14.6">
        <name slugifiedName="name-preventing-unnoticed-manipu">Preventing Unnoticed Manipulation of Access Tokens</name>
        <t indent="0" pn="section-14.6-1">As defined in <xref target="sec-issuing-access-tokens-as" format="default" sectionFormat="of" derivedContent="Section 3"/>, issued access tokens <bcp14>MUST NOT</bcp14> rely on unprotected headers to specify information as header parameters. Also, when issued access tokens are CWTs, they <bcp14>MUST</bcp14> be tagged by using the COSE CBOR tag corresponding to the used COSE object.  Further, the result <bcp14>MUST</bcp14> be tagged using the CWT CBOR tag; no further tagging is performed.</t>
        <t indent="0" pn="section-14.6-2">This ensures that the RS always computes the correct token hash corresponding to an access token, i.e., the same token hash computed by the AS and C for that access token.</t>
        <t indent="0" pn="section-14.6-3">By construction, the rules defined in <xref target="sec-issuing-access-tokens-as" format="default" sectionFormat="of" derivedContent="Section 3"/> prevent an active adversary from successfully performing an attack against the RS, which would otherwise be possible in case the access token is uploaded to the RS over an unprotected communication channel.</t>
        <t indent="0" pn="section-14.6-4">In such an attack, the adversary intercepts the access token en route to the RS. Then, the adversary manipulates the access token in a way that is going to be unnoticed by the RS but without preventing the successful cryptographic validation of the access token at the RS. To this end, the adversary has two possible options:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-14.6-5">
          <li pn="section-14.6-5.1">
            <t indent="0" pn="section-14.6-5.1.1">Adding and/or removing fields within the unprotected header(s) of the access token, as long as those fields do not play a role in the cryptographic validation of the access token.</t>
          </li>
          <li pn="section-14.6-5.2">
            <t indent="0" pn="section-14.6-5.2.1">Specifically when the access token is a CWT, adding, removing, or manipulating possible CBOR tags enclosing the access token.</t>
          </li>
        </ul>
        <t indent="0" pn="section-14.6-6">After that, the adversary sends the manipulated access token to the RS.</t>
        <t indent="0" pn="section-14.6-7">After having successfully validated the manipulated access token, the RS computes a corresponding token hash different from the one computed and stored by C and the AS. Finally, the RS stores the manipulated access token and the corresponding wrong token hash.</t>
        <t indent="0" pn="section-14.6-8">Later on, if the access token is revoked and the AS provides the RS with the corresponding correct token hash, the RS does not recognize the received token hash among the stored ones; therefore, the RS does not delete the revoked access token.</t>
      </section>
      <section anchor="sec-seccons-two-hashes-jwt" numbered="true" removeInRFC="false" toc="include" pn="section-14.7">
        <name slugifiedName="name-two-token-hashes-at-the-rs-">Two Token Hashes at the RS Using JWTs</name>
        <t indent="0" pn="section-14.7-1"><xref target="sec-token-hash-input-rs-jwt" format="default" sectionFormat="of" derivedContent="Section 4.3.2"/> specifies that an RS using JWTs as access tokens has to compute and store two token hashes associated with the same access token. This is because the RS does not know for sure if the AS provided the access token to the client by means of an AS-to-Client response encoded in CBOR or in JSON.</t>
        <t indent="0" pn="section-14.7-2">Taking advantage of that, a dishonest client can attempt to perform an attack against the RS. That is, the client can first receive the JWT in an AS-to-Client response encoded in CBOR (JSON). Then, the client can upload the JWT to the RS in a way that makes the RS believe that the client instead received the JWT in an AS-to-Client response encoded in JSON (CBOR).</t>
        <t indent="0" pn="section-14.7-3">Consequently, the RS considers a HASH_INPUT different from the one considered by the AS and the client (see <xref target="sec-token-hash-input-c-as" format="default" sectionFormat="of" derivedContent="Section 4.2"/>). Hence, the RS computes a token hash h' different from the token hash h computed by the AS and the client. It follows that, if the AS revokes the access token and advertises the right token hash h, then the RS will not learn about the access token revocation; therefore, the RS will not delete the access token.</t>
        <t indent="0" pn="section-14.7-4">Fundamentally, this would happen because the HASH_INPUT used to compute the token hash of a JWT depends on whether the AS-to-Client response is encoded in CBOR or in JSON. This makes the RS vulnerable to the attack described above when JWTs are used as access tokens. However, this is not a problem if the access token is a CWT, since the HASH_INPUT used to compute the token hash of a CWT does not depend on whether the AS-to-Client response is encoded in CBOR or in JSON.</t>
        <t indent="0" pn="section-14.7-5">While this asymmetry cannot be avoided altogether, the method defined for the AS and the client in <xref target="sec-token-hash-input-c-as" format="default" sectionFormat="of" derivedContent="Section 4.2"/> deliberately penalizes the case where the RS uses JWTs as access tokens. In such a case, the RS effectively neutralizes the attack described above by computing and storing two token hashes associated with the same access token (see <xref target="sec-token-hash-input-rs-jwt" format="default" sectionFormat="of" derivedContent="Section 4.3.2"/>).</t>
        <t indent="0" pn="section-14.7-6">Conversely, this design deliberately favors the case where the RS uses CWTs as access tokens, which is a preferable option for resource-constrained RSs as well as the default case in the ACE framework (see <xref section="3" sectionFormat="of" target="RFC9200" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9200#section-3" derivedContent="RFC9200"/>). That is, if an RS uses CWTs as access tokens, then the RS is not exposed to the attack described above; therefore, the RS safely computes and stores only one token hash per access token (see <xref target="sec-token-hash-input-rs-cwt" format="default" sectionFormat="of" derivedContent="Section 4.3.1"/>).</t>
      </section>
      <section anchor="additional-security-measures" numbered="true" removeInRFC="false" toc="include" pn="section-14.8">
        <name slugifiedName="name-additional-security-measure">Additional Security Measures</name>
        <t indent="0" pn="section-14.8-1">By accessing the TRL at the AS, registered devices and administrators are able to learn that their pertaining access tokens have been revoked. However, they cannot learn the reason why, including when that reason is the compromise, misbehavior, or decommissioning of a registered device.</t>
        <t indent="0" pn="section-14.8-2">In fact, even the AS might not know that a registered device to which a revoked access token pertains has been specifically compromised, misbehaving, or decommissioned. At the same time, it might not be acceptable to only revoke the access tokens pertaining to such a registered device.</t>
        <t indent="0" pn="section-14.8-3">Therefore, in order to preserve the security of the system and application, the entity that authoritatively declares a registered device to be compromised, misbehaving, or decommissioned should also promptly trigger the execution of additional revocation processes as deemed appropriate. These include, for instance:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-14.8-4">
          <li pn="section-14.8-4.1">
            <t indent="0" pn="section-14.8-4.1.1">The deregistration of the registered device from the AS so that the AS does not issue further access tokens pertaining to that device.</t>
          </li>
          <li pn="section-14.8-4.2">
            <t indent="0" pn="section-14.8-4.2.1">If applicable, the revocation of the public authentication credential associated with the registered device (e.g., its public key certificate).</t>
          </li>
        </ul>
        <t indent="0" pn="section-14.8-5">The methods by which these processes are triggered and carried out are out of the scope of this document.</t>
      </section>
    </section>
    <section anchor="iana" numbered="true" removeInRFC="false" toc="include" pn="section-15">
      <name slugifiedName="name-iana-considerations">IANA Considerations</name>
      <t indent="0" pn="section-15-1">The IANA actions for this document are described in the following subsections.</t>
      <section anchor="iana-media-type" numbered="true" removeInRFC="false" toc="include" pn="section-15.1">
        <name slugifiedName="name-media-type-registrations">Media Type Registrations</name>
        <t indent="0" pn="section-15.1-1">IANA has registered the media type "application/ace-trl+cbor" for messages of the protocol defined in this document encoded in CBOR. This registration follows the procedures specified in <xref target="RFC6838" format="default" sectionFormat="of" derivedContent="RFC6838"/>.</t>
        <dl newline="false" indent="3" spacing="normal" pn="section-15.1-2">
          <dt pn="section-15.1-2.1">Type name:</dt>
          <dd pn="section-15.1-2.2">application</dd>
          <dt pn="section-15.1-2.3">Subtype name:</dt>
          <dd pn="section-15.1-2.4">ace-trl+cbor</dd>
          <dt pn="section-15.1-2.5">Required parameters:</dt>
          <dd pn="section-15.1-2.6">N/A</dd>
          <dt pn="section-15.1-2.7">Optional parameters:</dt>
          <dd pn="section-15.1-2.8">N/A</dd>
          <dt pn="section-15.1-2.9">Encoding considerations:</dt>
          <dd pn="section-15.1-2.10">Must be encoded as a CBOR map
          containing the protocol parameters defined in RFC 9770.</dd>
          <dt pn="section-15.1-2.11">Security considerations:</dt>
          <dd pn="section-15.1-2.12">See <xref target="sec-security-considerations" format="default" sectionFormat="of" derivedContent="Section 14"/> of RFC 9770.</dd>
          <dt pn="section-15.1-2.13">Interoperability considerations:</dt>
          <dd pn="section-15.1-2.14">N/A</dd>
          <dt pn="section-15.1-2.15">Published specification:</dt>
          <dd pn="section-15.1-2.16">RFC 9770</dd>
          <dt pn="section-15.1-2.17">Applications that use this media type:</dt>
          <dd pn="section-15.1-2.18">The type is used
          by authorization servers, clients, and RSs that support
          the notification of revoked access tokens according to a Token
          Revocation List maintained by the authorization server as specified
          in RFC 9770.</dd>
          <dt pn="section-15.1-2.19">Fragment identifier considerations:</dt>
          <dd pn="section-15.1-2.20">N/A</dd>
          <dt pn="section-15.1-2.21">Additional information:</dt>
          <dd pn="section-15.1-2.22">N/A</dd>
          <dt pn="section-15.1-2.23">Person &amp; email address to contact for further
          information:</dt>
          <dd pn="section-15.1-2.24">ACE WG mailing list (ace@ietf.org) or IETF
          Applications and Real-Time Area (art@ietf.org)</dd>
          <dt pn="section-15.1-2.25">Intended usage:</dt>
          <dd pn="section-15.1-2.26">COMMON</dd>
          <dt pn="section-15.1-2.27">Restrictions on usage:</dt>
          <dd pn="section-15.1-2.28">None</dd>
          <dt pn="section-15.1-2.29">Author/Change controller:</dt>
          <dd pn="section-15.1-2.30">IETF</dd>
        </dl>
      </section>
      <section anchor="iana-content-type" numbered="true" removeInRFC="false" toc="include" pn="section-15.2">
        <name slugifiedName="name-coap-content-formats-regist">CoAP Content-Formats Registry</name>
        <t indent="0" pn="section-15.2-1">IANA has registered the following entry to the "CoAP Content-Formats" registry within the "Constrained RESTful Environments (CoRE) Parameters" registry group.</t>
        <dl newline="false" spacing="compact" indent="3" pn="section-15.2-2">
          <dt pn="section-15.2-2.1">Content Type:</dt>
          <dd pn="section-15.2-2.2">application/ace-trl+cbor</dd>
          <dt pn="section-15.2-2.3">Content Coding:</dt>
          <dd pn="section-15.2-2.4">-</dd>
          <dt pn="section-15.2-2.5">ID:</dt>
          <dd pn="section-15.2-2.6">262</dd>
          <dt pn="section-15.2-2.7">Reference:</dt>
          <dd pn="section-15.2-2.8">RFC 9770</dd>
        </dl>
      </section>
      <section anchor="iana-custom-problem-details" numbered="true" removeInRFC="false" toc="include" pn="section-15.3">
        <name slugifiedName="name-custom-problem-detail-keys-">Custom Problem Detail Keys Registry</name>
        <t indent="0" pn="section-15.3-1">IANA has registered the following entry in the "Custom Problem Detail Keys" registry within the "Constrained RESTful Environments (CoRE) Parameters" registry group.</t>
        <dl newline="false" spacing="compact" indent="3" pn="section-15.3-2">
          <dt pn="section-15.3-2.1">Key Value:</dt>
          <dd pn="section-15.3-2.2">1</dd>
          <dt pn="section-15.3-2.3">Name:</dt>
          <dd pn="section-15.3-2.4">ace-trl-error</dd>
          <dt pn="section-15.3-2.5">Brief Description:</dt>
          <dd pn="section-15.3-2.6">Carry RFC 9770 problem details in a Concise Problem Details data item.</dd>
          <dt pn="section-15.3-2.7">Change Controller:</dt>
          <dd pn="section-15.3-2.8">IETF</dd>
          <dt pn="section-15.3-2.9">Reference:</dt>
          <dd pn="section-15.3-2.10">
            <xref target="sec-error-responses" format="default" sectionFormat="of" derivedContent="Section 6.1"/> of RFC 9770</dd>
        </dl>
      </section>
      <section anchor="iana-token-revocation-list" numbered="true" removeInRFC="false" toc="include" pn="section-15.4">
        <name slugifiedName="name-ace-token-revocation-list-pa">ACE Token Revocation List Parameters Registry</name>
        <t indent="0" pn="section-15.4-1">IANA has established the "ACE Token Revocation List Parameters"  registry within the "Authentication and Authorization for Constrained Environments (ACE)" registry group.</t>
        <t indent="0" pn="section-15.4-2">One of the following registration policies is used: "Standards Action With Expert Review", "Specification Required" per <xref section="4.6" sectionFormat="of" target="RFC8126" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8126#section-4.6" derivedContent="RFC8126"/>, or "Expert Review" per <xref section="4.5" sectionFormat="of" target="RFC8126" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8126#section-4.5" derivedContent="RFC8126"/>. Expert Review guidelines are provided in <xref target="review" format="default" sectionFormat="of" derivedContent="Section 15.6"/>.</t>
        <t indent="0" pn="section-15.4-3">All assignments according to "Standards Action With Expert Review" are made on a "Standards Action" basis per <xref section="4.9" sectionFormat="of" target="RFC8126" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8126#section-4.9" derivedContent="RFC8126"/> with Expert Review additionally required per <xref section="4.5" sectionFormat="of" target="RFC8126" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8126#section-4.5" derivedContent="RFC8126"/>. The procedure for early IANA allocation of Standards Track code points defined in <xref target="RFC7120" format="default" sectionFormat="of" derivedContent="RFC7120"/> also applies. When such a procedure is used, IANA will ask the designated expert(s) to approve the early allocation before registration. In addition, WG chairs are encouraged to consult the expert(s) early during the process outlined in <xref section="3.1" sectionFormat="of" target="RFC7120" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7120#section-3.1" derivedContent="RFC7120"/>.</t>
        <t indent="0" pn="section-15.4-4">The columns of this registry are as follows:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-15.4-5">
          <li pn="section-15.4-5.1">Name: This field contains a descriptive name that
          enables easier reference to the item. The name <bcp14>MUST</bcp14>
          be unique, and it is not used in the encoding.</li>
          <li pn="section-15.4-5.2">CBOR Key: This field contains the value used as CBOR map
          key of the item. The value <bcp14>MUST</bcp14> be unique. The value
          is an unsigned integer or a negative integer. Different ranges of
          values use different registration policies <xref target="RFC8126" format="default" sectionFormat="of" derivedContent="RFC8126"/>. Integer values from -256 to 255 are designated
          as "Standards Action With Expert Review". Integer values from -65536
          to -257 and from 256 to 65535 are designated as "Specification
          Required". Integer values greater than 65535 are designated as
          "Expert Review". Integer values less than -65536 are marked as
          "Private Use".</li>
          <li pn="section-15.4-5.3">CBOR Type: This field contains the allowable CBOR data
          types for values of this item or a pointer to the registry that
          defines its type, when that depends on another item.</li>
          <li pn="section-15.4-5.4">Reference: This field contains a pointer to the public
          specification for the item.</li>
        </ul>
        <t indent="0" pn="section-15.4-6">This registry has been initially populated by the values in <xref target="trl-registry-parameters" format="default" sectionFormat="of" derivedContent="Section 12"/>. The "Reference" column for all of these entries refers to this document.</t>
      </section>
      <section anchor="iana-token-revocation-list-errors" numbered="true" removeInRFC="false" toc="include" pn="section-15.5">
        <name slugifiedName="name-ace-token-revocation-list-err">ACE Token Revocation List Errors</name>
        <t indent="0" pn="section-15.5-1">IANA has established the "ACE Token Revocation List Errors"  registry within the "Authentication and Authorization for Constrained Environments (ACE)" registry group.</t>
        <t indent="0" pn="section-15.5-2">One of the following registration policies is used: "Standards Action With Expert Review", "Specification Required" per <xref section="4.6" sectionFormat="of" target="RFC8126" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8126#section-4.6" derivedContent="RFC8126"/>, or "Expert Review" per <xref section="4.5" sectionFormat="of" target="RFC8126" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8126#section-4.5" derivedContent="RFC8126"/>. Expert Review guidelines are provided in <xref target="review" format="default" sectionFormat="of" derivedContent="Section 15.6"/>.</t>
        <t indent="0" pn="section-15.5-3">All assignments according to "Standards Action With Expert Review" are made on a "Standards Action" basis per <xref section="4.9" sectionFormat="of" target="RFC8126" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8126#section-4.9" derivedContent="RFC8126"/> with Expert Review additionally required per <xref section="4.5" sectionFormat="of" target="RFC8126" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8126#section-4.5" derivedContent="RFC8126"/>. The procedure for early IANA allocation of Standards Track code points defined in <xref target="RFC7120" format="default" sectionFormat="of" derivedContent="RFC7120"/> also applies. When such a procedure is used, IANA will ask the designated expert(s) to approve the early allocation before registration. In addition, WG chairs are encouraged to consult the expert(s) early during the process outlined in <xref section="3.1" sectionFormat="of" target="RFC7120" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7120#section-3.1" derivedContent="RFC7120"/>.</t>
        <t indent="0" pn="section-15.5-4">The columns of this registry are as follows:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-15.5-5">
          <li pn="section-15.5-5.1">
            <t indent="0" pn="section-15.5-5.1.1">Value: The field contains the value to be used to identify the error. The value <bcp14>MUST</bcp14> be unique. The value is an unsigned integer or a negative integer. Different ranges of values use different registration policies <xref target="RFC8126" format="default" sectionFormat="of" derivedContent="RFC8126"/>. Integer values from -256 to 255 are designated as "Standards Action With Expert Review". Integer values from -65536 to -257 and from 256 to 65535 are designated as "Specification Required". Integer values greater than 65535 are designated as "Expert Review". Integer values less than -65536 are marked as "Private Use".</t>
          </li>
          <li pn="section-15.5-5.2">
            <t indent="0" pn="section-15.5-5.2.1">Description: This field contains a brief description of the error.</t>
          </li>
          <li pn="section-15.5-5.3">
            <t indent="0" pn="section-15.5-5.3.1">Reference: This field contains a pointer to the public specification defining the error, if one exists.</t>
          </li>
        </ul>
        <t indent="0" pn="section-15.5-6">This registry has been initially populated by the values in <xref target="error-types" format="default" sectionFormat="of" derivedContent="Section 13"/>. The "Reference" column for all of these entries refers to this document.</t>
      </section>
      <section anchor="review" numbered="true" removeInRFC="false" toc="include" pn="section-15.6">
        <name slugifiedName="name-expert-review-instructions">Expert Review Instructions</name>
        <t indent="0" pn="section-15.6-1">The IANA registries established by this document use "Standards Action With Expert Review", "Specification Required", or "Expert Review" registration procedures depending on the range of values for which an assignment is requested. This section gives some general guidelines for what the experts should be looking for, but they are being designated as experts for a reason, so they should be given substantial latitude.</t>
        <t indent="0" pn="section-15.6-2">Expert reviewers should take into consideration the following points:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-15.6-3">
          <li pn="section-15.6-3.1">
            <t indent="0" pn="section-15.6-3.1.1">Point squatting should be discouraged. Reviewers are encouraged to get sufficient information for registration requests to ensure that the usage is not going to duplicate one that is already registered and that the point is likely to be used in deployments. The zones tagged as Private Use are intended for testing purposes and closed environments. Code points in other ranges should not be assigned for testing.</t>
          </li>
          <li pn="section-15.6-3.2">
            <t indent="0" pn="section-15.6-3.2.1">Specifications are required for the "Standards Action With Expert Review" range of point assignment. Specifications should exist for "Specification Required" ranges, but early assignment before a specification is available is considered to be permissible. For the "Expert Review" range of point assignment, specifications are recommended and are needed if they are expected to be used outside of closed environments in an interoperable way. When specifications are not provided, the description provided needs to have sufficient information to identify what the point is being used for.</t>
          </li>
          <li pn="section-15.6-3.3">
            <t indent="0" pn="section-15.6-3.3.1">Experts should take into account the expected usage of fields when approving point assignment. The fact that there is a range for Standards Track documents does not mean that a Standards Track document cannot have points assigned outside of that range. The length of the encoded value should be weighed against how many code points of that length are left, the size of device it will be used on, and the number of code points left that encode to that size.</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <displayreference target="I-D.bormann-t2trg-stp" to="STP"/>
    <displayreference target="I-D.ietf-core-conditional-attributes" to="COND-PARAMETERS"/>
    <references pn="section-16">
      <name slugifiedName="name-references">References</name>
      <references pn="section-16.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="IANA.Hash.Algorithms" target="https://www.iana.org/assignments/named-information" quoteTitle="true" derivedAnchor="IANA.Hash.Algorithms">
          <front>
            <title>Named Information Hash Algorithm Registry</title>
            <author>
              <organization showOnFrontPage="true">IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" quoteTitle="true" derivedAnchor="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 indent="0">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="RFC3629" target="https://www.rfc-editor.org/info/rfc3629" quoteTitle="true" derivedAnchor="RFC3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau"/>
            <date month="November" year="2003"/>
            <abstract>
              <t indent="0">ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems. The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values. This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
        <reference anchor="RFC4648" target="https://www.rfc-editor.org/info/rfc4648" quoteTitle="true" derivedAnchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t indent="0">This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC6347" target="https://www.rfc-editor.org/info/rfc6347" quoteTitle="true" derivedAnchor="RFC6347">
          <front>
            <title>Datagram Transport Layer Security Version 1.2</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
            <date month="January" year="2012"/>
            <abstract>
              <t indent="0">This document specifies version 1.2 of the Datagram Transport Layer Security (DTLS) protocol. The DTLS protocol provides communications privacy for datagram protocols. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. The DTLS protocol is based on the Transport Layer Security (TLS) protocol and provides equivalent security guarantees. Datagram semantics of the underlying transport are preserved by the DTLS protocol. This document updates DTLS 1.0 to work with TLS version 1.2. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6347"/>
          <seriesInfo name="DOI" value="10.17487/RFC6347"/>
        </reference>
        <reference anchor="RFC6749" target="https://www.rfc-editor.org/info/rfc6749" quoteTitle="true" derivedAnchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t indent="0">The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC6838" target="https://www.rfc-editor.org/info/rfc6838" quoteTitle="true" derivedAnchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t indent="0">This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="RFC6920" target="https://www.rfc-editor.org/info/rfc6920" quoteTitle="true" derivedAnchor="RFC6920">
          <front>
            <title>Naming Things with Hashes</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="D. Kutscher" initials="D." surname="Kutscher"/>
            <author fullname="C. Dannewitz" initials="C." surname="Dannewitz"/>
            <author fullname="B. Ohlman" initials="B." surname="Ohlman"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="P. Hallam-Baker" initials="P." surname="Hallam-Baker"/>
            <date month="April" year="2013"/>
            <abstract>
              <t indent="0">This document defines a set of ways to identify a thing (a digital object in this case) using the output from a hash function. It specifies a new URI scheme for this purpose, a way to map these to HTTP URLs, and binary and human-speakable formats for these names. The various formats are designed to support, but not require, a strong link to the referenced object, such that the referenced object may be authenticated to the same degree as the reference to it. The reason for this work is to standardise current uses of hash outputs in URLs and to support new information-centric applications and other uses of hash outputs in protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6920"/>
          <seriesInfo name="DOI" value="10.17487/RFC6920"/>
        </reference>
        <reference anchor="RFC7120" target="https://www.rfc-editor.org/info/rfc7120" quoteTitle="true" derivedAnchor="RFC7120">
          <front>
            <title>Early IANA Allocation of Standards Track Code Points</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <date month="January" year="2014"/>
            <abstract>
              <t indent="0">This memo describes the process for early allocation of code points by IANA from registries for which "Specification Required", "RFC Required", "IETF Review", or "Standards Action" policies apply. This process can be used to alleviate the problem where code point allocation is needed to facilitate desired or required implementation and deployment experience prior to publication of an RFC, which would normally trigger code point allocation. The procedures in this document are intended to apply only to IETF Stream documents.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="100"/>
          <seriesInfo name="RFC" value="7120"/>
          <seriesInfo name="DOI" value="10.17487/RFC7120"/>
        </reference>
        <reference anchor="RFC7252" target="https://www.rfc-editor.org/info/rfc7252" quoteTitle="true" derivedAnchor="RFC7252">
          <front>
            <title>The Constrained Application Protocol (CoAP)</title>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
            <author fullname="K. Hartke" initials="K." surname="Hartke"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2014"/>
            <abstract>
              <t indent="0">The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks. The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s. The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t>
              <t indent="0">CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types. CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7252"/>
          <seriesInfo name="DOI" value="10.17487/RFC7252"/>
        </reference>
        <reference anchor="RFC7515" target="https://www.rfc-editor.org/info/rfc7515" quoteTitle="true" derivedAnchor="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 indent="0">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="RFC7516" target="https://www.rfc-editor.org/info/rfc7516" quoteTitle="true" derivedAnchor="RFC7516">
          <front>
            <title>JSON Web Encryption (JWE)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Hildebrand" initials="J." surname="Hildebrand"/>
            <date month="May" year="2015"/>
            <abstract>
              <t indent="0">JSON Web Encryption (JWE) represents encrypted content 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 IANA registries defined by that specification. Related digital signature and Message Authentication Code (MAC) capabilities are described in the separate JSON Web Signature (JWS) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7516"/>
          <seriesInfo name="DOI" value="10.17487/RFC7516"/>
        </reference>
        <reference anchor="RFC7519" target="https://www.rfc-editor.org/info/rfc7519" quoteTitle="true" derivedAnchor="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 indent="0">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="RFC7641" target="https://www.rfc-editor.org/info/rfc7641" quoteTitle="true" derivedAnchor="RFC7641">
          <front>
            <title>Observing Resources in the Constrained Application Protocol (CoAP)</title>
            <author fullname="K. Hartke" initials="K." surname="Hartke"/>
            <date month="September" year="2015"/>
            <abstract>
              <t indent="0">The Constrained Application Protocol (CoAP) is a RESTful application protocol for constrained nodes and networks. The state of a resource on a CoAP server can change over time. This document specifies a simple protocol extension for CoAP that enables CoAP clients to "observe" resources, i.e., to retrieve a representation of a resource and keep this representation updated by the server over a period of time. The protocol follows a best-effort approach for sending new representations to clients and provides eventual consistency between the state observed by each client and the actual resource state at the server.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7641"/>
          <seriesInfo name="DOI" value="10.17487/RFC7641"/>
        </reference>
        <reference anchor="RFC8126" target="https://www.rfc-editor.org/info/rfc8126" quoteTitle="true" derivedAnchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t indent="0">Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t indent="0">To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t indent="0">This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="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 indent="0">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>
        <reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259" quoteTitle="true" derivedAnchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t indent="0">JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t indent="0">This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC8392" target="https://www.rfc-editor.org/info/rfc8392" quoteTitle="true" derivedAnchor="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 indent="0">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="RFC8446" target="https://www.rfc-editor.org/info/rfc8446" quoteTitle="true" derivedAnchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t indent="0">This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t indent="0">This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8610" target="https://www.rfc-editor.org/info/rfc8610" quoteTitle="true" derivedAnchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t indent="0">This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC8613" target="https://www.rfc-editor.org/info/rfc8613" quoteTitle="true" derivedAnchor="RFC8613">
          <front>
            <title>Object Security for Constrained RESTful Environments (OSCORE)</title>
            <author fullname="G. Selander" initials="G." surname="Selander"/>
            <author fullname="J. Mattsson" initials="J." surname="Mattsson"/>
            <author fullname="F. Palombini" initials="F." surname="Palombini"/>
            <author fullname="L. Seitz" initials="L." surname="Seitz"/>
            <date month="July" year="2019"/>
            <abstract>
              <t indent="0">This document defines Object Security for Constrained RESTful Environments (OSCORE), a method for application-layer protection of the Constrained Application Protocol (CoAP), using CBOR Object Signing and Encryption (COSE). OSCORE provides end-to-end protection between endpoints communicating using CoAP or CoAP-mappable HTTP. OSCORE is designed for constrained nodes and networks supporting a range of proxy operations, including translation between different transport protocols.</t>
              <t indent="0">Although an optional functionality of CoAP, OSCORE alters CoAP options processing and IANA registration. Therefore, this document updates RFC 7252.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8613"/>
          <seriesInfo name="DOI" value="10.17487/RFC8613"/>
        </reference>
        <reference anchor="RFC8725" target="https://www.rfc-editor.org/info/rfc8725" quoteTitle="true" derivedAnchor="RFC8725">
          <front>
            <title>JSON Web Token Best Current Practices</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="February" year="2020"/>
            <abstract>
              <t indent="0">JSON Web Tokens, also known as JWTs, are URL-safe JSON-based security tokens that contain a set of claims that can be signed and/or encrypted. JWTs are being widely used and deployed as a simple security token format in numerous protocols and applications, both in the area of digital identity and in other application areas. This Best Current Practices document updates RFC 7519 to provide actionable guidance leading to secure implementation and deployment of JWTs.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="225"/>
          <seriesInfo name="RFC" value="8725"/>
          <seriesInfo name="DOI" value="10.17487/RFC8725"/>
        </reference>
        <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949" quoteTitle="true" derivedAnchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t indent="0">The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t indent="0">This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC9052" target="https://www.rfc-editor.org/info/rfc9052" quoteTitle="true" derivedAnchor="RFC9052">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="August" year="2022"/>
            <abstract>
              <t indent="0">Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
              <t indent="0">This document, along with RFC 9053, obsoletes RFC 8152.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="96"/>
          <seriesInfo name="RFC" value="9052"/>
          <seriesInfo name="DOI" value="10.17487/RFC9052"/>
        </reference>
        <reference anchor="RFC9147" target="https://www.rfc-editor.org/info/rfc9147" quoteTitle="true" derivedAnchor="RFC9147">
          <front>
            <title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
            <date month="April" year="2022"/>
            <abstract>
              <t indent="0">This document specifies version 1.3 of the Datagram Transport Layer Security (DTLS) protocol. DTLS 1.3 allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t indent="0">The DTLS 1.3 protocol is based on the Transport Layer Security (TLS) 1.3 protocol and provides equivalent security guarantees with the exception of order protection / non-replayability. Datagram semantics of the underlying transport are preserved by the DTLS protocol.</t>
              <t indent="0">This document obsoletes RFC 6347.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9147"/>
          <seriesInfo name="DOI" value="10.17487/RFC9147"/>
        </reference>
        <reference anchor="RFC9200" target="https://www.rfc-editor.org/info/rfc9200" quoteTitle="true" derivedAnchor="RFC9200">
          <front>
            <title>Authentication and Authorization for Constrained Environments Using the OAuth 2.0 Framework (ACE-OAuth)</title>
            <author fullname="L. Seitz" initials="L." surname="Seitz"/>
            <author fullname="G. Selander" initials="G." surname="Selander"/>
            <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="August" year="2022"/>
            <abstract>
              <t indent="0">This specification defines a framework for authentication and authorization in Internet of Things (IoT) environments called ACE-OAuth. The framework is based on a set of building blocks including OAuth 2.0 and the Constrained Application Protocol (CoAP), thus transforming a well-known and widely used authorization solution into a form suitable for IoT devices. Existing specifications are used where possible, but extensions are added and profiles are defined to better serve the IoT use cases.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9200"/>
          <seriesInfo name="DOI" value="10.17487/RFC9200"/>
        </reference>
        <reference anchor="RFC9202" target="https://www.rfc-editor.org/info/rfc9202" quoteTitle="true" derivedAnchor="RFC9202">
          <front>
            <title>Datagram Transport Layer Security (DTLS) Profile for Authentication and Authorization for Constrained Environments (ACE)</title>
            <author fullname="S. Gerdes" initials="S." surname="Gerdes"/>
            <author fullname="O. Bergmann" initials="O." surname="Bergmann"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="G. Selander" initials="G." surname="Selander"/>
            <author fullname="L. Seitz" initials="L." surname="Seitz"/>
            <date month="August" year="2022"/>
            <abstract>
              <t indent="0">This specification defines a profile of the Authentication and Authorization for Constrained Environments (ACE) framework that allows constrained servers to delegate client authentication and authorization. The protocol relies on DTLS version 1.2 or later for communication security between entities in a constrained network using either raw public keys or pre-shared keys. A resource-constrained server can use this protocol to delegate management of authorization information to a trusted host with less-severe limitations regarding processing power and memory.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9202"/>
          <seriesInfo name="DOI" value="10.17487/RFC9202"/>
        </reference>
        <reference anchor="RFC9203" target="https://www.rfc-editor.org/info/rfc9203" quoteTitle="true" derivedAnchor="RFC9203">
          <front>
            <title>The Object Security for Constrained RESTful Environments (OSCORE) Profile of the Authentication and Authorization for Constrained Environments (ACE) Framework</title>
            <author fullname="F. Palombini" initials="F." surname="Palombini"/>
            <author fullname="L. Seitz" initials="L." surname="Seitz"/>
            <author fullname="G. Selander" initials="G." surname="Selander"/>
            <author fullname="M. Gunnarsson" initials="M." surname="Gunnarsson"/>
            <date month="August" year="2022"/>
            <abstract>
              <t indent="0">This document specifies a profile for the Authentication and Authorization for Constrained Environments (ACE) framework. It utilizes Object Security for Constrained RESTful Environments (OSCORE) to provide communication security and proof-of-possession for a key owned by the client and bound to an OAuth 2.0 access token.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9203"/>
          <seriesInfo name="DOI" value="10.17487/RFC9203"/>
        </reference>
        <reference anchor="RFC9290" target="https://www.rfc-editor.org/info/rfc9290" quoteTitle="true" derivedAnchor="RFC9290">
          <front>
            <title>Concise Problem Details for Constrained Application Protocol (CoAP) APIs</title>
            <author fullname="T. Fossati" initials="T." surname="Fossati"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="October" year="2022"/>
            <abstract>
              <t indent="0">This document defines a concise "problem detail" as a way to carry machine-readable details of errors in a Representational State Transfer (REST) response to avoid the need to define new error response formats for REST APIs for constrained environments. The format is inspired by, but intended to be more concise than, the problem details for HTTP APIs defined in RFC 7807.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9290"/>
          <seriesInfo name="DOI" value="10.17487/RFC9290"/>
        </reference>
        <reference anchor="RFC9431" target="https://www.rfc-editor.org/info/rfc9431" quoteTitle="true" derivedAnchor="RFC9431">
          <front>
            <title>Message Queuing Telemetry Transport (MQTT) and Transport Layer Security (TLS) Profile of Authentication and Authorization for Constrained Environments (ACE) Framework</title>
            <author fullname="C. Sengul" initials="C." surname="Sengul"/>
            <author fullname="A. Kirby" initials="A." surname="Kirby"/>
            <date month="July" year="2023"/>
            <abstract>
              <t indent="0">This document specifies a profile for the Authentication and Authorization for Constrained Environments (ACE) framework to enable authorization in a publish-subscribe messaging system based on Message Queuing Telemetry Transport (MQTT). Proof-of-Possession keys, bound to OAuth 2.0 access tokens, are used to authenticate and authorize MQTT Clients. The protocol relies on TLS for confidentiality and MQTT server (Broker) authentication.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9431"/>
          <seriesInfo name="DOI" value="10.17487/RFC9431"/>
        </reference>
        <reference anchor="RFC9528" target="https://www.rfc-editor.org/info/rfc9528" quoteTitle="true" derivedAnchor="RFC9528">
          <front>
            <title>Ephemeral Diffie-Hellman Over COSE (EDHOC)</title>
            <author fullname="G. Selander" initials="G." surname="Selander"/>
            <author fullname="J. Preuß Mattsson" initials="J." surname="Preuß Mattsson"/>
            <author fullname="F. Palombini" initials="F." surname="Palombini"/>
            <date month="March" year="2024"/>
            <abstract>
              <t indent="0">This document specifies Ephemeral Diffie-Hellman Over COSE (EDHOC), a very compact and lightweight authenticated Diffie-Hellman key exchange with ephemeral keys. EDHOC provides mutual authentication, forward secrecy, and identity protection. EDHOC is intended for usage in constrained scenarios, and a main use case is to establish an Object Security for Constrained RESTful Environments (OSCORE) security context. By reusing CBOR Object Signing and Encryption (COSE) for cryptography, Concise Binary Object Representation (CBOR) for encoding, and Constrained Application Protocol (CoAP) for transport, the additional code size can be kept very low.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9528"/>
          <seriesInfo name="DOI" value="10.17487/RFC9528"/>
        </reference>
        <reference anchor="SHA-256" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf" quoteTitle="true" derivedAnchor="SHA-256">
          <front>
            <title>Secure Hash Standard</title>
            <author>
              <organization showOnFrontPage="true">NIST</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
          <seriesInfo name="NIST FIPS PUB" value="180-4"/>
          <seriesInfo name="DOI" value="10.6028/NIST.FIPS.180-4"/>
        </reference>
      </references>
      <references pn="section-16.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="I-D.ietf-core-conditional-attributes" target="https://datatracker.ietf.org/doc/html/draft-ietf-core-conditional-attributes-11" quoteTitle="true" derivedAnchor="COND-PARAMETERS">
          <front>
            <title>Conditional Query Parameters for CoAP Observe</title>
            <author fullname="Bill Silverajan" initials="B." surname="Silverajan">
              <organization showOnFrontPage="true">Tampere University</organization>
            </author>
            <author fullname="Michael Koster" initials="M." surname="Koster">
              <organization showOnFrontPage="true">Dogtiger Labs</organization>
            </author>
            <author fullname="Alan Soloway" initials="A." surname="Soloway">
              <organization showOnFrontPage="true">Qualcomm Technologies, Inc.</organization>
            </author>
            <date day="16" month="March" year="2025"/>
            <abstract>
              <t indent="0">This specification defines Conditional Notification and Control Query Parameters compatible with CoAP Observe (RFC7641).</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-conditional-attributes-11"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="RFC7009" target="https://www.rfc-editor.org/info/rfc7009" quoteTitle="true" derivedAnchor="RFC7009">
          <front>
            <title>OAuth 2.0 Token Revocation</title>
            <author fullname="T. Lodderstedt" initials="T." role="editor" surname="Lodderstedt"/>
            <author fullname="S. Dronia" initials="S." surname="Dronia"/>
            <author fullname="M. Scurtescu" initials="M." surname="Scurtescu"/>
            <date month="August" year="2013"/>
            <abstract>
              <t indent="0">This document proposes an additional endpoint for OAuth authorization servers, which allows clients to notify the authorization server that a previously obtained refresh or access token is no longer needed. This allows the authorization server to clean up security credentials. A revocation request will invalidate the actual token and, if applicable, other tokens based on the same authorization grant.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7009"/>
          <seriesInfo name="DOI" value="10.17487/RFC7009"/>
        </reference>
        <reference anchor="I-D.bormann-t2trg-stp" target="https://datatracker.ietf.org/doc/html/draft-bormann-t2trg-stp-03" quoteTitle="true" derivedAnchor="STP">
          <front>
            <title>The Series Transfer Pattern (STP)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization showOnFrontPage="true">Universität Bremen TZI</organization>
            </author>
            <author fullname="Klaus Hartke" initials="K." surname="Hartke">
              <organization showOnFrontPage="true">Ericsson</organization>
            </author>
            <date day="7" month="April" year="2020"/>
            <abstract>
              <t indent="0">Many applications make use of Series of data items, i.e., an array of data items where new items can be added over time. Where such Series are to be made available using REST protocols such as CoAP or HTTP, the Series has to be mapped into a structure of one or more resources and a protocol for a client to obtain the Series and to learn about new items. Various protocols have been standardized that make Series-shaped data available, with rather different properties and objectives. The present document is an attempt to extract a common underlying pattern and to define media types and an access scheme that can be used right away for further protocols that provide Series-shaped data.</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-t2trg-stp-03"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
      </references>
    </references>
    <section anchor="sec-series-pattern" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a">
      <name slugifiedName="name-on-using-the-series-transfe">On Using the Series Transfer Pattern</name>
      <t indent="0" pn="section-appendix.a-1">Performing a diff query of the TRL as specified in <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/> is, in fact, a usage example of the Series Transfer Pattern (STP) defined in <xref target="I-D.bormann-t2trg-stp" format="default" sectionFormat="of" derivedContent="STP"/>.</t>
      <t indent="0" pn="section-appendix.a-2">That is, a diff query enables the transfer of a series of diff entries with the AS providing U &lt;= MAX_N diff entries as related to the U most recent TRL updates pertaining to a requester, i.e., a registered device or an administrator.</t>
      <t indent="0" pn="section-appendix.a-3">When responding to a diff query request from a requester (see <xref target="ssec-trl-diff-query" format="default" sectionFormat="of" derivedContent="Section 8"/>), 'diff_set' is a subset of the update collection associated with the requester where each 'diff_entry' record is a series item from that update collection. Note that 'diff_set' specifies the whole current update collection when the value of U is equal to SIZE, i.e., the current number of series items in the update collection.</t>
      <t indent="0" pn="section-appendix.a-4">The value N of the 'diff' query parameter in the GET request allows the requester and the AS to trade the amount of provided information with the latency of the information transfer.</t>
      <t indent="0" pn="section-appendix.a-5">Since the update collection associated with each requester includes up to MAX_N series items, the AS deletes the oldest series item when a new one is generated and added to the end of the update collection, due to a new TRL update pertaining to that requester (see <xref target="sec-trl-endpoint-supporting-diff-queries" format="default" sectionFormat="of" derivedContent="Section 6.2"/>). This addresses the question "When can the server decide to no longer retain older items?" raised in <xref section="3.2" sectionFormat="of" target="I-D.bormann-t2trg-stp" format="default" derivedLink="https://datatracker.ietf.org/doc/html/draft-bormann-t2trg-stp-03#section-3.2" derivedContent="STP"/>.</t>
      <t indent="0" pn="section-appendix.a-6">Furthermore, performing a diff query of the TRL together with the "Cursor" extension as specified in <xref target="sec-using-cursor" format="default" sectionFormat="of" derivedContent="Section 9"/> relies, in fact, on the "cursor" pattern of the STP (see <xref section="3.3" sectionFormat="of" target="I-D.bormann-t2trg-stp" format="default" derivedLink="https://datatracker.ietf.org/doc/html/draft-bormann-t2trg-stp-03#section-3.3" derivedContent="STP"/>).</t>
    </section>
    <section anchor="sec-trl-parameteters" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.b">
      <name slugifiedName="name-local-supportive-parameters">Local Supportive Parameters of the TRL Endpoint</name>
      <t indent="0" pn="section-appendix.b-1"><xref target="_table-TRL-endpoint-parameters" format="default" sectionFormat="of" derivedContent="Table 3"/> provides an aggregated overview of the local supportive parameters that the AS internally uses at its TRL endpoint when supporting diff queries (see <xref target="sec-trl-endpoint" format="default" sectionFormat="of" derivedContent="Section 6"/>) and the "Cursor" extension (see <xref target="sec-trl-endpoint-supporting-cursor" format="default" sectionFormat="of" derivedContent="Section 6.2.1"/>).</t>
      <t indent="0" pn="section-appendix.b-2">Except for MAX_N defined in <xref target="sec-trl-endpoint-supporting-diff-queries" format="default" sectionFormat="of" derivedContent="Section 6.2"/>, all the other parameters are defined in <xref target="sec-trl-endpoint-supporting-cursor" format="default" sectionFormat="of" derivedContent="Section 6.2.1"/> and are used only if the AS supports the "Cursor" extension.</t>
      <t indent="0" pn="section-appendix.b-3">For each parameter, the columns of the table provide the following information. Both a registered device and an administrator are referred to as "requester".</t>
      <dl spacing="normal" indent="3" newline="false" pn="section-appendix.b-4">
        <dt pn="section-appendix.b-4.1">Name:</dt>
        <dd pn="section-appendix.b-4.2">The parameter name. A name with letters in uppercase denotes a parameter whose value does not change after its initialization.
        </dd>
        <dt pn="section-appendix.b-4.3">Single instance:</dt>
        <dd pn="section-appendix.b-4.4">"Y" if there is a single parameter instance associated with the TRL or "N" if there is one parameter instance per update collection (i.e., per requester).</dd>
        <dt pn="section-appendix.b-4.5">Description:</dt>
        <dd pn="section-appendix.b-4.6">A short description of the parameter.</dd>
        <dt pn="section-appendix.b-4.7">Values:</dt>
        <dd pn="section-appendix.b-4.8">The unsigned integer values that the parameter can assume, where LB and UB denote the inclusive lower bound and upper bound, respectively.</dd>
      </dl>
      <table align="center" anchor="_table-TRL-endpoint-parameters" pn="table-3">
        <name slugifiedName="name-local-supportive-parameters-">Local Supportive Parameters of the TRL Endpoint</name>
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">Name</th>
            <th align="left" colspan="1" rowspan="1">Single  instance</th>
            <th align="left" colspan="1" rowspan="1">Description</th>
            <th align="left" colspan="1" rowspan="1">Values</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">MAX_N</td>
            <td align="left" colspan="1" rowspan="1">Y</td>
            <td align="left" colspan="1" rowspan="1">Max number of series items in the update collection of each requester</td>
            <td align="left" colspan="1" rowspan="1">LB = 1 <br/><br/> If supporting <br/> the "Cursor" extension, then <br/> UB = MAX_INDEX+1</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">MAX_DIFF_BATCH</td>
            <td align="left" colspan="1" rowspan="1">N</td>
            <td align="left" colspan="1" rowspan="1">Max number of diff entries included in a diff query response when using the "Cursor" extension</td>
            <td align="left" colspan="1" rowspan="1">LB = 1 <br/><br/> UB = MAX_N</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">MAX_INDEX</td>
            <td align="left" colspan="1" rowspan="1">Y</td>
            <td align="left" colspan="1" rowspan="1">Max value of each instance of 'index'</td>
            <td align="left" colspan="1" rowspan="1">LB = MAX_N-1 <br/><br/> UB = (2<sup>64</sup>)-1</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">index</td>
            <td align="left" colspan="1" rowspan="1">N</td>
            <td align="left" colspan="1" rowspan="1">Value associated with a series item of an update collection</td>
            <td align="left" colspan="1" rowspan="1">LB = 0 <br/><br/> UB = MAX_INDEX</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">last_index</td>
            <td align="left" colspan="1" rowspan="1">N</td>
            <td align="left" colspan="1" rowspan="1">The 'index' value of the most recently added series item in an update collection</td>
            <td align="left" colspan="1" rowspan="1">LB = 0 <br/><br/> UB = MAX_INDEX</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="sec-RS-examples" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.c">
      <name slugifiedName="name-interaction-examples">Interaction Examples</name>
      <t indent="0" pn="section-appendix.c-1">This section provides examples of interactions between an RS as a registered device and an AS. In the examples, all the access tokens issued by the AS are intended to be consumed by the considered RS.</t>
      <t indent="0" pn="section-appendix.c-2">The AS supports both full queries and diff queries of the TRL, as defined in Sections <xref target="ssec-trl-full-query" format="counter" sectionFormat="of" derivedContent="7"/> and <xref target="ssec-trl-diff-query" format="counter" sectionFormat="of" derivedContent="8"/>, respectively.</t>
      <t indent="0" pn="section-appendix.c-3">The RS registration is assumed to be done by the RS sending a POST request with an unspecified payload to the AS, which replies with a 2.01 (Created) response. The payload of the registration response is assumed to be a CBOR map, which, in turn, is assumed to include the following entries:</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-appendix.c-4">
        <li pn="section-appendix.c-4.1">
          <t indent="0" pn="section-appendix.c-4.1.1">a 'trl_path' parameter specifying the path of the TRL endpoint;</t>
        </li>
        <li pn="section-appendix.c-4.2">
          <t indent="0" pn="section-appendix.c-4.2.1">a 'trl_hash' parameter specifying the "Hash Name String" of the hash function used to compute token hashes as defined in <xref target="sec-token-name" format="default" sectionFormat="of" derivedContent="Section 4"/>;</t>
        </li>
        <li pn="section-appendix.c-4.3">
          <t indent="0" pn="section-appendix.c-4.3.1">a 'max_n' parameter specifying the value of MAX_N, i.e., the maximum number of series items that the AS retains in the update collection associated with a registered device (see <xref target="sec-trl-endpoint-supporting-diff-queries" format="default" sectionFormat="of" derivedContent="Section 6.2"/>);</t>
        </li>
        <li pn="section-appendix.c-4.4">
          <t indent="0" pn="section-appendix.c-4.4.1">possible further parameters related to the registration process.</t>
        </li>
      </ul>
      <t indent="0" pn="section-appendix.c-5">Furthermore, 'h(x)' refers to the hash function used to compute the token hashes, as defined in <xref target="sec-token-name" format="default" sectionFormat="of" derivedContent="Section 4"/> of this specification and according to <xref target="RFC6920" format="default" sectionFormat="of" derivedContent="RFC6920"/>. Assuming the usage of CWTs transported in AS-to-Client responses encoded in CBOR (see <xref target="sec-token-hash-input-c-as-cbor" format="default" sectionFormat="of" derivedContent="Section 4.2.1"/>), 'bstr.h(t1)' and 'bstr.h(t2)' denote CBOR byte strings, whose values are the token hashes of the access tokens t1 and t2, respectively.</t>
      <section anchor="sec-RS-example-1" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.c.1">
        <name slugifiedName="name-full-query-with-observe">Full Query with Observe</name>
        <t indent="0" pn="section-appendix.c.1-1"><xref target="fig-RS-AS" format="default" sectionFormat="of" derivedContent="Figure 10"/> shows an interaction example of a CoAP observation and a full query of the TRL.</t>
        <t indent="0" pn="section-appendix.c.1-2">In this example, the AS does not support the "Cursor" extension. Hence, the 'cursor' parameter is not included in the payload of the responses to a full query request.</t>
        <figure anchor="fig-RS-AS" align="left" suppress-title="false" pn="figure-10">
          <name slugifiedName="name-interaction-for-full-query-">Interaction for Full Query with Observe</name>
          <artwork type="ascii-art" align="center" pn="section-appendix.c.1-3.1">
RS                                                     AS
|                                                       |
|  Registration: POST                                   |
+------------------------------------------------------&gt;|
|                                                       |
|&lt;------------------------------------------------------+
|                        2.01 Created                   |
|                          Payload: {                   |
|                            / ... /                    |
|                            "trl_path": "/revoke/trl", |
|                            "trl_hash": "sha-256",     |
|                               "max_n": 10             |
|                          }                            |
|                                                       |
|  GET coap://as.example.com/revoke/trl/                |
|    Observe: 0                                         |
+------------------------------------------------------&gt;|
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 42                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / full_set / 0: []                           |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|             (Access tokens t1 and t2 issued           |
|             and successfully submitted to RS)         |
|                                                       |
|                          ...                          |
|                                                       |
|              (Access token t1 is revoked)             |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 53                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / full_set / 0: [bstr.h(t1)]                 |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|              (Access token t2 is revoked)             |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 64                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / full_set / 0: [bstr.h(t1), bstr.h(t2)]     |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|               (Access token t1 expires)               |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 75                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / full_set / 0: [bstr.h(t2)]                 |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|               (Access token t2 expires)               |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 86                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / full_set / 0: []                           |
|        }                                              |
|                                                       |
</artwork>
        </figure>
      </section>
      <section anchor="sec-RS-example-2" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.c.2">
        <name slugifiedName="name-diff-query-with-observe">Diff Query with Observe</name>
        <t indent="0" pn="section-appendix.c.2-1"><xref target="fig-RS-AS-2" format="default" sectionFormat="of" derivedContent="Figure 11"/> shows an interaction example of a CoAP observation and a diff query of the TRL.</t>
        <t indent="0" pn="section-appendix.c.2-2">The RS indicates N = 3 as the value of the 'diff' query parameter, i.e., as the maximum number of diff entries to be included in a response from the AS.</t>
        <t indent="0" pn="section-appendix.c.2-3">In this example, the AS does not support the "Cursor" extension. Hence, the 'cursor' parameter and the 'more' parameter are not included in the payload of the responses to a diff query request.</t>
        <figure anchor="fig-RS-AS-2" align="left" suppress-title="false" pn="figure-11">
          <name slugifiedName="name-interaction-for-diff-query-">Interaction for Diff Query with Observe</name>
          <artwork type="ascii-art" align="center" pn="section-appendix.c.2-4.1">
RS                                                     AS
|                                                       |
|  Registration: POST                                   |
+------------------------------------------------------&gt;|
|                                                       |
|&lt;------------------------------------------------------+
|                        2.01 Created                   |
|                          Payload: {                   |
|                            / ... /                    |
|                            "trl_path": "/revoke/trl", |
|                            "trl_hash": "sha-256",     |
|                               "max_n": 10             |
|                          }                            |
|                                                       |
|  GET coap://as.example.com/revoke/trl?diff=3          |
|    Observe: 0                                         |
+------------------------------------------------------&gt;|
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 42                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / diff_set / 1: []                           |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|             (Access tokens t1 and t2 issued           |
|             and successfully submitted to RS)         |
|                                                       |
|                          ...                          |
|                                                       |
|               (Access token t1 is revoked)            |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 53                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / diff_set / 1: [                            |
|                           [ [], [bstr.h(t1)] ]        |
|                          ]                            |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|               (Access token t2 is revoked)            |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 64                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / diff_set / 1: [                            |
|                           [ [], [bstr.h(t2)] ],       |
|                           [ [], [bstr.h(t1)] ]        |
|                          ]                            |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|               (Access token t1 expires)               |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 75                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / diff_set / 1: [                            |
|                           [ [bstr.h(t1)], [] ],       |
|                           [ [], [bstr.h(t2)] ],       |
|                           [ [], [bstr.h(t1)] ]        |
|                          ]                            |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|               (Access token t2 expires)               |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 86                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / diff_set / 1: [                            |
|                           [ [bstr.h(t2)], [] ],       |
|                           [ [bstr.h(t1)], [] ],       |
|                           [ [], [bstr.h(t2)] ]        |
|                          ]                            |
|        }                                              |
|                                                       |
</artwork>
        </figure>
      </section>
      <section anchor="sec-RS-example-3" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.c.3">
        <name slugifiedName="name-full-query-with-observe-and">Full Query with Observe and Diff Query</name>
        <t indent="0" pn="section-appendix.c.3-1"><xref target="fig-RS-AS-3" format="default" sectionFormat="of" derivedContent="Figure 12"/> shows an interaction example of a CoAP observation and a full query of the TRL.</t>
        <t indent="0" pn="section-appendix.c.3-2">The example also shows one of the notifications from the AS getting lost in transmission; thus, that notification does not reach the RS.</t>
        <t indent="0" pn="section-appendix.c.3-3">When this happens, and after a waiting time defined by the application has elapsed, the RS sends a GET request with no Observe Option to the AS, asking the AS to perform a diff query of the TRL. The RS indicates N = 8 as the value of the 'diff' query parameter, i.e., as the maximum number of diff entries to be included in a response from the AS.</t>
        <t indent="0" pn="section-appendix.c.3-4">In this example, the AS does not support the "Cursor" extension. Hence, the 'cursor' parameter is not included in the payload of the responses to a full query request. Also, the 'cursor' parameter and the 'more' parameter are not included in the payload of the responses to a diff query request.</t>
        <figure anchor="fig-RS-AS-3" align="left" suppress-title="false" pn="figure-12">
          <name slugifiedName="name-interaction-for-full-query-w">Interaction for Full Query with Observe and Diff Query</name>
          <artwork type="ascii-art" align="center" pn="section-appendix.c.3-5.1">
RS                                                     AS
|                                                       |
|  Registration: POST                                   |
+------------------------------------------------------&gt;|
|                                                       |
|&lt;------------------------------------------------------+
|                        2.01 Created                   |
|                          Payload: {                   |
|                            / ... /                    |
|                            "trl_path": "/revoke/trl", |
|                            "trl_hash": "sha-256",     |
|                               "max_n": 10             |
|                          }                            |
|                                                       |
|  GET coap://as.example.com/revoke/trl/                |
|    Observe: 0                                         |
+------------------------------------------------------&gt;|
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 42                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / full_set / 0: []                           |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|           (Access tokens t1 and t2 issued             |
|           and successfully submitted to RS)           |
|                                                       |
|                          ...                          |
|                                                       |
|              (Access token t1 is revoked)             |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 53                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / full_set / 0: [bstr.h(t1)]                 |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|              (Access token t2 is revoked)             |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 64                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / full_set / 0: [bstr.h(t1), bstr.h(t2)]     |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|               (Access token t1 expires)               |
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Observe: 75                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / full_set / 0: [bstr.h(t2)]                 |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|               (Access token t2 expires)               |
|                                                       |
|  Lost X &lt;---------------------------------------------+
|      2.05 Content                                     |
|        Observe: 86                                    |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / full_set / 0: []                           |
|        }                                              |
|                                                       |
|                          ...                          |
|                                                       |
|           (Enough time has passed since               |
|           the latest received notification)           |
|                                                       |
|                                                       |
|  GET coap://as.example.com/revoke/trl?diff=8          |
+------------------------------------------------------&gt;|
|                                                       |
|&lt;------------------------------------------------------+
|      2.05 Content                                     |
|        Content-Format: 262 (application/ace-trl+cbor) |
|        Payload: {                                     |
|          / diff_set / 1: [                            |
|                           [ [bstr.h(t2)], [] ],       |
|                           [ [bstr.h(t1)], [] ],       |
|                           [ [], [bstr.h(t2)] ],       |
|                           [ [], [bstr.h(t1)] ]        |
|                          ]                            |
|        }                                              |
|                                                       |
</artwork>
        </figure>
      </section>
      <section anchor="sec-RS-example-2-3" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.c.4">
        <name slugifiedName="name-diff-query-with-observe-and">Diff Query with Observe and "Cursor" Extension</name>
        <t indent="0" pn="section-appendix.c.4-1">In this example, the AS supports the "Cursor" extension. Hence, the CBOR map conveyed as payload of the registration response additionally includes a "max_diff_batch" parameter. This specifies the value of MAX_DIFF_BATCH, i.e., the maximum number of diff entries that can be included in a response to a diff query request from this RS.</t>
        <t indent="0" pn="section-appendix.c.4-2"><xref target="fig-RS-AS-4" format="default" sectionFormat="of" derivedContent="Figure 13"/> shows an interaction example of a CoAP observation and a diff query of the TRL.</t>
        <t indent="0" pn="section-appendix.c.4-3">The RS specifies the 'diff' query parameter with a value of 3, i.e., the maximum number of diff entries to be included in a response from the AS.</t>
        <t indent="0" pn="section-appendix.c.4-4">If the RS has not received a notification from the AS for a waiting time defined by the application, the RS sends a GET request with no Observe Option to the AS, asking the AS to perform a diff query of the TRL.</t>
        <t indent="0" pn="section-appendix.c.4-5">This is followed up by a further diff query request that includes the 'cursor' query parameter. Note that the payload of the corresponding response differs from the payload of the response to the previous diff query request.</t>
        <figure anchor="fig-RS-AS-4" align="left" suppress-title="false" pn="figure-13">
          <name slugifiedName="name-interaction-for-diff-query-w">Interaction for Diff Query with Observe and "Cursor" Extension</name>
          <artwork type="ascii-art" align="center" pn="section-appendix.c.4-6.1">
RS                                                         AS
|                                                           |
|  Registration: POST                                       |
+----------------------------------------------------------&gt;|
|                                                           |
|&lt;----------------------------------------------------------+
|                      2.01 Created                         |
|                        Payload: {                         |
|                          / ... /                          |
|                                "trl_path": "/revoke/trl", |
|                                "trl_hash": "sha-256",     |
|                                   "max_n": 10,            |
|                          "max_diff_batch": 5              |
|                        }                                  |
|                                                           |
|  GET coap://as.example.com/revoke/trl?diff=3              |
|    Observe: 0                                             |
+----------------------------------------------------------&gt;|
|                                                           |
|&lt;----------------------------------------------------------+
|          2.05 Content                                     |
|            Observe: 42                                    |
|            Content-Format: 262 (application/ace-trl+cbor) |
|            Payload: {                                     |
|              / diff_set / 1: [],                          |
|                / cursor / 2: null,                        |
|                  / more / 3: false                        |
|            }                                              |
|                                                           |
|                             ...                           |
|                                                           |
|             (Access tokens t1 and t2 issued               |
|             and successfully submitted to RS)             |
|                                                           |
|                             ...                           |
|                                                           |
|               (Access token t1 is revoked)                |
|                                                           |
|&lt;----------------------------------------------------------+
|          2.05 Content                                     |
|            Observe: 53                                    |
|            Content-Format: 262 (application/ace-trl+cbor) |
|            Payload: {                                     |
|              / diff_set / 1: [                            |
|                               [ [], [bstr.h(t1)] ]        |
|                              ],                           |
|                / cursor / 2: 0,                           |
|                  / more / 3: false                        |
|            }                                              |
|                                                           |
|                             ...                           |
|                                                           |
|               (Access token t2 is revoked)                |
|                                                           |
|&lt;----------------------------------------------------------+
|          2.05 Content                                     |
|            Observe: 64                                    |
|            Content-Format: 262 (application/ace-trl+cbor) |
|            Payload: {                                     |
|              / diff_set / 1: [                            |
|                               [ [], [bstr.h(t2)] ],       |
|                               [ [], [bstr.h(t1)] ]        |
|                              ],                           |
|                / cursor / 2: 1,                           |
|                  / more / 3: false                        |
|            }                                              |
|                                                           |
|                             ...                           |
|                                                           |
|                 (Access token t1 expires)                 |
|                                                           |
|&lt;----------------------------------------------------------+
|          2.05 Content                                     |
|            Observe: 75                                    |
|            Content-Format: 262 (application/ace-trl+cbor) |
|            Payload: {                                     |
|              / diff_set / 1: [                            |
|                               [ [bstr.h(t1)], [] ],       |
|                               [ [], [bstr.h(t2)] ],       |
|                               [ [], [bstr.h(t1)] ]        |
|                              ],                           |
|                / cursor / 2: 2,                           |
|                  / more / 3: false                        |
|            }                                              |
|                                                           |
|                             ...                           |
|                                                           |
|                 (Access token t2 expires)                 |
|                                                           |
|&lt;----------------------------------------------------------+
|          2.05 Content                                     |
|            Observe: 86                                    |
|            Content-Format: 262 (application/ace-trl+cbor) |
|            Payload: {                                     |
|              / diff_set / 1: [                            |
|                               [ [bstr.h(t2)], [] ],       |
|                               [ [bstr.h(t1)], [] ],       |
|                               [ [], [bstr.h(t2)] ]        |
|                              ],                           |
|                / cursor / 2: 3,                           |
|                  / more / 3: false                        |
|            }                                              |
|                                                           |
|                             ...                           |
|                                                           |
|             (Enough time has passed since                 |
|             the latest received notification)             |
|                                                           |
|                                                           |
|  GET coap://as.example.com/revoke/trl?diff=3              |
+----------------------------------------------------------&gt;|
|                                                           |
|&lt;----------------------------------------------------------+
|          2.05 Content                                     |
|            Content-Format: 262 (application/ace-trl+cbor) |
|            Payload: {                                     |
|              / diff_set / 1: [                            |
|                               [ [bstr.h(t2)], [] ],       |
|                               [ [bstr.h(t1)], [] ],       |
|                               [ [], [bstr.h(t2)] ]        |
|                              ],                           |
|                / cursor / 2: 3,                           |
|                  / more / 3: false                        |
|            }                                              |
|                                                           |
|  GET coap://as.example.com/revoke/trl?diff=3&amp;cursor=3     |
+----------------------------------------------------------&gt;|
|                                                           |
|&lt;----------------------------------------------------------+
|          2.05 Content                                     |
|            Content-Format: 262 (application/ace-trl+cbor) |
|            Payload: {                                     |
|              / diff_set / 1: [],                          |
|                / cursor / 2: 3,                           |
|                  / more / 3: false                        |
|            }                                              |
|                                                           |
</artwork>
        </figure>
      </section>
      <section anchor="sec-RS-example-5" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.c.5">
        <name slugifiedName="name-full-query-with-observe-and-">Full Query with Observe and Diff Query with "Cursor" Extension</name>
        <t indent="0" pn="section-appendix.c.5-1">In this example, the AS supports the "Cursor" extension. Hence, the CBOR map conveyed as payload of the registration response additionally includes a "max_diff_batch" parameter. This specifies the value of MAX_DIFF_BATCH, i.e., the maximum number of diff entries that can be included in a response to a diff query request from this RS.</t>
        <t indent="0" pn="section-appendix.c.5-2"><xref target="fig-RS-AS-5" format="default" sectionFormat="of" derivedContent="Figure 14"/> shows an interaction example of a CoAP observation and a full query of the TRL.</t>
        <t indent="0" pn="section-appendix.c.5-3">The example also shows some of the notifications from the AS getting lost in transmission; thus, those notifications do not reach the RS.</t>
        <t indent="0" pn="section-appendix.c.5-4">When this happens, and after a waiting time defined by the application has elapsed, the RS sends a GET request with no Observe Option to the AS, asking the AS to perform a diff query of the TRL. In particular, the RS specifies:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-appendix.c.5-5">
          <li pn="section-appendix.c.5-5.1">
            <t indent="0" pn="section-appendix.c.5-5.1.1">The 'diff' query parameter with a value of 8, i.e., the maximum number of diff entries to be included in a response from the AS.</t>
          </li>
          <li pn="section-appendix.c.5-5.2">
            <t indent="0" pn="section-appendix.c.5-5.2.1">The 'cursor' query parameter with a value of 2, thus requesting from the update collection the series items following the one with the 'index' value equal to 2 (i.e., following the last series item that the RS successfully received in an earlier notification response).</t>
          </li>
        </ul>
        <t indent="0" pn="section-appendix.c.5-6">The response from the AS conveys a first batch of MAX_DIFF_BATCH = 5 series items from the update collection corresponding to the RS. The AS indicates that further series items are actually available in the update collection by setting the 'more' parameter of the response to <tt>true</tt>. Also, the 'cursor' parameter of the response is set to 7, i.e., to the 'index' value of the most recent series item included in the response.</t>
        <t indent="0" pn="section-appendix.c.5-7">After that, the RS follows up with a further diff query request including the 'cursor' query parameter with a value of 7 in order to retrieve the next and last batch of series items from the update collection.</t>
        <figure anchor="fig-RS-AS-5" align="left" suppress-title="false" pn="figure-14">
          <name slugifiedName="name-interaction-for-full-query-wi">Interaction for Full Query with Observe and Diff Query with "Cursor" Extension</name>
          <artwork type="ascii-art" align="center" pn="section-appendix.c.5-8.1">
RS                                                                AS
|                                                                  |
|  Registration: POST                                              |
+-----------------------------------------------------------------&gt;|
|                                                                  |
|&lt;-----------------------------------------------------------------+
|                             2.01 Created                         |
|                               Payload: {                         |
|                                 / ... /                          |
|                                       "trl_path": "/revoke/trl", |
|                                       "trl_hash": "sha-256",     |
|                                          "max_n": 10,            |
|                                 "max_diff_batch": 5              |
|                               }                                  |
|                                                                  |
|  GET coap://as.example.com/revoke/trl/                           |
|    Observe: 0                                                    |
+-----------------------------------------------------------------&gt;|
|                                                                  |
|&lt;-----------------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 42                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [],                          |
|                       / cursor / 2: null                         |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                 (Access tokens t1, t2, t3 issued                 |
|                 and successfully submitted to RS)                |
|                                                                  |
|                                ...                               |
|                                                                  |
|                 (Access tokens t4, t5, t6 issued                 |
|                 and successfully submitted to RS)                |
|                                                                  |
|                                ...                               |
|                                                                  |
|                   (Access token t1 is revoked)                   |
|                                                                  |
|&lt;-----------------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 53                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [bstr.h(t1)],                |
|                       / cursor / 2: 0                            |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                    (Access token t2 is revoked)                  |
|                                                                  |
|&lt;-----------------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 64                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [bstr.h(t1), bstr.h(t2)],    |
|                       / cursor / 2: 1                            |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                     (Access token t1 expires)                    |
|                                                                  |
|&lt;-----------------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 75                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [bstr.h(t2)],                |
|                       / cursor / 2: 2                            |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                     (Access token t2 expires)                    |
|                                                                  |
|  Lost X &lt;--------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 86                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [],                          |
|                       / cursor / 2: 3                            |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                     (Access token t3 is revoked)                 |
|                                                                  |
|  Lost X &lt;--------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 88                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [bstr.h(t3)],                |
|                       / cursor / 2: 4                            |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                     (Access token t4 is revoked)                 |
|                                                                  |
|  Lost X &lt;--------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 89                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [bstr.h(t3), bstr.h(t4)],    |
|                       / cursor / 2: 5                            |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                     (Access token t3 expires)                    |
|                                                                  |
|  Lost X &lt;--------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 90                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [bstr.h(t4)],                |
|                       / cursor / 2: 6                            |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                     (Access token t4 expires)                    |
|                                                                  |
|  Lost X &lt;--------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 91                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [],                          |
|                       / cursor / 2: 7                            |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|               (Access tokens t5 and t6 are revoked)              |
|                                                                  |
|  Lost X &lt;--------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 92                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [bstr.h(t5), bstr.h(t6)],    |
|                       / cursor / 2: 8                            |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                     (Access token t5 expires)                    |
|                                                                  |
|  Lost X &lt;--------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 93                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [bstr.h(t6)],                |
|                       / cursor / 2: 9                            |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                     (Access token t6 expires)                    |
|                                                                  |
|  Lost X &lt;--------------------------------------------------------+
|                 2.05 Content                                     |
|                   Observe: 94                                    |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / full_set / 0: [],                          |
|                       / cursor / 2: 10                           |
|                   }                                              |
|                                                                  |
|                                ...                               |
|                                                                  |
|                 (Enough time has passed since                    |
|                 the latest received notification)                |
|                                                                  |
|                                                                  |
|  GET coap://as.example.com/revoke/trl?diff=8&amp;cursor=2            |
+-----------------------------------------------------------------&gt;|
|                                                                  |
|&lt;-----------------------------------------------------------------+
|                 2.05 Content                                     |
|                   Content-Format: 262 (application/ace-trl+cbor) |
|                   Payload: {                                     |
|                     / diff_set / 1: [                            |
|                                      [ [bstr.h(t4)], [] ],       |
|                                      [ [bstr.h(t3)], [] ],       |
|                                      [ [], [bstr.h(t4)] ],       |
|                                      [ [], [bstr.h(t3)] ],       |
|                                      [ [bstr.h(t2)], [] ]        |
|                                     ],                           |
|                       / cursor / 2: 7,                           |
|                         / more / 3: true                         |
|                   }                                              |
|                                                                  |
|  GET coap://as.example.com/revoke/trl?diff=8&amp;cursor=7            |
+-----------------------------------------------------------------&gt;|
|                                                                  |
|&lt;-----------------------------------------------------------------+
|            2.05 Content                                          |
|              Content-Format: 262 (application/ace-trl+cbor)      |
|              Payload: {                                          |
|                / diff_set / 1: [                                 |
|                                 [ [bstr.h(t6)], [] ],            |
|                                 [ [bstr.h(t5)], [] ],            |
|                                 [ [], [bstr.h(t5), bstr.h(t6)] ] |
|                                ],                                |
|                  / cursor / 2: 10,                               |
|                    / more / 3: false                             |
|              }                                                   |
|                                                                  |
</artwork>
        </figure>
      </section>
    </section>
    <section numbered="false" anchor="acknowldegment" removeInRFC="false" toc="include" pn="section-appendix.d">
      <name slugifiedName="name-acknowledgments">Acknowledgments</name>
      <t indent="0" pn="section-appendix.d-1"><contact fullname="Ludwig Seitz"/> contributed as a coauthor of
      initial versions of this document.</t>
      <t indent="0" pn="section-appendix.d-2">The authors sincerely thank <contact fullname="Christian Amsüss"/>,
      <contact fullname="Carsten Bormann"/>, <contact fullname="Deb Cooley"/>,
      <contact fullname="Roman Danyliw"/>, <contact fullname="Dhruv Dhody"/>,
      <contact fullname="Rikard Höglund"/>, <contact fullname="Benjamin       Kaduk"/>, <contact fullname="David Navarro"/>, <contact fullname="Joerg       Ott"/>, <contact fullname="Marco Rasori"/>, <contact fullname="Michael       Richardson"/>, <contact fullname="Kyle Rose"/>, <contact fullname="Zaheduzzaman Sarker"/>, <contact fullname="Jim Schaad"/>,
      <contact fullname="Göran Selander"/>, <contact fullname="Travis       Spencer"/>, <contact fullname="Orie Steele"/>, <contact fullname="Éric       Vyncke"/>, <contact fullname="Niklas Widell"/>, <contact fullname="Dale       Worley"/>, and <contact fullname="Paul Wouters"/> for their comments and
      feedback.</t>
      <t indent="0" pn="section-appendix.d-3">The work on this document has been partly supported by the Sweden's
      Innovation Agency VINNOVA and the Celtic-Next projects CRITISEC and
      CYPRESS; and by the H2020 project SIFIS-Home (Grant agreement
      952652).</t>
    </section>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.e">
      <name slugifiedName="name-authors-addresses">Authors' Addresses</name>
      <author initials="M." surname="Tiloca" fullname="Marco Tiloca">
        <organization showOnFrontPage="true">RISE AB</organization>
        <address>
          <postal>
            <street>Isafjordsgatan 22</street>
            <city>Kista</city>
            <code>164 40</code>
            <country>Sweden</country>
          </postal>
          <email>marco.tiloca@ri.se</email>
        </address>
      </author>
      <author initials="F." surname="Palombini" fullname="Francesca Palombini">
        <organization showOnFrontPage="true">Ericsson AB</organization>
        <address>
          <postal>
            <street>Torshamnsgatan 23</street>
            <city>Kista</city>
            <code>164 40</code>
            <country>Sweden</country>
          </postal>
          <email>francesca.palombini@ericsson.com</email>
        </address>
      </author>
      <author initials="S." surname="Echeverria" fullname="Sebastian Echeverria">
        <organization showOnFrontPage="true">CMU SEI</organization>
        <address>
          <postal>
            <street>4500 Fifth Avenue</street>
            <city>Pittsburgh</city>
            <region>PA</region>
            <code>15213-2612</code>
            <country>United States of America</country>
          </postal>
          <email>secheverria@sei.cmu.edu</email>
        </address>
      </author>
      <author initials="G." surname="Lewis" fullname="Grace Lewis">
        <organization showOnFrontPage="true">CMU SEI</organization>
        <address>
          <postal>
            <street>4500 Fifth Avenue</street>
            <city>Pittsburgh</city>
            <region>PA</region>
            <code>15213-2612</code>
            <country>United States of America</country>
          </postal>
          <email>glewis@sei.cmu.edu</email>
        </address>
      </author>
    </section>
  </back>
</rfc>
