<?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.0.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ace-revoked-token-notification-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.3 -->
  <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-04"/>
    <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="L." surname="Seitz" fullname="Ludwig Seitz">
      <organization>Combitech</organization>
      <address>
        <postal>
          <street>Djaeknegatan 31</street>
          <city>Malmoe</city>
          <code>21135</code>
          <country>Sweden</country>
        </postal>
        <email>ludwig.seitz@combitech.com</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="March" day="13"/>
    <area>Internet</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. The method allows Clients and Resource Servers to access a Token Revocation List on the Authorization Server, with the possible additional use of resource observation for the Constrained Application Protocol (CoAP). 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) resource on the AS, in order to obtain an updated list of revoked, but yet not expired, pertaining Access Tokens. In particular, registered devices can subscribe to the TRL at the AS by using resource observation <xref target="RFC7641"/> for the Constrained Application Protocol (CoAP) <xref target="RFC7252"/>.</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 an updated list of revoked, but yet not expired, pertaining Access Tokens, 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 resource: a resource on the AS, with a TRL as its representation.</li>
          <li>TRL endpoint: an endpoint at the AS associated with the TRL resource. 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 caller of the TRL endpoint.</li>
          <li>Administrator: entity authorized to get full access to the TRL at the AS, and acting as a caller of 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 resource. At any point in time, the TRL resource 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 resource.  </t>
          <t>
After the registration procedure is finished, the registered device can send an Observation Request to the TRL resource 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 resource, 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 resource.  </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 TRL 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 resource 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 resource 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 portion 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 resource.</t>
        </li>
        <li>An administrator can access and subscribe to the TRL like a registered device, while getting the full updated representation of the TRL.</li>
      </ul>
      <t><xref target="fig-protocol-overview"/> shows a high-level overview of the service provided by this protocol. In particular, it shows the Observe notifications sent by the AS to one administrator and four registered devices, upon revocation of the issued Access Tokens t1, t2 and t3, with token hash th1, th2 and th3, respectively. 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>
          <t>The AS defines ENCODED_TOKEN, as 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.  </t>
          <t>
Note that the content of the 'access_token' parameter is either:  </t>
          <ul spacing="normal">
            <li>A CBOR byte string, if the Access Token was transported using CBOR. 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 ENCODED_TOKEN takes the bytes {0x58 0x77 0xd0 0x83 0x44 0xa1 ...}, i.e., the raw content of the 'access_token' parameter.</li>
            <li>A text string, if the Access Token was transported using JSON. With reference to the example in <xref target="fig-as-response-json"/>, ENCODED_TOKEN takes "2YotnFZFEjr1zCsicMWpAA", i.e., the raw content of the 'access_token' parameter.</li>
          </ul>
        </li>
        <li>
          <t>The AS defines HASH_INPUT as follows.  </t>
          <ul spacing="normal">
            <li>If CBOR was used to transport the Access Token (as a CWT or JWT), HASH_INPUT takes the same value of ENCODED_TOKEN.</li>
            <li>
              <t>If JSON was used to transport the Access Token (as a CWT or JWT), HASH_INPUT takes the serialization of ENCODED_TOKEN.      </t>
              <t>
In either case, HASH_INPUT results in the binary representation of the content of the 'access_token' parameter from the AS-to-Client response.</t>
            </li>
          </ul>
        </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 ...
    (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>
    </section>
    <section anchor="sec-trl-resource">
      <name>The TRL Resource</name>
      <t>Upon startup, the AS creates a single TRL resource, 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 order of the token hashes in the CBOR array is irrelevant, and the CBOR array MUST be treated as a set in which the order of elements has no significant meaning.</t>
      <t>The TRL is initialized as empty, i.e., the initial content of the TRL resource representation MUST be an empty CBOR array.</t>
      <section anchor="ssec-trl-update">
        <name>Update of the TRL Resource</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 resource representation. That is, a CBOR byte string with the token hash as its value is added to the CBOR array used as TRL resource representation.</li>
          <li>When a revoked Access Token expires, the token hash of the Access Token is removed from the TRL resource representation. That is, the CBOR byte string with the token hash as its value is removed from the CBOR array used as TRL resource representation.</li>
        </ul>
      </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 caller of the TRL endpoint and the AS MUST be encrypted, as well as integrity and replay protected. Furthermore, responses from the AS to the caller MUST be bound to the caller's request.</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 query 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 portion 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 resource 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 resource, 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 portion 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 portion 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 portion of the TRL pertaining to that requester. If the TRL portion 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 portion 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 resource, 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. 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 following conditions holds.  </t>
            <ul spacing="normal">
              <li>
                <t>The GET request does not specify the 'diff' query parameter.      </t>
                <t>
The 'error' parameter within the CBOR map carried in the response payload 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.      </t>
                <t>
The 'error' parameter within the CBOR map carried in the response payload MUST have value 0 ("Invalid parameter value").</t>
              </li>
              <li>
                <t>The 'cursor' query parameter 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 response payload 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 response payload 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>
            <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>
          </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 current TRL resource representation, 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 of 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 resource representation.</li>
            <li>If the requester is an administrator, HASHES specifies all the token hashes in the current TRL resource representation.</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 order of the token hashes in the CBOR array is irrelevant, i.e., the CBOR array MUST be treated as a set in which the order of elements has no significant 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 the "Cursor" extension (if it supports diff queries at all), 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 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 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 order of the token hashes in the CBOR arrays 'removed' and 'added' is irrelevant. That is, the CBOR arrays 'removed' and 'added' MUST be treated as a set in which the order of elements has no significant 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 portion of the TRL pertaining to the requester. The second 'diff_entry' element relates to the second from last most recent update to that portion, 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 to the TRL endpoint (see <xref target="sec-using-cursor-diff-query-response"/>).      </t>
              <t>
If the AS does not support both diff queries and the "Cursor" extension, these parameters 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 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 'cursor' query parameter 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.</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 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 portion 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.</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 resource (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 resource 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 resource 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 resource 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 does not support 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"/>), 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 portion 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 whether the TRL resource 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 caller of 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.</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 not 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 as per the two conditions specified above, 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-resource">
        <name>Content Retrieval from the TRL Resource</name>
        <t>The AS MUST ensure that each registered device can access and retrieve only its pertaining portion 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 portion 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-resource">
        <name>Size of the TRL Resource</name>
        <t>If many non-expired Access Tokens associated with a registered device are revoked, the pertaining portion 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 resource (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 a 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 migth still 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 Autherization Server upon receiving a 4.01 (Unauthorized) response from the RS. Instead, the Client SHOULD send a request to the TRL resource at the AS, in order to assert whether the Access Token is still valid. If this is the case, the Client SHOULD NOT ask for a new Access Token.</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 resource 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 resource, 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. Specifications are needed for the "Expert Review" range 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>
          <li>Even for "Expert Review", specifications are recommended. When specifications are not provided for a request where "Expert Review" is the assignment policy, the description provided needs to have sufficient information to verify the code points above.</li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://www.rfc-editor.org/info/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" target="https://datatracker.ietf.org/doc/html/draft-ietf-core-conditional-attributes-06">
          <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" target="https://datatracker.ietf.org/doc/html/draft-bormann-t2trg-stp-03">
          <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 portion 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 item, 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 resource; 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. 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 resource;</li>
        <li>a 'trl_hash' parameter, specifying the hash function used to computed token hashes as defined in <xref target="sec-token-name"/>;</li>
        <li>an '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 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 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-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 explcitly.</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>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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
l5LCi0rRrbxVXg3f8VbdwlnFirwvX/P3d09FudOK4NN1UNXio89zhYu4peeq
juGu6rnyCAqf5wpO1eO8wm9VkW3VdQW/Gi6BP4toPzAvtVlNsb4xr5WcYmao
GqcYnWyDU6wEsWWcYnJO6znFLJ9HYysytiLRvtytmlL6WG/tPFvgF6vFX3V7
2ufkMVNHbXnM/q7uBPj7Es6zf7TdpwfD0c4gtJ/uR3s74WN5mh9WL5Vm2tsb
Dnd69ru93Z0RHHN5ptphKqsJv33yeGSPOIp2wl7fXc1CB6BNL4scgMvhcgNJ
oQjh4hq8Og/wKgG6UldzcWsSRzr5kxqpzWcwCvE25mAutyDoleNT58zYL1SD
l1c8mSteTzpPu31EqSTpFL0iG3fyYkYeswfYwFMUetUdkJIYX1ejOFZxtaqQ
cLrwVGqpV5Z93KphOkvziAP+trvT43O3i7LNtwvdh95Q2Ap5tKiJOHf+cIE3
nMygUN2+ytZNqRxHrbUfVdNEfZtqqxdZtA6MPKvLhhKu5RuKWz6w3i7x/7wI
i7nOllg9o+cYc2GA8SXDCW1IzlmuvbZbtlPWjIZLrm7YbG5MVSm++cClO2cW
hlg++ypyes/cV7C2XGSnEVsru6lpSejxwPniNyUxtHTumLFIJX1ev12fecgJ
9vRQOTFekLwutm6njdVOYpWA4KlnkeUATtKKpzROoqTwOEpNSsFS3lGVCiF3
1Yt5TAshXUb3yzCveO5GVdWPYpzKzE19Y1Q/DuvKxI2NUgXNInDWHQZvhR6l
UnEay0meFFKutvup8ys3Z2+uYgyS1l2+07HONG8KEeimew4IS3RviWoP3fvY
94JC1buhe8f7LG1LjtklY2C+3II7hL6m69uqZydOQeXNsq7gVO1Pa5yAt3f5
iYM2dzNanTTMOt/eEo69mhytGu/X8slB1eEW8E0z+kLvzFJjj8JJHvHge1t2
SJb97Ow0lFYlmn3dGi2wNWI2nKAbHgbVMqNexbBaMgPbZaOpUeuIM6M3KQ5l
DPmaWizHoYBkxMojukmD87IXwOIG6t7cJYnM1FStTWh2irvWgTycRVuw3rxs
Xw1OJXBP1xFJzH6JtrJts1yrT6J0WR1I1/1DCYzuWmzO7pumO1HY1e4rCgZy
4Enw4bmEmF+3S4NuuWFeVQX1WkWd7apvUYprIrM+EdjQ929BTyqvTHu+TrTX
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
9OL41ILPXq92NvWnWw110FTAab/WjPO1swEuqZ6liE5//8dyrzWjU8NspU89
uX1CrzV8nNc2a6QwSJ98rkzy6mvUUNe+QS2f91lXp8Lk862lFvlFQXL91zbd
Nh87QZyrytKthteWn+0jMIX93drZ1J+/L1Mw2muVPdwzhYWvlXCy9zng5OO9
2tnUn58KTrYDY0z9o/zaXeHkmq994ai8Ix3/863m15af7SOg8jf7tbOpPz8N
VO7ds9dlPgvZ62eAk08eL9zbfyk7oPE1X7iBHFIquGBHCNAjVuPiaooyPKBa
wiX9Yj3XL9bp3YlnzJvDZ+5+MxfonX63i25N9+o9bxaqzkDOaxzFTv6zlIra
yYC+2yrpiqiP665TGXEP0RHs/CDZ+6s58qoZ1PeOvIWLvDtH3iI/Xi1nWMDL
6vfW5MdreK3Jj7fotRo/XjPXq/Xj1b62gOF+ko68/4H09511w8pnhcqfjyNP
lU/cO/JW/9w78lZ6reFTem1Jh9ynpZ5/ih45h7qXfq30+Tswhrbr0PvHwtea
WMk9L1n42pLuv0+LAj5F/9/HoAD0ufxjCVXtnnDu6rWGT+W15dyNnxThfIre
xrsiHAv726hhrkE49/T2GdFbjSv1k6K3T9GTetf01luN3u6KTBcu8remt8bX
ar3EnV6dn7jG5dvsJ67Ln5xN5rk9osdvvFvyG+9+1IzKi0vTloOuGFKjcd2m
POte3lS6BwobWU2wXiKWbgLUhsg0dZmzrzfDrGKVDktX4/zI9dAxXsA0m3Ej
b1wsFbCGwXUY842G2N9fpedKYbV94xBdUzMJZ7l1p7gkqDudFeSSL30W3ADe
TleHP9V9gnWe9sDjaH/yhTja2x87MVauDLr359/78+/9+V+4P/8+MffLD8h/
UabNvT9/0WsNn3t//n2G7e/yWsPn3sP+5WXYfmE4eZ8q+zFx8j5VdqnPApy8
+1TZIPhpZbT8DB2895r5gtcaPu5rm8cJ3UJKnkB0983wuuMhdqobRHWvqb6n
0qU3voqGjh9zy//aqotEA3qN15ZNiHtivfbZGtDLggQ/93GYpV77YsOlja/V
h292V0zzL0di1kv7R+P/Z/Gn/9zyVgFQPKfOP7+oq6ntl7fvmb2KbuTGjWW6
5YT6MlJsqaq65ITsiCT074fF4LJlXO7qlhenwbbTW8b072tuMuOGNLBRjFzg
ZDvzrbhG2XUvcQ5YDIWM7MDY3m9RUOGCoNy/W+I8hBMMnt1VwLFChOdwpK5t
hkWhCOSQmsi10L0o1w7Q8c0FS8bSPn78TNpv4Y1N1KEJL9aY4UpC3Q/I08qe
73poPgoJKNm94j1BokGaWa3zNbD5EjArtFkTW9Id/vEKoXSef5woE37WjTQx
o1wr2sSvrqNl3EbTkAWvo204GofzWRh90mDyfJbQJRbsdc0WMfhZs02MfnWt
VjH0thWWai+34LIAOQhKroE1A1rLLbj51dUDW9asqxar8KufM+WsHfDCz5o6
O37W1tvxUypmaftf874KLw9E3ToA+TyZ1L7sPZwW5ijgq6NwkkfV372v3p2K
3GBwf5qvNn6aHPWNgbjKq8sH4z5NMP1GEF4+QHfbWT8ib1oiXIefT4M3rfRq
6bOW2Y6fJoa4gCNur/jqPUdc9dXGzyJ6rQ1efsL0ukQoEz9fHL0u653zvPqb
kPrOPal/5FcbP4tFsz/8dutZPyKpLxEhxs8XQerr+O/l1c+JS/TuucRHfrXx
s1gh+Py4xBIxe/x8UVxileBg6dW7YDBLLfgWXGL3nkt85FcbP2VHyrJpE55Z
P372hH519QwKa9b/4p7aZcGkPvfM9J6ZfjRmuvjV34LU/4UhyDR/T+qfbVDm
S0P/+tylvRVLz0tpR3dTiU4/Nucy7d9nMn2cTKb936vEP0+n9zX+1Rp/QHJA
oCIezCdhZuZTOERXyV0slQ725COlg9XMr4rqrRX02nw8AiEEth6qeikkfmtd
OZlb9+jhT9gSgsZ2r9qEocMJrr+n7u92X8OLO52bLJ27BO14rbY1+K7LKMwm
MV6Vbme3KZBsCW77QCSsBdFjFGcwO/GFKsl/t1/abj1o3Mwxwagzc+Gj6QhB
u1PZbM7w2MkASHtO/Cu8CuMJ3UYv/Qwqc7aRFECSFgqQldYInvS0VpHNo9aC
Xgvl9+hGzAJf/0ZjLO/QPWn7elS+4rR0Q6nbocG621ElMIaFJihGkhwTAOVq
yIYUwNJFh8ugPm4lCdJsiBOneGUhrPSK+0knIJqIExFuauxYEhnuKMdPPrdJ
9dPqxdoZf3qEdTXlO1CYzS7W1Zt96nP5c6ukQPncPjdQPrdIEZTPLTIF7RHW
ThhUg6yeN2i/uU76oHw+bhahPcJ6yYTuGlZtmOGM8KXS5q3SDuVzC0NXPrey
d+VTKvdbzexVY7gpiSuOcLeWbKOP+rMZYdGnOkIl+7BNV+QWu770Q/8aVslC
XGoXnwIkP4Wz2INz2If/f7z0Wax4FJ8JJH+PswhWSRq9qzX8ZhJnyWRS+XyK
EseJbCw5gpvyufoa7iXO6p9lKKshvfOu1vCbUdaSaZ/y+bQpy2lx024awc2w
XH0N95S1+sc/wvLplJ8bZS2ZZSmfT5myeivILE1XAWYlrr6Ge8pa/bMUZTWk
IN7ZGlbvG7QWZS2ZmSifT5Gybu1/qNGHm0a4p6zVP8tog7sfXxv87SjriWcB
tbv4FClLyazdde2sGn24aYR7ylr9swxl7X1JlPXtCnD4xCnL2Fl7q9hZNfpw
0xruKWv1T80IFalVrw5+XpT1bY1n7POjrL11ZVaNPtw0wj1lrf5ZjrL2vhzK
qvGMfT6UdWs765vV13BPWat/KiOUQ4v7nMj6mFL07rAtfHmE34qyPvsMCiWz
9i1t8PECbdCiqxo7s3kN95S1+mc5mbX/5cisLyZS/HgdrzsAYJ013FPW6p/l
KOvxl0NZn32k+NbaYPlCuCVGuKes1T+eEVapla9Zwwol83e3i/Uqat01LHkT
gSqs7Tkj/JfITF4WkqXPJ8Kj7qz2Xj5/L3mUVqijr46wu/YIdkH+3grtk/wj
7K41QqUVQbDCCKv2BpCP7T1YbwSrVBqLxVYc4TeqmLZH+B243DfOCF8Yl1uN
uZUhyZ9VmJt/hFWYm3+EVZhb3Qilz99LBpLFmlYfYX/tEWzWVHKBMJNpGqGR
sdSvwVFElxnCs4blejD4R1iFsTStYeUR6lsz7N/yWplyW4WGXg0bD4Kn6WA+
xZra11RwmusmDEP5ocOVqDk8fvbsKDh+enLx8uwgeDWJwhzdltOUylupmlcV
qj54EPw1yrBYP+hs72LZQ2d7L3ight7ehX9+wIryk+ksS1FpnYE1CZNxtXU6
wn93yD06S/Oi43RmSGcR/5VTUfoZrWAYTNO0gNdSNFSxYncQ4rXsBIua/hD4
9qs0jwtQm6kFwhj7E4AeTs0iwn4fL9xQvQnwShMAv67+VZMn8M9hcPrmxeFP
+CqWep/ST66zV90nn0T4bZjFk5tgPkNWhGUhlxkZAo/CeXH5z06cjFJdbz/P
dQV0a9CdTcN3LSw0Vz0pgrAosrg/L6ie+pd5XlANu0gbXuJVjFbFJUBzgoDB
0ciOxypMbGWhyuLp8WMEDy4KgR+r44FTm2dxcaP7OFgH8Cx+B08MoyKMJzlW
P58cnh76HjyNrgNqyDCM3wUwbHYVR1Svb4BqtUQI4LlZCsciy6Id0QNThOAY
G0wMYFNjLA2/4uIa2LqagM9giDuJmt5dhCBHEzgs06MCoRIB8NMsBuALfJBM
8jLa9xjtdy2078E/Ce2fYteJWOE64szJ6dPjnwjLGtbygzrC6yycdUJAmoSa
l6h6+WtsfDHPVb16zSjHWQbTaHRQcyK94AiZVbz/b2ZtXYdcI3cMOHR6XS0E
UDGdF5101OnjGm1AIq3rCvo8moZJEQ/ytj6YAYt4BrQcHC97KajvMNR7FtR3
4J8E9WPp7IAvwtNCC7wV4hayzgiIFfsBYOcK5r79qLiOALbTEPAR/l9BGLge
rIkaeSDGCqdkvpVFsE/1YF2Hlq7GBmIDmty1WJSmBooZB/10eNNGRkNULseq
23rgmLHs4/sUEFvq0BiatFG1EmyOgm19TGcc0xCH4ZBmSSSAsSnHYrHRu9kk
pKWjBKZ/DkB03dyOcLb5CHesI9yGf34wBM0yMbf7qsxn1KUDXSD2JUtWQ4UK
S2G+lY4ASW862GWEAVRHRDPgtFGWNNFBm7kJSysgJPX7IB3KoZxLYw9YH1hB
g2JOGLKJHj0Wd3iMHW40EaJEnYw6eRFy/w+Rr/mWI3qAySbo8CHZBSPQeZbE
1EpnAZLrbZJeT6LhmL4jjSDk74YRffcBVRZuKRMNv2slKSoTKK1QgKXY5Add
WFk0wa46YfI2eP/+/dFlhhQFeHs4zf/z/+b5hw8f2vRDmAG0EkBYUOqTRH19
Fr8Ns2Hww3/+n/EEeIj6+vso+SWcAln8ezicv1XfPg2vYpDC4VUIAFdfvgiz
QRqchXB8sf4uBr4fTYIz/N9smKd6vj/H0+Acvgz1VH/6z/+TwXLPowkALMrg
a4Ic/HKRwXx5cD7DBlP0g3DRGA97ymDDZ0dRNOwD7KRtDGphQSrNiTRNo+uv
j+wFGwBRvSj1teKuRH89OT19+ddD6XkUBUfRBBhm5xR7icC5/QI4ERydnVyc
nB8f/YGeklZGP/S2e9v6kfOTZyfnnR+w99Lmn2BXwGDHWUSHHny733u83wOs
+v+3sRj8bN0BAA==

-->

</rfc>
