<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version  (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ace-revoked-token-notification-08" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <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="Internet-Draft" value="draft-ietf-ace-revoked-token-notification-08"/>
    <author initials="M." surname="Tiloca" fullname="Marco Tiloca">
      <organization>RISE AB</organization>
      <address>
        <postal>
          <street>Isafjordsgatan 22</street>
          <city>Kista</city>
          <code>16440</code>
          <country>Sweden</country>
        </postal>
        <email>marco.tiloca@ri.se</email>
      </address>
    </author>
    <author initials="F." surname="Palombini" fullname="Francesca Palombini">
      <organization>Ericsson AB</organization>
      <address>
        <postal>
          <street>Torshamnsgatan 23</street>
          <city>Kista</city>
          <code>16440</code>
          <country>Sweden</country>
        </postal>
        <email>francesca.palombini@ericsson.com</email>
      </address>
    </author>
    <author initials="S." surname="Echeverria" fullname="Sebastian Echeverria">
      <organization>CMU SEI</organization>
      <address>
        <postal>
          <street>4500 Fifth Avenue</street>
          <city>Pittsburgh, PA</city>
          <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>CMU SEI</organization>
      <address>
        <postal>
          <street>4500 Fifth Avenue</street>
          <city>Pittsburgh, PA</city>
          <code>15213-2612</code>
          <country>United States of America</country>
        </postal>
        <email>glewis@sei.cmu.edu</email>
      </address>
    </author>
    <date year="2024" month="June" day="24"/>
    <area>Security</area>
    <workgroup>ACE Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>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 to access a Token Revocation List 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 Resource Servers.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Authentication and Authorization for Constrained Environments Working Group mailing list (ace@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ace/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/ace-wg/ace-revoked-token-notification"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <t>Authentication and Authorization for Constrained Environments (ACE) <xref target="RFC9200"/> is a framework that enforces access control on IoT devices acting as Resource Servers. In order to use ACE, both Clients and Resource Servers have to register with an Authorization Server (AS) and become a registered device. Once registered, a Client can send a request to the AS, to obtain an access token for a Resource Server (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"/>).</t>
      <t>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: (1) a registered device has been compromised, or is suspected of being compromised; (2) a registered device is decommissioned; (3) there has been a change in the ACE profile for a registered device; (4) there has been a change in access policies for a registered device; and (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).</t>
      <t>As discussed in <xref section="6.1" sectionFormat="of" target="RFC9200"/>, only client-initiated revocation is currently specified <xref target="RFC7009"/> for OAuth 2.0 <xref target="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>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"/> 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"/>. Other underlying protocols than CoAP are not prohibited from being supported in the future, if they are defined to be used in the ACE framework for Authentication and Authorization.</t>
      <t>Unlike in the case of token introspection (see <xref section="5.9" sectionFormat="of" target="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>The benefits of this method are that it complements token introspection, and it does not require the registered devices to support any additional endpoints (see <xref target="terminology"/>). 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"/>), and the lightweight computation of hash values to use as access token identifiers (see <xref target="sec-token-name"/>).</t>
      <t>The process by which access tokens are declared revoked is out of the scope of this document. It is also out of scope 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.</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>Readers are expected to be familiar with the terms and concepts described in the ACE framework for Authentication and Authorization <xref target="RFC9200"/>, as well as with terms and concepts related to CBOR Web Tokens (CWTs) <xref target="RFC8392"/> and JSON Web Tokens (JWTs) <xref target="RFC7519"/>.</t>
        <t>The terminology for entities in the considered architecture is defined in OAuth 2.0 <xref target="RFC6749"/>. In particular, this includes Client, Resource Server (RS), and Authorization Server (AS).</t>
        <t>Readers are also expected to be familiar with the terms and concepts related to CDDL <xref target="RFC8610"/>, CBOR <xref target="RFC8949"/>, JSON <xref target="RFC8259"/>, CoAP <xref target="RFC7252"/>, CoAP Observe <xref target="RFC7641"/>, and the use of hash functions to name objects as defined in <xref target="RFC6920"/>.</t>
        <t>Note that the term "endpoint" is used here following its OAuth definition <xref target="RFC6749"/>, aimed at denoting resources such as /token and /introspect at the AS, and /authz-info at the RS. This document does not use the CoAP definition of "endpoint", which is "An entity participating in the CoAP protocol."</t>
        <t>This specification also refers to the following terminology.</t>
        <ul spacing="normal">
          <li>
            <t>Token hash: 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"/>.</t>
          </li>
          <li>
            <t>Token Revocation List (TRL): a collection of token hashes such that the corresponding access tokens have been revoked but are not expired yet.</t>
          </li>
          <li>
            <t>TRL endpoint: 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.</t>
          </li>
          <li>
            <t>Registered device: a device registered at the AS, i.e., as a Client, or an RS, or both. A registered device acts as a requester towards the TRL endpoint.</t>
          </li>
          <li>
            <t>Administrator: entity authorized to get full access to the TRL at the AS, and acting 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>
          </li>
          <li>
            <t>Pertaining access token:  </t>
            <ul spacing="normal">
              <li>
                <t>With reference to an administrator, an access token issued by the AS.</t>
              </li>
              <li>
                <t>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>
          </li>
          <li>
            <t>Token hash pertaining to a requester: a token hash corresponding to an access token pertaining to that requester, i.e., an administrator or a registered device.</t>
          </li>
          <li>
            <t>TRL update pertaining to a requester: an update to the TRL through which token hashes pertaining to that requester have been added to the TRL or removed from the TRL.</t>
          </li>
        </ul>
        <t>Examples throughout this document are expressed in CBOR diagnostic notation as defined in <xref section="8" sectionFormat="of" target="RFC8949"/> and <xref section="G" sectionFormat="of" target="RFC8610"/>. Diagnostic notation comments are often used to provide a textual representation of the numeric parameter names and values.</t>
        <t>In the CBOR diagnostic notation used in this document, constructs of the form e'SOME_NAME' are replaced by the value assigned to SOME_NAME in the CDDL model shown in <xref target="fig-cddl-model"/> of <xref target="sec-cddl-model"/>. For example, {e'full_set': [], e'cursor': 3} stands for {0: [], 2: 3}.</t>
        <t>Note to RFC Editor: Please delete the paragraph immediately preceding this note. Also, in the CBOR diagnostic notation used in this document, please replace the constructs of the form e'SOME_NAME' with the value assigned to SOME_NAME in the CDDL model shown in <xref target="fig-cddl-model"/> of <xref target="sec-cddl-model"/>. Finally, please delete this note.</t>
      </section>
    </section>
    <section anchor="sec-overview">
      <name>Protocol Overview</name>
      <t>This protocol defines how a CoAP-based Authorization Server informs Clients and Resource Servers, 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>At a high level, the steps of this protocol are as follows.</t>
      <ul spacing="normal">
        <li>
          <t>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>
          <t>When a device registers at the AS, it also receives the url-path to the TRL endpoint.  </t>
          <t>
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 for: the current list of pertaining revoked access tokens (see <xref target="ssec-trl-full-query"/>); or the most recent updates that occurred over the list of pertaining revoked access tokens (see <xref target="ssec-trl-diff-query"/>).  </t>
          <t>
In particular, the registered device can rely on Observation for CoAP <xref target="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 interested in receiving notifications about its update. Upon receiving the Observation Request, the AS adds the registered device to the list of observers of the TRL endpoint.</t>
        </li>
        <li>
          <t>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>
In either case, after updating the TRL, the AS sends Observe notifications as per <xref target="RFC7641"/>. That is, an Observe notification is sent to each registered device subscribed to the TRL and to which the access token pertains.  </t>
          <t>
Depending on the specific subscription established through the Observation Request, the notification provides 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"/>), or the most recent TRL updates occurred over that list of pertaining revoked access tokens (see <xref target="ssec-trl-diff-query"/>).  </t>
          <t>
Further Observe notifications may be sent, consistently with ongoing additional observations of the TRL endpoint.</t>
        </li>
        <li>
          <t>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"/>) or the most recent updates occurred to the whole TRL (see <xref target="ssec-trl-diff-query"/>).</t>
        </li>
      </ul>
      <t><xref target="fig-protocol-overview"/> 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">
        <name>Protocol Overview</name>
        <artset>
          <artwork type="svg" align="center"><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"><![CDATA[
                    +----------------------+
                    | 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><xref target="sec-RS-examples"/> provides examples of the protocol flow and message exchanges between the AS and a registered device.</t>
    </section>
    <section anchor="sec-token-name">
      <name>Token Hash</name>
      <t>This section specifies how token hashes are computed.</t>
      <t>First, <xref target="sec-token-hash-input-motivation"/> provides the motivation for the used construction.</t>
      <t>Building on that, the value used as input to compute a token hash is defined in <xref target="sec-token-hash-input-c-as"/> for the Client and the AS, and in <xref target="sec-token-hash-input-rs"/> for the RS. Finally, <xref target="sec-token-hash-output"/> defines how such an input is used for computing the token hash.</t>
      <t>The process outlined below refers to the base64url encoding and decoding without padding (see <xref section="5" sectionFormat="of" target="RFC4648"/>), and denotes as "binary representation" of a text string the corresponding UTF-8 encoding <xref target="RFC3629"/>, which is the implied charset used in JSON (see <xref section="8.1" sectionFormat="of" target="RFC8259"/>).</t>
      <section anchor="sec-token-hash-input-motivation">
        <name>Motivation for the Used Construction</name>
        <t>An access token can have one among different formats. The most expected formats are CWT <xref target="RFC8392"/> and JWT <xref target="RFC7519"/>, with the former being the default format to use in the ACE framework (see <xref section="3" sectionFormat="of" target="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">
          <name>Issuing of the Access Token to the Client</name>
          <t>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"/>), 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">
            <li>
              <t>One way relies on CBOR, which is required if CoAP is used (see <xref section="5" sectionFormat="of" target="RFC9200"/>) and is recommended otherwise (see <xref section="3" sectionFormat="of" target="RFC9200"/>). That is, the AS-to-Client response has media-type "application/ace+cbor".  </t>
              <t>
This implies that, within the CBOR map specified as message payload, the parameter 'access_token' is a CBOR data item of type CBOR byte string and with value the binary representation BYTES of the access token. In particular:  </t>
              <ul spacing="normal">
                <li>
                  <t>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 CWT).</t>
                </li>
                <li>
                  <t>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>
              <t>An alternative way relies on JSON. That is, the AS-to-Client response has media-type "application/ace+json".  </t>
              <t>
This implies that, within the JSON object specified as message payload, the parameter 'access_token' has as value a text string TEXT encoding the access token. In particular:  </t>
              <ul spacing="normal">
                <li>
                  <t>If the access token is a JWT, then TEXT is the text string that encodes the JWT.</t>
                </li>
                <li>
                  <t>If the access token is a CWT, then TEXT is the base64url-encoded text string of the binary representation of the CWT (i.e., of the CBOR array that encodes the CWT).</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="sec-token-hash-input-motivation-rs">
          <name>Provisioning of Access Tokens to the RS</name>
          <t>In accordance with the used transport profile of ACE (e.g., <xref target="RFC9202"/>, <xref target="RFC9203"/>, <xref target="RFC9431"/>), the RS receives a piece of token-related information hereafter denoted as TOKEN_INFO.</t>
          <t>In particular:</t>
          <ul spacing="normal">
            <li>
              <t>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. This is irrespective of the access token being a CWT or a JWT. That is, TOKEN_INFO is the binary representation of the access token.</t>
            </li>
            <li>
              <t>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>
              <t>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>The following overviews how the above specifically applies to the existing transport profiles of ACE.</t>
          <ul spacing="normal">
            <li>
              <t>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"/>), 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"/>), TOKEN_INFO is the payload of the POST request.</t>
            </li>
            <li>
              <t>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"/>), 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>
              <t>The access token can be uploaded to the RS during a DTLS session establishment, e.g., like it is defined in <xref section="3.2.2" sectionFormat="of" target="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"/>), or of the 'identity' field of a PSKIdentity, within the PreSharedKeyExtension of a ClientHello message (when using DTLS 1.3 <xref target="RFC9147"/>).</t>
            </li>
            <li>
              <t>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"/>. 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>
        </section>
        <section anchor="design-rationale">
          <name>Design Rationale</name>
          <t>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>This is achieved by building HASH_INPUT according to the content of the 'access_token' parameter in the AS-to-Client responses, since that is what all among the AS, the Client, and the RS are able to see.</t>
        </section>
      </section>
      <section anchor="sec-token-hash-input-c-as">
        <name>Hash Input on the Client and the AS</name>
        <t>The Client and the AS consider the content of the 'access_token' parameter in the AS-to-Client response, where the access token is included and provided to the requester Client.</t>
        <t>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"/>) or in JSON (see <xref target="sec-token-hash-input-c-as-json"/>).</t>
        <t>Once determined HASH_INPUT, 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"/>.</t>
        <section anchor="sec-token-hash-input-c-as-cbor">
          <name>AS-to-Client Response Encoded in CBOR</name>
          <t>If the AS-to-Client response is encoded in CBOR, then HASH_INPUT is defined as follows:</t>
          <ul spacing="normal">
            <li>
              <t>BYTES denotes the value of the CBOR byte string conveyed in the parameter 'access_token'.  </t>
              <t>
With reference to the example in <xref target="fig-as-response-cbor"/>, BYTES is the bytes {0xd0 0x83 0x43 ... 0x64 0x3b}.  </t>
              <t>
Note that BYTES is the binary representation of the access token, irrespective of this being a CWT or a JWT.</t>
            </li>
            <li>
              <t>HASH_INPUT_TEXT is the base64url-encoded text string that encodes BYTES.</t>
            </li>
            <li>
              <t>HASH_INPUT is the binary representation of HASH_INPUT_TEXT.</t>
            </li>
          </ul>
          <figure anchor="fig-as-response-cbor">
            <name>Example of AS-to-Client CoAP response using CBOR</name>
            <artwork align="left"><![CDATA[
Header: Created (Code=2.01)
Content-Format: application/ace+cbor
Max-Age: 85800
Payload:
{
   / access_token / 1 : h'd08343a1010aa2044c53796d6d65
                          74726963313238054d99a0d7846e
                          762c49ffe8a63e0b5858b918a11f
                          d81e438b7f973d9e2e119bcb2242
                          4ba0f38a80f27562f400ee1d0d6c
                          0fdb559c02421fd384fc2ebe22d7
                          071378b0ea7428fff157444d45f7
                          e6afcda1aae5f6495830c5862708
                          7fc5b4974f319a8707a635dd643b',
   / token_type /  34 : 2 / PoP /,
   / expires_in /   2 : 86400,
   / ace_profile / 38 : 1 / coap_dtls /,
   / (remainder of the response omitted for brevity) /
}
]]></artwork>
          </figure>
        </section>
        <section anchor="sec-token-hash-input-c-as-json">
          <name>AS-to-Client Response Encoded in JSON</name>
          <t>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>With reference to the example in <xref target="fig-as-response-json"/>, HASH_INPUT is the binary representation of "2YotnFZFEjr1zCsicMWpAA".</t>
          <t>Note that:</t>
          <ul spacing="normal">
            <li>
              <t>If the access token is a JWT, then HASH_INPUT is the binary representation of the JWT.</t>
            </li>
            <li>
              <t>If the access token is a CWT, then HASH_INPUT is the binary representation of the base64url-encoded text string that encodes the binary representation of the CWT.</t>
            </li>
          </ul>
          <figure anchor="fig-as-response-json">
            <name>Example of AS-to-Client HTTP response using JSON</name>
            <artwork align="left"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/ace+json
Cache-Control: no-store
Pragma: no-cache
Payload:
{
   "access_token" : "2YotnFZFEjr1zCsicMWpAA",
   "token_type"   : "pop",
   "expires_in"   : 86400,
   "ace_profile"  : "1"
}
]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="sec-token-hash-input-rs">
        <name>HASH_INPUT on the RS</name>
        <t>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"/>) or JWTs (see <xref target="sec-token-hash-input-rs-jwt"/>).</t>
        <section anchor="sec-token-hash-input-rs-cwt">
          <name>Access Tokens as CWTs</name>
          <t>If the RS expects access tokens to be CWTs, then the RS performs the following steps.</t>
          <ol spacing="normal" type="1"><li>
              <t>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"/>).</t>
            </li>
            <li>
              <t>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"/>). Hence, the RS assumes TOKEN_INFO to be the binary representation of the access token.</t>
            </li>
            <li>
              <t>The RS verifies the access token as per <xref section="5.10.1.1" sectionFormat="of" target="RFC9200"/>. If the verification fails, then the RS does not discard the access token yet, and it instead moves to step 4.  </t>
              <t>
Otherwise, the RS stores the access token and computes the corresponding token hash, as defined in <xref target="sec-token-hash-output"/>. 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>
After that, the RS stores the computed token hash as associated with the access token, and then terminates this algorithm.</t>
            </li>
            <li>
              <t>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"/>). Hence, the RS assumes TOKEN_INFO to be the binary representation of HASH_INPUT_TEXT, which is the base64url-encoded text string that encodes the binary representation of the access token.</t>
            </li>
            <li>
              <t>The RS performs the base64url decoding of HASH_INPUT_TEXT, and considers the result as the binary representation of the access token.</t>
            </li>
            <li>
              <t>The RS verifies the access token as per <xref section="5.10.1.1" sectionFormat="of" target="RFC9200"/>. If the verification fails, then the RS terminates this algorithm.  </t>
              <t>
Otherwise, the RS stores the access token and computes the corresponding token hash, as defined in <xref target="sec-token-hash-output"/>. In particular, HASH_INPUT is TOKEN_INFO.  </t>
              <t>
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">
          <name>Access Tokens as JWTs</name>
          <t>If the RS expects access tokens to be JWTs, then the RS performs the following steps.</t>
          <ol spacing="normal" type="1"><li>
              <t>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"/>).</t>
            </li>
            <li>
              <t>The RS verifies the access token as per <xref section="5.10.1.1" sectionFormat="of" target="RFC9200"/>. If the verification fails, then the RS terminates this algorithm. Otherwise, the RS stores the access token.</t>
            </li>
            <li>
              <t>The RS computes a first token hash associated with the access token, as defined in <xref target="sec-token-hash-output"/>.  </t>
              <t>
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"/>). Hence, HASH_INPUT is TOKEN_INFO.  </t>
              <t>
After that, the RS stores the computed token hash as associated with the access token.</t>
            </li>
            <li>
              <t>The RS computes a second token hash associated with the access token, as defined in <xref target="sec-token-hash-output"/>.  </t>
              <t>
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"/>). 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>
After that, the RS stores the computed token hash as associated with the access token.</t>
            </li>
          </ol>
          <t>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>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>If the RS performs both step 3 and step 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"/>.</t>
          <t><xref target="sec-seccons-two-hashes-jwt"/> 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">
        <name>Computing the Token Hash</name>
        <t>Once determined HASH_INPUT as defined in <xref target="sec-token-hash-input-c-as"/> and <xref target="sec-token-hash-input-rs"/>, a hash value of HASH_INPUT is generated as per <xref section="6" sectionFormat="of" target="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>The specifically used hash function <bcp14>MUST</bcp14> be collision-resistant on byte-strings, and <bcp14>MUST</bcp14> be selected from the "Named Information Hash Algorithm" Registry <xref target="Named.Information.Hash.Algorithm"/>.</t>
        <t>The AS specifies the used hash function to registered devices during their registration procedure (see <xref target="sec-registration"/>).</t>
      </section>
    </section>
    <section anchor="sec-trl-resource">
      <name>Token Revocation List (TRL)</name>
      <t>Upon startup, the AS creates a single Token Revocation List (TRL), encoded as a CBOR array.</t>
      <t>Each element of the array is a CBOR byte string, with value 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>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">
        <name>Update of the TRL</name>
        <t>The AS updates the TRL in the following two cases.</t>
        <ul spacing="normal">
          <li>
            <t>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>
            <t>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>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 window.</t>
      </section>
    </section>
    <section anchor="sec-trl-endpoint">
      <name>The TRL Endpoint</name>
      <t>Consistent with <xref section="6.5" sectionFormat="of" target="RFC9200"/>, all communications between a requester towards the TRL endpoint and 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>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"/>.</t>
      <t>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"/>).</t>
      <t>The TRL endpoint supports only the GET method, and allows two types of queries of the TRL.</t>
      <ul spacing="normal">
        <li>
          <t>Full query: the AS returns the token hashes of the revoked access tokens currently in the TRL and pertaining to the requester.  </t>
          <t>
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"/>.</t>
        </li>
        <li>
          <t>Diff query: the AS returns a list of diff entries. Each diff entry is related to one update 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>
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"/>. The processing of a diff query and the related response format are defined in <xref target="ssec-trl-diff-query"/>.</t>
        </li>
      </ul>
      <t>If it supports diff queries, the AS <bcp14>MAY</bcp14> additionally support its "Cursor" extension, which has two benefits. First, 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. Second, 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 reference point.</t>
      <t>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"/>. 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"/>.</t>
      <t><xref target="sec-trl-parameteters"/> 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">
        <name>Error Responses with Problem Details</name>
        <t>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"/>. 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"/>). The CBOR map is formatted as follows.</t>
        <ul spacing="normal">
          <li>
            <t>It <bcp14>MUST</bcp14> include the Custom Problem Detail entry 'ace-trl-error' registered in <xref target="iana-custom-problem-details"/> of this document. This entry is formatted as a CBOR map, which includes the following fields.  </t>
            <ul spacing="normal">
              <li>
                <t>The field 'error-id' <bcp14>MUST</bcp14> be present. The map key used for this field is the CBOR unsigned integer with value 0. The value of this field is a CBOR integer specifying the error 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"/> of this document.</t>
              </li>
              <li>
                <t>The field 'cursor' <bcp14>MAY</bcp14> be present. The map key used for this field is the CBOR unsigned integer with value 1. The value of this field is a CBOR unsigned integer or the CBOR simple value <tt>null</tt> (0xf6).</t>
              </li>
            </ul>
            <t>
The CDDL notation <xref target="RFC8610"/> of the 'ace-trl-error' entry is given below.</t>
          </li>
        </ul>
        <sourcecode type="CDDL"><![CDATA[
   ace-trl-error = {
       0: int,        ; error-id
     ? 1: uint / null ; cursor
   }
]]></sourcecode>
        <ul spacing="normal">
          <li>
            <t>It <bcp14>MAY</bcp14> include further Standard Problem Detail entries or Custom Problem Detail entries (see <xref target="RFC9290"/>).  </t>
            <t>
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 occurred at the AS. The diagnostic text is intended for software engineers as well as for device and network operators, in order to aid debugging and provide context for possible intervention. The diagnostic message <bcp14>SHOULD</bcp14> be logged by the AS. The 'detail' entry is unlikely relevant in an unattended setup where human intervention is not expected.</t>
          </li>
        </ul>
        <t>An example of error response using the problem-details format is shown in <xref target="fig-example-error-response"/>.</t>
        <figure anchor="fig-example-error-response">
          <name>Example of Error Response with Problem Details</name>
          <artwork><![CDATA[
Header: Bad Request (Code=4.00)
Content-Format: application/concise-problem-details+cbor
Payload:
{
  / title /     -1: "Invalid parameter value",
  / detail /    -2: "Invalid value for 'cursor': -53",
  / ace-trl-error / e'ace-trl-error': {
    / error-id / 0: 0 / "Invalid parameter value" /,
    / cursor /   1: 42
  }
}
]]></artwork>
        </figure>
        <t>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 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">
        <name>Supporting Diff Queries</name>
        <t>If the AS supports diff queries, it is able to transfer a list of diff entries, each of which is related to one update occurred to the TRL (see <xref target="sec-trl-endpoint"/>). That is, when replying to a diff query performed by a requester, the AS specifies the diff entries related to the most recent TRL updates pertaining to the requester.</t>
        <t>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, which were added to the TRL or removed from the TRL at that update.</t>
        <t>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"/>).</t>
        <t>The series items in the update collection <bcp14>MUST</bcp14> be strictly ordered in a chronological fashion. That is, at any point in time, the current first series item is the one least recently added to the update collection and still retained by the AS, while the current 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>Each time the TRL changes, the AS performs the following operations for each requester.</t>
        <ol spacing="normal" type="1"><li>
            <t>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>
            <t>The AS creates two sets "trl_patch" of token hashes, i.e., one  "removed" set and one "added" set, as related to this TRL update.</t>
          </li>
          <li>
            <t>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>
            <t>The AS creates a new series item, which includes the two sets from step 3.</t>
          </li>
          <li>
            <t>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>
            <t>The AS adds the series item to the update collection associated with the requester, as the last (most recent) one.</t>
          </li>
        </ol>
        <section anchor="sec-trl-endpoint-supporting-cursor">
          <name>Supporting the "Cursor" Extension</name>
          <t>If it supports the "Cursor" extension for diff queries, the AS performs also the following actions.</t>
          <t>The AS defines the single, constant unsigned integer MAX_INDEX &lt;= ((2^64) - 1), where "^" is the exponentiation operator. 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^32) - 1). MAX_INDEX <bcp14>SHOULD</bcp14> be orders of magnitude greater than MAX_N.</t>
          <t>The following applies separately for each requester's update collection.</t>
          <ul spacing="normal">
            <li>
              <t>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 'index' with value 0.  </t>
              <t>
If i_X is the value of 'index' associated with a series item X, then the following series item Y will take 'index' with value i_Y = (i_X + 1) % (MAX_INDEX + 1). That is, after having added a series item whose associated 'index' has value MAX_INDEX, the next added series item will result in a wrap-around of the 'index' value, and will thus take 'index' with value 0.  </t>
              <t>
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">
                <li>
                  <t>...</t>
                </li>
                <li>
                  <t>(i_A = MAX_INDEX - 2, i_B = MAX_INDEX - 1, i_C = MAX_INDEX)</t>
                </li>
                <li>
                  <t>(i_B = MAX_INDEX - 1, i_C = MAX_INDEX, i_D = 0)</t>
                </li>
                <li>
                  <t>(i_C = MAX_INDEX, i_D = 0, i_E = 1)</t>
                </li>
                <li>
                  <t>(i_D = 0, i_E = 1, i_F = 2)</t>
                </li>
                <li>
                  <t>...</t>
                </li>
              </ul>
            </li>
            <li>
              <t>The unsigned integer 'last_index' is also defined, with minimum value 0 and maximum value MAX_INDEX.  </t>
              <t>
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>
That is, after having added V series items to the update collection, the last and most recently added series item has 'index' with value 'last_index' = (V - 1) % (MAX_INDEX + 1).  </t>
              <t>
As long as a wrap-around 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>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"/>.</t>
          <t>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"/>).</t>
        </section>
      </section>
      <section anchor="sec-trl-endpoint-query-parameters">
        <name>Query Parameters</name>
        <t>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">
          <li>
            <t>'diff': if included, it indicates to perform a diff query of the TRL (see <xref target="ssec-trl-diff-query"/>). Its value <bcp14>MUST</bcp14> be either:  </t>
            <ul spacing="normal">
              <li>
                <t>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>
                <t>a positive integer strictly greater than 0, indicating the maximum number of diff entries that a (notification) response should include.</t>
              </li>
            </ul>
            <t>
If the AS does not support diff queries, it ignores the 'diff' query parameter when present in the GET request, and proceeds like when processing a full query of the TRL (see <xref target="ssec-trl-full-query"/>).  </t>
            <t>
Otherwise, the AS <bcp14>MUST</bcp14> return a 4.00 (Bad Request) response in case the 'diff' query parameter of the GET request specifies a value that is neither 0 nor a positive integer, irrespective of the presence of the 'cursor' parameter and its value (see below). The response <bcp14>MUST</bcp14> have Content-Format "application/concise-problem-details+cbor" and its payload is formatted as defined in <xref target="sec-error-responses"/>. 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 field 'cursor' <bcp14>MUST NOT</bcp14> be present.</t>
          </li>
          <li>
            <t>'cursor': if included, it indicates to perform a diff query of the TRL together with the "Cursor" extension, as defined in <xref target="sec-using-cursor-diff-query-response"/>. 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>
If included, the 'cursor' query parameter specifies an unsigned integer value that was provided by the AS in a previous response from the TRL endpoint (see <xref target="sec-using-cursor-full-query-response"/>, <xref target="sec-using-cursor-diff-query-response-no-cursor"/>, and <xref target="sec-using-cursor-diff-query-response-cursor"/>).  </t>
            <t>
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, i.e.: i) it performs a diff query of the TRL (see <xref target="ssec-trl-diff-query"/>), if it supports diff queries and the 'diff' query parameter is present in the GET request; or ii) it performs a full query of the TRL (see <xref target="ssec-trl-full-query"/>) otherwise.  </t>
            <t>
If the AS supports both diff queries and the "Cursor" extension, and the GET request specifies 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>
The 4.00 (Bad Request) response <bcp14>MUST</bcp14> have Content-Format "application/concise-problem-details+cbor" and its payload is formatted as defined in <xref target="sec-error-responses"/>.  </t>
            <ul spacing="normal">
              <li>
                <t>The GET request does not specify the 'diff' query parameter, irrespective of the value of the 'cursor' parameter.      </t>
                <t>
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 field 'cursor' <bcp14>MUST NOT</bcp14> be present.</t>
              </li>
              <li>
                <t>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"/>).      </t>
                <t>
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 field 'cursor', whose value is either: the CBOR simple value <tt>null</tt> (0xf6), if the update collection associated with the requester is empty; or the corresponding current value of 'last_index' otherwise.</t>
              </li>
              <li>
                <t>All of the following hold: the update collection associated with the requester is not empty; no wrap-around of its '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"/>).      </t>
                <t>
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 field 'cursor' <bcp14>MUST NOT</bcp14> be present.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="ssec-trl-full-query">
      <name>Full Query of the TRL</name>
      <t>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"><li>
          <t>From the TRL, the AS builds a set HASHES such that:  </t>
          <ul spacing="normal">
            <li>
              <t>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>
              <t>If the requester is an administrator, HASHES specifies all the token hashes currently in the TRL.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>The AS sends a 2.05 (Content) response to the requester. The response <bcp14>MUST</bcp14> have Content-Format "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">
            <li>
              <t>The 'full_set' parameter <bcp14>MUST</bcp14> be included and specifies a CBOR array 'full_set_value'. Each element of 'full_set_value' is a CBOR byte string, with value one of the token hashes from the set HASHES. If the set HASHES is empty, the 'full_set' parameter specifies the empty CBOR array.      </t>
              <t>
The CBOR array <bcp14>MUST</bcp14> be treated as a set, i.e., the order of its elements has no meaning.</t>
            </li>
            <li>
              <t>The 'cursor' 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-diff-queries"/> and <xref target="sec-trl-endpoint-supporting-cursor"/>). Its value is set as specified in <xref target="sec-using-cursor-full-query-response"/>, and provides the requester with information for performing a follow-up diff query using the "Cursor" extension (see <xref target="sec-using-cursor-diff-query-response"/>).      </t>
              <t>
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><xref target="cddl-full"/> provides the CDDL definition <xref target="RFC8610"/> of the CBOR array 'full_set_value' specified in the response from the AS, as value of the 'full_set' parameter.</t>
      <figure anchor="cddl-full">
        <name>CDDL definition of 'full_set_value'</name>
        <artwork type="CDDL" align="left"><![CDATA[
token_hash = bytes
full_set_value = [* token_hash]
]]></artwork>
      </figure>
      <t><xref target="response-full"/> shows an example 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">
        <name>Example of response following a full query request to the TRL endpoint</name>
        <artwork align="left"><![CDATA[
Header: Content (Code=2.05)
Content-Format: application/ace-trl+cbor
Payload:
{
   e'full_set' : [
     h'01fa51cc/...
       (remainder of the token hash omitted for brevity)/',
     h'01748190/...
       (remainder of the token hash omitted for brevity)/'
   ]
}
]]></artwork>
      </figure>
    </section>
    <section anchor="ssec-trl-diff-query">
      <name>Diff Query of the TRL</name>
      <t>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>Note that, if the AS supports both diff queries and the related "Cursor" extension, the steps 3 and 4 defined below are extended as defined in <xref target="sec-using-cursor-diff-query-response"/>.</t>
      <ol spacing="normal" type="1"><li>
          <t>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 pre-defined positive integer MAX_N (see <xref target="sec-trl-endpoint-supporting-diff-queries"/>), then NUM takes the value of MAX_N. Otherwise, NUM takes N.</t>
        </li>
        <li>
          <t>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>
          <t>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>
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"/>). In particular, the first diff entry refers to the most recent of such updates, the second diff entry refers to the second from last of such updates, and so on.  </t>
          <t>
Each diff entry is a CBOR array 'diff_entry', which includes the following two elements.  </t>
          <ul spacing="normal">
            <li>
              <t>The first element is a 'trl_patch' set of token hashes, encoded as a CBOR array 'removed'. Each element of the array is a CBOR byte string, with value the token hash of an access token such that: it pertained to the requester; and it was removed from the TRL during the update associated with the diff entry.</t>
            </li>
            <li>
              <t>The second element is a 'trl_patch' set of token hashes, encoded as a CBOR array 'added'. Each element of the array is a CBOR byte string, with value the token hash of an access token such that: it pertains to the requester; and it was added to the TRL during the update associated with the diff entry.</t>
            </li>
          </ul>
          <t>
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>
          <t>The AS prepares a 2.05 (Content) response for the requester. The response <bcp14>MUST</bcp14> have Content-Format "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">
            <li>
              <t>The 'diff_set' parameter <bcp14>MUST</bcp14> be present and specifies 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 value 0, in which case 'diff_set_value' is the empty CBOR array.      </t>
              <t>
Within 'diff_set_value', the CBOR arrays 'diff_entry' <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 from last most recent TRL update pertaining to the requester, and so on.</t>
            </li>
            <li>
              <t>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"/>). Their values are set as specified in <xref target="sec-using-cursor-diff-query-response"/>, and provide the requester with information for performing a follow-up query of the TRL (see <xref target="sec-using-cursor-diff-query-response"/>).      </t>
              <t>
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, it <bcp14>MUST</bcp14> silently ignore the 'cursor' parameter and the 'more' parameter if present.</t>
            </li>
          </ul>
        </li>
      </ol>
      <t><xref target="cddl-diff"/> provides the CDDL definition <xref target="RFC8610"/> of the CBOR array 'diff_set_value' specified in the response from the AS, as value of the 'diff_set' parameter.</t>
      <figure anchor="cddl-diff">
        <name>CDDL definition of 'diff_set_value'</name>
        <artwork type="CDDL" align="left"><![CDATA[
   token_hash = bytes
   trl_patch = [* token_hash]
   diff_entry = [removed: trl_patch, added: trl_patch]
   diff_set_value = [* diff_entry]
]]></artwork>
      </figure>
      <t><xref target="response-diff"/> shows an example response from the AS, following a diff query request to the TRL endpoint, where U = 3 diff entries are specified. 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">
        <name>Example of response following a diff query request to the TRL endpoint</name>
        <artwork align="left"><![CDATA[
Header: Content (Code=2.05)
Content-Format: application/ace-trl+cbor
Payload:
{
   e'diff_set' : [
     [
       [ h'01fa51cc/...
           (remainder of the token hash omitted for brevity)/',
         h'01748190/...
           (remainder of the token hash omitted for brevity)/'
       ],
       [ h'01cdf1ca/...
           (remainder of the token hash omitted for brevity)/',
         h'01be41a6/...
           (remainder of the token hash omitted for brevity)/'
       ]
     ],
     [
       [ h'0144dd12/...
           (remainder of the token hash omitted for brevity)/',
         h'01231fff/...
           (remainder of the token hash omitted for brevity)/'
       ],
       []
     ],
     [
       [],
       [ h'01ca986f/...
           (remainder of the token hash omitted for brevity)/',
         h'01fe1a2b/...
           (remainder of the token hash omitted for brevity)/'
       ]
     ]
   ]
}
]]></artwork>
      </figure>
      <t><xref target="sec-series-pattern"/> 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"/>.</t>
    </section>
    <section anchor="sec-using-cursor">
      <name>Response Messages when Using the "Cursor" Extension</name>
      <t>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 <xref target="sec-using-cursor-full-query-response"/> and <xref target="sec-using-cursor-diff-query-response"/>, respectively.</t>
      <t>The exact format of the response depends on the request being a full query or diff query request, on the presence of the 'diff' and 'cursor' query parameters and their values in the diff query request, and on the current status of the update collection associated with the requester.</t>
      <t>Error handling and the possible resulting error responses are as defined in <xref target="sec-trl-endpoint-query-parameters"/>.</t>
      <section anchor="sec-using-cursor-full-query-response">
        <name>Response to Full Query</name>
        <t>When processing a full query request to the TRL endpoint, the AS composes a response as defined in <xref target="ssec-trl-full-query"/>.</t>
        <t>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>The 'cursor' parameter <bcp14>MUST</bcp14> specify the CBOR simple value <tt>null</tt> 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>Otherwise, the 'cursor' parameter <bcp14>MUST</bcp14> specify a CBOR unsigned integer. This <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"/>), as corresponding to the most recent TRL update pertaining to the requester. Such a value is in fact the current value of 'last_index' for the update collection associated with the requester.</t>
      </section>
      <section anchor="sec-using-cursor-diff-query-response">
        <name>Response to Diff Query</name>
        <t>When processing a diff query request to the TRL endpoint, the AS composes a response as defined in the following.</t>
        <section anchor="sec-using-cursor-diff-query-response-empty">
          <name>Empty Collection</name>
          <t>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 "application/ace-trl+cbor" and its payload <bcp14>MUST</bcp14> be a CBOR map formatted as follows.</t>
          <ul spacing="normal">
            <li>
              <t>The 'diff_set' parameter <bcp14>MUST</bcp14> be included and specifies the empty CBOR array.</t>
            </li>
            <li>
              <t>The 'cursor' parameter <bcp14>MUST</bcp14> be included and specifies the CBOR simple value <tt>null</tt> (0xf6).</t>
            </li>
            <li>
              <t>The 'more' parameter <bcp14>MUST</bcp14> be included and specifies the CBOR simple value <tt>false</tt> (0xf4).</t>
            </li>
          </ul>
          <t>Note that the above applies when the update collection associated with the requester has no elements, regardless of whether the 'cursor' query parameter is included or not 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">
          <name>Cursor Not Specified in the Diff Query Request</name>
          <t>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"/>, with the following differences.</t>
          <ul spacing="normal">
            <li>
              <t>At step 3, the AS considers the value MAX_DIFF_BATCH (see <xref target="sec-trl-endpoint-supporting-cursor"/>), and prepares L = min(U, MAX_DIFF_BATCH) diff entries.  </t>
              <t>
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>
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>
              <t>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">
                <li>
                  <t>The 'diff_set' parameter <bcp14>MUST</bcp14> be present and specifies 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>
                  <t>The 'cursor' parameter <bcp14>MUST</bcp14> be present and specifies a CBOR unsigned integer. This <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>
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>
                  <t>The 'more' parameter <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> specify the CBOR simple value <tt>false</tt> (0xf4) if U &lt;= MAX_DIFF_BATCH, or the CBOR simple value <tt>true</tt> (0xf5) otherwise.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>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. As defined in <xref target="sec-using-cursor-diff-query-response-cursor"/>, 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">
          <name>Cursor Specified in the Diff Query Request</name>
          <t>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>
          <ul spacing="normal">
            <li>
              <t>Case A - 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"/>).  </t>
              <t>
In this case, the AS returns a 2.05 (Content) response. The response <bcp14>MUST</bcp14> have Content-Format "application/ace-trl+cbor" and its payload <bcp14>MUST</bcp14> be a CBOR map formatted as follows.  </t>
              <ul spacing="normal">
                <li>
                  <t>The 'diff_set' parameter <bcp14>MUST</bcp14> be included and specifies the empty CBOR array.</t>
                </li>
                <li>
                  <t>The 'cursor' parameter <bcp14>MUST</bcp14> be included and specifies the CBOR simple value <tt>null</tt> (0xf6).</t>
                </li>
                <li>
                  <t>The 'more' parameter <bcp14>MUST</bcp14> be included and specifies the CBOR simple value <tt>true</tt> (0xf5).</t>
                </li>
              </ul>
              <t>
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>
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 with a valid value of the 'cursor' parameter (see <xref target="sec-using-cursor-full-query-response"/>) to be possibly used as query parameter in a following diff query request.</t>
            </li>
            <li>
              <t>Case B - The series item X with 'index' having value P is found in the update collection associated with the requester; or 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>
In this case, the AS performs the actions defined in <xref target="ssec-trl-diff-query"/>, with the following differences.  </t>
              <ul spacing="normal">
                <li>
                  <t>At step 3, the AS considers the value MAX_DIFF_BATCH (see <xref target="sec-trl-endpoint-supporting-cursor"/>), 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>
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>
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>
                  <t>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">
                    <li>
                      <t>The 'diff_set' parameter <bcp14>MUST</bcp14> be present and specifies 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>
                      <t>The 'cursor' parameter <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> specify a CBOR unsigned integer. In particular:          </t>
                      <ul spacing="normal">
                        <li>
                          <t>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. Such a value is in fact the current value of 'last_index' for the update collection.</t>
                        </li>
                        <li>
                          <t>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>
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>
                      <t>The 'more' parameter <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> specify the CBOR simple value <tt>false</tt> (0xf4) if SUB_U &lt;= MAX_DIFF_BATCH, or the CBOR simple value <tt>true</tt> (0xf5) otherwise.</t>
                    </li>
                  </ul>
                </li>
              </ul>
              <t>
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>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="sec-registration">
      <name>Registration at the Authorization Server</name>
      <t>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">
        <li>
          <t>The url-path to the TRL endpoint at the AS.</t>
        </li>
        <li>
          <t>The hash function used to compute token hashes. This is specified by identifying an entry in the "Named Information Hash Algorithm" Registry <xref target="Named.Information.Hash.Algorithm"/>. The specific means for this is outside the scope of this document.</t>
        </li>
        <li>
          <t>A positive integer MAX_N, if the AS supports diff queries of the TRL (see <xref target="sec-trl-endpoint-supporting-diff-queries"/> and <xref target="ssec-trl-diff-query"/>).</t>
        </li>
        <li>
          <t>A positive integer MAX_DIFF_BATCH, if the AS supports diff queries of the TRL as well as the related "Cursor" extension (see <xref target="sec-trl-endpoint-supporting-cursor"/> and <xref target="sec-using-cursor"/>).</t>
        </li>
      </ul>
      <t>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"/>).</t>
      <t>In the same spirit, it <bcp14>MUST</bcp14> be ensured that communications between the AS and an administrator are mutually authenticated, encrypted and integrity protected, as well as protected against message replay.</t>
      <t>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 <xref target="RFC8446"/><xref target="RFC9147"/>, or an OSCORE Security Context <xref target="RFC8613"/> by running the authenticated key exchange protocol EDHOC <xref target="RFC9528"/>.</t>
      <t>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 full TRL.</t>
      <t>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>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 for Authentication and Authorization (see <xref section="5.5" sectionFormat="of" target="RFC9200"/>).</t>
    </section>
    <section anchor="sec-notification">
      <name>Notification of Revoked Access Tokens</name>
      <t>Once registered at the AS, the administrator or 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"/>) or a diff query (see <xref target="ssec-trl-diff-query"/>) 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"/>.</t>
      <t>In case the request is successfully processed, the AS replies with a response specifying the CoAP response code 2.05 (Content). In particular, if the AS supports diff queries but not the "Cursor" extension (see <xref target="sec-trl-endpoint-supporting-diff-queries"/> and <xref target="sec-trl-endpoint-supporting-cursor"/>), then the payload of the response is formatted as defined in <xref target="ssec-trl-full-query"/> or in <xref target="ssec-trl-diff-query"/>, 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"/>.</t>
      <t>When the TRL is updated (see <xref target="ssec-trl-update"/>), 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"/>. 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 attribute "c.pmax" defined in <xref target="I-D.ietf-core-conditional-attributes"/>, 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 the TRL has changed or not.</t>
      <t>Following a first exchange with the AS, an administrator or a registered device can send additional GET (Observation) requests to the TRL endpoint at any time, analogously to what is defined above. When doing so, the requester towards the TRL endpoint can perform a full query (see <xref target="ssec-trl-full-query"/>) or a diff query (see <xref target="ssec-trl-diff-query"/>) of the TRL. In the latter case, the requester can additionally rely on the "Cursor" extension (see <xref target="sec-trl-endpoint-query-parameters"/> and <xref target="sec-using-cursor-diff-query-response"/>).</t>
      <t>As specified in <xref target="sec-trl-endpoint-supporting-diff-queries"/>, 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 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>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>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 occurred to its associated update collection altogether. 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"/>).</t>
      <t>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">
        <name>Handling of Access Tokens and Token Hashes</name>
        <t>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>An RS <bcp14>MUST NOT</bcp14> accept and store an access token, if the corresponding token hash is among the currently stored ones.</t>
        <t>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">
          <li>
            <t>The RS has received and seen t1, irrespective of having accepted and stored it.</t>
          </li>
          <li>
            <t>The RS has gained knowledge that t1 has expired. This can be achieved, e.g., through the following means.  </t>
            <ul spacing="normal">
              <li>
                <t>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"/>).</t>
              </li>
              <li>
                <t>The value of the 'exp' claim specified in t1 indicates that t1 has expired.</t>
              </li>
              <li>
                <t>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>
                <t>The result of token introspection performed on t1 (see <xref section="5.9" sectionFormat="of" target="RFC9200"/>), if supported by both the RS and the AS.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>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>Retaining the stored token hashes as specified above limits the impact from a (dishonest) Client whose pertaining access token: i) specifies the 'exi' claim; ii) is uploaded at the RS for the first time after it has been revoked and later expired; and iii) has the sequence number encoded in the 'cti' claim greater than the highest sequence number among the expired access tokens specifying the 'exi' claim for the RS (see <xref section="5.10.3" sectionFormat="of" target="RFC9200"/>). 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>In order to further limit such a risk, when receiving an access token that specifies the 'exi' claim and for which a corresponding token hash is not stored, the RS can introspect the access token (see <xref section="5.9" sectionFormat="of" target="RFC9200"/>), if token introspection is implemented by both the RS and the AS.</t>
        <t>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 (see <xref section="5.10.3" sectionFormat="of" target="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>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 specifying the 'exi' claim for the RS. If that is the case, sn* <bcp14>MUST</bcp14> take the value of sn_th.</t>
        <t>By virtue of what is defined in <xref section="5.10.3" sectionFormat="of" target="RFC9200"/>, this ensures that, following the deletion of the token hash associated with an access token specifying 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">
      <name>ACE Token Revocation List Parameters</name>
      <t>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"/> of this specification.</t>
      <t>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">
        <name>CBOR abbreviations for the ACE Token Revocation List parameters</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">CBOR Key</th>
            <th align="left">CBOR Type</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">full_set</td>
            <td align="left">0</td>
            <td align="left">array</td>
          </tr>
          <tr>
            <td align="left">diff_set</td>
            <td align="left">1</td>
            <td align="left">array</td>
          </tr>
          <tr>
            <td align="left">cursor</td>
            <td align="left">2</td>
            <td align="left">Null or unsigned integer</td>
          </tr>
          <tr>
            <td align="left">more</td>
            <td align="left">3</td>
            <td align="left">True or False</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="error-types">
      <name>ACE Token Revocation List Error Identifiers</name>
      <t>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"/>).</t>
      <table align="center" anchor="_table-ACE-TRL-Error">
        <name>ACE Token Revocation List Error Identifiers</name>
        <thead>
          <tr>
            <th align="left">Value</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">0</td>
            <td align="left">Invalid parameter value</td>
          </tr>
          <tr>
            <td align="left">1</td>
            <td align="left">Invalid set of parameters</td>
          </tr>
          <tr>
            <td align="left">2</td>
            <td align="left">Out of bound cursor value</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="sec-security-considerations">
      <name>Security Considerations</name>
      <t>The protocol defined in this document inherits the security considerations from the ACE framework for Authentication and Authorization <xref target="RFC9200"/>, from <xref target="RFC8392"/> as to the usage of CWTs, from <xref target="RFC7519"/> as to the usage of JWTs, from <xref target="RFC7641"/> as to the usage of CoAP Observe, and from <xref target="RFC6920"/> with regard to computing the token hashes. The following considerations also apply.</t>
      <section anchor="content-retrieval-from-the-trl">
        <name>Content Retrieval from the TRL</name>
        <t>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>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 retrieve the full TRL (see <xref target="sec-registration"/>).</t>
      </section>
      <section anchor="size-of-the-trl">
        <name>Size of the TRL</name>
        <t>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"/>).</t>
        <t>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">
        <name>Communication Patterns</name>
        <t>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>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 according to a related application policy.</t>
      </section>
      <section anchor="request-of-new-access-tokens">
        <name>Request of New Access Tokens</name>
        <t>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>This can be due to a number of causes. For example, the access token has been revoked, and the RS has become aware of it and has expunged the access token, but the Client is not aware of it (yet). As another example, 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.</t>
        <t>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 Authorization Server 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 instead to request a new one.</t>
      </section>
      <section anchor="vulnerable-time-window-at-the-rs">
        <name>Vulnerable Time Window at the RS</name>
        <t>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>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 an access is a security violation, even if the Client is not attempting to be malicious.</t>
        <t>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-two-hashes-jwt">
        <name>Two Token Hashes at the RS using JWTs</name>
        <t><xref target="sec-token-hash-input-rs-jwt"/> defines 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, when using JWTs, 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>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>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"/>). 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 and thus will not delete the access token.</t>
        <t>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. Instead, 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>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"/> 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"/>).</t>
        <t>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"/>). That is, if an RS uses CWTs as access tokens, then the RS is not exposed to the attack described above, and thus it safely computes and stores only one token hash per access token (see <xref target="sec-token-hash-input-rs-cwt"/>).</t>
      </section>
      <section anchor="additional-security-measures">
        <name>Additional Security Measures</name>
        <t>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 that happened, including when that reason is the compromise, misbehavior, or decommissioning of a registered device.</t>
        <t>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>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">
          <li>
            <t>The de-registration of the registered device from the AS, so that the AS does not issue further access tokens pertaining to that device.</t>
          </li>
          <li>
            <t>If applicable, the revocation of the public authentication credential associated with the registered device (e.g., its public key certificate).</t>
          </li>
        </ul>
        <t>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">
      <name>IANA Considerations</name>
      <t>This document has the following actions for IANA.</t>
      <t>Note to RFC Editor: Please replace all occurrences of "[RFC-XXXX]" with the RFC number of this specification and delete this paragraph.</t>
      <section anchor="iana-media-type">
        <name>Media Type Registrations</name>
        <t>IANA is asked to register 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"/>.</t>
        <t>Type name: application</t>
        <t>Subtype name: ace-trl+cbor</t>
        <t>Required parameters: N/A</t>
        <t>Optional parameters: N/A</t>
        <t>Encoding considerations: Must be encoded as a CBOR map containing the protocol parameters defined in [RFC-XXXX].</t>
        <t>Security considerations: See <xref target="sec-security-considerations"/> of this document.</t>
        <t>Interoperability considerations: N/A</t>
        <t>Published specification: [RFC-XXXX]</t>
        <t>Applications that use this media type: The type is used by Authorization Servers, Clients, and Resource Servers that support the notification of revoked access tokens, according to a Token Revocation List maintained by the Authorization Server as specified in [RFC-XXXX].</t>
        <t>Fragment identifier considerations: N/A</t>
        <t>Additional information: N/A</t>
        <t>Person &amp; email address to contact for further information: ACE WG mailing list (ace@ietf.org) or IETF Applications and Real-Time Area (art@ietf.org)</t>
        <t>Intended usage: COMMON</t>
        <t>Restrictions on usage: None</t>
        <t>Author/Change controller: IETF</t>
        <t>Provisional registration: No</t>
      </section>
      <section anchor="iana-content-type">
        <name>CoAP Content-Formats Registry</name>
        <t>IANA is asked to add the following entry to the "CoAP Content-Formats" registry within the "Constrained RESTful Environments (CoRE) Parameters" registry group.</t>
        <t>Content Type: application/ace-trl+cbor</t>
        <t>Content Coding: -</t>
        <t>ID: TBD</t>
        <t>Reference: [RFC-XXXX]</t>
      </section>
      <section anchor="iana-custom-problem-details">
        <name>Custom Problem Detail Keys Registry</name>
        <t>IANA is asked to register the following entry in the "Custom Problem Detail Keys" registry within the "Constrained RESTful Environments (CoRE) Parameters" registry group.</t>
        <ul spacing="normal">
          <li>
            <t>Key Value: TBD</t>
          </li>
          <li>
            <t>Name: ace-trl-error</t>
          </li>
          <li>
            <t>Brief Description: Carry [RFC-XXXX] problem details in a Concise Problem Details data item.</t>
          </li>
          <li>
            <t>Change Controller: IETF</t>
          </li>
          <li>
            <t>Reference: <xref target="sec-error-responses"/> of [RFC-XXXX]</t>
          </li>
        </ul>
      </section>
      <section anchor="iana-token-revocation-list">
        <name>ACE Token Revocation List Parameters Registry</name>
        <t>IANA is asked to establish the "ACE Token Revocation List Parameters" IANA registry within the "Authentication and Authorization for Constrained Environments (ACE)" registry group.</t>
        <t>As registration policy, the registry uses either "Standards Action with Expert Review", or "Specification Required" per <xref section="4.6" sectionFormat="of" target="RFC8126"/>, or "Expert Review" per <xref section="4.5" sectionFormat="of" target="RFC8126"/>. Expert Review guidelines are provided in <xref target="review"/>.</t>
        <t>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"/>, with Expert Review additionally required per <xref section="4.5" sectionFormat="of" target="RFC8126"/>. The procedure for early IANA allocation of Standards Track code points defined in <xref target="RFC7120"/> also applies. When such a procedure is used, review and approval by the designated expert are also required, in order for the WG chairs to determine that the conditions for early allocation are met (see step 2 in <xref section="3.1" sectionFormat="of" target="RFC7120"/>).</t>
        <t>The columns of this registry are:</t>
        <ul spacing="normal">
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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"/>. 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>
            <t>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.</t>
          </li>
          <li>
            <t>Reference: This field contains a pointer to the public specification for the item.</t>
          </li>
        </ul>
        <t>This registry has been initially populated by the values in <xref target="trl-registry-parameters"/>. The "Reference" column for all of these entries refers to this document.</t>
      </section>
      <section anchor="iana-token-revocation-list-errors">
        <name>ACE Token Revocation List Errors</name>
        <t>IANA is asked to establish the "ACE Token Revocation List Errors" IANA registry within the "Authentication and Authorization for Constrained Environments (ACE)" registry group.</t>
        <t>As registration policy, the registry uses either "Standards Action with Expert Review", or "Specification Required" per <xref section="4.6" sectionFormat="of" target="RFC8126"/>, or "Expert Review" per <xref section="4.5" sectionFormat="of" target="RFC8126"/>. Expert Review guidelines are provided in <xref target="review"/>.</t>
        <t>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"/>, with Expert Review additionally required per <xref section="4.5" sectionFormat="of" target="RFC8126"/>. The procedure for early IANA allocation of Standards Track code points defined in <xref target="RFC7120"/> also applies. When such a procedure is used, review and approval by the designated expert are also required, in order for the WG chairs to determine that the conditions for early allocation are met (see step 2 in <xref section="3.1" sectionFormat="of" target="RFC7120"/>).</t>
        <t>The columns of this registry are:</t>
        <ul spacing="normal">
          <li>
            <t>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"/>. 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>
            <t>Description: This field contains a brief description of the error.</t>
          </li>
          <li>
            <t>Reference: This field contains a pointer to the public specification defining the error, if one exists.</t>
          </li>
        </ul>
        <t>This registry has been initially populated by the values in <xref target="error-types"/>. The "Reference" column for all of these entries refers to this document.</t>
      </section>
      <section anchor="review">
        <name>Expert Review Instructions</name>
        <t>The IANA registries established in this document are defined as "Standards Action with Expert Review", "Specification Required", or "Expert Review", 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>Expert reviewers should take into consideration the following points:</t>
        <ul spacing="normal">
          <li>
            <t>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>
            <t>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>
            <t>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>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="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>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">
          <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>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">
          <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>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">
          <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>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">
          <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>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">
          <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>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">
          <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>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">
          <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>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>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="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>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="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>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>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="RFC7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="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>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>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>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">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8392">
          <front>
            <title>CBOR Web Token (CWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="May" year="2018"/>
            <abstract>
              <t>CBOR Web Token (CWT) is a compact means of representing claims to be transferred between two parties. The claims in a CWT are encoded in the Concise Binary Object Representation (CBOR), and CBOR Object Signing and Encryption (COSE) is used for added application-layer security protection. A claim is a piece of information asserted about a subject and is represented as a name/value pair consisting of a claim name and a claim value. CWT is derived from JSON Web Token (JWT) but uses CBOR rather than JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8392"/>
          <seriesInfo name="DOI" value="10.17487/RFC8392"/>
        </reference>
        <reference anchor="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>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>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">
          <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>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">
          <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>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>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="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>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>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="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>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>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>This document obsoletes RFC 6347.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9147"/>
          <seriesInfo name="DOI" value="10.17487/RFC9147"/>
        </reference>
        <reference anchor="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>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="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>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="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>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">
          <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>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">
          <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>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">
          <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>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="Named.Information.Hash.Algorithm" target="https://www.iana.org/assignments/named-information/named-information.xhtml">
          <front>
            <title>Named Information Hash Algorithm</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="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>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.ietf-core-conditional-attributes">
          <front>
            <title>Conditional Attributes for Constrained RESTful Environments</title>
            <author fullname="Michael Koster" initials="M." surname="Koster">
              <organization>Dogtiger Labs</organization>
            </author>
            <author fullname="Alan Soloway" initials="A." surname="Soloway">
              <organization>Qualcomm Technologies, Inc.</organization>
            </author>
            <author fullname="Bill Silverajan" initials="B." surname="Silverajan">
              <organization>Tampere University</organization>
            </author>
            <date day="14" month="January" year="2023"/>
            <abstract>
              <t>   This specification defines Conditional Notification and Control
   Attributes that work with CoAP Observe (RFC7641).

Editor note

   The git repository for the draft is found at https://github.com/core-
   wg/conditional-attributes/

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-conditional-attributes-06"/>
        </reference>
        <reference anchor="I-D.bormann-t2trg-stp">
          <front>
            <title>The Series Transfer Pattern (STP)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Klaus Hartke" initials="K." surname="Hartke">
              <organization>Ericsson</organization>
            </author>
            <date day="7" month="April" year="2020"/>
            <abstract>
              <t>   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"/>
        </reference>
      </references>
    </references>
    <section anchor="sec-series-pattern">
      <name>On using the Series Transfer Pattern</name>
      <t>Performing a diff query of the TRL as specified in <xref target="ssec-trl-diff-query"/> is in fact a usage example of the Series Transfer Pattern defined in <xref target="I-D.bormann-t2trg-stp"/>.</t>
      <t>That is, a diff query enables the transfer of a series of diff entries, with the AS specifying 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>When responding to a diff query request from a requester (see <xref target="ssec-trl-diff-query"/>), '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>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>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"/>). 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"/>.</t>
      <t>Furthermore, performing a diff query of the TRL together with the "Cursor" extension as specified in <xref target="sec-using-cursor"/> in fact relies on the "Cursor" pattern of the Series Transfer Pattern (see <xref section="3.3" sectionFormat="of" target="I-D.bormann-t2trg-stp"/>).</t>
    </section>
    <section anchor="sec-trl-parameteters">
      <name>Local Supportive Parameters of the TRL Endpoint</name>
      <t><xref target="_table-TRL-endpoint-parameters"/> 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"/>) and the "Cursor" extension (see <xref target="sec-trl-endpoint-supporting-cursor"/>).</t>
      <t>Except for MAX_N defined in <xref target="sec-trl-endpoint-supporting-diff-queries"/>, all the other parameters are defined in <xref target="sec-trl-endpoint-supporting-cursor"/> and are used only if the AS supports the "Cursor" extension.</t>
      <t>For each parameter, the columns of the table specify the following information. Both a registered device and an administrator are referred to as "requester".</t>
      <ul spacing="normal">
        <li>
          <t>Name: parameter name. A name with letters in uppercase denotes a parameter whose value does not change after its initialization.</t>
        </li>
        <li>
          <t>Single instance: "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).</t>
        </li>
        <li>
          <t>Description: short parameter description.</t>
        </li>
        <li>
          <t>Values: the unsigned integer values that the parameter can assume, where LB and UB denote the inclusive lower bound and upper bound, respectively, and "^" is the exponentiation operator.</t>
        </li>
      </ul>
      <table align="center" anchor="_table-TRL-endpoint-parameters">
        <name>Local Supportive Parameters of the TRL Endpoint</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Single  instance</th>
            <th align="left">Description</th>
            <th align="left">Values</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">MAX_N</td>
            <td align="left">Y</td>
            <td align="left">Max number of series items in the update collection of each requester</td>
            <td align="left">LB = 1 <br/><br/> If supporting <br/> "Cursor", then <br/> UB = MAX_INDEX+1</td>
          </tr>
          <tr>
            <td align="left">MAX_DIFF_BATCH</td>
            <td align="left">N</td>
            <td align="left">Max number of diff entries included in a diff query response when using "Cursor"</td>
            <td align="left">LB = 1 <br/><br/> UB = MAX_N</td>
          </tr>
          <tr>
            <td align="left">MAX_INDEX</td>
            <td align="left">Y</td>
            <td align="left">Max value of each instance of the 'index' parameter</td>
            <td align="left">LB = MAX_N-1 <br/><br/> UB = (2^64)-1</td>
          </tr>
          <tr>
            <td align="left">index</td>
            <td align="left">N</td>
            <td align="left">Value associated with a series item of an update collection</td>
            <td align="left">LB = 0 <br/><br/> UB = MAX_INDEX</td>
          </tr>
          <tr>
            <td align="left">last_index</td>
            <td align="left">N</td>
            <td align="left">The 'index' value of the most recently added series item in an update collection</td>
            <td align="left">LB = 0 <br/><br/> UB = MAX_INDEX</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="sec-RS-examples">
      <name>Interaction Examples</name>
      <t>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>The AS supports both full queries and diff queries of the TRL, as defined in <xref target="ssec-trl-full-query"/> and <xref target="ssec-trl-diff-query"/>, respectively.</t>
      <t>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">
        <li>
          <t>a 'trl_path' parameter, specifying the path of the TRL endpoint;</t>
        </li>
        <li>
          <t>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"/>;</t>
        </li>
        <li>
          <t>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="ssec-trl-diff-query"/>);</t>
        </li>
        <li>
          <t>possible further parameters related to the registration process.</t>
        </li>
      </ul>
      <t>Furthermore, 'h(x)' refers to the hash function used to compute the token hashes, as defined in <xref target="sec-token-name"/> of this specification and according to <xref target="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"/>), 'bstr.h(t1)' and 'bstr.h(t2)' denote the CBOR byte strings with value the token hashes of the access tokens t1 and t2, respectively.</t>
      <section anchor="sec-RS-example-1">
        <name>Full Query with Observe</name>
        <t><xref target="fig-RS-AS"/> shows an interaction example considering a CoAP observation and a full query of the TRL.</t>
        <t>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">
          <name>Interaction for full query with Observe</name>
          <artset>
            <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1296" width="440" viewBox="0 0 440 1296" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,1280" fill="none" stroke="black"/>
                <path d="M 432,48 L 432,1280" fill="none" stroke="black"/>
                <path d="M 8,80 L 424,80" fill="none" stroke="black"/>
                <path d="M 16,112 L 432,112" fill="none" stroke="black"/>
                <path d="M 8,288 L 424,288" fill="none" stroke="black"/>
                <path d="M 16,320 L 432,320" fill="none" stroke="black"/>
                <path d="M 16,592 L 432,592" fill="none" stroke="black"/>
                <path d="M 16,784 L 432,784" fill="none" stroke="black"/>
                <path d="M 16,976 L 432,976" fill="none" stroke="black"/>
                <path d="M 16,1168 L 432,1168" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="432,288 420,282.4 420,293.6" fill="black" transform="rotate(0,424,288)"/>
                <polygon class="arrowhead" points="432,80 420,74.4 420,85.6" fill="black" transform="rotate(0,424,80)"/>
                <polygon class="arrowhead" points="24,1168 12,1162.4 12,1173.6" fill="black" transform="rotate(180,16,1168)"/>
                <polygon class="arrowhead" points="24,976 12,970.4 12,981.6" fill="black" transform="rotate(180,16,976)"/>
                <polygon class="arrowhead" points="24,784 12,778.4 12,789.6" fill="black" transform="rotate(180,16,784)"/>
                <polygon class="arrowhead" points="24,592 12,586.4 12,597.6" fill="black" transform="rotate(180,16,592)"/>
                <polygon class="arrowhead" points="24,320 12,314.4 12,325.6" fill="black" transform="rotate(180,16,320)"/>
                <polygon class="arrowhead" points="24,112 12,106.4 12,117.6" fill="black" transform="rotate(180,16,112)"/>
                <g class="text">
                  <text x="12" y="36">RS</text>
                  <text x="428" y="36">AS</text>
                  <text x="80" y="68">Registration:</text>
                  <text x="156" y="68">POST</text>
                  <text x="180" y="132">2.01</text>
                  <text x="232" y="132">Created</text>
                  <text x="212" y="148">Payload:</text>
                  <text x="256" y="148">{</text>
                  <text x="200" y="164">/</text>
                  <text x="224" y="164">...</text>
                  <text x="248" y="164">/</text>
                  <text x="236" y="180">"trl_path"</text>
                  <text x="288" y="180">:</text>
                  <text x="356" y="180">"/revoke/trl",</text>
                  <text x="236" y="196">"trl_hash"</text>
                  <text x="288" y="196">:</text>
                  <text x="340" y="196">"sha-256",</text>
                  <text x="248" y="212">"max_n"</text>
                  <text x="288" y="212">:</text>
                  <text x="308" y="212">10</text>
                  <text x="184" y="228">}</text>
                  <text x="40" y="260">GET</text>
                  <text x="192" y="260">coap://as.example.com/revoke/trl/</text>
                  <text x="76" y="276">Observe:</text>
                  <text x="120" y="276">0</text>
                  <text x="76" y="340">2.05</text>
                  <text x="128" y="340">Content</text>
                  <text x="108" y="356">Observe:</text>
                  <text x="156" y="356">42</text>
                  <text x="136" y="372">Content-Format:</text>
                  <text x="300" y="372">application/ace-trl+cbor</text>
                  <text x="108" y="388">Payload:</text>
                  <text x="152" y="388">{</text>
                  <text x="136" y="404">e'full_set'</text>
                  <text x="192" y="404">:</text>
                  <text x="212" y="404">[]</text>
                  <text x="80" y="420">}</text>
                  <text x="216" y="452">...</text>
                  <text x="120" y="484">(Access</text>
                  <text x="180" y="484">tokens</text>
                  <text x="220" y="484">t1</text>
                  <text x="248" y="484">and</text>
                  <text x="276" y="484">t2</text>
                  <text x="316" y="484">issued</text>
                  <text x="104" y="500">and</text>
                  <text x="172" y="500">successfully</text>
                  <text x="264" y="500">submitted</text>
                  <text x="316" y="500">to</text>
                  <text x="344" y="500">RS)</text>
                  <text x="216" y="532">...</text>
                  <text x="144" y="564">(Access</text>
                  <text x="200" y="564">token</text>
                  <text x="236" y="564">t1</text>
                  <text x="260" y="564">is</text>
                  <text x="308" y="564">revoked)</text>
                  <text x="76" y="612">2.05</text>
                  <text x="128" y="612">Content</text>
                  <text x="108" y="628">Observe:</text>
                  <text x="156" y="628">53</text>
                  <text x="136" y="644">Content-Format:</text>
                  <text x="300" y="644">application/ace-trl+cbor</text>
                  <text x="108" y="660">Payload:</text>
                  <text x="152" y="660">{</text>
                  <text x="136" y="676">e'full_set'</text>
                  <text x="192" y="676">:</text>
                  <text x="252" y="676">[bstr.h(t1)]</text>
                  <text x="80" y="692">}</text>
                  <text x="216" y="724">...</text>
                  <text x="144" y="756">(Access</text>
                  <text x="200" y="756">token</text>
                  <text x="236" y="756">t2</text>
                  <text x="260" y="756">is</text>
                  <text x="308" y="756">revoked)</text>
                  <text x="76" y="804">2.05</text>
                  <text x="128" y="804">Content</text>
                  <text x="108" y="820">Observe:</text>
                  <text x="156" y="820">64</text>
                  <text x="136" y="836">Content-Format:</text>
                  <text x="300" y="836">application/ace-trl+cbor</text>
                  <text x="108" y="852">Payload:</text>
                  <text x="152" y="852">{</text>
                  <text x="136" y="868">e'full_set'</text>
                  <text x="192" y="868">:</text>
                  <text x="252" y="868">[bstr.h(t1),</text>
                  <text x="352" y="868">bstr.h(t2)]</text>
                  <text x="80" y="884">}</text>
                  <text x="216" y="916">...</text>
                  <text x="144" y="948">(Access</text>
                  <text x="200" y="948">token</text>
                  <text x="236" y="948">t1</text>
                  <text x="284" y="948">expires)</text>
                  <text x="76" y="996">2.05</text>
                  <text x="128" y="996">Content</text>
                  <text x="108" y="1012">Observe:</text>
                  <text x="156" y="1012">75</text>
                  <text x="136" y="1028">Content-Format:</text>
                  <text x="300" y="1028">application/ace-trl+cbor</text>
                  <text x="108" y="1044">Payload:</text>
                  <text x="152" y="1044">{</text>
                  <text x="136" y="1060">e'full_set'</text>
                  <text x="192" y="1060">:</text>
                  <text x="252" y="1060">[bstr.h(t2)]</text>
                  <text x="80" y="1076">}</text>
                  <text x="216" y="1108">...</text>
                  <text x="144" y="1140">(Access</text>
                  <text x="200" y="1140">token</text>
                  <text x="236" y="1140">t2</text>
                  <text x="284" y="1140">expires)</text>
                  <text x="76" y="1188">2.05</text>
                  <text x="128" y="1188">Content</text>
                  <text x="108" y="1204">Observe:</text>
                  <text x="156" y="1204">86</text>
                  <text x="136" y="1220">Content-Format:</text>
                  <text x="300" y="1220">application/ace-trl+cbor</text>
                  <text x="108" y="1236">Payload:</text>
                  <text x="152" y="1236">{</text>
                  <text x="136" y="1252">e'full_set'</text>
                  <text x="192" y="1252">:</text>
                  <text x="212" y="1252">[]</text>
                  <text x="80" y="1268">}</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art" align="center"><![CDATA[
RS                                                  AS
|                                                    |
|  Registration: POST                                |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|                   2.01 Created                     |
|                     Payload: {                     |
|                       / ... /                      |
|                       "trl_path" : "/revoke/trl",  |
|                       "trl_hash" : "sha-256",      |
|                          "max_n" : 10              |
|                     }                              |
|                                                    |
|  GET coap://as.example.com/revoke/trl/             |
|    Observe: 0                                      |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 42                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'full_set' : []                          |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|          (Access tokens t1 and t2 issued           |
|          and successfully submitted to RS)         |
|                                                    |
|                        ...                         |
|                                                    |
|             (Access token t1 is revoked)           |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 53                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'full_set' : [bstr.h(t1)]                |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|             (Access token t2 is revoked)           |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 64                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'full_set' : [bstr.h(t1), bstr.h(t2)]    |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|             (Access token t1 expires)              |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 75                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'full_set' : [bstr.h(t2)]                |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|             (Access token t2 expires)              |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 86                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'full_set' : []                          |
|        }                                           |
|                                                    |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="sec-RS-example-2">
        <name>Diff Query with Observe</name>
        <t><xref target="fig-RS-AS-2"/> shows an interaction example considering a CoAP observation and a diff query of the TRL.</t>
        <t>The RS indicates N = 3 as value of the 'diff' query parameter, i.e., as the maximum number of diff entries to be specified in a response from the AS.</t>
        <t>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">
          <name>Interaction for diff query with Observe</name>
          <artset>
            <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1504" width="440" viewBox="0 0 440 1504" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,1488" fill="none" stroke="black"/>
                <path d="M 432,48 L 432,1488" fill="none" stroke="black"/>
                <path d="M 8,80 L 424,80" fill="none" stroke="black"/>
                <path d="M 16,112 L 432,112" fill="none" stroke="black"/>
                <path d="M 8,288 L 424,288" fill="none" stroke="black"/>
                <path d="M 16,320 L 432,320" fill="none" stroke="black"/>
                <path d="M 16,592 L 432,592" fill="none" stroke="black"/>
                <path d="M 16,816 L 432,816" fill="none" stroke="black"/>
                <path d="M 16,1056 L 432,1056" fill="none" stroke="black"/>
                <path d="M 16,1312 L 432,1312" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="432,288 420,282.4 420,293.6" fill="black" transform="rotate(0,424,288)"/>
                <polygon class="arrowhead" points="432,80 420,74.4 420,85.6" fill="black" transform="rotate(0,424,80)"/>
                <polygon class="arrowhead" points="24,1312 12,1306.4 12,1317.6" fill="black" transform="rotate(180,16,1312)"/>
                <polygon class="arrowhead" points="24,1056 12,1050.4 12,1061.6" fill="black" transform="rotate(180,16,1056)"/>
                <polygon class="arrowhead" points="24,816 12,810.4 12,821.6" fill="black" transform="rotate(180,16,816)"/>
                <polygon class="arrowhead" points="24,592 12,586.4 12,597.6" fill="black" transform="rotate(180,16,592)"/>
                <polygon class="arrowhead" points="24,320 12,314.4 12,325.6" fill="black" transform="rotate(180,16,320)"/>
                <polygon class="arrowhead" points="24,112 12,106.4 12,117.6" fill="black" transform="rotate(180,16,112)"/>
                <g class="text">
                  <text x="12" y="36">RS</text>
                  <text x="428" y="36">AS</text>
                  <text x="80" y="68">Registration:</text>
                  <text x="156" y="68">POST</text>
                  <text x="180" y="132">2.01</text>
                  <text x="232" y="132">Created</text>
                  <text x="212" y="148">Payload:</text>
                  <text x="256" y="148">{</text>
                  <text x="200" y="164">/</text>
                  <text x="224" y="164">...</text>
                  <text x="248" y="164">/</text>
                  <text x="236" y="180">"trl_path"</text>
                  <text x="288" y="180">:</text>
                  <text x="356" y="180">"/revoke/trl",</text>
                  <text x="236" y="196">"trl_hash"</text>
                  <text x="288" y="196">:</text>
                  <text x="340" y="196">"sha-256",</text>
                  <text x="248" y="212">"max_n"</text>
                  <text x="288" y="212">:</text>
                  <text x="308" y="212">10</text>
                  <text x="184" y="228">}</text>
                  <text x="40" y="260">GET</text>
                  <text x="216" y="260">coap://as.example.com/revoke/trl?diff=3</text>
                  <text x="76" y="276">Observe:</text>
                  <text x="120" y="276">0</text>
                  <text x="76" y="340">2.05</text>
                  <text x="128" y="340">Content</text>
                  <text x="108" y="356">Observe:</text>
                  <text x="156" y="356">42</text>
                  <text x="136" y="372">Content-Format:</text>
                  <text x="300" y="372">application/ace-trl+cbor</text>
                  <text x="108" y="388">Payload:</text>
                  <text x="152" y="388">{</text>
                  <text x="136" y="404">e'diff_set'</text>
                  <text x="192" y="404">:</text>
                  <text x="212" y="404">[]</text>
                  <text x="80" y="420">}</text>
                  <text x="216" y="452">...</text>
                  <text x="120" y="484">(Access</text>
                  <text x="180" y="484">tokens</text>
                  <text x="220" y="484">t1</text>
                  <text x="248" y="484">and</text>
                  <text x="276" y="484">t2</text>
                  <text x="316" y="484">issued</text>
                  <text x="104" y="500">and</text>
                  <text x="172" y="500">successfully</text>
                  <text x="264" y="500">submitted</text>
                  <text x="316" y="500">to</text>
                  <text x="344" y="500">RS)</text>
                  <text x="216" y="532">...</text>
                  <text x="136" y="564">(Access</text>
                  <text x="192" y="564">token</text>
                  <text x="228" y="564">t1</text>
                  <text x="252" y="564">is</text>
                  <text x="300" y="564">revoked)</text>
                  <text x="76" y="612">2.05</text>
                  <text x="128" y="612">Content</text>
                  <text x="108" y="628">Observe:</text>
                  <text x="156" y="628">53</text>
                  <text x="136" y="644">Content-Format:</text>
                  <text x="300" y="644">application/ace-trl+cbor</text>
                  <text x="108" y="660">Payload:</text>
                  <text x="152" y="660">{</text>
                  <text x="136" y="676">e'diff_set'</text>
                  <text x="192" y="676">:</text>
                  <text x="208" y="676">[</text>
                  <text x="216" y="692">[</text>
                  <text x="240" y="692">[],</text>
                  <text x="308" y="692">[bstr.h(t1)]</text>
                  <text x="368" y="692">]</text>
                  <text x="208" y="708">]</text>
                  <text x="80" y="724">}</text>
                  <text x="216" y="756">...</text>
                  <text x="136" y="788">(Access</text>
                  <text x="192" y="788">token</text>
                  <text x="228" y="788">t2</text>
                  <text x="252" y="788">is</text>
                  <text x="300" y="788">revoked)</text>
                  <text x="76" y="836">2.05</text>
                  <text x="128" y="836">Content</text>
                  <text x="108" y="852">Observe:</text>
                  <text x="156" y="852">64</text>
                  <text x="136" y="868">Content-Format:</text>
                  <text x="300" y="868">application/ace-trl+cbor</text>
                  <text x="108" y="884">Payload:</text>
                  <text x="152" y="884">{</text>
                  <text x="136" y="900">e'diff_set'</text>
                  <text x="192" y="900">:</text>
                  <text x="208" y="900">[</text>
                  <text x="216" y="916">[</text>
                  <text x="240" y="916">[],</text>
                  <text x="308" y="916">[bstr.h(t2)]</text>
                  <text x="372" y="916">],</text>
                  <text x="216" y="932">[</text>
                  <text x="240" y="932">[],</text>
                  <text x="308" y="932">[bstr.h(t1)]</text>
                  <text x="368" y="932">]</text>
                  <text x="208" y="948">]</text>
                  <text x="80" y="964">}</text>
                  <text x="216" y="996">...</text>
                  <text x="152" y="1028">(Access</text>
                  <text x="208" y="1028">token</text>
                  <text x="244" y="1028">t1</text>
                  <text x="292" y="1028">expires)</text>
                  <text x="76" y="1076">2.05</text>
                  <text x="128" y="1076">Content</text>
                  <text x="108" y="1092">Observe:</text>
                  <text x="156" y="1092">75</text>
                  <text x="136" y="1108">Content-Format:</text>
                  <text x="300" y="1108">application/ace-trl+cbor</text>
                  <text x="108" y="1124">Payload:</text>
                  <text x="152" y="1124">{</text>
                  <text x="136" y="1140">e'diff_set'</text>
                  <text x="192" y="1140">:</text>
                  <text x="208" y="1140">[</text>
                  <text x="216" y="1156">[</text>
                  <text x="280" y="1156">[bstr.h(t1)],</text>
                  <text x="348" y="1156">[]</text>
                  <text x="372" y="1156">],</text>
                  <text x="216" y="1172">[</text>
                  <text x="240" y="1172">[],</text>
                  <text x="308" y="1172">[bstr.h(t2)]</text>
                  <text x="372" y="1172">],</text>
                  <text x="216" y="1188">[</text>
                  <text x="240" y="1188">[],</text>
                  <text x="308" y="1188">[bstr.h(t1)]</text>
                  <text x="368" y="1188">]</text>
                  <text x="208" y="1204">]</text>
                  <text x="80" y="1220">}</text>
                  <text x="216" y="1252">...</text>
                  <text x="152" y="1284">(Access</text>
                  <text x="208" y="1284">token</text>
                  <text x="244" y="1284">t2</text>
                  <text x="292" y="1284">expires)</text>
                  <text x="76" y="1332">2.05</text>
                  <text x="128" y="1332">Content</text>
                  <text x="108" y="1348">Observe:</text>
                  <text x="156" y="1348">86</text>
                  <text x="136" y="1364">Content-Format:</text>
                  <text x="300" y="1364">application/ace-trl+cbor</text>
                  <text x="108" y="1380">Payload:</text>
                  <text x="152" y="1380">{</text>
                  <text x="136" y="1396">e'diff_set'</text>
                  <text x="192" y="1396">:</text>
                  <text x="208" y="1396">[</text>
                  <text x="216" y="1412">[</text>
                  <text x="280" y="1412">[bstr.h(t2)],</text>
                  <text x="348" y="1412">[]</text>
                  <text x="372" y="1412">],</text>
                  <text x="216" y="1428">[</text>
                  <text x="280" y="1428">[bstr.h(t1)],</text>
                  <text x="348" y="1428">[]</text>
                  <text x="372" y="1428">],</text>
                  <text x="216" y="1444">[</text>
                  <text x="240" y="1444">[],</text>
                  <text x="308" y="1444">[bstr.h(t2)]</text>
                  <text x="368" y="1444">]</text>
                  <text x="208" y="1460">]</text>
                  <text x="80" y="1476">}</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art" align="center"><![CDATA[
RS                                                  AS
|                                                    |
|  Registration: POST                                |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|                   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                                      |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 42                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'diff_set' : []                          |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|          (Access tokens t1 and t2 issued           |
|          and successfully submitted to RS)         |
|                                                    |
|                        ...                         |
|                                                    |
|            (Access token t1 is revoked)            |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 53                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'diff_set' : [                           |
|                         [ [], [bstr.h(t1)] ]       |
|                        ]                           |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|            (Access token t2 is revoked)            |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 64                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'diff_set' : [                           |
|                         [ [], [bstr.h(t2)] ],      |
|                         [ [], [bstr.h(t1)] ]       |
|                        ]                           |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|              (Access token t1 expires)             |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 75                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'diff_set' : [                           |
|                         [ [bstr.h(t1)], [] ],      |
|                         [ [], [bstr.h(t2)] ],      |
|                         [ [], [bstr.h(t1)] ]       |
|                        ]                           |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|              (Access token t2 expires)             |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 86                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'diff_set' : [                           |
|                         [ [bstr.h(t2)], [] ],      |
|                         [ [bstr.h(t1)], [] ],      |
|                         [ [], [bstr.h(t2)] ]       |
|                        ]                           |
|        }                                           |
|                                                    |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="sec-RS-example-3">
        <name>Full Query with Observe plus Diff Query</name>
        <t><xref target="fig-RS-AS-3"/> shows an interaction example considering a CoAP observation and a full query of the TRL.</t>
        <t>The example also considers one of the notifications from the AS to get lost in transmission, and thus not reaching the RS.</t>
        <t>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, to perform a diff query of the TRL. The RS indicates N = 8 as value of the 'diff' query parameter, i.e., as the maximum number of diff entries to be specified in a response from the AS.</t>
        <t>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">
          <name>Interaction for full query with Observe plus diff query</name>
          <artset>
            <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1632" width="440" viewBox="0 0 440 1632" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,1616" fill="none" stroke="black"/>
                <path d="M 432,48 L 432,1616" fill="none" stroke="black"/>
                <path d="M 8,80 L 424,80" fill="none" stroke="black"/>
                <path d="M 16,112 L 432,112" fill="none" stroke="black"/>
                <path d="M 8,288 L 424,288" fill="none" stroke="black"/>
                <path d="M 16,320 L 432,320" fill="none" stroke="black"/>
                <path d="M 16,592 L 432,592" fill="none" stroke="black"/>
                <path d="M 16,784 L 432,784" fill="none" stroke="black"/>
                <path d="M 16,976 L 432,976" fill="none" stroke="black"/>
                <path d="M 88,1168 L 432,1168" fill="none" stroke="black"/>
                <path d="M 8,1408 L 424,1408" fill="none" stroke="black"/>
                <path d="M 16,1440 L 432,1440" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="432,1408 420,1402.4 420,1413.6" fill="black" transform="rotate(0,424,1408)"/>
                <polygon class="arrowhead" points="432,288 420,282.4 420,293.6" fill="black" transform="rotate(0,424,288)"/>
                <polygon class="arrowhead" points="432,80 420,74.4 420,85.6" fill="black" transform="rotate(0,424,80)"/>
                <polygon class="arrowhead" points="96,1168 84,1162.4 84,1173.6" fill="black" transform="rotate(180,88,1168)"/>
                <polygon class="arrowhead" points="24,1440 12,1434.4 12,1445.6" fill="black" transform="rotate(180,16,1440)"/>
                <polygon class="arrowhead" points="24,976 12,970.4 12,981.6" fill="black" transform="rotate(180,16,976)"/>
                <polygon class="arrowhead" points="24,784 12,778.4 12,789.6" fill="black" transform="rotate(180,16,784)"/>
                <polygon class="arrowhead" points="24,592 12,586.4 12,597.6" fill="black" transform="rotate(180,16,592)"/>
                <polygon class="arrowhead" points="24,320 12,314.4 12,325.6" fill="black" transform="rotate(180,16,320)"/>
                <polygon class="arrowhead" points="24,112 12,106.4 12,117.6" fill="black" transform="rotate(180,16,112)"/>
                <g class="text">
                  <text x="12" y="36">RS</text>
                  <text x="428" y="36">AS</text>
                  <text x="80" y="68">Registration:</text>
                  <text x="156" y="68">POST</text>
                  <text x="180" y="132">2.01</text>
                  <text x="232" y="132">Created</text>
                  <text x="212" y="148">Payload:</text>
                  <text x="256" y="148">{</text>
                  <text x="200" y="164">/</text>
                  <text x="224" y="164">...</text>
                  <text x="248" y="164">/</text>
                  <text x="236" y="180">"trl_path"</text>
                  <text x="288" y="180">:</text>
                  <text x="356" y="180">"/revoke/trl",</text>
                  <text x="236" y="196">"trl_hash"</text>
                  <text x="288" y="196">:</text>
                  <text x="340" y="196">"sha-256",</text>
                  <text x="248" y="212">"max_n"</text>
                  <text x="288" y="212">:</text>
                  <text x="308" y="212">10</text>
                  <text x="184" y="228">}</text>
                  <text x="40" y="260">GET</text>
                  <text x="192" y="260">coap://as.example.com/revoke/trl/</text>
                  <text x="76" y="276">Observe:</text>
                  <text x="120" y="276">0</text>
                  <text x="76" y="340">2.05</text>
                  <text x="128" y="340">Content</text>
                  <text x="108" y="356">Observe:</text>
                  <text x="156" y="356">42</text>
                  <text x="136" y="372">Content-Format:</text>
                  <text x="300" y="372">application/ace-trl+cbor</text>
                  <text x="108" y="388">Payload:</text>
                  <text x="152" y="388">{</text>
                  <text x="136" y="404">e'full_set'</text>
                  <text x="192" y="404">:</text>
                  <text x="212" y="404">[]</text>
                  <text x="80" y="420">}</text>
                  <text x="216" y="452">...</text>
                  <text x="120" y="484">(Access</text>
                  <text x="180" y="484">tokens</text>
                  <text x="220" y="484">t1</text>
                  <text x="248" y="484">and</text>
                  <text x="276" y="484">t2</text>
                  <text x="316" y="484">issued</text>
                  <text x="104" y="500">and</text>
                  <text x="172" y="500">successfully</text>
                  <text x="264" y="500">submitted</text>
                  <text x="316" y="500">to</text>
                  <text x="344" y="500">RS)</text>
                  <text x="216" y="532">...</text>
                  <text x="136" y="564">(Access</text>
                  <text x="192" y="564">token</text>
                  <text x="228" y="564">t1</text>
                  <text x="252" y="564">is</text>
                  <text x="300" y="564">revoked)</text>
                  <text x="76" y="612">2.05</text>
                  <text x="128" y="612">Content</text>
                  <text x="108" y="628">Observe:</text>
                  <text x="156" y="628">53</text>
                  <text x="136" y="644">Content-Format:</text>
                  <text x="300" y="644">application/ace-trl+cbor</text>
                  <text x="108" y="660">Payload:</text>
                  <text x="152" y="660">{</text>
                  <text x="136" y="676">e'full_set'</text>
                  <text x="192" y="676">:</text>
                  <text x="252" y="676">[bstr.h(t1)]</text>
                  <text x="80" y="692">}</text>
                  <text x="216" y="724">...</text>
                  <text x="136" y="756">(Access</text>
                  <text x="192" y="756">token</text>
                  <text x="228" y="756">t2</text>
                  <text x="252" y="756">is</text>
                  <text x="300" y="756">revoked)</text>
                  <text x="76" y="804">2.05</text>
                  <text x="128" y="804">Content</text>
                  <text x="108" y="820">Observe:</text>
                  <text x="156" y="820">64</text>
                  <text x="136" y="836">Content-Format:</text>
                  <text x="300" y="836">application/ace-trl+cbor</text>
                  <text x="108" y="852">Payload:</text>
                  <text x="152" y="852">{</text>
                  <text x="136" y="868">e'full_set'</text>
                  <text x="192" y="868">:</text>
                  <text x="252" y="868">[bstr.h(t1),</text>
                  <text x="352" y="868">bstr.h(t2)]</text>
                  <text x="80" y="884">}</text>
                  <text x="216" y="916">...</text>
                  <text x="144" y="948">(Access</text>
                  <text x="200" y="948">token</text>
                  <text x="236" y="948">t1</text>
                  <text x="284" y="948">expires)</text>
                  <text x="76" y="996">2.05</text>
                  <text x="128" y="996">Content</text>
                  <text x="108" y="1012">Observe:</text>
                  <text x="156" y="1012">75</text>
                  <text x="136" y="1028">Content-Format:</text>
                  <text x="300" y="1028">application/ace-trl+cbor</text>
                  <text x="108" y="1044">Payload:</text>
                  <text x="152" y="1044">{</text>
                  <text x="136" y="1060">e'full_set'</text>
                  <text x="192" y="1060">:</text>
                  <text x="252" y="1060">[bstr.h(t2)]</text>
                  <text x="80" y="1076">}</text>
                  <text x="216" y="1108">...</text>
                  <text x="144" y="1140">(Access</text>
                  <text x="200" y="1140">token</text>
                  <text x="236" y="1140">t2</text>
                  <text x="284" y="1140">expires)</text>
                  <text x="44" y="1172">Lost</text>
                  <text x="72" y="1172">X</text>
                  <text x="76" y="1188">2.05</text>
                  <text x="128" y="1188">Content</text>
                  <text x="108" y="1204">Observe:</text>
                  <text x="156" y="1204">86</text>
                  <text x="136" y="1220">Content-Format:</text>
                  <text x="300" y="1220">application/ace-trl+cbor</text>
                  <text x="108" y="1236">Payload:</text>
                  <text x="152" y="1236">{</text>
                  <text x="136" y="1252">e'full_set'</text>
                  <text x="192" y="1252">:</text>
                  <text x="212" y="1252">[]</text>
                  <text x="80" y="1268">}</text>
                  <text x="216" y="1300">...</text>
                  <text x="128" y="1332">(Enough</text>
                  <text x="180" y="1332">time</text>
                  <text x="216" y="1332">has</text>
                  <text x="260" y="1332">passed</text>
                  <text x="312" y="1332">since</text>
                  <text x="96" y="1348">the</text>
                  <text x="140" y="1348">latest</text>
                  <text x="204" y="1348">received</text>
                  <text x="296" y="1348">notification)</text>
                  <text x="40" y="1396">GET</text>
                  <text x="216" y="1396">coap://as.example.com/revoke/trl?diff=8</text>
                  <text x="76" y="1460">2.05</text>
                  <text x="128" y="1460">Content</text>
                  <text x="136" y="1476">Content-Format:</text>
                  <text x="300" y="1476">application/ace-trl+cbor</text>
                  <text x="108" y="1492">Payload:</text>
                  <text x="152" y="1492">{</text>
                  <text x="136" y="1508">e'diff_set'</text>
                  <text x="192" y="1508">:</text>
                  <text x="208" y="1508">[</text>
                  <text x="216" y="1524">[</text>
                  <text x="280" y="1524">[bstr.h(t2)],</text>
                  <text x="348" y="1524">[]</text>
                  <text x="372" y="1524">],</text>
                  <text x="216" y="1540">[</text>
                  <text x="280" y="1540">[bstr.h(t1)],</text>
                  <text x="348" y="1540">[]</text>
                  <text x="372" y="1540">],</text>
                  <text x="216" y="1556">[</text>
                  <text x="240" y="1556">[],</text>
                  <text x="308" y="1556">[bstr.h(t2)]</text>
                  <text x="372" y="1556">],</text>
                  <text x="216" y="1572">[</text>
                  <text x="240" y="1572">[],</text>
                  <text x="308" y="1572">[bstr.h(t1)]</text>
                  <text x="368" y="1572">]</text>
                  <text x="208" y="1588">]</text>
                  <text x="80" y="1604">}</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art" align="center"><![CDATA[
RS                                                  AS
|                                                    |
|  Registration: POST                                |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|                   2.01 Created                     |
|                     Payload: {                     |
|                       / ... /                      |
|                       "trl_path" : "/revoke/trl",  |
|                       "trl_hash" : "sha-256",      |
|                          "max_n" : 10              |
|                     }                              |
|                                                    |
|  GET coap://as.example.com/revoke/trl/             |
|    Observe: 0                                      |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 42                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'full_set' : []                          |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|          (Access tokens t1 and t2 issued           |
|          and successfully submitted to RS)         |
|                                                    |
|                        ...                         |
|                                                    |
|            (Access token t1 is revoked)            |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 53                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'full_set' : [bstr.h(t1)]                |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|            (Access token t2 is revoked)            |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 64                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'full_set' : [bstr.h(t1), bstr.h(t2)]    |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|             (Access token t1 expires)              |
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Observe: 75                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'full_set' : [bstr.h(t2)]                |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|             (Access token t2 expires)              |
|                                                    |
|  Lost X <------------------------------------------+
|      2.05 Content                                  |
|        Observe: 86                                 |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'full_set' : []                          |
|        }                                           |
|                                                    |
|                        ...                         |
|                                                    |
|           (Enough time has passed since            |
|         the latest received notification)          |
|                                                    |
|                                                    |
|  GET coap://as.example.com/revoke/trl?diff=8       |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|      2.05 Content                                  |
|        Content-Format: application/ace-trl+cbor    |
|        Payload: {                                  |
|          e'diff_set' : [                           |
|                         [ [bstr.h(t2)], [] ],      |
|                         [ [bstr.h(t1)], [] ],      |
|                         [ [], [bstr.h(t2)] ],      |
|                         [ [], [bstr.h(t1)] ]       |
|                        ]                           |
|        }                                           |
|                                                    |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="sec-RS-example-2-3">
        <name>Diff Query with Observe and "Cursor"</name>
        <t>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><xref target="fig-RS-AS-4"/> shows an interaction example considering a CoAP observation and a diff query of the TRL.</t>
        <t>The RS specifies the query parameter 'diff' with value 3, i.e., the maximum number of diff entries to be specified in a response from the AS.</t>
        <t>After 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, to perform a diff query of the TRL.</t>
        <t>This is followed up by a further diff query request that specifies the query parameter 'cursor'. 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">
          <name>Interaction for diff query with Observe and "Cursor"</name>
          <artset>
            <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="2224" width="472" viewBox="0 0 472 2224" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,2208" fill="none" stroke="black"/>
                <path d="M 464,48 L 464,2208" fill="none" stroke="black"/>
                <path d="M 8,80 L 456,80" fill="none" stroke="black"/>
                <path d="M 16,112 L 464,112" fill="none" stroke="black"/>
                <path d="M 8,304 L 456,304" fill="none" stroke="black"/>
                <path d="M 16,336 L 464,336" fill="none" stroke="black"/>
                <path d="M 16,640 L 464,640" fill="none" stroke="black"/>
                <path d="M 16,896 L 464,896" fill="none" stroke="black"/>
                <path d="M 16,1168 L 464,1168" fill="none" stroke="black"/>
                <path d="M 16,1456 L 464,1456" fill="none" stroke="black"/>
                <path d="M 8,1792 L 456,1792" fill="none" stroke="black"/>
                <path d="M 16,1824 L 464,1824" fill="none" stroke="black"/>
                <path d="M 8,2048 L 456,2048" fill="none" stroke="black"/>
                <path d="M 16,2080 L 464,2080" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="464,2048 452,2042.4 452,2053.6" fill="black" transform="rotate(0,456,2048)"/>
                <polygon class="arrowhead" points="464,1792 452,1786.4 452,1797.6" fill="black" transform="rotate(0,456,1792)"/>
                <polygon class="arrowhead" points="464,304 452,298.4 452,309.6" fill="black" transform="rotate(0,456,304)"/>
                <polygon class="arrowhead" points="464,80 452,74.4 452,85.6" fill="black" transform="rotate(0,456,80)"/>
                <polygon class="arrowhead" points="24,2080 12,2074.4 12,2085.6" fill="black" transform="rotate(180,16,2080)"/>
                <polygon class="arrowhead" points="24,1824 12,1818.4 12,1829.6" fill="black" transform="rotate(180,16,1824)"/>
                <polygon class="arrowhead" points="24,1456 12,1450.4 12,1461.6" fill="black" transform="rotate(180,16,1456)"/>
                <polygon class="arrowhead" points="24,1168 12,1162.4 12,1173.6" fill="black" transform="rotate(180,16,1168)"/>
                <polygon class="arrowhead" points="24,896 12,890.4 12,901.6" fill="black" transform="rotate(180,16,896)"/>
                <polygon class="arrowhead" points="24,640 12,634.4 12,645.6" fill="black" transform="rotate(180,16,640)"/>
                <polygon class="arrowhead" points="24,336 12,330.4 12,341.6" fill="black" transform="rotate(180,16,336)"/>
                <polygon class="arrowhead" points="24,112 12,106.4 12,117.6" fill="black" transform="rotate(180,16,112)"/>
                <g class="text">
                  <text x="12" y="36">RS</text>
                  <text x="460" y="36">AS</text>
                  <text x="80" y="68">Registration:</text>
                  <text x="156" y="68">POST</text>
                  <text x="172" y="132">2.01</text>
                  <text x="224" y="132">Created</text>
                  <text x="204" y="148">Payload:</text>
                  <text x="248" y="148">{</text>
                  <text x="232" y="164">/</text>
                  <text x="256" y="164">...</text>
                  <text x="280" y="164">/</text>
                  <text x="268" y="180">"trl_path"</text>
                  <text x="320" y="180">:</text>
                  <text x="388" y="180">"/revoke/trl",</text>
                  <text x="268" y="196">"trl_hash"</text>
                  <text x="320" y="196">:</text>
                  <text x="372" y="196">"sha-256",</text>
                  <text x="280" y="212">"max_n"</text>
                  <text x="320" y="212">:</text>
                  <text x="344" y="212">10,</text>
                  <text x="256" y="228">"max_diff_batch":</text>
                  <text x="336" y="228">5</text>
                  <text x="176" y="244">}</text>
                  <text x="40" y="276">GET</text>
                  <text x="216" y="276">coap://as.example.com/revoke/trl?diff=3</text>
                  <text x="76" y="292">Observe:</text>
                  <text x="120" y="292">0</text>
                  <text x="108" y="356">2.05</text>
                  <text x="160" y="356">Content</text>
                  <text x="140" y="372">Observe:</text>
                  <text x="188" y="372">42</text>
                  <text x="168" y="388">Content-Format:</text>
                  <text x="332" y="388">application/ace-trl+cbor</text>
                  <text x="140" y="404">Payload:</text>
                  <text x="184" y="404">{</text>
                  <text x="168" y="420">e'diff_set'</text>
                  <text x="224" y="420">:</text>
                  <text x="248" y="420">[],</text>
                  <text x="176" y="436">e'cursor'</text>
                  <text x="224" y="436">:</text>
                  <text x="256" y="436">null,</text>
                  <text x="184" y="452">e'more'</text>
                  <text x="224" y="452">:</text>
                  <text x="256" y="452">false</text>
                  <text x="112" y="468">}</text>
                  <text x="232" y="500">...</text>
                  <text x="136" y="532">(Access</text>
                  <text x="196" y="532">tokens</text>
                  <text x="236" y="532">t1</text>
                  <text x="264" y="532">and</text>
                  <text x="292" y="532">t2</text>
                  <text x="332" y="532">issued</text>
                  <text x="120" y="548">and</text>
                  <text x="188" y="548">successfully</text>
                  <text x="280" y="548">submitted</text>
                  <text x="332" y="548">to</text>
                  <text x="360" y="548">RS)</text>
                  <text x="232" y="580">...</text>
                  <text x="152" y="612">(Access</text>
                  <text x="208" y="612">token</text>
                  <text x="244" y="612">t1</text>
                  <text x="268" y="612">is</text>
                  <text x="316" y="612">revoked)</text>
                  <text x="108" y="660">2.05</text>
                  <text x="160" y="660">Content</text>
                  <text x="140" y="676">Observe:</text>
                  <text x="188" y="676">53</text>
                  <text x="168" y="692">Content-Format:</text>
                  <text x="332" y="692">application/ace-trl+cbor</text>
                  <text x="140" y="708">Payload:</text>
                  <text x="184" y="708">{</text>
                  <text x="168" y="724">e'diff_set'</text>
                  <text x="224" y="724">:</text>
                  <text x="240" y="724">[</text>
                  <text x="248" y="740">[</text>
                  <text x="272" y="740">[],</text>
                  <text x="340" y="740">[bstr.h(t1)]</text>
                  <text x="400" y="740">]</text>
                  <text x="244" y="756">],</text>
                  <text x="176" y="772">e'cursor'</text>
                  <text x="224" y="772">:</text>
                  <text x="244" y="772">0,</text>
                  <text x="184" y="788">e'more'</text>
                  <text x="224" y="788">:</text>
                  <text x="256" y="788">false</text>
                  <text x="112" y="804">}</text>
                  <text x="232" y="836">...</text>
                  <text x="152" y="868">(Access</text>
                  <text x="208" y="868">token</text>
                  <text x="244" y="868">t2</text>
                  <text x="268" y="868">is</text>
                  <text x="316" y="868">revoked)</text>
                  <text x="108" y="916">2.05</text>
                  <text x="160" y="916">Content</text>
                  <text x="140" y="932">Observe:</text>
                  <text x="188" y="932">64</text>
                  <text x="168" y="948">Content-Format:</text>
                  <text x="332" y="948">application/ace-trl+cbor</text>
                  <text x="140" y="964">Payload:</text>
                  <text x="184" y="964">{</text>
                  <text x="168" y="980">e'diff_set'</text>
                  <text x="224" y="980">:</text>
                  <text x="240" y="980">[</text>
                  <text x="248" y="996">[</text>
                  <text x="272" y="996">[],</text>
                  <text x="340" y="996">[bstr.h(t2)]</text>
                  <text x="404" y="996">],</text>
                  <text x="248" y="1012">[</text>
                  <text x="272" y="1012">[],</text>
                  <text x="340" y="1012">[bstr.h(t1)]</text>
                  <text x="400" y="1012">]</text>
                  <text x="244" y="1028">],</text>
                  <text x="176" y="1044">e'cursor'</text>
                  <text x="224" y="1044">:</text>
                  <text x="244" y="1044">1,</text>
                  <text x="184" y="1060">e'more'</text>
                  <text x="224" y="1060">:</text>
                  <text x="256" y="1060">false</text>
                  <text x="112" y="1076">}</text>
                  <text x="232" y="1108">...</text>
                  <text x="152" y="1140">(Access</text>
                  <text x="208" y="1140">token</text>
                  <text x="244" y="1140">t1</text>
                  <text x="292" y="1140">expires)</text>
                  <text x="108" y="1188">2.05</text>
                  <text x="160" y="1188">Content</text>
                  <text x="140" y="1204">Observe:</text>
                  <text x="188" y="1204">75</text>
                  <text x="168" y="1220">Content-Format:</text>
                  <text x="332" y="1220">application/ace-trl+cbor</text>
                  <text x="140" y="1236">Payload:</text>
                  <text x="184" y="1236">{</text>
                  <text x="168" y="1252">e'diff_set'</text>
                  <text x="224" y="1252">:</text>
                  <text x="240" y="1252">[</text>
                  <text x="248" y="1268">[</text>
                  <text x="312" y="1268">[bstr.h(t1)],</text>
                  <text x="380" y="1268">[]</text>
                  <text x="404" y="1268">],</text>
                  <text x="248" y="1284">[</text>
                  <text x="272" y="1284">[],</text>
                  <text x="340" y="1284">[bstr.h(t2)]</text>
                  <text x="404" y="1284">],</text>
                  <text x="248" y="1300">[</text>
                  <text x="272" y="1300">[],</text>
                  <text x="340" y="1300">[bstr.h(t1)]</text>
                  <text x="400" y="1300">]</text>
                  <text x="244" y="1316">],</text>
                  <text x="176" y="1332">e'cursor'</text>
                  <text x="224" y="1332">:</text>
                  <text x="244" y="1332">2,</text>
                  <text x="184" y="1348">e'more'</text>
                  <text x="224" y="1348">:</text>
                  <text x="256" y="1348">false</text>
                  <text x="112" y="1364">}</text>
                  <text x="232" y="1396">...</text>
                  <text x="152" y="1428">(Access</text>
                  <text x="208" y="1428">token</text>
                  <text x="244" y="1428">t2</text>
                  <text x="292" y="1428">expires)</text>
                  <text x="108" y="1476">2.05</text>
                  <text x="160" y="1476">Content</text>
                  <text x="140" y="1492">Observe:</text>
                  <text x="188" y="1492">86</text>
                  <text x="168" y="1508">Content-Format:</text>
                  <text x="332" y="1508">application/ace-trl+cbor</text>
                  <text x="140" y="1524">Payload:</text>
                  <text x="184" y="1524">{</text>
                  <text x="168" y="1540">e'diff_set'</text>
                  <text x="224" y="1540">:</text>
                  <text x="240" y="1540">[</text>
                  <text x="248" y="1556">[</text>
                  <text x="312" y="1556">[bstr.h(t2)],</text>
                  <text x="380" y="1556">[]</text>
                  <text x="404" y="1556">],</text>
                  <text x="248" y="1572">[</text>
                  <text x="312" y="1572">[bstr.h(t1)],</text>
                  <text x="380" y="1572">[]</text>
                  <text x="404" y="1572">],</text>
                  <text x="248" y="1588">[</text>
                  <text x="272" y="1588">[],</text>
                  <text x="340" y="1588">[bstr.h(t2)]</text>
                  <text x="400" y="1588">]</text>
                  <text x="244" y="1604">],</text>
                  <text x="176" y="1620">e'cursor'</text>
                  <text x="224" y="1620">:</text>
                  <text x="244" y="1620">3,</text>
                  <text x="184" y="1636">e'more'</text>
                  <text x="224" y="1636">:</text>
                  <text x="256" y="1636">false</text>
                  <text x="112" y="1652">}</text>
                  <text x="232" y="1684">...</text>
                  <text x="136" y="1716">(Enough</text>
                  <text x="188" y="1716">time</text>
                  <text x="224" y="1716">has</text>
                  <text x="268" y="1716">passed</text>
                  <text x="320" y="1716">since</text>
                  <text x="128" y="1732">the</text>
                  <text x="172" y="1732">latest</text>
                  <text x="236" y="1732">received</text>
                  <text x="328" y="1732">notification)</text>
                  <text x="40" y="1780">GET</text>
                  <text x="216" y="1780">coap://as.example.com/revoke/trl?diff=3</text>
                  <text x="108" y="1844">2.05</text>
                  <text x="160" y="1844">Content</text>
                  <text x="168" y="1860">Content-Format:</text>
                  <text x="332" y="1860">application/ace-trl+cbor</text>
                  <text x="140" y="1876">Payload:</text>
                  <text x="184" y="1876">{</text>
                  <text x="168" y="1892">e'diff_set'</text>
                  <text x="224" y="1892">:</text>
                  <text x="240" y="1892">[</text>
                  <text x="248" y="1908">[</text>
                  <text x="312" y="1908">[bstr.h(t2)],</text>
                  <text x="380" y="1908">[]</text>
                  <text x="404" y="1908">],</text>
                  <text x="248" y="1924">[</text>
                  <text x="312" y="1924">[bstr.h(t1)],</text>
                  <text x="380" y="1924">[]</text>
                  <text x="404" y="1924">],</text>
                  <text x="248" y="1940">[</text>
                  <text x="272" y="1940">[],</text>
                  <text x="340" y="1940">[bstr.h(t2)]</text>
                  <text x="400" y="1940">]</text>
                  <text x="244" y="1956">],</text>
                  <text x="176" y="1972">e'cursor'</text>
                  <text x="224" y="1972">:</text>
                  <text x="244" y="1972">3,</text>
                  <text x="184" y="1988">e'more'</text>
                  <text x="224" y="1988">:</text>
                  <text x="256" y="1988">false</text>
                  <text x="112" y="2004">}</text>
                  <text x="40" y="2036">GET</text>
                  <text x="252" y="2036">coap://as.example.com/revoke/trl?diff=3&amp;cursor=3</text>
                  <text x="108" y="2100">2.05</text>
                  <text x="160" y="2100">Content</text>
                  <text x="168" y="2116">Content-Format:</text>
                  <text x="332" y="2116">application/ace-trl+cbor</text>
                  <text x="140" y="2132">Payload:</text>
                  <text x="184" y="2132">{</text>
                  <text x="168" y="2148">e'diff_set'</text>
                  <text x="224" y="2148">:</text>
                  <text x="248" y="2148">[],</text>
                  <text x="176" y="2164">e'cursor'</text>
                  <text x="224" y="2164">:</text>
                  <text x="244" y="2164">3,</text>
                  <text x="184" y="2180">e'more'</text>
                  <text x="224" y="2180">:</text>
                  <text x="256" y="2180">false</text>
                  <text x="112" y="2196">}</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art" align="center"><![CDATA[
RS                                                      AS
|                                                        |
|  Registration: POST                                    |
+------------------------------------------------------->|
|                                                        |
|<-------------------------------------------------------+
|                  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                                          |
+------------------------------------------------------->|
|                                                        |
|<-------------------------------------------------------+
|          2.05 Content                                  |
|            Observe: 42                                 |
|            Content-Format: application/ace-trl+cbor    |
|            Payload: {                                  |
|              e'diff_set' : [],                         |
|                e'cursor' : null,                       |
|                  e'more' : false                       |
|            }                                           |
|                                                        |
|                          ...                           |
|                                                        |
|            (Access tokens t1 and t2 issued             |
|            and successfully submitted to RS)           |
|                                                        |
|                          ...                           |
|                                                        |
|              (Access token t1 is revoked)              |
|                                                        |
|<-------------------------------------------------------+
|          2.05 Content                                  |
|            Observe: 53                                 |
|            Content-Format: application/ace-trl+cbor    |
|            Payload: {                                  |
|              e'diff_set' : [                           |
|                             [ [], [bstr.h(t1)] ]       |
|                            ],                          |
|                e'cursor' : 0,                          |
|                  e'more' : false                       |
|            }                                           |
|                                                        |
|                          ...                           |
|                                                        |
|              (Access token t2 is revoked)              |
|                                                        |
|<-------------------------------------------------------+
|          2.05 Content                                  |
|            Observe: 64                                 |
|            Content-Format: application/ace-trl+cbor    |
|            Payload: {                                  |
|              e'diff_set' : [                           |
|                             [ [], [bstr.h(t2)] ],      |
|                             [ [], [bstr.h(t1)] ]       |
|                            ],                          |
|                e'cursor' : 1,                          |
|                  e'more' : false                       |
|            }                                           |
|                                                        |
|                          ...                           |
|                                                        |
|              (Access token t1 expires)                 |
|                                                        |
|<-------------------------------------------------------+
|          2.05 Content                                  |
|            Observe: 75                                 |
|            Content-Format: application/ace-trl+cbor    |
|            Payload: {                                  |
|              e'diff_set' : [                           |
|                             [ [bstr.h(t1)], [] ],      |
|                             [ [], [bstr.h(t2)] ],      |
|                             [ [], [bstr.h(t1)] ]       |
|                            ],                          |
|                e'cursor' : 2,                          |
|                  e'more' : false                       |
|            }                                           |
|                                                        |
|                          ...                           |
|                                                        |
|              (Access token t2 expires)                 |
|                                                        |
|<-------------------------------------------------------+
|          2.05 Content                                  |
|            Observe: 86                                 |
|            Content-Format: application/ace-trl+cbor    |
|            Payload: {                                  |
|              e'diff_set' : [                           |
|                             [ [bstr.h(t2)], [] ],      |
|                             [ [bstr.h(t1)], [] ],      |
|                             [ [], [bstr.h(t2)] ]       |
|                            ],                          |
|                e'cursor' : 3,                          |
|                  e'more' : false                       |
|            }                                           |
|                                                        |
|                          ...                           |
|                                                        |
|            (Enough time has passed since               |
|             the latest received notification)          |
|                                                        |
|                                                        |
|  GET coap://as.example.com/revoke/trl?diff=3           |
+------------------------------------------------------->|
|                                                        |
|<-------------------------------------------------------+
|          2.05 Content                                  |
|            Content-Format: application/ace-trl+cbor    |
|            Payload: {                                  |
|              e'diff_set' : [                           |
|                             [ [bstr.h(t2)], [] ],      |
|                             [ [bstr.h(t1)], [] ],      |
|                             [ [], [bstr.h(t2)] ]       |
|                            ],                          |
|                e'cursor' : 3,                          |
|                  e'more' : false                       |
|            }                                           |
|                                                        |
|  GET coap://as.example.com/revoke/trl?diff=3&cursor=3  |
+------------------------------------------------------->|
|                                                        |
|<-------------------------------------------------------+
|          2.05 Content                                  |
|            Content-Format: application/ace-trl+cbor    |
|            Payload: {                                  |
|              e'diff_set' : [],                         |
|                e'cursor' : 3,                          |
|                  e'more' : false                       |
|            }                                           |
|                                                        |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="sec-RS-example-5">
        <name>Full Query with Observe plus Diff Query with "Cursor"</name>
        <t>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><xref target="fig-RS-AS-5"/> shows an interaction example considering a CoAP observation and a full query of the TRL.</t>
        <t>The example also considers some of the notifications from the AS to get lost in transmission, and thus not reaching the RS.</t>
        <t>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, to perform a diff query of the TRL. In particular, the RS specifies:</t>
        <ul spacing="normal">
          <li>
            <t>The query parameter 'diff' with value 8, i.e., the maximum number of diff entries to be specified in a response from the AS.</t>
          </li>
          <li>
            <t>The query parameter 'cursor' with value 2, thus requesting from the update collection the series items following the one with '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>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>After that, the RS follows up with a further diff query request specifying the query parameter 'cursor' with value 7, in order to retrieve the next and last batch of series items from the update collection.</t>
        <figure anchor="fig-RS-AS-5">
          <name>Interaction for full query with Observe plus diff query with "Cursor"</name>
          <artset>
            <artwork type="svg" align="center"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="3568" width="528" viewBox="0 0 528 3568" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,3552" fill="none" stroke="black"/>
                <path d="M 520,48 L 520,3552" fill="none" stroke="black"/>
                <path d="M 8,80 L 512,80" fill="none" stroke="black"/>
                <path d="M 16,112 L 520,112" fill="none" stroke="black"/>
                <path d="M 8,304 L 512,304" fill="none" stroke="black"/>
                <path d="M 16,336 L 520,336" fill="none" stroke="black"/>
                <path d="M 16,704 L 520,704" fill="none" stroke="black"/>
                <path d="M 16,912 L 520,912" fill="none" stroke="black"/>
                <path d="M 16,1120 L 520,1120" fill="none" stroke="black"/>
                <path d="M 88,1328 L 520,1328" fill="none" stroke="black"/>
                <path d="M 88,1536 L 520,1536" fill="none" stroke="black"/>
                <path d="M 88,1744 L 520,1744" fill="none" stroke="black"/>
                <path d="M 88,1952 L 520,1952" fill="none" stroke="black"/>
                <path d="M 88,2160 L 520,2160" fill="none" stroke="black"/>
                <path d="M 88,2368 L 520,2368" fill="none" stroke="black"/>
                <path d="M 88,2576 L 520,2576" fill="none" stroke="black"/>
                <path d="M 88,2784 L 520,2784" fill="none" stroke="black"/>
                <path d="M 8,3040 L 512,3040" fill="none" stroke="black"/>
                <path d="M 16,3072 L 520,3072" fill="none" stroke="black"/>
                <path d="M 8,3328 L 512,3328" fill="none" stroke="black"/>
                <path d="M 16,3360 L 520,3360" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="520,3328 508,3322.4 508,3333.6" fill="black" transform="rotate(0,512,3328)"/>
                <polygon class="arrowhead" points="520,3040 508,3034.4 508,3045.6" fill="black" transform="rotate(0,512,3040)"/>
                <polygon class="arrowhead" points="520,304 508,298.4 508,309.6" fill="black" transform="rotate(0,512,304)"/>
                <polygon class="arrowhead" points="520,80 508,74.4 508,85.6" fill="black" transform="rotate(0,512,80)"/>
                <polygon class="arrowhead" points="96,2784 84,2778.4 84,2789.6" fill="black" transform="rotate(180,88,2784)"/>
                <polygon class="arrowhead" points="96,2576 84,2570.4 84,2581.6" fill="black" transform="rotate(180,88,2576)"/>
                <polygon class="arrowhead" points="96,2368 84,2362.4 84,2373.6" fill="black" transform="rotate(180,88,2368)"/>
                <polygon class="arrowhead" points="96,2160 84,2154.4 84,2165.6" fill="black" transform="rotate(180,88,2160)"/>
                <polygon class="arrowhead" points="96,1952 84,1946.4 84,1957.6" fill="black" transform="rotate(180,88,1952)"/>
                <polygon class="arrowhead" points="96,1744 84,1738.4 84,1749.6" fill="black" transform="rotate(180,88,1744)"/>
                <polygon class="arrowhead" points="96,1536 84,1530.4 84,1541.6" fill="black" transform="rotate(180,88,1536)"/>
                <polygon class="arrowhead" points="96,1328 84,1322.4 84,1333.6" fill="black" transform="rotate(180,88,1328)"/>
                <polygon class="arrowhead" points="24,3360 12,3354.4 12,3365.6" fill="black" transform="rotate(180,16,3360)"/>
                <polygon class="arrowhead" points="24,3072 12,3066.4 12,3077.6" fill="black" transform="rotate(180,16,3072)"/>
                <polygon class="arrowhead" points="24,1120 12,1114.4 12,1125.6" fill="black" transform="rotate(180,16,1120)"/>
                <polygon class="arrowhead" points="24,912 12,906.4 12,917.6" fill="black" transform="rotate(180,16,912)"/>
                <polygon class="arrowhead" points="24,704 12,698.4 12,709.6" fill="black" transform="rotate(180,16,704)"/>
                <polygon class="arrowhead" points="24,336 12,330.4 12,341.6" fill="black" transform="rotate(180,16,336)"/>
                <polygon class="arrowhead" points="24,112 12,106.4 12,117.6" fill="black" transform="rotate(180,16,112)"/>
                <g class="text">
                  <text x="12" y="36">RS</text>
                  <text x="516" y="36">AS</text>
                  <text x="80" y="68">Registration:</text>
                  <text x="156" y="68">POST</text>
                  <text x="228" y="132">2.01</text>
                  <text x="280" y="132">Created</text>
                  <text x="260" y="148">Payload:</text>
                  <text x="304" y="148">{</text>
                  <text x="288" y="164">/</text>
                  <text x="312" y="164">...</text>
                  <text x="336" y="164">/</text>
                  <text x="324" y="180">"trl_path"</text>
                  <text x="376" y="180">:</text>
                  <text x="444" y="180">"/revoke/trl",</text>
                  <text x="324" y="196">"trl_hash"</text>
                  <text x="376" y="196">:</text>
                  <text x="428" y="196">"sha-256",</text>
                  <text x="336" y="212">"max_n"</text>
                  <text x="376" y="212">:</text>
                  <text x="400" y="212">10,</text>
                  <text x="312" y="228">"max_diff_batch":</text>
                  <text x="392" y="228">5</text>
                  <text x="232" y="244">}</text>
                  <text x="40" y="276">GET</text>
                  <text x="192" y="276">coap://as.example.com/revoke/trl/</text>
                  <text x="76" y="292">Observe:</text>
                  <text x="120" y="292">0</text>
                  <text x="164" y="356">2.05</text>
                  <text x="216" y="356">Content</text>
                  <text x="196" y="372">Observe:</text>
                  <text x="244" y="372">42</text>
                  <text x="224" y="388">Content-Format:</text>
                  <text x="388" y="388">application/ace-trl+cbor</text>
                  <text x="196" y="404">Payload:</text>
                  <text x="240" y="404">{</text>
                  <text x="224" y="420">e'full_set'</text>
                  <text x="280" y="420">:</text>
                  <text x="304" y="420">[],</text>
                  <text x="232" y="436">e'cursor'</text>
                  <text x="280" y="436">:</text>
                  <text x="308" y="436">null</text>
                  <text x="168" y="452">}</text>
                  <text x="264" y="484">...</text>
                  <text x="160" y="516">(Access</text>
                  <text x="220" y="516">tokens</text>
                  <text x="264" y="516">t1,</text>
                  <text x="296" y="516">t2,</text>
                  <text x="324" y="516">t3</text>
                  <text x="364" y="516">issued</text>
                  <text x="152" y="532">and</text>
                  <text x="220" y="532">successfully</text>
                  <text x="312" y="532">submitted</text>
                  <text x="364" y="532">to</text>
                  <text x="392" y="532">RS)</text>
                  <text x="264" y="564">...</text>
                  <text x="160" y="596">(Access</text>
                  <text x="220" y="596">tokens</text>
                  <text x="264" y="596">t4,</text>
                  <text x="296" y="596">t5,</text>
                  <text x="324" y="596">t6</text>
                  <text x="364" y="596">issued</text>
                  <text x="144" y="612">and</text>
                  <text x="212" y="612">successfully</text>
                  <text x="304" y="612">submitted</text>
                  <text x="356" y="612">to</text>
                  <text x="384" y="612">RS)</text>
                  <text x="264" y="644">...</text>
                  <text x="184" y="676">(Access</text>
                  <text x="240" y="676">token</text>
                  <text x="276" y="676">t1</text>
                  <text x="300" y="676">is</text>
                  <text x="348" y="676">revoked)</text>
                  <text x="164" y="724">2.05</text>
                  <text x="216" y="724">Content</text>
                  <text x="196" y="740">Observe:</text>
                  <text x="244" y="740">53</text>
                  <text x="224" y="756">Content-Format:</text>
                  <text x="388" y="756">application/ace-trl+cbor</text>
                  <text x="196" y="772">Payload:</text>
                  <text x="240" y="772">{</text>
                  <text x="224" y="788">e'full_set'</text>
                  <text x="280" y="788">:</text>
                  <text x="344" y="788">[bstr.h(t1)],</text>
                  <text x="232" y="804">e'cursor'</text>
                  <text x="280" y="804">:</text>
                  <text x="296" y="804">0</text>
                  <text x="168" y="820">}</text>
                  <text x="264" y="852">...</text>
                  <text x="184" y="884">(Access</text>
                  <text x="240" y="884">token</text>
                  <text x="276" y="884">t2</text>
                  <text x="300" y="884">is</text>
                  <text x="348" y="884">revoked)</text>
                  <text x="164" y="932">2.05</text>
                  <text x="216" y="932">Content</text>
                  <text x="196" y="948">Observe:</text>
                  <text x="244" y="948">64</text>
                  <text x="224" y="964">Content-Format:</text>
                  <text x="388" y="964">application/ace-trl+cbor</text>
                  <text x="196" y="980">Payload:</text>
                  <text x="240" y="980">{</text>
                  <text x="224" y="996">e'full_set'</text>
                  <text x="280" y="996">:</text>
                  <text x="340" y="996">[bstr.h(t1),</text>
                  <text x="444" y="996">bstr.h(t2)],</text>
                  <text x="232" y="1012">e'cursor'</text>
                  <text x="280" y="1012">:</text>
                  <text x="296" y="1012">1</text>
                  <text x="168" y="1028">}</text>
                  <text x="264" y="1060">...</text>
                  <text x="192" y="1092">(Access</text>
                  <text x="248" y="1092">token</text>
                  <text x="284" y="1092">t1</text>
                  <text x="332" y="1092">expires)</text>
                  <text x="164" y="1140">2.05</text>
                  <text x="216" y="1140">Content</text>
                  <text x="196" y="1156">Observe:</text>
                  <text x="244" y="1156">75</text>
                  <text x="224" y="1172">Content-Format:</text>
                  <text x="388" y="1172">application/ace-trl+cbor</text>
                  <text x="196" y="1188">Payload:</text>
                  <text x="240" y="1188">{</text>
                  <text x="224" y="1204">e'full_set'</text>
                  <text x="280" y="1204">:</text>
                  <text x="344" y="1204">[bstr.h(t2)],</text>
                  <text x="216" y="1220">e'cursor'</text>
                  <text x="280" y="1220">:</text>
                  <text x="296" y="1220">2</text>
                  <text x="168" y="1236">}</text>
                  <text x="264" y="1268">...</text>
                  <text x="192" y="1300">(Access</text>
                  <text x="248" y="1300">token</text>
                  <text x="284" y="1300">t2</text>
                  <text x="332" y="1300">expires)</text>
                  <text x="44" y="1332">Lost</text>
                  <text x="72" y="1332">X</text>
                  <text x="164" y="1348">2.05</text>
                  <text x="216" y="1348">Content</text>
                  <text x="196" y="1364">Observe:</text>
                  <text x="244" y="1364">86</text>
                  <text x="224" y="1380">Content-Format:</text>
                  <text x="388" y="1380">application/ace-trl+cbor</text>
                  <text x="196" y="1396">Payload:</text>
                  <text x="240" y="1396">{</text>
                  <text x="224" y="1412">e'full_set'</text>
                  <text x="280" y="1412">:</text>
                  <text x="304" y="1412">[],</text>
                  <text x="232" y="1428">e'cursor'</text>
                  <text x="280" y="1428">:</text>
                  <text x="296" y="1428">3</text>
                  <text x="168" y="1444">}</text>
                  <text x="264" y="1476">...</text>
                  <text x="184" y="1508">(Access</text>
                  <text x="240" y="1508">token</text>
                  <text x="276" y="1508">t3</text>
                  <text x="300" y="1508">is</text>
                  <text x="348" y="1508">revoked)</text>
                  <text x="44" y="1540">Lost</text>
                  <text x="72" y="1540">X</text>
                  <text x="164" y="1556">2.05</text>
                  <text x="216" y="1556">Content</text>
                  <text x="196" y="1572">Observe:</text>
                  <text x="244" y="1572">88</text>
                  <text x="224" y="1588">Content-Format:</text>
                  <text x="388" y="1588">application/ace-trl+cbor</text>
                  <text x="196" y="1604">Payload:</text>
                  <text x="240" y="1604">{</text>
                  <text x="224" y="1620">e'full_set'</text>
                  <text x="280" y="1620">:</text>
                  <text x="344" y="1620">[bstr.h(t3)],</text>
                  <text x="232" y="1636">e'cursor'</text>
                  <text x="280" y="1636">:</text>
                  <text x="296" y="1636">4</text>
                  <text x="168" y="1652">}</text>
                  <text x="264" y="1684">...</text>
                  <text x="184" y="1716">(Access</text>
                  <text x="240" y="1716">token</text>
                  <text x="276" y="1716">t4</text>
                  <text x="300" y="1716">is</text>
                  <text x="348" y="1716">revoked)</text>
                  <text x="44" y="1748">Lost</text>
                  <text x="72" y="1748">X</text>
                  <text x="164" y="1764">2.05</text>
                  <text x="216" y="1764">Content</text>
                  <text x="196" y="1780">Observe:</text>
                  <text x="244" y="1780">89</text>
                  <text x="224" y="1796">Content-Format:</text>
                  <text x="388" y="1796">application/ace-trl+cbor</text>
                  <text x="196" y="1812">Payload:</text>
                  <text x="240" y="1812">{</text>
                  <text x="224" y="1828">e'full_set'</text>
                  <text x="280" y="1828">:</text>
                  <text x="340" y="1828">[bstr.h(t3),</text>
                  <text x="444" y="1828">bstr.h(t4)],</text>
                  <text x="232" y="1844">e'cursor'</text>
                  <text x="280" y="1844">:</text>
                  <text x="296" y="1844">5</text>
                  <text x="168" y="1860">}</text>
                  <text x="264" y="1892">...</text>
                  <text x="200" y="1924">(Access</text>
                  <text x="256" y="1924">token</text>
                  <text x="292" y="1924">t3</text>
                  <text x="340" y="1924">expires)</text>
                  <text x="44" y="1956">Lost</text>
                  <text x="72" y="1956">X</text>
                  <text x="164" y="1972">2.05</text>
                  <text x="216" y="1972">Content</text>
                  <text x="196" y="1988">Observe:</text>
                  <text x="244" y="1988">90</text>
                  <text x="224" y="2004">Content-Format:</text>
                  <text x="388" y="2004">application/ace-trl+cbor</text>
                  <text x="196" y="2020">Payload:</text>
                  <text x="240" y="2020">{</text>
                  <text x="224" y="2036">e'full_set'</text>
                  <text x="280" y="2036">:</text>
                  <text x="344" y="2036">[bstr.h(t4)],</text>
                  <text x="232" y="2052">e'cursor'</text>
                  <text x="280" y="2052">:</text>
                  <text x="296" y="2052">6</text>
                  <text x="168" y="2068">}</text>
                  <text x="264" y="2100">...</text>
                  <text x="200" y="2132">(Access</text>
                  <text x="256" y="2132">token</text>
                  <text x="292" y="2132">t4</text>
                  <text x="340" y="2132">expires)</text>
                  <text x="44" y="2164">Lost</text>
                  <text x="72" y="2164">X</text>
                  <text x="164" y="2180">2.05</text>
                  <text x="216" y="2180">Content</text>
                  <text x="196" y="2196">Observe:</text>
                  <text x="244" y="2196">91</text>
                  <text x="224" y="2212">Content-Format:</text>
                  <text x="388" y="2212">application/ace-trl+cbor</text>
                  <text x="196" y="2228">Payload:</text>
                  <text x="240" y="2228">{</text>
                  <text x="224" y="2244">e'full_set'</text>
                  <text x="280" y="2244">:</text>
                  <text x="304" y="2244">[],</text>
                  <text x="232" y="2260">e'cursor'</text>
                  <text x="280" y="2260">:</text>
                  <text x="296" y="2260">7</text>
                  <text x="168" y="2276">}</text>
                  <text x="264" y="2308">...</text>
                  <text x="152" y="2340">(Access</text>
                  <text x="212" y="2340">tokens</text>
                  <text x="252" y="2340">t5</text>
                  <text x="280" y="2340">and</text>
                  <text x="308" y="2340">t6</text>
                  <text x="336" y="2340">are</text>
                  <text x="388" y="2340">revoked)</text>
                  <text x="44" y="2372">Lost</text>
                  <text x="72" y="2372">X</text>
                  <text x="164" y="2388">2.05</text>
                  <text x="216" y="2388">Content</text>
                  <text x="196" y="2404">Observe:</text>
                  <text x="244" y="2404">92</text>
                  <text x="224" y="2420">Content-Format:</text>
                  <text x="388" y="2420">application/ace-trl+cbor</text>
                  <text x="196" y="2436">Payload:</text>
                  <text x="240" y="2436">{</text>
                  <text x="224" y="2452">e'full_set'</text>
                  <text x="280" y="2452">:</text>
                  <text x="340" y="2452">[bstr.h(t5),</text>
                  <text x="444" y="2452">bstr.h(t6)],</text>
                  <text x="232" y="2468">e'cursor'</text>
                  <text x="280" y="2468">:</text>
                  <text x="296" y="2468">8</text>
                  <text x="168" y="2484">}</text>
                  <text x="264" y="2516">...</text>
                  <text x="200" y="2548">(Access</text>
                  <text x="256" y="2548">token</text>
                  <text x="292" y="2548">t5</text>
                  <text x="340" y="2548">expires)</text>
                  <text x="44" y="2580">Lost</text>
                  <text x="72" y="2580">X</text>
                  <text x="164" y="2596">2.05</text>
                  <text x="216" y="2596">Content</text>
                  <text x="196" y="2612">Observe:</text>
                  <text x="244" y="2612">93</text>
                  <text x="224" y="2628">Content-Format:</text>
                  <text x="388" y="2628">application/ace-trl+cbor</text>
                  <text x="196" y="2644">Payload:</text>
                  <text x="240" y="2644">{</text>
                  <text x="224" y="2660">e'full_set'</text>
                  <text x="280" y="2660">:</text>
                  <text x="344" y="2660">[bstr.h(t6)],</text>
                  <text x="232" y="2676">e'cursor'</text>
                  <text x="280" y="2676">:</text>
                  <text x="296" y="2676">9</text>
                  <text x="168" y="2692">}</text>
                  <text x="264" y="2724">...</text>
                  <text x="200" y="2756">(Access</text>
                  <text x="256" y="2756">token</text>
                  <text x="292" y="2756">t6</text>
                  <text x="340" y="2756">expires)</text>
                  <text x="44" y="2788">Lost</text>
                  <text x="72" y="2788">X</text>
                  <text x="164" y="2804">2.05</text>
                  <text x="216" y="2804">Content</text>
                  <text x="196" y="2820">Observe:</text>
                  <text x="244" y="2820">94</text>
                  <text x="224" y="2836">Content-Format:</text>
                  <text x="388" y="2836">application/ace-trl+cbor</text>
                  <text x="196" y="2852">Payload:</text>
                  <text x="240" y="2852">{</text>
                  <text x="224" y="2868">e'full_set'</text>
                  <text x="280" y="2868">:</text>
                  <text x="304" y="2868">[],</text>
                  <text x="232" y="2884">e'cursor'</text>
                  <text x="280" y="2884">:</text>
                  <text x="300" y="2884">10</text>
                  <text x="168" y="2900">}</text>
                  <text x="264" y="2932">...</text>
                  <text x="168" y="2964">(Enough</text>
                  <text x="220" y="2964">time</text>
                  <text x="256" y="2964">has</text>
                  <text x="300" y="2964">passed</text>
                  <text x="352" y="2964">since</text>
                  <text x="160" y="2980">the</text>
                  <text x="204" y="2980">latest</text>
                  <text x="268" y="2980">received</text>
                  <text x="360" y="2980">notification)</text>
                  <text x="40" y="3028">GET</text>
                  <text x="252" y="3028">coap://as.example.com/revoke/trl?diff=8&amp;cursor=2</text>
                  <text x="164" y="3092">2.05</text>
                  <text x="216" y="3092">Content</text>
                  <text x="224" y="3108">Content-Format:</text>
                  <text x="388" y="3108">application/ace-trl+cbor</text>
                  <text x="196" y="3124">Payload:</text>
                  <text x="240" y="3124">{</text>
                  <text x="224" y="3140">e'diff_set'</text>
                  <text x="280" y="3140">:</text>
                  <text x="296" y="3140">[</text>
                  <text x="304" y="3156">[</text>
                  <text x="368" y="3156">[bstr.h(t4)],</text>
                  <text x="436" y="3156">[]</text>
                  <text x="460" y="3156">],</text>
                  <text x="304" y="3172">[</text>
                  <text x="368" y="3172">[bstr.h(t3)],</text>
                  <text x="436" y="3172">[]</text>
                  <text x="460" y="3172">],</text>
                  <text x="304" y="3188">[</text>
                  <text x="328" y="3188">[],</text>
                  <text x="396" y="3188">[bstr.h(t4)]</text>
                  <text x="460" y="3188">],</text>
                  <text x="304" y="3204">[</text>
                  <text x="328" y="3204">[],</text>
                  <text x="396" y="3204">[bstr.h(t3)]</text>
                  <text x="460" y="3204">],</text>
                  <text x="304" y="3220">[</text>
                  <text x="368" y="3220">[bstr.h(t2)],</text>
                  <text x="436" y="3220">[]</text>
                  <text x="456" y="3220">]</text>
                  <text x="300" y="3236">],</text>
                  <text x="232" y="3252">e'cursor'</text>
                  <text x="280" y="3252">:</text>
                  <text x="300" y="3252">7,</text>
                  <text x="240" y="3268">e'more'</text>
                  <text x="280" y="3268">:</text>
                  <text x="308" y="3268">true</text>
                  <text x="168" y="3284">}</text>
                  <text x="40" y="3316">GET</text>
                  <text x="252" y="3316">coap://as.example.com/revoke/trl?diff=8&amp;cursor=7</text>
                  <text x="92" y="3380">2.05</text>
                  <text x="144" y="3380">Content</text>
                  <text x="152" y="3396">Content-Format:</text>
                  <text x="316" y="3396">application/ace-trl+cbor</text>
                  <text x="124" y="3412">Payload:</text>
                  <text x="168" y="3412">{</text>
                  <text x="152" y="3428">e'diff_set'</text>
                  <text x="208" y="3428">:</text>
                  <text x="224" y="3428">[</text>
                  <text x="232" y="3444">[</text>
                  <text x="296" y="3444">[bstr.h(t6)],</text>
                  <text x="364" y="3444">[]</text>
                  <text x="388" y="3444">],</text>
                  <text x="232" y="3460">[</text>
                  <text x="296" y="3460">[bstr.h(t5)],</text>
                  <text x="364" y="3460">[]</text>
                  <text x="388" y="3460">],</text>
                  <text x="232" y="3476">[</text>
                  <text x="256" y="3476">[],</text>
                  <text x="324" y="3476">[bstr.h(t5),</text>
                  <text x="424" y="3476">bstr.h(t6)]</text>
                  <text x="480" y="3476">]</text>
                  <text x="228" y="3492">],</text>
                  <text x="160" y="3508">e'cursor'</text>
                  <text x="208" y="3508">:</text>
                  <text x="232" y="3508">10,</text>
                  <text x="168" y="3524">e'more'</text>
                  <text x="208" y="3524">:</text>
                  <text x="240" y="3524">false</text>
                  <text x="96" y="3540">}</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art" align="center"><![CDATA[
RS                                                             AS
|                                                               |
|  Registration: POST                                           |
+-------------------------------------------------------------->|
|                                                               |
|<--------------------------------------------------------------+
|                         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                                                 |
+-------------------------------------------------------------->|
|                                                               |
|<--------------------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 42                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [],                         |
|                       e'cursor' : 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)                 |
|                                                               |
|<--------------------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 53                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [bstr.h(t1)],               |
|                       e'cursor' : 0                           |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|                  (Access token t2 is revoked)                 |
|                                                               |
|<--------------------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 64                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [bstr.h(t1), bstr.h(t2)],   |
|                       e'cursor' : 1                           |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|                   (Access token t1 expires)                   |
|                                                               |
|<--------------------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 75                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [bstr.h(t2)],               |
|                     e'cursor'   : 2                           |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|                   (Access token t2 expires)                   |
|                                                               |
|  Lost X <-----------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 86                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [],                         |
|                       e'cursor' : 3                           |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|                  (Access token t3 is revoked)                 |
|                                                               |
|  Lost X <-----------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 88                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [bstr.h(t3)],               |
|                       e'cursor' : 4                           |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|                  (Access token t4 is revoked)                 |
|                                                               |
|  Lost X <-----------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 89                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [bstr.h(t3), bstr.h(t4)],   |
|                       e'cursor' : 5                           |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|                    (Access token t3 expires)                  |
|                                                               |
|  Lost X <-----------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 90                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [bstr.h(t4)],               |
|                       e'cursor' : 6                           |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|                    (Access token t4 expires)                  |
|                                                               |
|  Lost X <-----------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 91                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [],                         |
|                       e'cursor' : 7                           |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|              (Access tokens t5 and t6 are revoked)            |
|                                                               |
|  Lost X <-----------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 92                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [bstr.h(t5), bstr.h(t6)],   |
|                       e'cursor' : 8                           |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|                    (Access token t5 expires)                  |
|                                                               |
|  Lost X <-----------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 93                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [bstr.h(t6)],               |
|                       e'cursor' : 9                           |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|                    (Access token t6 expires)                  |
|                                                               |
|  Lost X <-----------------------------------------------------+
|                 2.05 Content                                  |
|                   Observe: 94                                 |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'full_set' : [],                         |
|                       e'cursor' : 10                          |
|                   }                                           |
|                                                               |
|                              ...                              |
|                                                               |
|                (Enough time has passed since                  |
|                 the latest received notification)             |
|                                                               |
|                                                               |
|  GET coap://as.example.com/revoke/trl?diff=8&cursor=2         |
+-------------------------------------------------------------->|
|                                                               |
|<--------------------------------------------------------------+
|                 2.05 Content                                  |
|                   Content-Format: application/ace-trl+cbor    |
|                   Payload: {                                  |
|                     e'diff_set' : [                           |
|                                    [ [bstr.h(t4)], [] ],      |
|                                    [ [bstr.h(t3)], [] ],      |
|                                    [ [], [bstr.h(t4)] ],      |
|                                    [ [], [bstr.h(t3)] ],      |
|                                    [ [bstr.h(t2)], [] ]       |
|                                   ],                          |
|                       e'cursor' : 7,                          |
|                         e'more' : true                        |
|                   }                                           |
|                                                               |
|  GET coap://as.example.com/revoke/trl?diff=8&cursor=7         |
+-------------------------------------------------------------->|
|                                                               |
|<--------------------------------------------------------------+
|        2.05 Content                                           |
|          Content-Format: application/ace-trl+cbor             |
|          Payload: {                                           |
|            e'diff_set' : [                                    |
|                           [ [bstr.h(t6)], [] ],               |
|                           [ [bstr.h(t5)], [] ],               |
|                           [ [], [bstr.h(t5), bstr.h(t6)] ]    |
|                          ],                                   |
|              e'cursor' : 10,                                  |
|                e'more' : false                                |
|          }                                                    |
|                                                               |
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="sec-cddl-model" removeInRFC="true">
      <name>CDDL Model</name>
      <figure anchor="fig-cddl-model">
        <name>CDDL model</name>
        <artwork type="CDDL" align="left"><![CDATA[
full_set = 0
diff_set = 1
cursor = 2
more = 3

ace-trl-error = 1
]]></artwork>
      </figure>
    </section>
    <section anchor="sec-document-updates" removeInRFC="true">
      <name>Document Updates</name>
      <section anchor="sec-07-08">
        <name>Version -07 to -08</name>
        <ul spacing="normal">
          <li>
            <t>Added definition of pertaining token hash.</t>
          </li>
          <li>
            <t>Added definition of pertaining TRL update.</t>
          </li>
          <li>
            <t>Rephrased example of token uploading to be more future ready.</t>
          </li>
          <li>
            <t>Consistent use of "TRL update" throughout the document.</t>
          </li>
          <li>
            <t>Editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-06-07">
        <name>Version -06 to -07</name>
        <ul spacing="normal">
          <li>
            <t>RFC 9290 is used instead of the custom format for error responses.</t>
          </li>
          <li>
            <t>Avoided quotation marks when using CBOR simple values.</t>
          </li>
          <li>
            <t>CBOR diagnostic notation uses placeholders from a CDDL model.</t>
          </li>
          <li>
            <t>Early mentioning that there is a single MAX_N value.</t>
          </li>
          <li>
            <t>Added more details on the authorization of administrators.</t>
          </li>
          <li>
            <t>Added recommendations for avoiding lost TRL updates from going unnoticed.</t>
          </li>
          <li>
            <t>If diff queries are supported, the AS <bcp14>MUST</bcp14> provide MAX_N at registration.</t>
          </li>
          <li>
            <t>If the "Cursor" extension is supported, the AS <bcp14>MUST</bcp14> provide MAX_DIFF_BATCH at registration.</t>
          </li>
          <li>
            <t>Clarified that how the token revocation specifically happens is out of scope.</t>
          </li>
          <li>
            <t>Clearer, upfront distinction between using CoAP Observe or not.</t>
          </li>
          <li>
            <t>Revised and extended method for computing the token hashes.</t>
          </li>
          <li>
            <t>Clearer presentation of invalid requests to the TRL endpoint.</t>
          </li>
          <li>
            <t>Clearer expected relation between MAX_INDEX and MAX_N values.</t>
          </li>
          <li>
            <t>Clarified meaning of registered parameters.</t>
          </li>
          <li>
            <t>Generalized security considerations on vulnerable time window at the RS.</t>
          </li>
          <li>
            <t>Added security considerations on additional security measures.</t>
          </li>
          <li>
            <t>Fixes and improvements in the IANA considerations.</t>
          </li>
          <li>
            <t>Used AASVG in diagrams.</t>
          </li>
          <li>
            <t>Used actual tables instead of figures.</t>
          </li>
          <li>
            <t>Fixed notation in the examples.</t>
          </li>
          <li>
            <t>Clarifications and editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-05-06">
        <name>Version -05 to -06</name>
        <ul spacing="normal">
          <li>
            <t>Clarified instructions for Expert Review in the IANA considerations.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-04-05">
        <name>Version -04 to -05</name>
        <ul spacing="normal">
          <li>
            <t>Explicit focus on CoAP in the abstract and introduction.</t>
          </li>
          <li>
            <t>Removed terminology aliasing ("TRL endpoint" vs. "TRL resource").</t>
          </li>
          <li>
            <t>Use "requester" instead of "caller".</t>
          </li>
          <li>
            <t>Use "subset" instead of "portion".</t>
          </li>
          <li>
            <t>Revised presentation of how token hashes are computed.</t>
          </li>
          <li>
            <t>Improved error handling.</t>
          </li>
          <li>
            <t>Revised examples.</t>
          </li>
          <li>
            <t>More precise security considerations.</t>
          </li>
          <li>
            <t>Clarifications and editorial improvements.</t>
          </li>
          <li>
            <t>Updated author list.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-03-04">
        <name>Version -03 to -04</name>
        <ul spacing="normal">
          <li>
            <t>Improved presentation of pre- and post-registration operations.</t>
          </li>
          <li>
            <t>Removed moot processing cases with the "Cursor" extension.</t>
          </li>
          <li>
            <t>Positive integers as CBOR abbreviations for all parameters.</t>
          </li>
          <li>
            <t>Renamed N_MAX as MAX_N.</t>
          </li>
          <li>
            <t>Access tokens are not necessarily uploaded through /authz-info.</t>
          </li>
          <li>
            <t>The use of the "c.pmax" conditional attribute is just an example.</t>
          </li>
          <li>
            <t>Revised handling of token hashes at the RS.</t>
          </li>
          <li>
            <t>Extended and improved security considerations.</t>
          </li>
          <li>
            <t>Fixed details in IANA considerations.</t>
          </li>
          <li>
            <t>New appendix overviewing parameters of the TRL endpoint.</t>
          </li>
          <li>
            <t>Examples of message exchange moved to an appendix.</t>
          </li>
          <li>
            <t>Added examples of message exchange with the "Cursor" extension.</t>
          </li>
          <li>
            <t>Clarifications and editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-02-03">
        <name>Version -02 to -03</name>
        <ul spacing="normal">
          <li>
            <t>Definition of MAX_INDEX for the "Cursor" extension.</t>
          </li>
          <li>
            <t>Handling wrap-around of 'index' when using the "Cursor" extension.</t>
          </li>
          <li>
            <t>Error handling for the case where 'cursor' &gt; MAX_INDEX.</t>
          </li>
          <li>
            <t>Improved error handling in case 'index' is out-of-bound.</t>
          </li>
          <li>
            <t>Clarified parameter semantics, message content and examples.</t>
          </li>
          <li>
            <t>Editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-01-02">
        <name>Version -01 to -02</name>
        <ul spacing="normal">
          <li>
            <t>Earlier mentioning of error cases.</t>
          </li>
          <li>
            <t>Clearer distinction between maintaining the history of TRL updates and preparing the response to a diff query.</t>
          </li>
          <li>
            <t>Defined the use of "cursor" in the document body, as an extension of diff queries.</t>
          </li>
          <li>
            <t>Both success and error responses have a CBOR map as payload.</t>
          </li>
          <li>
            <t>Corner cases of message processing explained more explicitly.</t>
          </li>
          <li>
            <t>Clarifications and editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-00-01">
        <name>Version -00 to -01</name>
        <ul spacing="normal">
          <li>
            <t>Added actions to perform upon receiving responses from the TRL endpoint.</t>
          </li>
          <li>
            <t>Fixed off-by-one error when using the "Cursor" pattern.</t>
          </li>
          <li>
            <t>Improved error handling, with registered error codes.</t>
          </li>
          <li>
            <t>Section restructuring (full- and diff-query as self-standing sections).</t>
          </li>
          <li>
            <t>Renamed identifiers and CBOR parameters.</t>
          </li>
          <li>
            <t>Clarifications and editorial improvements.</t>
          </li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowldegment">
      <name>Acknowledgments</name>
      <t><contact fullname="Ludwig Seitz"/> contributed as a co-author of initial versions of this document.</t>
      <t>The authors sincerely thank <contact fullname="Christian Amsüss"/>, <contact fullname="Carsten Bormann"/>, <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="Jim Schaad"/>, <contact fullname="Göran Selander"/>, <contact fullname="Travis Spencer"/>, <contact fullname="Dale Worley"/>, and <contact fullname="Paul Wouters"/> for their comments and feedback.</t>
      <t>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>
  </back>
  <!-- ##markdown-source:
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
DBkRriYpWTUYsZhSEIgVUOmcZJaSghsUCnknRGKui7dn5MsqWwaL3LcoCkVw
N4kHF4HD0YjjCMbEh2x3RVB94T0+oZgM3I64ehU7UmPzTbCZmc0sGpHK2YjI
s6VDzpQPUmFWA8OQVcFiksrGuYDWoEJQ5pG/Voj8Gb2mrFG/+BMIb538RU9n
BWFUGE0wyAl0xFJL4Hje5GESv/157oUFWk745itZs0gMzP1EZAk6EckHHtTb
OVLxPKn0NaCgnEyfz9VFPnY9kcGzmMeJ9DHIipqH9IHM4qwSkSwHKEm8pQhX
bRKuIvWrFs3wn4NEYaxIKpbIxfoHPRq/IyGOPOsYKnrNmC+6iZGvSWpPz1GU
UP4Ivgnw5mwM6kmSz0o72kjWAvcsSTwMq7owSU/M8dt4FHnZTNPEy1xd4FsX
6rWLbZSL2VWO7KdDcSbKl1mnz7wOZ1TXWIYOCR57HglEEzHGnTiIiC+NQHIP
COqd6AiJ3jCvmEpkpNrkAw7OEvPpNE4LJh41/3oK0Bhor6xriRGT7zWHkcI5
Ad78b/OJ4ri8PNeJC/bnd+3g53fBh38MKzA/Lhw5nz+yZeKlWSI8if3oPh40
njMc8WZwDmdxa4HN/G7Jf6zRrP5ul/sHvmutVJ6Qb/Q/zLvqGfkHvbQWXdbm
v1zyH2v+tn9nA2LZf6z96JqZYW0/KkNil/6hdVLrl573y5oPxh9tYOE/BGe6
jb/AkLe0oxpE8bOv/+P84f0tjy0YouoGh6i2lxyiIx9niI71WTiE96l6wUcb
h+gs/9m3Ccrah/3oXpAtccrNN+s1q8k6kO4KnfLteJyeZ9+sI3tMivWPyOGQ
952ctoXVlMDbtIilvlNcRNsKRmO0rgC9naAX4hwZFcf7ltqooSi/xLHXTcD3
xExN6UDKrGMF/ihvpZhBTcAnWnZqfIlDjxJ0KD1NC5Qc7UgifLCdZvBEewKM
hGUce6csOqhfxJov4X/absY2lW9n6dgIubHIqGwvo+dJ1ZrOKgmfxGW5tvbU
MwMH1zlox6WEApNKyXfemIUkLK3x/cJ+G33O2uBWewEUPngDHrdtZ6wGZ7IV
5UrngF/ckxLXzL68OC0YdUx77CeILa6LGU1yezuzYqzdwrQdjHanfyBLJssa
iqeYROMFR4pNHLP4dDQaOesT0o/WxfXsmrrXyZ5EdnBMYTQCpy3xvDl72n5k
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
q3nb2AqchgXWZbcxjsvqrdlL4zbOLHg7PSAsvRTtcSRF23tjg1V9b7e5DVNl
skG2UjUmV5TmgnUmKaSdUzOiI7Y2mHoHJ6dtsUCYQqaqW4QS7tQDVGHHDGaa
r0uZj3BSknB7qrIisU4ynpF/3Awdyt5xUrptE7NKcuLqNuopy0p6ovpR1Jp8
6spwqsmnIzvaZdeW63EqPe/CHU6dBqQYk2yZ+blqOa2ftzNEZi9bOTm1Gp69
fnVqNGJV2w04s9ZAVGFnVWHnVKWZer1se1RU55CcklY9HXHn+z1MHZeESWR2
F20SOHRqKzfw8h61OwO78dGwPvKyxNEGAPAtVl3asMVPr2w4VWWy0F5dnK+t
MTAndN4Y61gFhCWFUyrOvK5GpKTT0Sxj7K/lhHudPOrSOcXtoCz68aNa0CR+
/zabtxpNmYjI20YXVeikgb/bahMrzHN4/jJFIOeaxGg/unWqyq6wyJVn/Qt1
+/b18Y2L++83Nxwn7MIzuHDPIXBPvYOYkynmROJY5WKxdhigrjohp3itX4s9
mPFfz/dfVBGD6lyz5bEPYOtc3K+6ABpcpf6iB19YojSN27/G9guExXLPJQ7E
g5PCcK+9XJd14l6NVt27Fz1FUvknErVoYFX9r8432l0yFYzSc/zy4BSADlrG
VandPsJ6lKFbUWqmb5ReYjf8jv2+claNW0pF5iK3dk03O/PTToAKaLl23ZEN
1pttcUycq7bUWYXIozpoMqrVe+DBQv+3+URxXF6erwFZX/lzcAoSzw0+KCg5
SY77zEgWvva79uqf3/9440X++w2m+11wNmJvwt2aQRL4vOaz3Y8+rPRaFD2I
Op0O/HfF19YVo1uP9qP1B5yU9wC+BH1q0Wt4m+m18iLGuCh8Zf5s+CYxIXyt
u+X+0vTax+bBFs624DW07w/yeLr/4EFcduQWd4C+W4B4UH8tUvRnP9oKDh6Y
7ZeEyoC9u7qc+DKzqT81WHZ6897wX3Pz+ZrT7LzXFtyVptmiKNlQHSw2AA//
9o+lXluAhs2z3cpreLk/52z3D8LMWGk/Da9RzRS7AW4560/SSmSvk9PNW12k
+/ncIIk8qFBXxlLlLW/OeW352X7ma7q7Pe8N/7Wf+ZoaWbR2YX8z1zSq4WTv
14aTezurvPbF4GQrMqrRP7zXfms42ZUOaOXm/NeWn+1nxsmHu6u89oXgZO+O
Tjp08leGk4/2VnntTsRWr1mmEHJ8aEuRcnLYDgqu3qINKrbtCTPhqGlGu+7k
uEd5SEsarHquwarduxWTVTCkyHTGNu3FX0bfRNu689r8uDirX2HYKOx4S9ks
70QnhTrpUAfdz2xJU9E2G2jsdX6QEO/VbGz1oM47G9uSi7yzsd3Z2Go2tv/A
C/XNtv3anY3Nm039+YuxsZl48C9LALizsc1bpPv5/HL6kia2X66c/qXb2Jxr
uuxr3udvcMFbroXuH4tfm0MTfjtEYWmD3i/3BnzpFr3PcAPQ9vKPJUS1u4vz
SbMtZ3f8xV6cL93seEsXx8L+FkqKN7g4d/ft57hvDTbVX+x9+9JNqrd833qr
3bfbuqaLF/kl3bdGc3G712QwtqyDyxuMmyIcp+NZaVuTAwbkbc+AvP1ZYx7P
TMg81y8zLdswalyedbtRew2wsQTNGPMeUklzlg4gVn8etMkWmLWiAl8pjP57
ThVPS+k6I8XnOUUOu9ml3JISK6OrQFwJY7dbK1NX33E8LVVJD4lxx4wBO+Wb
DiLL9VlwowE7tt3u/Ndgco+CFvdHv3aL+23FrkYHgGN3dv07u74HksDnzq5f
+9zFzt5gb3d2/cbZvmTH/p1df94i3c+dXf9Xb9e/i529s7TPf+2Lwcm72Nm7
2Fn5fCE4eRc7+3ljZ6PoOdp//hKtgJy/IUPvnYjtv3b/KMtn5xds2kP73TQu
MR2/pNKIDa+pCotSYSW9TIaOYXIz/NqNF7naa8sHxj3Sr/0mNOE7x8pSr/02
/Z/N/pjtFQP42bViTL43C+hHLf7vYh7/+3owvp8cNE3m9kWFEG0zu92g+DK5
luL3yxTLcVrr6JqwMVsUCfv7cTW4WDcWdNVwwSnl69SHMbXU5heKcT0UWCgG
6/P1E6+aml7r3LLJBEPyBdker52fImXCBYVfMVjcN1bZk+1VwLKC4+ZgpLq7
wqKQFbKvTPhb7DZatj1v3MFiSSfZ53eMSX0v7OdCVZiwgv0UVxLrkj4BLOCi
6vOPQvxEdnXqgO9nkBdWsW4NbG4RZPksG1xGutkMdvXIHUpy684j/NzUgcRk
80ZOJH71JjLHp8gdsuCbyB6O/GF/FvqUDJjqn2UEi/l7vaGDCT83dDLpV2/k
aKK3LWdTa7kF+9xkP/J1/4ZXl5EcPg2bbpKHYs26qs+KX/0l35wbS+/4uaEv
Cz83FP7xc2MFAD9+vkor/F7oVXxZhSbsA4cfj5teDp5rIsEL+9EoHpdJ/YHQ
qz+BrL3w1XlK/23Ourx/rfbq8j62Xz6Ylve5feqsXxCBWc0Lh58vhMCs8qr3
uZkSj585VG0RWdta7dU7srbEq8v6I39F93U1DyV+fnX3dVlbXeDVn+aqd++u
+q3PuqSX95Nn/YKu+mqOX/z8Kq76Taz58uovikr07qjErc+6pN/9k2f9gqjE
aq54/PyqqMQqrkLv1dsgMMst+BOoxPYdlbjlWZeOhAjM+vkDIm7j1Ztaan+z
5tY7inhHEX9GirjCff03hgNe3Lv7+nPf15v7OH5lONwcU7SzYo63Fw50Oynf
9OP8GKPduwijzxthtPtz5dSX+eQuqb6eVA/IDohUpYPZOC7MfAqXqI3b2VJh
Wo8+U5hWw/yKiFor6LX4eARCCGw9VL17Gn7r9F4zPezwJ6zBQGO73SZh6HiM
6++p3rzua9jH0uk7qaOmEKy2B1UrDtyZMomLcYrdj+2oMwWSTcHtEIiExCB6
jNICZif6UL/60TfRrrfhZuC4MV2CU4DlkTRgNEUYaH8qzswZHksHwOWeESWL
L+N0TC2mm9rZtfAyAEutFChrtQgCgWP/XRWz5L8XFDfw36NmmBW+/lDjLO9w
UWdRr6OoWxJB9140oYVxpa8Uo0mJoXnSrG9OcJ7XTnAZ5MetZFFeDHHiHJsH
wkovuWlcBkyKaBFhp8aPJZHhVqPv5PMpQXha3LhxLJ4e4aaS8y0I0GYXN5Wj
Q+K09/mkcD35fHrUnnw+IXhPPp8Qw2ePcONQPjXI6hF99ps3CeyTz2eO77NH
WL0sRX0NN4n20yP8Wu/mJ2m88vmEuED5fILqLJ9P0qDl42foraRI6zHcmMHV
RviJdONlR5hv/P5Ma6jFBbaoe2y1HQoMDK9hlfjAz7QL7/NFQHIHoLgL/39v
aUiuCMhfLSSjVaIwb2sNXzq1Xz1IUz5fJLV3vA3LjeCFUq68hjtqT5/l4yVv
aw1f+s1aPZxSPl/4zXIqwrTmjOBFLq68hrubxZ/l4xN/Izdr9ehF+XzRN6u3
PM8y9yrCaL+V13B3s/izfEzfra1h9do6P+XNWj3iTz5f5M36ZN1/nmx8d7Pm
jOBdrO3PLw1+8TfrUeDXZUb4Im+W4lnbN9Wz5snGdzdrzgjezdq5u1mPHt9w
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
ySMXQEcCAA==

-->

</rfc>
