<?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.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ace-revoked-token-notification-06" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.2 -->
  <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-06"/>
    <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="2023" month="June" day="02"/>
    <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 use 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 any additional endpoints on the registered devices. 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 Token identifiers (see <xref target="sec-token-name"/>).</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" 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 CBOR <xref target="RFC8949"/>, JSON <xref target="RFC8259"/>, the CoAP protocol <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, unless otherwise indicated, the term "endpoint" is used here following its OAuth definition, 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>Token hash: identifier of an access token, in binary format encoding. The token hash has no relation to other possibly used token identifiers, such as the 'cti' (CWT ID) claim of CBOR Web Tokens (CWTs) <xref target="RFC8392"/>.</li>
          <li>Token Revocation List (TRL): a collection of token hashes such that the corresponding access tokens have been revoked but are not expired yet.</li>
          <li>TRL endpoint: an endpoint on 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.</li>
          <li>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.</li>
          <li>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. How the administrator authorization is established and verified is out of the scope of this specification.</li>
          <li>
            <t>Pertaining access token:  </t>
            <ul spacing="normal">
              <li>With reference to an administrator, an access token issued by the AS.</li>
              <li>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.</li>
            </ul>
          </li>
        </ul>
        <t>Examples throughout this document are expressed in CBOR diagnostic notation without the tag and value abbreviations.</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>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.</li>
        <li>
          <t>When a device registers at the AS, it also receives the url-path to the TRL endpoint.  </t>
          <t>
After the registration procedure is finished, the registered device can send an Observation Request to the TRL endpoint as described in <xref target="RFC7641"/>, i.e., a GET request including the CoAP Observe Option set to 0 (register). By doing so, the registered device effectively subscribes to the TRL, as interested to receive notifications about its update. Upon receiving the request, the AS adds the registered device to the list of observers of the TRL endpoint.  </t>
          <t>
At any time, the registered device can send a GET request to the TRL endpoint. 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 occurred over the list of pertaining revoked access tokens (see <xref target="ssec-trl-diff-query"/>). In either case, the registered device may also rely on an Observation Request for subscribing to the TRL as discussed above.</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 rather 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>An administrator can access and subscribe to the TRL like a registered device, while getting the full updated content of the TRL.</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, with token hash th1, th2 and th3, respectively.</t>
      <t>Consistently, 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>
        <artwork 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>
      </figure>
      <t><xref target="sec-RS-examples"/> provides examples of the protocol flow and message exchange between the AS and a registered device.</t>
    </section>
    <section anchor="sec-token-name">
      <name>Token Hash</name>
      <t>The token hash of an access token is computed as follows.</t>
      <ol spacing="normal" type="1"><li>The AS considers the content of the 'access_token' parameter in the AS-to-Client response (see <xref section="5.8.2" sectionFormat="of" target="RFC9200"/>), where the Access Token was included and provided to the requesting Client.</li>
        <li>
          <t>The AS defines HASH_INPUT as follows.  </t>
          <ul spacing="normal">
            <li>
              <t>If the content of the 'access_token' parameter from step 1 is a CBOR byte string, then HASH_INPUT takes the binary serialization of that CBOR byte string. This is the case where CBOR was used to transport the Access Token (as a CWT or JWT).      </t>
              <t>
With reference to the example in <xref target="fig-as-response-cbor"/>, and assuming the string's length in bytes to be 119 (i.e., 0x77 in hexadecimal), then HASH_INPUT takes the bytes {0x58 0x77 0xd0 0x83 0x44 0xa1 ...}, i.e., the raw content of the 'access_token' parameter.</t>
            </li>
            <li>
              <t>If the content of the 'access_token' parameter from step 1 is a text string, then HASH_INPUT takes the binary serialization of that text string. This is the case where JSON was used to transport the Access Token (as a CWT or JWT).      </t>
              <t>
With reference to the example in <xref target="fig-as-response-json"/>, HASH_INPUT is the binary serialization of "2YotnFZFEjr1zCsicMWpAA", i.e., of the raw content of the 'access_token' parameter.</t>
            </li>
          </ul>
          <t>
In either case, HASH_INPUT results in the binary representation of the raw content of the 'access_token' parameter from the AS-to-Client response.</t>
        </li>
        <li>
          <t>The AS generates a hash value of HASH_INPUT 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 MUST be collision-resistant on byte-strings, and MUST 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>
        </li>
      </ol>
      <figure anchor="fig-as-response-cbor">
        <name>Example of AS-to-Client response using CBOR</name>
        <artwork align="left"><![CDATA[
2.01 Created
Content-Format: application/ace+cbor
Max-Age: 85800
Payload:
{
   "access_token" : h'd08344a1 ...
    (remainder of the access token omitted for brevity) ...',
   "token_type" : pop,
   "expires_in" : 86400,
   "profile" : coap_dtls,
   (remainder of the response omitted for brevity)
}
]]></artwork>
      </figure>
      <figure anchor="fig-as-response-json">
        <name>Example of AS-to-Client response using JSON</name>
        <artwork align="left"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
Payload:
{
   "access_token" : "2YotnFZFEjr1zCsicMWpAA",
   "token_type" : "pop",
   "expires_in" : 86400,
   "profile" : "coap_dtls",
   (remainder of the response omitted for brevity)
}
]]></artwork>
      </figure>
    </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 MUST 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 MUST be the empty CBOR array. The TRL is accessible through the TRL endpoint on 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>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.</li>
          <li>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.</li>
        </ul>
        <t>The AS MAY 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 MUST be encrypted, as well as integrity and replay protected. Furthermore, responses from the AS to the requester MUST be bound to the corresponding requests.</t>
      <t>Following a request to the TRL endpoint, the messages defined in this document that the AS sends as response use Content-Format "application/ace-trl+cbor". Their payload is formatted as a CBOR map, and the CBOR values for the parameters included therein are defined in <xref target="trl-registry-parameters"/>.</t>
      <t>The AS MUST implement measures to prevent access to the TRL endpoint by entities other than registered devices and authorized administrators.</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 MUST 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 of the most recent updates, in the subset of the TRL pertaining to the requester.  </t>
          <t>
The entry associated with one of such updates contains a list of token hashes, such that: i) the corresponding revoked access tokens pertain to the requester; and ii) they were added to or removed from the TRL at that update.  </t>
          <t>
The AS MAY 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 MAY additionally support its "Cursor" extension, which has two benefits. First, the AS can avoid excessively big latencies when several diff entries have to be transferred, by delivering one adjacent subset at the time, in different diff query responses. Second, a requester can retrieve diff entries associated with TRL updates that, even if not the most recent ones, occurred after a TRL update 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 parameters used by the TRL endpoint, when the AS supports diff queries and the "Cursor" extension.</t>
      <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, as a series of TRL updates. That is, when replying to a diff query performed by a requester, the AS specifies the most recent updates to the subset of the TRL pertaining to that requester.</t>
        <t>The following defines how the AS builds and maintains consistent histories of TRL updates for each registered device and administrator, hereafter referred to as requesters.</t>
        <t>For each requester, the AS maintains an update collection of maximum MAX_N series items, where MAX_N is a pre-defined, constant positive integer. The AS MUST keep track of the MAX_N most recent updates to the subset of the TRL that pertains to each requester. The AS SHOULD 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 MUST 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>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.</li>
          <li>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.</li>
          <li>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.</li>
          <li>The AS creates a new series item, which includes the two sets from step 3.</li>
          <li>
            <t>If the update collection associated with the requester currently includes MAX_N series items, the AS MUST delete the oldest series item in the update collection.  </t>
            <t>
This occurs when the number of TRL updates pertaining to the requester and currently stored at the AS is equal to MAX_N.</t>
          </li>
          <li>The AS adds the series item to the update collection associated with the requester, as the most recent one.</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 constant, unsigned integer MAX_INDEX &lt;= ((2^64) - 1), where "^" is the exponentiation operator. In particular, the value of MAX_INDEX is REQUIRED to be at least (MAX_N - 1), and is RECOMMENDED to be at least ((2^32) - 1). Note that MAX_INDEX is practically expected to be order of magnitudes greater than MAX_N.</t>
          <t>When maintaining the history of updates to the TRL, the following applies separately for each 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 MUST 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>...</li>
                <li>( i_A = MAX_INDEX - 2, i_B = MAX_INDEX - 1, i_C = MAX_INDEX )</li>
                <li>( i_B = MAX_INDEX - 1, i_C = MAX_INDEX, i_D = 0 )</li>
                <li>( i_C = MAX_INDEX, i_D = 0, i_E = 1 )</li>
                <li>( i_D = 0, i_E = 1, i_F = 2 )</li>
                <li>...</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 latest added 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 until and including V, 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 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 depends on the specific registered device or administrator associated with the update collection in question. If supporting the "Cursor" extension, the AS SHOULD provide registered devices and administrators with the 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 MUST 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 MUST be either:  </t>
            <ul spacing="normal">
              <li>the integer 0, indicating that a (notification) response should include as many diff entries as the AS can provide in the response; or</li>
              <li>a positive integer strictly greater than 0, indicating the maximum number of diff entries that a (notification) response should include.</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 MUST return a 4.00 (Bad Request) response in case the 'diff' query parameter of the GET request specifies a value other than 0 or than a positive integer, irrespective of the presence of the 'cursor' parameter and its value (see below). The response MUST have Content-Format "application/ace-trl+cbor". The payload of the response is a CBOR map, which MUST include the 'error' parameter with value 0 ("Invalid parameter value") and MAY include the 'error_description' parameter to provide additional context.</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 MUST be either 0 or a positive integer.  </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: i) like when processing 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) like when processing 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 MUST return a 4.00 (Bad Request) response in case any of the conditions below holds.  </t>
            <t>
The 4.00 (Bad Request) response MUST have Content-Format "application/ace-trl+cbor". The payload of the response MUST be a CBOR map, which MUST include the 'error' parameter and MAY include the 'error_description' parameter to provide additional context.  </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>
The 'error' parameter within the CBOR map carried in the payload of the 4.00 (Bad Request) response MUST have value 1 ("Invalid set of parameters").</t>
              </li>
              <li>
                <t>The 'cursor' query parameter has a value other than 0 or than a positive integer, or it has a value strictly greater than MAX_INDEX (see <xref target="sec-trl-endpoint-supporting-cursor"/>).      </t>
                <t>
The 'error' parameter within the CBOR map carried in the payload of the 4.00 (Bad Request) response MUST have value 0 ("Invalid parameter value"). The CBOR map MUST also include the 'cursor' parameter, which MUST specify either: the CBOR simple value "null" (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>
The 'error' parameter within the CBOR map carried in the payload of the 4.00 (Bad Request) response MUST have value 2 ("Out of bound cursor value"). The CBOR map MUST also include the 'cursor' parameter, which MUST specify the current value of 'last_index' for the update collection associated with the requester.</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>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 use the authenticated identity of the registered device to perform the necessary filtering on the TRL content.</li>
            <li>If the requester is an administrator, HASHES specifies all the token hashes currently in the TRL.</li>
          </ul>
        </li>
        <li>
          <t>The AS sends a 2.05 (Content) response to the requester. The response MUST have Content-Format "application/ace-trl+cbor". The payload of the response is a CBOR map, which MUST be formatted as follows.  </t>
          <ul spacing="normal">
            <li>
              <t>The 'full_set' parameter MUST be included and specifies a CBOR array 'full_set_value'. Each element of 'full_set_value' specifies one of the token hashes from the set HASHES, encoded as a CBOR byte string. If the set HASHES is empty, the 'full_set' parameter specifies the empty CBOR array.      </t>
              <t>
The CBOR array MUST be treated as a set, i.e., the order of its elements has no meaning.</t>
            </li>
            <li>
              <t>The 'cursor' parameter MUST 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 specified according to what is defined 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 MUST NOT be included. In case the requester does not support both diff queries and the "Cursor" extension, it MUST 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 of 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[
2.05 Content
Content-Format: application/ace-trl+cbor
Payload:
{
   "full_set" : [
     h'01fa51cc ... ', h'01748190 ... '
   ]
}
]]></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>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.</li>
        <li>The AS determines U = min(NUM, SIZE), where SIZE &lt;= MAX_N is the number of TRL updates pertaining to the requester and currently stored at the AS.</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>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.</li>
            <li>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.</li>
          </ul>
          <t>
The CBOR arrays 'removed' and 'added' MUST 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 MUST have Content-Format "application/ace-trl+cbor". The payload of the response is a CBOR map, which MUST be formatted as follows.  </t>
          <ul spacing="normal">
            <li>
              <t>The 'diff_set' parameter MUST 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 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' MUST 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 update to the subset of the TRL pertaining to the requester. The second 'diff_entry' element relates to the second from last most recent update to that subset, and so on.</t>
            </li>
            <li>
              <t>The 'cursor' parameter and the 'more' parameter MUST 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 specified according to what is defined 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 MUST NOT be included. In case the requester supports diff queries but not the "Cursor" extension, it MUST 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 of 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[
2.05 Content
Content-Format: application/ace-trl+cbor
Payload:
{
   "diff_set" : [
     [
       [ h'01fa51cc ... ', h'01748190 ... '],
       [ h'01cdf1ca ... ', h'01be41a6 ... ']
     ],
     [
       [ h'0144dd12 ... ', h'01231fff ... '],
       []
     ],
     [
       [],
       [ h'01ca986f ... ', h'01fe1a2b ... ']
     ]
   ]
}
]]></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 it supports both diff queries and the "Cursor" extension, the AS 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 "null" (0xf6) or a CBOR unsigned integer.</t>
        <t>The 'cursor' parameter MUST specify the CBOR simple value "null" in case there are currently no TRL updates pertinent 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 a first update pertaining to that requester occurs to the TRL.</t>
        <t>Otherwise, the 'cursor' parameter MUST specify a CBOR unsigned integer. This MUST 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 update pertaining to the requester occurred to the TRL. 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 MUST have Content-Format "application/ace-trl+cbor" and its payload MUST be a CBOR map formatted as follows.</t>
          <ul spacing="normal">
            <li>The 'diff_set' parameter MUST be included and specifies the empty CBOR array.</li>
            <li>The 'cursor' parameter MUST be included and specifies the CBOR simple value "null" (0xf6).</li>
            <li>The 'more' parameter MUST be included and specifies the CBOR simple value "false" (0xf4).</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 same 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 MUST be formatted as follows.  </t>
              <ul spacing="normal">
                <li>The 'diff_set' parameter MUST 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 diff entry.</li>
                <li>
                  <t>The 'cursor' parameter MUST be present and specifies a CBOR unsigned integer. This MUST 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 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 MUST be present and MUST specify the CBOR simple value "false" (0xf4) if U &lt;= MAX_DIFF_BATCH, or the CBOR simple value "true" (0xf5) otherwise.      </t>
                  <t>
If the 'more' parameter has value "true", 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>
                </li>
              </ul>
            </li>
          </ul>
        </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 history of updates 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 MUST have Content-Format "application/ace-trl+cbor" and its payload MUST be a CBOR map formatted as follows.  </t>
              <ul spacing="normal">
                <li>The 'diff_set' parameter MUST be included and specifies the empty CBOR array.</li>
                <li>The 'cursor' parameter MUST be included and specifies the CBOR simple value "null" (0xf6).</li>
                <li>The 'more' parameter MUST be included and specifies the CBOR simple value "true" (0xf5).</li>
              </ul>
              <t>
With the combination ('cursor', 'more') = ("null", "true"), the AS is signaling 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 should 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 same 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 MUST be formatted as follows.      </t>
                  <ul spacing="normal">
                    <li>The 'diff_set' parameter MUST 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 diff entry. Note that L might have value 0, in which case 'diff_set_value' is the empty CBOR array.</li>
                    <li>
                      <t>The 'cursor' parameter MUST be present and MUST specify a CBOR unsigned integer. In particular:          </t>
                      <ul spacing="normal">
                        <li>If L is equal to 0, i.e., the series item X is the last one in the update collection, then the 'cursor' parameter MUST 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.</li>
                        <li>If L is different than 0, then the 'cursor' parameter MUST 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 update pertaining to the requester and returned in this diff query response.</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 MUST be present and MUST specify the CBOR simple value "false" (0xf4) if SUB_U &lt;= MAX_DIFF_BATCH, or the CBOR simple value "true" (0xf5) otherwise.          </t>
                      <t>
If 'more' has value "true", 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>
                </li>
              </ul>
            </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>The url-path to the TRL endpoint at the AS.</li>
        <li>The hash function used to compute token hashes. This is specified as an integer or a text string, taking value from the "ID" or "Hash Name String" column of the "Named Information Hash Algorithm" Registry <xref target="Named.Information.Hash.Algorithm"/>, respectively.</li>
        <li>Optionally, 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"/>).</li>
        <li>Optionally, 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"/>).</li>
      </ul>
      <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 completed the registration procedure 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.</t>
      <section anchor="handling-of-access-tokens-and-token-hashes">
        <name>Handling of Access Tokens and Token Hashes</name>
        <t>When receiving a response from the TRL endpoint, a registered device MUST expunge every stored access token associated with a token hash specified in the response. In case the registered device is an RS, it MUST store the token hash.</t>
        <t>An RS MUST NOT accept and store an access token, if the corresponding token hash is among the currently stored ones.</t>
        <t>An RS stores a token hash th1 corresponding to an access token t1 until both the following conditions hold.</t>
        <ul spacing="normal">
          <li>The RS has received and seen t1, irrespective of having accepted and stored it.</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>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"/>).</li>
              <li>The value of the 'exp' claim specified in t1 indicates that t1 has expired.</li>
              <li>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.</li>
              <li>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.</li>
            </ul>
          </li>
        </ul>
        <t>The RS MUST NOT delete the stored token hashes whose corresponding access tokens do not fulfill the two conditions above, unless it becomes necessary due to memory limitations. In such a case, the RS MUST 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 MUST 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* MUST 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 MUST use the Content-Format "application/ace-trl+cbor" defined in <xref target="iana-content-type"/> of this specification.</t>
      <t>The table below summarizes them, and specifies the CBOR value to use as abbreviation instead of the full descriptive name.</t>
      <figure anchor="fig-cbor-trl-params">
        <name>CBOR abbreviations for the ACE Token Revocation List parameters</name>
        <artwork align="center"><![CDATA[
+-------------------+------------+------------------------+
| Name              | CBOR Value | CBOR Type              |
+-------------------+------------+------------------------+
| full_set          |  0         | array                  |
+-------------------+------------+------------------------+
| diff_set          |  1         | array                  |
+-------------------+------------+------------------------+
| cursor            |  2         | unsigned integer /     |
|                   |            | simple value "null"    |
+-------------------+------------+------------------------+
| more              |  3         | simple value "false" / |
|                   |            | simple value "true"    |
+-------------------+------------+------------------------+
| error             |  4         | integer                |
+-------------------+------------+------------------------+
| error_description |  5         | text string            |
+-------------------+------------+------------------------+
]]></artwork>
      </figure>
    </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 include as error identifiers, in the 'error' parameter of an error response from the TRL endpoint. This applies to error responses whose payload is a CBOR map and whose Content-Format is "application/ace-trl+cbor".</t>
      <figure anchor="fig-ACE-TRL-Error">
        <name>ACE Token Revocation List Error Identifiers</name>
        <artwork align="center"><![CDATA[
+-------+---------------------------+
| Value | Description               |
+-------+---------------------------+
|   0   | Invalid parameter value   |
+-------+---------------------------+
|   1   | Invalid set of parameters |
+-------+---------------------------+
|   2   | Out of bound cursor value |
+-------+---------------------------+
]]></artwork>
      </figure>
    </section>
    <section anchor="sec-security-considerations">
      <name>Security Considerations</name>
      <t>Security considerations are inherited 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 MUST ensure that each registered device can access and retrieve only its pertaining subset of the TRL. To this end, the AS can 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>Disclosing any information about revoked access tokens to entities other than the intended registered devices may result in privacy concerns. Therefore, the AS MUST ensure that, other than registered devices accessing their own pertaining subset of the TRL, only authorized and authenticated administrators can retrieve the full TRL. To this end, the AS may rely on an access control list or similar.</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, 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. Issuing access tokens with not too long expiration time could help reduce the size of the TRL, but an AS SHOULD take measures to limit this size.</t>
      </section>
      <section anchor="communication-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 registered device. The suppression of those notifications by an external attacker that has access to the network would prevent registered devices from ever knowing that their pertaining access tokens have been revoked.</t>
        <t>In order to avoid this, a registered device SHOULD NOT rely solely on the CoAP Observe notifications. In particular, a registered device SHOULD 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 might anyway receive an unprotected 4.01 (Unauthorized) response from the RS.</t>
        <t>This can be due to different reasons. For example, the access token has actually been revoked and the Client is not aware about that yet, while the RS has gained knowledge about that and has expunged the access token. Also, an on-path, active adversary might have injected a forged 4.01 (Unauthorized) response.</t>
        <t>In either case, if the Client believes that the access token is still valid, it SHOULD NOT immediately ask for a new access token to the Authorization Server upon receiving a 4.01 (Unauthorized) response from the RS. Instead, the Client SHOULD 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="dishonest-clients">
        <name>Dishonest Clients</name>
        <t>A dishonest Client may attempt to exploit its early knowledge about a revoked access token, in order to illegitimately continue accessing a protected resource at the RS beyond the access token revocation.</t>
        <t>That is, the Client might gain knowledge about the revocation of an access token considerably earlier than the RS, e.g., if the Client relies on CoAP Observe to access the TRL at the AS, while the RS relies only on polling through individual requests.</t>
        <t>This makes the RS vulnerable during a time interval that starts when the Client gains knowledge of the revoked access token and ends when the RS expunges the access token, e.g., after having gained knowledge of its revocation. During such a time interval, the Client would be able to illegitimately access protected resources at the RS, if this still retains the access token without knowing about its revocation yet.</t>
        <t>In order to mitigate the risk of such an abuse, if an RS relies solely on polling through individual requests to the TRL endpoint, the RS SHOULD enforce an adequate trade-off between the polling frequency and the maximum length of the vulnerable time window.</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: &lt;iesg@ietf.org&gt;</t>
        <t>Intended usage: COMMON</t>
        <t>Restrictions on usage: None</t>
        <t>Author: Marco Tiloca &lt;marco.tiloca@ri.se&gt;</t>
        <t>Change controller: IESG</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 "CoRE Parameters" registry group.</t>
        <t>Media Type: application/ace-trl+cbor</t>
        <t>Encoding: -</t>
        <t>ID: TBD</t>
        <t>Reference: [RFC-XXXX]</t>
      </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>The registry uses the "Expert Review" registration procedure <xref target="RFC8126"/>. Expert Review guidelines are provided in <xref target="review"/>. It should be noted that, in addition to the Expert Review, some portions of the registry require a specification, potentially a Standards Track RFC, to be supplied as well.</t>
        <t>The columns of this registry are:</t>
        <ul spacing="normal">
          <li>Name: This field contains a descriptive name that enables easier reference to the item. The name MUST be unique. It is not used in the encoding.</li>
          <li>CBOR Value: This field contains the value used as CBOR abbreviation of the item. These values MUST be unique. The value can be 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".</li>
          <li>CBOR Type: This field contains the CBOR type of the item, or a pointer to the registry that defines its type, when that depends on another item.</li>
          <li>Reference: This field contains a pointer to the public specification for the item.</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>The registry uses the "Expert Review" registration procedure <xref target="RFC8126"/>. Expert Review guidelines are provided in <xref target="review"/>. It should be noted that, in addition to the Expert Review, some portions of the registry require a specification, potentially a Standards Track RFC, to be supplied as well.</t>
        <t>The columns of this registry are:</t>
        <ul spacing="normal">
          <li>Value: The field contains the value to be used to identify the error. These values MUST be unique. The value can be 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".</li>
          <li>Description: This field contains a brief description of the error.</li>
          <li>Reference: This field contains a pointer to the public specification defining the error, if one exists.</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 "Expert Review". 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>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.</li>
          <li>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.</li>
          <li>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.</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">
              <organization/>
            </author>
            <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="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="J. Klensin" initials="J." surname="Klensin">
              <organization/>
            </author>
            <author fullname="T. Hansen" initials="T." surname="Hansen">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="D. Kutscher" initials="D." surname="Kutscher">
              <organization/>
            </author>
            <author fullname="C. Dannewitz" initials="C." surname="Dannewitz">
              <organization/>
            </author>
            <author fullname="B. Ohlman" initials="B." surname="Ohlman">
              <organization/>
            </author>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <author fullname="P. Hallam-Baker" initials="P." surname="Hallam-Baker">
              <organization/>
            </author>
            <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="RFC7252">
          <front>
            <title>The Constrained Application Protocol (CoAP)</title>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby">
              <organization/>
            </author>
            <author fullname="K. Hartke" initials="K." surname="Hartke">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="J. Bradley" initials="J." surname="Bradley">
              <organization/>
            </author>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <author fullname="T. Narten" initials="T." surname="Narten">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem">
              <organization/>
            </author>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman">
              <organization/>
            </author>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig">
              <organization/>
            </author>
            <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="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">
              <organization/>
            </author>
            <author fullname="C. Vigano" initials="C." surname="Vigano">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <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="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <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="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">
              <organization/>
            </author>
            <author fullname="G. Selander" initials="G." surname="Selander">
              <organization/>
            </author>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem">
              <organization/>
            </author>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman">
              <organization/>
            </author>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig">
              <organization/>
            </author>
            <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="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">
              <organization/>
            </author>
            <author fullname="S. Dronia" initials="S." surname="Dronia">
              <organization/>
            </author>
            <author fullname="M. Scurtescu" initials="M." surname="Scurtescu">
              <organization/>
            </author>
            <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 TRL updates, with the AS specifying U &lt;= MAX_N diff entries as the U most recent updates to the subset of the TRL 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>Parameters of the TRL Endpoint</name>
      <t><xref target="fig-TRL-endpoint-parameters"/> provides an aggregated overview of the parameters used by the TRL endpoint, when the AS supports 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>Name: parameter name. A name with letters in uppercase denotes a parameter whose value does not change after its initialization.</li>
        <li>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).</li>
        <li>Description: short parameter description.</li>
        <li>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.</li>
      </ul>
      <figure anchor="fig-TRL-endpoint-parameters">
        <name>Parameters of the TRL Endpoint</name>
        <artwork align="center"><![CDATA[
+----------------+----------+--------------------+--------------------+
| Name           | Single   | Description        | Value              |
|                | instance |                    |                    |
+----------------+----------+--------------------+--------------------+
| MAX_N          | Y        | Max number of TRL  | LB = 1             |
|                |          | updates stored per |                    |
|                |          | requester          | If supporting      |
|                |          |                    | "Cursor", then     |
|                |          |                    | UB = (MAX_INDEX+1) |
+----------------+----------+--------------------+--------------------+
| MAX_DIFF_BATCH | N        | Max number of diff | LB = 1             |
|                |          | entries included   |                    |
|                |          | in a diff query    | UB = MAX_N         |
|                |          | response when      |                    |
|                |          | using "Cursor"     |                    |
+----------------+----------+--------------------+--------------------+
| MAX_INDEX      | Y        | Max value of each  | LB = (MAX_N-1)     |
|                |          | instance of the    |                    |
|                |          | 'index' parameter  | UB = ((2^64)-1)    |
+----------------+----------+--------------------+--------------------+
| index          | N        | Value associated   | LB = 0             |
|                |          | with a series item |                    |
|                |          | of an updated      | UB = MAX_INDEX     |
|                |          | collection         |                    |
+----------------+----------+--------------------+--------------------+
| last_index     | N        | The 'index' value  | LB = 0             |
|                |          | of the most        |                    |
|                |          | recently added     | UB = MAX_INDEX     |
|                |          | series item in an  |                    |
|                |          | update collection  |                    |
+----------------+----------+--------------------+--------------------+
]]></artwork>
      </figure>
    </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>The details of the registration process are omitted, but it is assumed that the RS sends an unspecified payload to the AS, which replies with a 2.01 (Created) response.</t>
      <t>The payload of the registration response is a CBOR map, which includes the following entries:</t>
      <ul spacing="normal">
        <li>a 'trl_path' parameter, specifying the path of the TRL endpoint;</li>
        <li>a 'trl_hash' parameter, specifying the hash function used to compute token hashes as defined in <xref target="sec-token-name"/>;</li>
        <li>a 'max_n' parameter, specifying the value of MAX_N, i.e., the maximum number of TRL updates pertaining to each registered device that the AS retains for that device (see <xref target="ssec-trl-diff-query"/>);</li>
        <li>possible further parameters related to the registration process.</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 CBOR, 'bstr.h(t1)' and 'bstr.h(t2)' denote the byte-string representations of the token hashes for 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>
          <artwork align="center"><![CDATA[
RS                                                  AS
|                                                    |
|  Registration: POST                                |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|                    2.01 CREATED                    |
|                      Payload: {                    |
|                        ...                         |
|                        "trl_path" : "revoke/trl",  |
|                        "trl_hash" : "sha-256",     |
|                           "max_n" : 10             |
|                      }                             |
|                                                    |
|  GET Observe: 0                                    |
|    coap://as.example.com/revoke/trl/               |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|      2.05 CONTENT Observe: 42                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "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: {                                  |
|          "full_set" : [bstr.h(t1)]                 |
|        }                                           |
|                         .                          |
|                         .                          |
|                         .                          |
|                                                    |
|             (Access token t2 is revoked)           |
|                                                    |
|<---------------------------------------------------+
|      2.05 CONTENT Observe: 64                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "full_set" : [bstr.h(t1), bstr.h(t2)]     |
|        }                                           |
|                                                    |
|                         .                          |
|                         .                          |
|                         .                          |
|                                                    |
|             (Access token t1 expires)              |
|                                                    |
|<---------------------------------------------------+
|      2.05 CONTENT Observe: 75                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "full_set" : [bstr.h(t2)]                 |
|        }                                           |
|                         .                          |
|                         .                          |
|                         .                          |
|                                                    |
|             (Access token t2 expires)              |
|                                                    |
|<---------------------------------------------------+
|      2.05 CONTENT Observe: 86                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "full_set" : []                           |
|        }                                           |
|                                                    |
]]></artwork>
        </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>
          <artwork align="center"><![CDATA[
RS                                                  AS
|                                                    |
|  Registration: POST                                |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|                   2.01 CREATED                     |
|                     Payload: {                     |
|                       ...                          |
|                       "trl_path" : "revoke/trl",   |
|                       "trl_hash" : "sha-256",      |
|                          "max_n" : 10              |
|                     }                              |
|                                                    |
|  GET Observe: 0                                    |
|    coap://as.example.com/revoke/trl?diff=3         |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|      2.05 CONTENT Observe: 42                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "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: {                                  |
|          "diff_set" : [                            |
|                         [ [], [bstr.h(t1)] ]       |
|                       ]                            |
|        }                                           |
|                         .                          |
|                         .                          |
|                         .                          |
|                                                    |
|            (Access token t2 is revoked)            |
|                                                    |
|<---------------------------------------------------+
|      2.05 CONTENT Observe: 64                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "diff_set" : [                            |
|                         [ [], [bstr.h(t2)] ],      |
|                         [ [], [bstr.h(t1)] ]       |
|                       ]                            |
|        }                                           |
|                         .                          |
|                         .                          |
|                         .                          |
|                                                    |
|              (Access token t1 expires)             |
|                                                    |
|<---------------------------------------------------+
|      2.05 CONTENT Observe: 75                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "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: {                                  |
|          "diff_set" : [                            |
|                         [ [bstr.h(t2)], [] ],      |
|                         [ [bstr.h(t1)], [] ],      |
|                         [ [], [bstr.h(t2)] ]       |
|                       ]                            |
|        }                                           |
|                                                    |
]]></artwork>
        </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>
          <artwork align="center"><![CDATA[
RS                                                  AS
|                                                    |
|  Registration: POST                                |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|                   2.01 CREATED                     |
|                     Payload: {                     |
|                       ...                          |
|                       "trl_path" : "revoke/trl",   |
|                       "trl_hash" : "sha-256",      |
|                          "max_n" : 10              |
|                     }                              |
|                                                    |
|  GET Observe: 0                                    |
|    coap://as.example.com/revoke/trl/               |
+--------------------------------------------------->|
|                                                    |
|<---------------------------------------------------+
|      2.05 CONTENT Observe: 42                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "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: {                                  |
|          "full_set" : [bstr.h(t1)]                 |
|        }                                           |
|                         .                          |
|                         .                          |
|                         .                          |
|                                                    |
|            (Access token t2 is revoked)            |
|                                                    |
|<---------------------------------------------------+
|      2.05 CONTENT Observe: 64                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "full_set" : [bstr.h(t1), bstr.h(t2)]     |
|        }                                           |
|                         .                          |
|                         .                          |
|                         .                          |
|                                                    |
|             (Access token t1 expires)              |
|                                                    |
|<---------------------------------------------------+
|      2.05 CONTENT Observe: 75                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "full_set" : [bstr.h(t2)]                 |
|        }                                           |
|                         .                          |
|                         .                          |
|                         .                          |
|                                                    |
|             (Access token t2 expires)              |
|                                                    |
|  X<------------------------------------------------+
|      2.05 CONTENT Observe: 86                      |
|        Content-Format: "application/ace-trl+cbor"  |
|        Payload: {                                  |
|          "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: {                                  |
|          "diff_set" : [                            |
|                         [ [bstr.h(t2)], [] ],      |
|                         [ [bstr.h(t1)], [] ],      |
|                         [ [], [bstr.h(t2)] ],      |
|                         [ [], [bstr.h(t1)] ]       |
|                       ]                            |
|        }                                           |
|                                                    |
]]></artwork>
        </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>
          <artwork 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 Observe: 0                                        |
|    coap://as.example.com/revoke/trl?diff=3             |
+------------------------------------------------------->|
|                                                        |
|<-------------------------------------------------------+
|          2.05 CONTENT Observe: 42                      |
|            Content-Format: "application/ace-trl+cbor"  |
|            Payload: {                                  |
|              "diff_set" : [],                          |
|                "cursor" : null,                        |
|                  "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: {                                  |
|              "diff_set" : [                            |
|                             [ [], [bstr.h(t1)] ]       |
|                           ],                           |
|                "cursor" : 0,                           |
|                  "more" : false                        |
|            }                                           |
|                           .                            |
|                           .                            |
|                           .                            |
|                                                        |
|              (Access token t2 is revoked)              |
|                                                        |
|<-------------------------------------------------------+
|          2.05 CONTENT Observe: 64                      |
|            Content-Format: "application/ace-trl+cbor"  |
|            Payload: {                                  |
|              "diff_set" : [                            |
|                             [ [], [bstr.h(t2)] ],      |
|                             [ [], [bstr.h(t1)] ]       |
|                           ],                           |
|                "cursor" : 1,                           |
|                  "more" : false                        |
|            }                                           |
|                           .                            |
|                           .                            |
|                           .                            |
|                                                        |
|              (Access token t1 expires)                 |
|                                                        |
|<-------------------------------------------------------+
|          2.05 CONTENT Observe: 75                      |
|            Content-Format: "application/ace-trl+cbor"  |
|            Payload: {                                  |
|              "diff_set" : [                            |
|                             [ [bstr.h(t1)], [] ],      |
|                             [ [], [bstr.h(t2)] ],      |
|                             [ [], [bstr.h(t1)] ]       |
|                           ],                           |
|                "cursor" : 2,                           |
|                  "more" : false                        |
|            }                                           |
|                           .                            |
|                           .                            |
|                           .                            |
|                                                        |
|              (Access token t2 expires)                 |
|                                                        |
|<-------------------------------------------------------+
|          2.05 CONTENT Observe: 86                      |
|            Content-Format: "application/ace-trl+cbor"  |
|            Payload: {                                  |
|              "diff_set" : [                            |
|                             [ [bstr.h(t2)], [] ],      |
|                             [ [bstr.h(t1)], [] ],      |
|                             [ [], [bstr.h(t2)] ]       |
|                           ],                           |
|                "cursor" : 3,                           |
|                  "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: {                                  |
|              "diff_set" : [                            |
|                             [ [bstr.h(t2)], [] ],      |
|                             [ [bstr.h(t1)], [] ],      |
|                             [ [], [bstr.h(t2)] ]       |
|                           ],                           |
|                "cursor" : 3,                           |
|                  "more" : false                        |
|            }                                           |
|                                                        |
|  GET                                                   |
|    coap://as.example.com/revoke/trl?diff=3&cursor=3    |
+------------------------------------------------------->|
|                                                        |
|<-------------------------------------------------------+
|          2.05 CONTENT                                  |
|            Content-Format: "application/ace-trl+cbor"  |
|            Payload: {                                  |
|              "diff_set" : [],                          |
|                "cursor" : 3,                           |
|                  "more" : false                        |
|            }                                           |
|                                                        |
]]></artwork>
        </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>The query parameter 'diff' with value 8, i.e., the maximum number of diff entries to be specified in a response from the AS.</li>
          <li>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).</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 "true". 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>
          <artwork 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 Observe: 0                                               |
|    coap://as.example.com/revoke/trl/                          |
+-------------------------------------------------------------->|
|                                                               |
|<--------------------------------------------------------------+
|                 2.05 CONTENT Observe: 42                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [],                          |
|                       "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: {                                  |
|                     "full_set" : [bstr.h(t1)],                |
|                       "cursor" : 0                            |
|                   }                                           |
|                               .                               |
|                               .                               |
|                               .                               |
|                                                               |
|                  (Access token t2 is revoked)                 |
|                                                               |
|<--------------------------------------------------------------+
|                 2.05 CONTENT Observe: 64                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [bstr.h(t1), bstr.h(t2)],    |
|                       "cursor" : 1                            |
|                   }                                           |
|                               .                               |
|                               .                               |
|                               .                               |
|                                                               |
|                   (Access token t1 expires)                   |
|                                                               |
|<--------------------------------------------------------------+
|                 2.05 CONTENT Observe: 75                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [bstr.h(t2)],                |
|                     "cursor"   : 2                            |
|                   }                                           |
|                               .                               |
|                               .                               |
|                               .                               |
|                                                               |
|                   (Access token t2 expires)                   |
|                                                               |
|  X<-----------------------------------------------------------+
|                 2.05 CONTENT Observe: 86                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [],                          |
|                       "cursor" : 3                            |
|                   }                                           |
|                               .                               |
|                               .                               |
|                               .                               |
|                                                               |
|                  (Access token t3 is revoked)                 |
|                                                               |
|  X<-----------------------------------------------------------+
|                 2.05 CONTENT Observe: 88                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [bstr.h(t3)],                |
|                       "cursor" : 4                            |
|                   }                                           |
|                               .                               |
|                               .                               |
|                               .                               |
|                                                               |
|                  (Access token t4 is revoked)                 |
|                                                               |
|  X<-----------------------------------------------------------+
|                 2.05 CONTENT Observe: 89                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [bstr.h(t3), bstr.h(t4)],    |
|                       "cursor" : 5                            |
|                   }                                           |
|                               .                               |
|                               .                               |
|                               .                               |
|                                                               |
|                    (Access token t3 expires)                  |
|                                                               |
|  X<-----------------------------------------------------------+
|                 2.05 CONTENT Observe: 90                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [bstr.h(t4)],                |
|                       "cursor" : 6                            |
|                   }                                           |
|                               .                               |
|                               .                               |
|                               .                               |
|                                                               |
|                    (Access token t4 expires)                  |
|                                                               |
|  X<-----------------------------------------------------------+
|                 2.05 CONTENT Observe: 91                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [],                          |
|                       "cursor" : 7                            |
|                   }                                           |
|                               .                               |
|                               .                               |
|                               .                               |
|                                                               |
|              (Access tokens t5 and t6 are revoked)            |
|                                                               |
|  X<-----------------------------------------------------------+
|                 2.05 CONTENT Observe: 92                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [bstr.h(t5), bstr.h(t6)],    |
|                     "cursor" : 8                              |
|                   }                                           |
|                               .                               |
|                               .                               |
|                               .                               |
|                                                               |
|                    (Access token t5 expires)                  |
|                                                               |
|  X<-----------------------------------------------------------+
|                 2.05 CONTENT Observe: 93                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [bstr.h(t6)],                |
|                     "cursor" : 9                              |
|                   }                                           |
|                               .                               |
|                               .                               |
|                               .                               |
|                                                               |
|                    (Access token t6 expires)                  |
|                                                               |
|  X<-----------------------------------------------------------+
|                 2.05 CONTENT Observe: 94                      |
|                   Content-Format: "application/ace-trl+cbor"  |
|                   Payload: {                                  |
|                     "full_set" : [],                          |
|                       "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: {                                  |
|                     "diff_set" : [                            |
|                                    [ [bstr.h(t4)], [] ],      |
|                                    [ [bstr.h(t3)], [] ],      |
|                                    [ [], [bstr.h(t4)] ],      |
|                                    [ [], [bstr.h(t3)] ],      |
|                                    [ [bstr.h(t2)], [] ]       |
|                                  ],                           |
|                       "cursor" : 7,                           |
|                         "more" : true                         |
|                   }                                           |
|                                                               |
|  GET                                                          |
|    coap://as.example.com/revoke/trl?diff=8&cursor=7           |
+-------------------------------------------------------------->|
|                                                               |
|<--------------------------------------------------------------+
|        2.05 CONTENT                                           |
|          Content-Format: "application/ace-trl+cbor"           |
|          Payload: {                                           |
|            "diff_set" : [                                     |
|                           [ [bstr.h(t6)], [] ],               |
|                           [ [bstr.h(t5)], [] ],               |
|                           [ [], [bstr.h(t5), bstr.h(t6)] ]    |
|                         ],                                    |
|              "cursor" : 10,                                   |
|                "more" : false                                 |
|          }                                                    |
|                                                               |
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="sec-document-updates">
      <name>Document Updates</name>
      <t>RFC EDITOR: Please remove this section.</t>
      <section anchor="sec-05-06">
        <name>Version -05 to -06</name>
        <ul spacing="normal">
          <li>Clarified instructions for Expert Review in the IANA considerations.</li>
        </ul>
      </section>
      <section anchor="sec-04-05">
        <name>Version -04 to -05</name>
        <ul spacing="normal">
          <li>Explicit focus on CoAP in the abstract and introduction.</li>
          <li>Removed terminology aliasing ("TRL endpoint" vs. "TRL resource").</li>
          <li>Use "requester" instead of "caller".</li>
          <li>Use "subset" instead of "portion".</li>
          <li>Revised presentation of how token hashes are computed.</li>
          <li>Improved error handling.</li>
          <li>Revised examples.</li>
          <li>More precise security considerations.</li>
          <li>Clarifications and editorial improvements.</li>
          <li>Updated author list.</li>
        </ul>
      </section>
      <section anchor="sec-03-04">
        <name>Version -03 to -04</name>
        <ul spacing="normal">
          <li>Improved presentation of pre- and post-registration operations.</li>
          <li>Removed moot processing cases with the "Cursor" extension.</li>
          <li>Positive integers as CBOR abbreviations for all parameters.</li>
          <li>Renamed N_MAX as MAX_N.</li>
          <li>Access tokens are not necessarily uploaded through /authz-info.</li>
          <li>The use of the "c.pmax" conditional attribute is just an example.</li>
          <li>Revised handling of token hashes at the RS.</li>
          <li>Extended and improved security considerations.</li>
          <li>Fixed details in IANA considerations.</li>
          <li>New appendix overviewing parameters of the TRL endpoint.</li>
          <li>Examples of message exchange moved to an appendix.</li>
          <li>Added examples of message exchange with the "Cursor" extension.</li>
          <li>Clarifications and editorial improvements.</li>
        </ul>
      </section>
      <section anchor="sec-02-03">
        <name>Version -02 to -03</name>
        <ul spacing="normal">
          <li>Definition of MAX_INDEX for the "Cursor" extension.</li>
          <li>Handling wrap-around of 'index' when using the "Cursor" extension.</li>
          <li>Error handling for the case where 'cursor' &gt; MAX_INDEX.</li>
          <li>Improved error handling in case 'index' is out-of-bound.</li>
          <li>Clarified parameter semantics, message content and examples.</li>
          <li>Editorial improvements.</li>
        </ul>
      </section>
      <section anchor="sec-01-02">
        <name>Version -01 to -02</name>
        <ul spacing="normal">
          <li>Earlier mentioning of error cases.</li>
          <li>Clearer distinction between maintaining the history of TRL updates and preparing the response to a diff query.</li>
          <li>Defined the use of "cursor" in the document body, as an extension of diff queries.</li>
          <li>Both success and error responses have a CBOR map as payload.</li>
          <li>Corner cases of message processing explained more explicitly.</li>
          <li>Clarifications and editorial improvements.</li>
        </ul>
      </section>
      <section anchor="sec-00-01">
        <name>Version -00 to -01</name>
        <ul spacing="normal">
          <li>Added actions to perform upon receiving responses from the TRL endpoint.</li>
          <li>Fixed off-by-one error when using the "Cursor" pattern.</li>
          <li>Improved error handling, with registered error codes.</li>
          <li>Section restructuring (full- and diff-query as self-standing sections).</li>
          <li>Renamed identifiers and CBOR parameters.</li>
          <li>Clarifications and editorial improvements.</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="Rikard Höglund"/>, <contact fullname="Benjamin Kaduk"/>, <contact fullname="David Navarro"/>, <contact fullname="Marco Rasori"/>, <contact fullname="Michael Richardson"/>, <contact fullname="Jim Schaad"/>, <contact fullname="Göran Selander"/> and <contact fullname="Travis Spencer"/> for their comments and feedback.</t>
      <t>The work on this document has been partly supported by VINNOVA and the Celtic-Next project CRITISEC; and by the H2020 project SIFIS-Home (Grant agreement 952652).</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
3Z2NlVLGRHPMW6MF1kbMhhM0ywO1Qr9aUtWGHMdWFWYgaD7HNeo6vpwDY1uo
SaxybBxISazPooU2OC8bJiyGoC7/XZLOTILU2rRmB3lrzcvDXPSh2ht/7Euo
qcQJUJF1CRFYoqJs20zXKpYoBVYHckfAofhhdy1OZ1dP04Uq7GT4FcURWQ/F
7/FcPNqv26VOt1yvskppeq2c3HZSuOjpNY5gn+BtqP63oDiVV5I+X8e5bK3p
39ZYUsSFwmzN4vXdLLFOX2Bd67kaci2PuoNke5arAwVBkZIefVNjAarzkP2e
vqnnv4VvKq84LReKssblrK/A2rpr7fHUiLq8Gr5gh+/YsDFg0DEDdiBt/8Zt
ZluTXZ+VBygm/GbhouqLJ92BBs2XQqDOpYRVnLuyQV+/xuY4V+w3royEwS0P
HWyIqnJYB+fqFBwb45Y5hDoqDgp4L2tPa0/KRTaX5vuV3FcTiVyZrinzxT20
S3uECR2Y7VAXNa2jynR1nGbBrRksbdCC5Mqyk6UGPbCM0MqOOy2CJbj6mspY
mPplIu51wXa1NKtmm/bauhWFckdAYfec4M4Fy9SpPuOQuiybzwrLyK8S4tW4
rn53h7rdb6XYOaFO9ZnuJjrmVSWN3SnJxoZMSQZizljJSdT3PFF2IsnYI7So
HAYdcZ7bpQtpbFP2jipnyVT0wsr1+epabL6yi/JZ9a5ITyGDNEJtRBl56ykk
XX+JU5naJqmTbNm80bXjU6rnRKXBYlAVkOipHJpCt8lNNfDKU0OyLqyPtJd9
NEetFuCnbvuUq5asCgaf9lE8WE6HWu04Hiyjx9zqSB4sllqr9W/LHO7/R4Wu
g3SKt5FyzqxaUFsG3sLKcDy7tvSypbce9RxQx8KJrqRUo1YZ65pVgw+jDCpX
gNUUA5ygujKcqzCcWG5mCSeEXHnknEWlxqVF+Asovm0mbweE5JdsMkz7dHeM
1HlivRDnbHExxxJQuj/DN5VXsgd8L8Egiq+4G7/YLEt6KeQkwh7LXta7Gw7P
QehilCIaDOE1y8DfkJNFC4U+29oUammHlRgo55YMKaTKafmLtIaVqsVsSeE5
zTNV7T1PKH1YshS4wDFy5vuV5Qzd/rW+TND5/aWivLklbe5OlN1ysg1s/yPb
c7iKwe9k0jl//f2bBWYdnb2Arzq5DfCF5Ddg3+pjNbFhOYMHXYCqlVG3uGUZ
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
HXx5eA7Ayi/RPq7crML9lWNJMUu2d1KIvX3hTcgXz/lqRnCiGRflsBOk0WSt
DCx2DofHBBX8ECkDuufuOYll0GcT/z2ppq4Vma6rV3mXDAXALFd+Ds+9FeIW
PqRu2PlZB8Grl+cXi5s1VYKqe/7NX8ZumUn+6xrDfe0fjWTJ0dnx4cXx01qQ
+J5XvK0HwfuVmgVBt9ttWlvdTy0ld1rBARoeMaHoEXzXai9uhoRMzfLLEMP+
sE3zaNiSpAU221mobPPzoaG3RaM1N0P/mfCQg5Lq3zzaIA1nB48ehXlXaL4L
XPyRgd6jSrPPCZXp2qyjl6cXx6cWfPZ6taOpP92spIOmREq7WTPO144GuKTK
kSI6/f0fyzVrRqeG0UpPPbl9Qs0aHqfZ5qFfCquTR00zqpVr396Wz/usqVOC
8PnWUpP8oiC5fjNnD+iSkFxleG41NFt+tI/AFPZ3a0dTf/6+TMFor1X2cM8U
FjYr4WTvc8DJx3u1o6k/PxWcbAfmMPWPcrO7wsk1m33hqLwjxfzzreZmy4/2
EVD5m/3a0dSfnwYq9+7Z6zLPQvb6GeDkk8cL1/bf6hzQ2Mzn1yCDlPJi2K4I
tIjVmLia3BkPKKdvSbtYz7WLdXp3YhnzBgiai9rMbXenwXfBLho23ZvyvFGu
OsI5rzEVO+HVkrRpxxr6bv6jW50+rsFOBdw9RFOw84MkbqxmyqtGaN+b8hZO
8u5MeYssebW8YQE3q19bkyWvoVmTJW9RsxpLXjPfq7Xk1TZbwHI/SVPe/0D6
+866PuWzQuXPx5Sn0jPuTXmrP/emvJWaNTylZkua5D4tBf1TtMk51L10s9Lz
d2AMbdek94+FzZpYyT0vWdhsSQPgp0UBn6IF8GNQAFpd/rGEqnZPOHfVrOGp
NFvO4PhJEc6naG+8K8KxsL+NGuYahHNPb58RvdUYUz8pevsUbal3TW+91ejt
rsh04SR/a3prbFZrJ+706izFNUbfZktxXQTlbDLP7R49luPdkuV496PGVF6Y
qHi+W0j1xvmh8q57a1PpAigsKTXB1IxYqhVQQSBTNGXOtt4M44pVQCxFyv/I
6dYx3rw0m3FJbZws5ceGwXUY83WFWGlfBehK0L191RBdTzMJZ7l1YbgEqDuV
G+R+L70XXIrdDleHP9W1gXW29sBran/yhZja2x87OFYuC7q36N9b9O8t+l+4
Rf8+OPfLd8p/UYebe4v+omYNz71F/z7K9ndp1vDc29i/vCjbLwwn78NlPyZO
3ofLLvUswMm7D5cNgp9WRsvP0MR7r5kvaNbwuM02jxO6EZRsgWjwm4U55vXn
VBK1ppmqrCplgOOraOhYMrf8zVadJB6g12i2bEjcE6vZZ3uAXhYk+Nx7YpZq
9sU6TBub1TtwdlcM9S/7YtYL/cfD/89iT/+55c0EII9OnX1+UdlU2y5v3/l6
Fd3I7RfL1MsJ9cWgWLNV1ckJ2RBJ6N8Pi8Fly5jc1Y0rTglvp76MKRbYXGjG
dWlgsRi5TMk25lt+jcZy6QRDch7ZLrK93yK5wgVFuVK4+HsINxhMu6uAZQVP
z+FIXaUMk0JRyM41kW+he3mt7arjK2yW9Kp9fE+a1PzCW5SoVhNeYTHDmYS6
NpAHC/hWheatEMeSXZXe4ywapJlVpF8Dmy/mspycNT4mfcUTXuuTzvOP423C
Z12PEzPMtbxO3HQdbeM2GodMeB2tw9E8nGehF0qDyfMsoVMsWOua5WLwWbNk
jG66VtkYam25p9rLTbgsSA6CkolgTcfWchNubrq6g8saddW0FW76OVPO2o4v
fNbU3fFZW3/Hp5TW0vY38zaFxgNRuw5APk8mtY29m9PCWAVsOgoneVT93dv0
7lTlhoP3p9m08Wky2Dc65CpNl3fKfZpg+o0gvLyj7rajfkTetITbDp9Pgzet
1LT0rHV8x6eJIS7giNsrNr3niKs2bXwW0WutE/MTptclXJr4fHH0uqyVztP0
NyH1nXtS/8hNG5/Fotnvhrv1qB+R1JfwFOPzRZD6OnZ8afo5cYnePZf4yE0b
n8UKwefHJZbw3ePzRXGJVZyEpaZ3wWCWmvAtuMTuPZf4yE0bn7IhZdnwCc+o
Hz+KQjddPZLCGvW/uaV2WTCp556Z3jPTj8ZMFzf9LUj9XxiCTPP3pP7ZOmW+
NPSvj2HaWzEJvRR+dDc56fRjc0zT/n1E08eNaNr/vZL+83R6n/VfzfoHZAdE
KuLBfBJmZjyFS3S53MVSYWFPPlJYWM34KsnemkGvzdsjEEJg666qN1Lit9Z9
l7l1sx7+hEUiqG/3nk/oOpzg/Hvq5nC3Gd4a6lyj6dwuaPtt9ZmDL9qMwmwS
493sdpSbAsmW4LYPRMJiED1GcQajE3+okv53+6Xl1oPGjSATjAIcD+QKSFMj
glanotqc7rGyAZD2nPhYeBXGk7BP97/7x2wjKYBELRQgK6USPGFqrSKbR60F
tRfK7eg6zgKbf6Mxllfo7rR9Nyvfr1q6HtWt2GDd9qgCGcNCExQjSY6BgHJZ
ZEMoYOnyw2VQH5eSBGk2xIFTvMYQZnrFFaYTEFHEiQg3NXYsiQx3FOsnz21C
/rSasXbkn+5hXY35DhRns4p19WefGl1+bhUcKM/tYwTluUWooDy3iBi0e1g7
cFB1snr8oN1ynTBCeT5uNKHdw3pBhe4cVi2g4fTwpdLmrcIP5bnFgVeeW517
5Sml/612/FV9uKGJK/ZwtyfaRlv1Z9PDoqfaQyUKsU3X5ha7vjBE/xxWiUZc
ahWfAiQ/hb3Yg33Yh/8/XnovVtyKzwSSv8deBKsEj97VHH4zibNkUKk8n6LE
cTwcS/bghn6uPod7ibP6swxlNYR53tUcfjPKWjL8U55Pm7Kckjftph7cSMvV
53BPWas//h6WD6v83ChryWhLeT5lyuqtILM0XQUYnbj6HO4pa/VnKcpqCEW8
szmsXkdoLcpaMkJRnk+Rsm5tf6jRh5t6uKes1Z9ltMHdj68N/naU9cQzgdpV
fIqUpWTW7rrnrBp9uKmHe8pa/VmGsva+JMr6dgU4fOKUZc5Ze6ucs2r04aY5
3FPW6k9NDxWpVa8Ofl6U9W2NZezzo6y9dWVWjT7c1MM9Za3+LEdZe18OZdVY
xj4fyrr1Oeub1edwT1mrP5Ueyq7FfQ5kfUwhendYJr7cw29FWZ99BIWSWfuW
Nvh4gTZo0VXNObN5DveUtfqznMza/3Jk1hfjKX68jtUdALDOHO4pa/VnOcp6
/OVQ1mfvKb61Nli+IG6JHu4pa/XH08MqOfM1c1ghdf7uVrFeZq07hyVvJlAJ
tj2nh/8WkcnLQrL0fCI86s5y8OX5e8mitEI+fbWH3bV7sBPz91Yoo+TvYXet
HiolCYIVeli1RoA8tvVgvR6slGlMFluxh98oc9ru4Xfgct84PXxhXG415laG
JD+rMDd/D6swN38PqzC3uh5Kz99LBySLNa3ew/7aPdisqWQCYSbT1EMjY6mf
g6OILtOFZw7L1WLw97AKY2maw8o91Jdo2L/lNTPl8goNNRs2HgRP08F8ijm1
rynhNNfFGIbyQ4czUXN4/ezZUXD89OTi5dlB8GoShTmaLacppbdSNq9KVH3w
IPhrlGGyftABqi9S+M/j4IHqensfPn7AjPKjSZipzHPAtvlAKgHAao/fzaKs
CM6iqzi6Vsm9J4enh7qWAJcNKA+3x8PtW8PtwUcaDvoEdhEXMMAAYAbvU10D
6TxEhAd4k1k2ToosHc7Vir6CieBKhwGAbhon6SQd3wQA0DDH9ODN1sXZ8yBK
hrMUGraCq7wb0FdwSE7n2SBqbVEnrwFkLUkvhi2gVUdciaI1CCcT+M68l8/7
xGTsl7DwBcyoJVO6ivHAMINRYKc4VR3eukyv5aiOiZYR54CD5JnNi2hILU+m
s4xWE2UZwPoSVjyBdTi9isjK6csXQGI4zgB+wo2eZ3FxU90JvaOqpgOCMhrG
RZrF4SSIeVhEK36bkW4YhPPiEuYxielOE2c/d3k/96z93IWPH5xllCEAnzs0
9izNi45T4COdOfNV2zpN0wKapWjnwB0dAHbnTEo1ZUaw9as0jws4dVEFjTGW
t4BjHNUcCft9vLclNAgN22uSx9XgCXwcBqdvXhz+hE2xUsAp/eT6CnADsdhF
EuG3AOHJTTCfoSRDjLzM6Bz5CKH4z06cjFJdrmGe6wT61qA7m4bvWrhrqrRJ
EBZFFvcBLzAs5Zd5XlAJBFFWbGxQKEK9Obilqip0mcIAPDgpoiG1PU0I8yx+
B28MoyKMJzmSop/GvwpOgQ1QPY9h/C6AbjNkDDgjA1SrooYmRpkW4zK+MEUI
jrE+yQAWNcbKAlecmwVLVwPwHgyHFh142y5CkFXIwUH7HqP9roX2PfhIaP8U
i5bECtcRZ05Onx7/RFjWMJcf1BZeZ+GsEwLSJMRUVLmFa6ybMs9VuYOaXo4d
jqHHRHrBHjKr9sO/mbk1cR3cdGquJgKomM6LTjrq9HGOXVdSmAIMeTQNkyIe
5G29MQPWEBnQNgM7XgrqOwz1ngX1HfjIwkMKg2BDeFtogZdC3ELmGQGxYjkJ
LHzCwrsfFdcRwHYaAj7C/xWEQWjCnKgODGKsCFrmW1kE61Qv1hX66WpsIDag
yV1rVSLZlCwP+unwpo2MhqhctlVXhcE+Y1nH9ykgtqQxMjRpoWomWFsHq0OZ
AkumrhLDIc2SSABjU47FYiOQxiFNHRU4+ojCeXJzO8rZ5j3csfZwGz5+MBQd
ipph1eWZz6jKC5rQ7Mu6rIIcFZ7CjCsdAZbedLBKDUOojopmwGqjLGkihDaz
ExZXQEnq90E6lF05l8IwMD/SluaEIptoEWZ5h/vY4UIlIWpkk1EnL0KuHyP6
Wb7lyB7gsgkaDEl4QQ+0oSU5tdJegOh6m6TXk2g4pu9Iowz5u2FE331AlZdL
EkXD71pJisro+/fvn8+H1/EYVhkX//zw4QNRM4snqtsVwhcdURUApYgHwgSu
eOuF+wPzUOguxXq4Rc521SyaYKmnMHkbwIBHlxnSKVDD4TT/r/+b5zBqm34I
M9iCBMgATppJor4+i9+G2TD44b/+z3gCnEl9/X2U/BKCVhj8ezicv1XfPg2v
YpDt4VUIu6i+fBFmgzQ4CwEnYv1dDNIkmgRn+N9smKd6vD/H0+Acvgz1UH/6
r/+TwXTPownsQpQhlHA74JeLDMbLg/MZVj+jH4Q3x4hBU94LfHcURcM+bIiA
B48GQZq4oCN7dB+ZFlaloiRmKrrGpbL+enJ6+vKvh1KIKwqOogmw4c4pFrgB
ZPgFEC04Oju5ODk/PvoDvSX1tX7obfe29SvnJ89Ozjs/YEGwzT/BqoBtj7OI
MCn4dr/3eL8HqPr/A+KDKKjP4QEA

-->

</rfc>
