rfc9770v1.txt | rfc9770.txt | |||
---|---|---|---|---|
Internet Engineering Task Force (IETF) M. Tiloca | Internet Engineering Task Force (IETF) M. Tiloca | |||
Request for Comments: 9770 RISE AB | Request for Comments: 9770 RISE AB | |||
Category: Standards Track F. Palombini | Category: Standards Track F. Palombini | |||
ISSN: 2070-1721 Ericsson AB | ISSN: 2070-1721 Ericsson AB | |||
S. Echeverria | S. Echeverria | |||
G. Lewis | G. Lewis | |||
CMU SEI | CMU SEI | |||
April 2025 | May 2025 | |||
Notification of Revoked Access Tokens in the Authentication and | Notification of Revoked Access Tokens in the Authentication and | |||
Authorization for Constrained Environments (ACE) Framework | Authorization for Constrained Environments (ACE) Framework | |||
Abstract | Abstract | |||
This document specifies a method of the Authentication and | This document specifies a method of the Authentication and | |||
Authorization for Constrained Environments (ACE) framework, which | Authorization for Constrained Environments (ACE) framework, which | |||
allows an authorization server to notify clients and resource servers | allows an authorization server to notify clients and resource servers | |||
(i.e., registered devices) about revoked access tokens. As specified | (i.e., registered devices) about revoked access tokens. As specified | |||
in this document, the method allows clients and resource servers to | in this document, the method allows clients and resource servers | |||
access a Token Revocation List (TRL) on the authorization server by | (RSs) to access a Token Revocation List (TRL) on the authorization | |||
using the Constrained Application Protocol (CoAP), with the possible | server by using the Constrained Application Protocol (CoAP), with the | |||
additional use of resource observation. Resulting (unsolicited) | possible additional use of resource observation. Resulting | |||
notifications of revoked access tokens complement alternative | (unsolicited) notifications of revoked access tokens complement | |||
approaches such as token introspection, while not requiring | alternative approaches such as token introspection, while not | |||
additional endpoints on clients and resource servers. | requiring additional endpoints on clients and RSs. | |||
Status of This Memo | Status of This Memo | |||
This is an Internet Standards Track document. | This is an Internet Standards Track document. | |||
This document is a product of the Internet Engineering Task Force | This document is a product of the Internet Engineering Task Force | |||
(IETF). It represents the consensus of the IETF community. It has | (IETF). It represents the consensus of the IETF community. It has | |||
received public review and has been approved for publication by the | received public review and has been approved for publication by the | |||
Internet Engineering Steering Group (IESG). Further information on | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | Internet Standards is available in Section 2 of RFC 7841. | |||
skipping to change at line 88 ¶ | skipping to change at line 88 ¶ | |||
6.1. Error Responses with Problem Details | 6.1. Error Responses with Problem Details | |||
6.2. Supporting Diff Queries | 6.2. Supporting Diff Queries | |||
6.2.1. Supporting the "Cursor" Extension | 6.2.1. Supporting the "Cursor" Extension | |||
6.3. Query Parameters | 6.3. Query Parameters | |||
7. Full Query of the TRL | 7. Full Query of the TRL | |||
8. Diff Query of the TRL | 8. Diff Query of the TRL | |||
9. Response Messages when Using the "Cursor" Extension | 9. Response Messages when Using the "Cursor" Extension | |||
9.1. Response to Full Query | 9.1. Response to Full Query | |||
9.2. Response to Diff Query | 9.2. Response to Diff Query | |||
9.2.1. Empty Collection | 9.2.1. Empty Collection | |||
9.2.2. Cursor Not Specified in the Diff Query Request | 9.2.2. Cursor Not Included in the Diff Query Request | |||
9.2.3. Cursor Specified in the Diff Query Request | 9.2.3. Cursor Included in the Diff Query Request | |||
10. Registration at the Authorization Server | 10. Registration at the Authorization Server | |||
11. Notification of Revoked Access Tokens | 11. Notification of Revoked Access Tokens | |||
11.1. Handling of Revoked Access Tokens and Token Hashes | 11.1. Handling of Revoked Access Tokens and Token Hashes | |||
12. ACE Token Revocation List Parameters | 12. ACE Token Revocation List Parameters | |||
13. ACE Token Revocation List Error Identifiers | 13. ACE Token Revocation List Error Identifiers | |||
14. Security Considerations | 14. Security Considerations | |||
14.1. Content Retrieval from the TRL | 14.1. Content Retrieval from the TRL | |||
14.2. Size of the TRL | 14.2. Size of the TRL | |||
14.3. Communication Patterns | 14.3. Communication Patterns | |||
14.4. Request of New Access Tokens | 14.4. Request of New Access Tokens | |||
skipping to change at line 119 ¶ | skipping to change at line 119 ¶ | |||
15.5. ACE Token Revocation List Errors | 15.5. ACE Token Revocation List Errors | |||
15.6. Expert Review Instructions | 15.6. Expert Review Instructions | |||
16. References | 16. References | |||
16.1. Normative References | 16.1. Normative References | |||
16.2. Informative References | 16.2. Informative References | |||
Appendix A. On Using the Series Transfer Pattern | Appendix A. On Using the Series Transfer Pattern | |||
Appendix B. Local Supportive Parameters of the TRL Endpoint | Appendix B. Local Supportive Parameters of the TRL Endpoint | |||
Appendix C. Interaction Examples | Appendix C. Interaction Examples | |||
C.1. Full Query with Observe | C.1. Full Query with Observe | |||
C.2. Diff Query with Observe | C.2. Diff Query with Observe | |||
C.3. Full Query with Observe Plus Diff Query | C.3. Full Query with Observe and Diff Query | |||
C.4. Diff Query with Observe and "Cursor" | C.4. Diff Query with Observe and "Cursor" Extension | |||
C.5. Full Query with Observe Plus Diff Query with "Cursor" | C.5. Full Query with Observe and Diff Query with "Cursor" | |||
Appendix D. CDDL Model | Extension | |||
Acknowledgments | Acknowledgments | |||
Authors' Addresses | Authors' Addresses | |||
1. Introduction | 1. Introduction | |||
Authentication and Authorization for Constrained Environments (ACE) | Authentication and Authorization for Constrained Environments (ACE) | |||
[RFC9200] is a framework that enforces access control on Internet of | [RFC9200] is a framework that enforces access control on Internet of | |||
Things (IoT) devices acting as Resource Servers (RSs). In order to | Things (IoT) devices acting as resource servers (RSs). In order to | |||
use ACE, both clients and RSs have to register with an Authorization | use ACE, both clients and RSs have to register with an authorization | |||
Server (AS) and become registered devices. Once registered, a client | server (AS) and become registered devices. Once registered, a client | |||
can send a request to the AS to obtain an access token for an RS. | can send a request to the AS to obtain an access token for an RS. | |||
For a client to access the RS, the client must present the issued | 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 | access token at the RS, which then validates it before storing it | |||
(see Section 5.10.1.1 of [RFC9200]). | (see Section 5.10.1.1 of [RFC9200]). | |||
Even though access tokens have expiration times, there are | Even though access tokens have expiration times, there are | |||
circumstances by which an access token may need to be revoked before | circumstances by which an access token may need to be revoked before | |||
its expiration time, such as when: | its expiration time, such as when: | |||
1. a registered device has been compromised or is suspected of being | 1. a registered device has been compromised or is suspected of being | |||
compromised; | compromised; | |||
2. a registered device is decommissioned; | 2. a registered device is decommissioned; | |||
3. there has been a change in the ACE profile for a registered | 3. there has been a change in the ACE profile for a registered | |||
device; | device; | |||
4. there has been a change in access policies for a registered | 4. there has been a change in access policies for a registered | |||
device; and | device; or | |||
5. there has been a change in the outcome of policy evaluation for a | 5. there has been a change in the outcome of policy evaluation for a | |||
registered device (e.g., if policy assessment depends on dynamic | registered device (e.g., if policy assessment depends on dynamic | |||
conditions in the execution environment, the user context, or the | conditions in the execution environment, the user context, or the | |||
resource utilization). | resource utilization). | |||
As discussed in Section 6.1 of [RFC9200], only client-initiated | As discussed in Section 6.1 of [RFC9200], only client-initiated | |||
revocation is currently specified [RFC7009] for OAuth 2.0 [RFC6749], | revocation is currently specified [RFC7009] for OAuth 2.0 [RFC6749], | |||
based on the assumption that access tokens in OAuth are issued with a | based on the assumption that access tokens in OAuth are issued with a | |||
relatively short lifetime. However, this is not expected to be the | relatively short lifetime. However, this is not expected to be the | |||
skipping to change at line 174 ¶ | skipping to change at line 174 ¶ | |||
This document specifies a method for allowing registered devices to | This document specifies a method for allowing registered devices to | |||
access and possibly subscribe to a Token Revocation List (TRL) on the | access and possibly subscribe to a Token Revocation List (TRL) on the | |||
AS in order to obtain updated information about pertaining access | AS in order to obtain updated information about pertaining access | |||
tokens that were revoked prior to their expiration. As specified in | tokens that were revoked prior to their expiration. As specified in | |||
this document, the registered devices use the Constrained Application | this document, the registered devices use the Constrained Application | |||
Protocol (CoAP) [RFC7252] to communicate with the AS and with one | Protocol (CoAP) [RFC7252] to communicate with the AS and with one | |||
another and can subscribe to the TRL on the AS by using resource | another and can subscribe to the TRL on the AS by using resource | |||
observation for CoAP [RFC7641]. Underlying protocols other than CoAP | observation for CoAP [RFC7641]. Underlying protocols other than CoAP | |||
are not prohibited from being supported in the future, if they are | are not prohibited from being supported in the future, if they are | |||
defined to be used in the ACE framework for Authentication and | defined to be used in the ACE framework. | |||
Authorization. | ||||
Unlike in the case of token introspection (see Section 5.9 of | Unlike in the case of token introspection (see Section 5.9 of | |||
[RFC9200]), a registered device does not provide an owned access | [RFC9200]), a registered device does not provide an owned access | |||
token to the AS for inquiring about its current state. Instead, | token to the AS for inquiring about its current state. Instead, | |||
registered devices simply obtain updated information about pertaining | registered devices simply obtain updated information about pertaining | |||
access tokens that were revoked prior to their expiration as | access tokens that were revoked prior to their expiration as | |||
efficiently identified by corresponding hash values. | efficiently identified by corresponding hash values. | |||
The benefits of this method are that it complements token | The benefits of this method are that it complements token | |||
introspection and does not require the registered devices to support | introspection and does not require the registered devices to support | |||
any additional endpoints (see Section 1.1). The only additional | any additional endpoints (see Section 1.1). The only additional | |||
requirements for registered devices are a request/response | requirements for registered devices are a request/response | |||
interaction with the AS to access and possibly subscribe to the TRL | interaction with the AS to access and possibly subscribe to the TRL | |||
(see Section 2) and the lightweight computation of hash values to use | (see Section 2) and the lightweight computation of hash values to use | |||
as access token identifiers (see Section 4). | as access token identifiers (see Section 4). | |||
The process by which access tokens are declared revoked is out of the | The process by which access tokens are declared revoked is out of the | |||
scope of this document. It is also out of scope the method by which | scope of this document. The method by which the AS determines or is | |||
the AS determines or is notified of revoked access tokens, according | notified of revoked access tokens, according to which the AS | |||
to which the AS consequently updates the TRL as specified in this | consequently updates the TRL as specified in this document, is also | |||
document. | out of scope. | |||
1.1. Terminology | 1.1. Terminology | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
Readers are expected to be familiar with the terms and concepts | Readers are expected to be familiar with the terms and concepts | |||
described in the ACE framework for Authentication and Authorization | described in the ACE framework [RFC9200], as well as with terms and | |||
[RFC9200], as well as with terms and concepts related to CBOR Web | concepts related to CBOR Web Tokens (CWTs) [RFC8392] and JSON Web | |||
Tokens (CWTs) [RFC8392] and JSON Web Tokens (JWTs) [RFC7519]. | Tokens (JWTs) [RFC7519]. | |||
The terminology for entities in the considered architecture is | The terminology for entities in the considered architecture is | |||
defined in OAuth 2.0 [RFC6749]. In particular, this includes client, | defined in OAuth 2.0 [RFC6749]. In particular, this includes client, | |||
resource server (RS), and authorization server (AS). | RS, and authorization server (AS). | |||
Readers are also expected to be familiar with the terms and concepts | Readers are also expected to be familiar with the terms and concepts | |||
related to the Concise Data Definition Language (CDDL) [RFC8610], | related to the Concise Data Definition Language (CDDL) [RFC8610], | |||
Concise Binary Object Representation (CBOR) [RFC8949], JSON | Concise Binary Object Representation (CBOR) [RFC8949], JSON | |||
[RFC8259], CBOR Object Signing and Encryption (COSE) [RFC9052], CoAP | [RFC8259], CBOR Object Signing and Encryption (COSE) [RFC9052], CoAP | |||
[RFC7252], CoAP Observe [RFC7641], and the use of hash functions to | [RFC7252], CoAP Observe [RFC7641], and the use of hash functions to | |||
name objects as defined in [RFC6920]. | name objects as defined in [RFC6920]. | |||
Note that the term "endpoint" is used here following its OAuth | Note that the term "endpoint" is used here following its OAuth | |||
definition [RFC6749], aimed at denoting resources such as /token and | definition [RFC6749], aimed at denoting resources such as /token and | |||
/introspect at the AS, and /authz-info at the RS. This document does | /introspect at the AS, and /authz-info at the RS. The CoAP | |||
not use the CoAP definition of "endpoint", which is "An entity | definition, which is "[a]n entity participating in the CoAP protocol" | |||
participating in the CoAP protocol." | [RFC7252], is not used in this document. | |||
This specification also uses the following terminology: | This specification also uses the following terminology: | |||
Token hash: identifier of an access token, in binary format | Token hash: identifier of an access token, in binary format | |||
encoding. The token hash has no relation to other access token | encoding. The token hash has no relation to other access token | |||
identifiers possibly used, such as the 'cti' (CWT ID) claim of | identifiers possibly used, such as the 'cti' (CWT ID) claim of | |||
CBOR Web Tokens (CWTs) [RFC8392]. | CBOR Web Tokens (CWTs) [RFC8392]. | |||
Token Revocation List (TRL): a collection of token hashes such that | Token Revocation List (TRL): a collection of token hashes such that | |||
the corresponding access tokens have been revoked but are not | the corresponding access tokens have been revoked but are not | |||
skipping to change at line 286 ¶ | skipping to change at line 285 ¶ | |||
TRL update pertaining to a requester: an update to the TRL through | TRL update pertaining to a requester: an update to the TRL through | |||
which token hashes pertaining to that requester have been added to | which token hashes pertaining to that requester have been added to | |||
or removed from the TRL. | or removed from the TRL. | |||
Full query: a type of query to the TRL where the AS returns the | Full query: a type of query to the TRL where the AS returns the | |||
token hashes of the revoked access tokens currently in the TRL and | token hashes of the revoked access tokens currently in the TRL and | |||
pertaining to the requester. Further details are specified in | pertaining to the requester. Further details are specified in | |||
Sections 6 and 7. | Sections 6 and 7. | |||
Diff query: a type of query to the TRL where the AS returns a list | Diff query: a type of query to the TRL where the AS returns a list | |||
of diff entries, each related to one update to the TRL and | of diff entries, each related to one update that occurred to the | |||
containing a set of token hashes pertaining to the requester. | TRL and containing a set of token hashes pertaining to the | |||
Further details are specified in Sections 6 and 8. | requester. Further details are specified in Sections 6 and 8. | |||
See Section 4 for further terminology used throughout that section. | ||||
Examples throughout this document are expressed in CBOR diagnostic | Examples throughout this document are expressed in CBOR diagnostic | |||
notation as defined in Section 8 of [RFC8949] and Appendix G of | notation as defined in Section 8 of [RFC8949] and Appendix G of | |||
[RFC8610]. Diagnostic notation comments are often used to provide a | [RFC8610]. Diagnostic notation comments are often used to provide a | |||
textual representation of the numeric parameter names and values. | textual representation of the numeric parameter names and values. | |||
In the CBOR diagnostic notation used in this document, constructs of | ||||
the form e'SOME_NAME' are replaced by the value assigned to SOME_NAME | ||||
in the CDDL model shown in Figure 15 of Appendix D. For example, | ||||
{e'full_set': [], e'cursor': 3} stands for {0: [], 2: 3}. | ||||
Note to RFC Editor: Please delete the paragraph immediately preceding | ||||
this note. Also, in the CBOR diagnostic notation used in this | ||||
document, please replace the constructs of the form e'SOME_NAME' with | ||||
the value assigned to SOME_NAME in the CDDL model shown in Figure 15 | ||||
of Appendix D. Finally, please delete this note. | ||||
2. Protocol Overview | 2. Protocol Overview | |||
This protocol defines how a CoAP-based authorization server informs | This protocol defines how a CoAP-based AS informs clients and RSs, | |||
clients and resource servers, i.e., registered devices, about | i.e., registered devices, about pertaining revoked access tokens. | |||
pertaining revoked access tokens. How the relationship between a | How the relationship between a registered device and the AS is | |||
registered device and the AS is established is out of the scope of | established is out of the scope of this specification. | |||
this specification. | ||||
At a high level, the steps of this protocol are as follows: | At a high level, the steps of this protocol are as follows: | |||
1. Upon startup, the AS creates a single TRL accessible through the | 1. Upon startup, the AS creates a single TRL accessible through the | |||
TRL endpoint. At any point in time, the TRL represents the list | TRL endpoint. At any point in time, the TRL represents the list | |||
of all revoked access tokens issued by the AS that are not | of all revoked access tokens issued by the AS that are not | |||
expired yet. | expired yet. | |||
2. When a device registers at the AS, it also receives the url-path | 2. When a device registers at the AS, it also receives the url-path | |||
to the TRL endpoint. | to the TRL endpoint. | |||
skipping to change at line 335 ¶ | skipping to change at line 324 ¶ | |||
registered device can send a GET request to the TRL endpoint at | registered device can send a GET request to the TRL endpoint at | |||
the AS. When doing so, it can request the following: the current | the AS. When doing so, it can request the following: the current | |||
list of pertaining revoked access tokens (see Section 7) or the | list of pertaining revoked access tokens (see Section 7) or the | |||
most recent updates that occurred over the list of pertaining | most recent updates that occurred over the list of pertaining | |||
revoked access tokens (see Section 8). | revoked access tokens (see Section 8). | |||
In particular, the registered device can rely on Observation for | In particular, the registered device can rely on Observation for | |||
CoAP [RFC7641]. In such a case, the GET request sent to the TRL | CoAP [RFC7641]. In such a case, the GET request sent to the TRL | |||
endpoint includes the CoAP Observe Option set to 0 (register), | endpoint includes the CoAP Observe Option set to 0 (register), | |||
i.e., it is an Observation Request. By doing so, the registered | i.e., it is an Observation Request. By doing so, the registered | |||
device effectively subscribes to the TRL, as interested in | device effectively subscribes to the TRL, as the device is | |||
receiving notifications about its update. Upon receiving the | interested in receiving notifications about the TRL's update. | |||
Observation Request, the AS adds the registered device to the | Upon receiving the Observation Request, the AS adds the | |||
list of observers of the TRL endpoint. | registered device to the list of observers of the TRL endpoint. | |||
3. When an access token is revoked, the AS adds the corresponding | 3. When an access token is revoked, the AS adds the corresponding | |||
token hash to the TRL. Also, when a revoked access token | token hash to the TRL. Also, when a revoked access token | |||
eventually expires, the AS removes the corresponding token hash | eventually expires, the AS removes the corresponding token hash | |||
from the TRL. | from the TRL. | |||
In either case, after updating the TRL, the AS sends Observe | In either case, after updating the TRL, the AS sends Observe | |||
notifications as per [RFC7641]. That is, an Observe notification | notifications as per [RFC7641]. That is, an Observe notification | |||
is sent to each registered device subscribed to the TRL and to | is sent to each registered device that is subscribed to the TRL | |||
which the access token pertains. | and to which the access token pertains. | |||
Depending on the specific subscription established through the | Depending on the specific subscription established through the | |||
Observation Request, the notification provides the current | Observation Request, the notification provides either the current | |||
updated list of revoked access tokens in the subset of the TRL | updated list of revoked access tokens in the subset of the TRL | |||
pertaining to that device (see Section 7), or the most recent TRL | pertaining to that device (see Section 7) or the most recent TRL | |||
updates that occurred over that list of pertaining revoked access | updates that occurred over that list of pertaining revoked access | |||
tokens (see Section 8). | tokens (see Section 8). | |||
Further Observe notifications may be sent, consistent with | Further Observe notifications may be sent, consistent with | |||
ongoing additional observations of the TRL endpoint. | ongoing additional observations of the TRL endpoint. | |||
4. An administrator can access and subscribe to the TRL like a | 4. An administrator can access and subscribe to the TRL like a | |||
registered device while getting the content of the whole TRL (see | registered device while getting the content of the whole TRL (see | |||
Section 7) or the most recent updates to the whole TRL (see | Section 7) or the most recent updates that occurred to the whole | |||
Section 8). | TRL (see Section 8). | |||
Figure 1 shows a high-level overview of the service provided by this | Figure 1 shows a high-level overview of the service provided by this | |||
protocol. For the sake of simplicity, the example shown in the | protocol. For the sake of simplicity, the example shown in the | |||
figure considers the simultaneous revocation of the three access | figure considers the simultaneous revocation of the three access | |||
tokens t1, t2, and t3 whose corresponding token hashes are th1, th2, | tokens t1, t2, and t3 whose corresponding token hashes are th1, th2, | |||
and th3, respectively. Consequently, the AS adds the three token | and th3, respectively. Consequently, the AS adds the three token | |||
hashes to the TRL at once and sends Observe notifications to one | hashes to the TRL at once and sends Observe notifications to one | |||
administrator and four registered devices. Each dotted line | administrator and four registered devices. Each dotted line | |||
associated with a pair of registered devices indicates the access | associated with a pair of registered devices indicates the access | |||
token that they both own. | token that they both own. | |||
skipping to change at line 440 ¶ | skipping to change at line 429 ¶ | |||
lengths, and the length of the encoded tag numbers MUST be the | lengths, and the length of the encoded tag numbers MUST be the | |||
minimum possible length. This means that tag number 16 is | minimum possible length. This means that tag number 16 is | |||
encoded as 0xd0 and not as 0xd810. | encoded as 0xd0 and not as 0xd810. | |||
The example in Figure 2 shows a CWT that uses the COSE object | The example in Figure 2 shows a CWT that uses the COSE object | |||
COSE_Encrypt0 (see Section 5.2 of [RFC9052]). | COSE_Encrypt0 (see Section 5.2 of [RFC9052]). | |||
* If, like for JWTs [RFC7519], the access token relies on a JSON | * If, like for JWTs [RFC7519], the access token relies on a JSON | |||
object for encoding its claims, the following applies: | object for encoding its claims, the following applies: | |||
Consistent with the ACE framework for Authentication and | Consistent with the ACE framework [RFC9200], this document | |||
Authorization [RFC9200], this document specifically considers | specifically considers JWTs, which are always represented using | |||
JWTs, which are always represented using the JSON Web Signature | the JSON Web Signature (JWS) Compact Serialization from [RFC7515] | |||
(JWS) Compact Serialization from [RFC7515] or the JSON Web | or the JSON Web Encryption (JWE) Compact Serialization from | |||
Encryption (JWE) Compact Serialization from [RFC7516]. | [RFC7516]. Consequently, all the header parameters are specified | |||
Consequently, all the header parameters are specified within | within integrity-protected fields. | |||
integrity-protected fields. | ||||
In case alternative access tokens were used, the following | In case alternative access tokens were used, the following | |||
applies: | applies: | |||
- If the access token uses the JWS Compact Serialization from | - If the access token uses the JWS JSON Serialization from | |||
[RFC7515], it MUST NOT include the JWS Unprotected Header. | [RFC7515], it MUST NOT include the JWS Unprotected Header. | |||
- If the access token uses the JWE Compact Serialization from | - If the access token uses the JWE JSON Serialization from | |||
[RFC7516], it MUST NOT include the JWE Shared Unprotected | [RFC7516], it MUST NOT include the JWE Shared Unprotected | |||
Header and it MUST NOT include the "header" member in any of | Header and it MUST NOT include the "header" member in any of | |||
the elements of the "recipients" array. | the elements of the "recipients" array. | |||
/ CWT CBOR tag / 61( | / CWT CBOR tag / 61( | |||
/ COSE_Encrypt0 CBOR tag / 16( | / COSE_Encrypt0 CBOR tag / 16( | |||
/ COSE_Encrypt0 object / [ | / COSE_Encrypt0 object / [ | |||
/ protected / h'a3010a044c53796d6d65747269633132 | / protected / h'a3010a044c53796d6d65747269633132 | |||
38054d99a0d7846e762c49ffe8a63e0b', | 38054d99a0d7846e762c49ffe8a63e0b', | |||
/ unprotected / {}, | / unprotected / {}, | |||
skipping to change at line 509 ¶ | skipping to change at line 497 ¶ | |||
the entire CBOR data item consisting of both a tag number and the tag | the entire CBOR data item consisting of both a tag number and the tag | |||
content: the tag content is the CBOR data item that is being tagged. | content: the tag content is the CBOR data item that is being tagged. | |||
Also, "tagged access token" is used to denote nested CBOR tags | Also, "tagged access token" is used to denote nested CBOR tags | |||
(possibly a single one), with the innermost tag content being a CWT. | (possibly a single one), with the innermost tag content being a CWT. | |||
4.1. Motivation for the Used Construction | 4.1. Motivation for the Used Construction | |||
An access token can have one among different formats. The most | An access token can have one among different formats. The most | |||
expected formats are CWT [RFC8392] and JWT [RFC7519], with the former | expected formats are CWT [RFC8392] and JWT [RFC7519], with the former | |||
being the default format to use in the ACE framework for | being the default format to use in the ACE framework (see Section 3 | |||
Authentication and Authorization (see Section 3 of [RFC9200]). While | of [RFC9200]). While access tokens are opaque to clients, an RS is | |||
access tokens are opaque to clients, an RS is aware of whether access | aware of whether access tokens that are issued for it to consume are | |||
tokens that are issued for it to consume are either CWTs or JWTs. | either CWTs or JWTs. | |||
4.1.1. Issuing of the Access Token to the Client | 4.1.1. Issuing of the Access Token to the Client | |||
There are two possible encodings that the AS can use for the AS-to- | There are two possible encodings that the AS can use for the AS-to- | |||
Client response (see Section 5.8.2 of [RFC9200]) where the issued | Client response (see Section 5.8.2 of [RFC9200]) where the issued | |||
access token is included and provided to the requester client. The | access token is included and provided to the requester client. The | |||
RS may not be aware of which encoding is used for that response to | RS may not be aware of which encoding is used for that response to | |||
that particular requester client. | that particular requester client. | |||
* One method of encoding relies on CBOR, which is required if CoAP | * One method of encoding relies on CBOR, which is required if CoAP | |||
is used (see Section 5 of [RFC9200]) and is recommended otherwise | is used (see Section 5 of [RFC9200]) and is recommended otherwise | |||
(see Section 3 of [RFC9200]). That is, the AS-to-Client response | (see Section 3 of [RFC9200]). That is, the AS-to-Client response | |||
has media-type "application/ace+cbor". | has media-type "application/ace+cbor". | |||
This implies that, within the CBOR map specified as message | This implies that, within the CBOR map specified as message | |||
payload, the parameter 'access_token' is a CBOR data item of type | payload, the 'access_token' parameter is a CBOR data item of type | |||
CBOR byte string and with a value of BYTES. In particular: | CBOR byte string and with a value of BYTES. In particular: | |||
- If the access token is a CWT, then BYTES is the binary | - If the access token is a CWT, then BYTES is the binary | |||
representation of the CWT (i.e., of the CBOR array that encodes | representation of the CWT (i.e., of the CBOR array that encodes | |||
the untagged CWT) or of a tagged access token with the CWT as | the untagged CWT) or of a tagged access token with the CWT as | |||
the innermost tag content. | the innermost tag content. | |||
- If the access token is a JWT, then BYTES is the binary | - If the access token is a JWT, then BYTES is the binary | |||
representation of the JWT (i.e., of the text string that | representation of the JWT (i.e., of the text string that | |||
encodes the JWT). | encodes the JWT). | |||
* An alternative method of encoding relies on JSON. That is, the | * An alternative method of encoding relies on JSON. That is, the | |||
AS-to-Client response has media-type "application/ace+json". | AS-to-Client response has media-type "application/ace+json". | |||
This implies that, within the JSON object specified as message | This implies that, within the JSON object specified as message | |||
payload, the parameter 'access_token' has as a value a text string | payload, the 'access_token' parameter has as a value a text string | |||
TEXT. In particular: | TEXT. In particular: | |||
- If the access token is a JWT, then TEXT is the text string that | - If the access token is a JWT, then TEXT is the text string that | |||
encodes the JWT. | encodes the JWT. | |||
- If the access token is a CWT, then TEXT is the base64url- | - If the access token is a CWT, then TEXT is the base64url- | |||
encoded text string of BYTES, which is the binary | encoded text string of BYTES, which is the binary | |||
representation of the CWT (i.e., of the CBOR array that encodes | representation of the CWT (i.e., of the CBOR array that encodes | |||
the untagged CWT) or of a tagged access token with the CWT as | the untagged CWT) or of a tagged access token with the CWT as | |||
the innermost tag content. | the innermost tag content. | |||
skipping to change at line 567 ¶ | skipping to change at line 555 ¶ | |||
In accordance with the used transport profile of ACE (e.g., | In accordance with the used transport profile of ACE (e.g., | |||
[RFC9202], [RFC9203], [RFC9431]), the RS receives a piece of token- | [RFC9202], [RFC9203], [RFC9431]), the RS receives a piece of token- | |||
related information hereafter denoted as TOKEN_INFO. | related information hereafter denoted as TOKEN_INFO. | |||
In particular: | In particular: | |||
* If the AS-to-Client response was encoded in CBOR, then TOKEN_INFO | * If the AS-to-Client response was encoded in CBOR, then TOKEN_INFO | |||
is the value of the CBOR byte string conveyed by the | is the value of the CBOR byte string conveyed by the | |||
'access_token' parameter of that response. That is, TOKEN_INFO is | 'access_token' parameter of that response. That is, TOKEN_INFO is | |||
the binary representation of the (tagged) access token. | the binary representation of the access token. | |||
* If the AS-to-Client response was encoded in JSON and the access | * If the AS-to-Client response was encoded in JSON and the access | |||
token is a JWT, then TOKEN_INFO is the binary representation of | token is a JWT, then TOKEN_INFO is the binary representation of | |||
the text string conveyed by the 'access_token' parameter of that | the text string conveyed by the 'access_token' parameter of that | |||
response. That is, TOKEN_INFO is the binary representation of the | response. That is, TOKEN_INFO is the binary representation of the | |||
access token. | access token. | |||
* If the AS-to-Client response was encoded in JSON and the access | * If the AS-to-Client response was encoded in JSON and the access | |||
token is a CWT, then TOKEN_INFO is the binary representation of | token is a CWT, then TOKEN_INFO is the binary representation of | |||
the base64url-encoded text string that encodes the binary | the base64url-encoded text string that encodes the binary | |||
representation of the (tagged) access token. That is, TOKEN_INFO | representation of the access token. That is, TOKEN_INFO is the | |||
is the binary representation of the base64url-encoded text string | binary representation of the base64url-encoded text string | |||
conveyed by the 'access_token' parameter. | conveyed by the 'access_token' parameter. | |||
The following overviews how the above specifically applies to the | The following overviews how the above specifically applies to the | |||
existing transport profiles of ACE: | existing transport profiles of ACE: | |||
* The (tagged) access token can be uploaded to the RS by means of a | * The access token can be uploaded to the RS by means of a POST | |||
POST request to the /authz-info endpoint (see Section 5.10.1 of | request to the /authz-info endpoint (see Section 5.10.1 of | |||
[RFC9200]), using a CoAP Content-Format or HTTP media-type that | [RFC9200]), using a CoAP Content-Format or HTTP media-type that | |||
reflects the format of the access token, if available (e.g., | reflects the format of the access token, if available (e.g., | |||
"application/cwt" for CWTs), or "application/octet-stream" | "application/cwt" for CWTs), or "application/octet-stream" | |||
otherwise. When doing so (e.g., like in [RFC9202]), TOKEN_INFO is | otherwise. When doing so (e.g., like in [RFC9202]), TOKEN_INFO is | |||
the payload of the POST request. | the payload of the POST request. | |||
* The (tagged) access token can be uploaded to the RS by means of a | * The access token can be uploaded to the RS by means of a POST | |||
POST request to the /authz-info endpoint, using the media-type | request to the /authz-info endpoint, using the media-type | |||
"application/ace+cbor". When doing so (e.g., like in [RFC9203]), | "application/ace+cbor". When doing so (e.g., like in [RFC9203]), | |||
TOKEN_INFO is the value of the CBOR byte string conveyed by the | TOKEN_INFO is the value of the CBOR byte string conveyed by the | |||
'access_token' parameter, within the CBOR map specified as payload | 'access_token' parameter, within the CBOR map specified as payload | |||
of the POST request. | of the POST request. | |||
* The (tagged) access token can be uploaded to the RS during a DTLS | * The access token can be uploaded to the RS during a DTLS session | |||
session establishment, e.g., like it is defined in Section 3.2.2 | establishment, e.g., like it is defined in Section 3.2.2 of | |||
of [RFC9202]. When doing so, TOKEN_INFO is the value of the | [RFC9202]. When doing so, TOKEN_INFO is the value of the | |||
'psk_identity' field of the ClientKeyExchange message (when using | 'psk_identity' field of the ClientKeyExchange message (when using | |||
DTLS 1.2 [RFC6347]) or of the 'identity' field of a PSKIdentity, | DTLS 1.2 [RFC6347]) or of the 'identity' field of a PSKIdentity, | |||
within the PreSharedKeyExtension of a ClientHello message (when | within the PreSharedKeyExtension of a ClientHello message (when | |||
using DTLS 1.3 [RFC9147]). | using DTLS 1.3 [RFC9147]). | |||
* The (tagged) access token can be uploaded to the RS within the | * The access token can be uploaded to the RS within the MQTT CONNECT | |||
MQTT CONNECT packet, e.g., like it is defined in Section 2.2.4.1 | packet, e.g., like it is defined in Section 2.2.4.1 of [RFC9431]. | |||
of [RFC9431]. When doing so, TOKEN_INFO is specified within the | When doing so, TOKEN_INFO is specified within the 'Authentication | |||
'Authentication Data' field of the MQTT CONNECT packet, following | Data' field of the MQTT CONNECT packet, following the property | |||
the property identifier 22 (0x16) and the token length. | identifier 22 (0x16) and the token length. | |||
Note that, if the access token is a CWT, it is specifically tagged as | ||||
defined in Section 3. | ||||
4.1.3. Design Rationale | 4.1.3. Design Rationale | |||
Considering the possible variants discussed above, it must always be | Considering the possible variants discussed above, it must always be | |||
ensured that the same HASH_INPUT value is used as input for | ensured that the same HASH_INPUT value is used as input for | |||
generating the token hash of a given access token, by the AS that has | generating the token hash of a given access token, by the AS that has | |||
issued the access token and by the registered devices to which the | issued the access token and by the registered devices to which the | |||
access token pertains (both client and RS). | access token pertains (both client and RS). | |||
This is achieved by building HASH_INPUT according to the content of | This is achieved by building HASH_INPUT according to the content of | |||
the 'access_token' parameter in the AS-to-Client responses because | the 'access_token' parameter in the AS-to-Client responses because | |||
that is what the AS, the client, and the RS are all able to see. | that is what the AS, the client, and the RS are all able to see. | |||
4.2. Hash Input on the Client and the AS | 4.2. Hash Input on the Client and the AS | |||
The client and the AS consider the content of the 'access_token' | The client and the AS consider the content of the 'access_token' | |||
parameter in the AS-to-Client response, in which the (tagged) access | parameter in the AS-to-Client response, in which the access token is | |||
token is included and provided to the requester client. | included and provided to the requester client. Note that, if the | |||
access token is a CWT, it is specifically tagged as defined in | ||||
Section 3. | ||||
The following defines how the client and the AS determine the | The following defines how the client and the AS determine the | |||
HASH_INPUT value to use as input for computing the token hash of the | HASH_INPUT value to use as input for computing the token hash of the | |||
conveyed access token, depending on the AS-to-Client response being | conveyed access token, depending on the AS-to-Client response being | |||
encoded in CBOR (see Section 4.2.1) or in JSON (see Section 4.2.2). | encoded in CBOR (see Section 4.2.1) or in JSON (see Section 4.2.2). | |||
Once the HASH_INPUT is determined, the client and the AS use it to | Once HASH_INPUT is determined, the client and the AS use it to | |||
compute the token hash of the conveyed access token as defined in | compute the token hash of the conveyed access token as defined in | |||
Section 4.4. | Section 4.4. | |||
4.2.1. AS-to-Client Response Encoded in CBOR | 4.2.1. AS-to-Client Response Encoded in CBOR | |||
If the AS-to-Client response is encoded in CBOR, then HASH_INPUT is | If the AS-to-Client response is encoded in CBOR, then HASH_INPUT is | |||
defined as follows: | defined as follows: | |||
* BYTES denotes the value of the CBOR byte string conveyed in the | * BYTES denotes the value of the CBOR byte string conveyed in the | |||
parameter 'access_token'. | 'access_token' parameter. | |||
With reference to the example in Figure 3, BYTES is the bytes | With reference to the example in Figure 3, BYTES is the bytes | |||
{0xd8 0x3d 0xd0 ... 0x64 0x3b}. | {0xd8, 0x3d, 0xd0, ..., 0x64, 0x3b}. | |||
Note that BYTES is the binary representation of the tagged access | Note that BYTES is the binary representation of the tagged access | |||
token if this is a CWT (as per Section 3) or of the access token | token if this is a CWT (as per Section 3) or of the access token | |||
if this is a JWT. | if this is a JWT. | |||
* HASH_INPUT_TEXT is the base64url-encoded text string that encodes | * HASH_INPUT_TEXT is the base64url-encoded text string that encodes | |||
BYTES. | BYTES. | |||
* HASH_INPUT is the binary representation of HASH_INPUT_TEXT. | * HASH_INPUT is the binary representation of HASH_INPUT_TEXT. | |||
Header: Created (Code=2.01) | Header: Created (Code=2.01) | |||
Content-Format: application/ace+cbor | Content-Format: 19 (application/ace+cbor) | |||
Max-Age: 85800 | Max-Age: 85800 | |||
Payload: | Payload: | |||
{ | { | |||
/ access_token / 1 : h'd83dd0835820a3010a044c53796d6d | / access_token / 1 : h'd83dd0835820a3010a044c53796d6d | |||
6574726963313238054d99a0d7846e | 6574726963313238054d99a0d7846e | |||
762c49ffe8a63e0ba05858b918a11f | 762c49ffe8a63e0ba05858b918a11f | |||
d81e438b7f973d9e2e119bcb22424b | d81e438b7f973d9e2e119bcb22424b | |||
a0f38a80f27562f400ee1d0d6c0fdb | a0f38a80f27562f400ee1d0d6c0fdb | |||
559c02421fd384fc2ebe22d7071378 | 559c02421fd384fc2ebe22d7071378 | |||
b0ea7428fff157444d45f7e6afcda1 | b0ea7428fff157444d45f7e6afcda1 | |||
aae5f6495830c58627087fc5b4974f | aae5f6495830c58627087fc5b4974f | |||
319a8707a635dd643b', | 319a8707a635dd643b', | |||
/ token_type / 34 : 2 / PoP /, | / token_type / 34 : 2 / PoP /, | |||
/ expires_in / 2 : 86400, | / expires_in / 2 : 86400, | |||
/ ace_profile / 38 : 1 / coap_dtls /, | / ace_profile / 38 : 1 / coap_dtls / | |||
/ (remainder of the response omitted for brevity) / | / (remainder of the response omitted for brevity) / | |||
} | } | |||
Figure 3: Example of AS-to-Client CoAP Response Using CBOR | Figure 3: Example of AS-to-Client CoAP Response Using CBOR | |||
4.2.2. AS-to-Client Response Encoded in JSON | 4.2.2. AS-to-Client Response Encoded in JSON | |||
If the AS-to-Client response is encoded in JSON, then HASH_INPUT is | If the AS-to-Client response is encoded in JSON, then HASH_INPUT is | |||
the binary representation of the text string conveyed by the | the binary representation of the text string conveyed by the | |||
'access_token' parameter. | 'access_token' parameter. | |||
skipping to change at line 759 ¶ | skipping to change at line 752 ¶ | |||
Section 4.1.2). | Section 4.1.2). | |||
2. The RS assumes that the client received the access token in an | 2. The RS assumes that the client received the access token in an | |||
AS-to-Client response encoded in CBOR (see Section 4.2.1). | AS-to-Client response encoded in CBOR (see Section 4.2.1). | |||
Hence, the RS assumes TOKEN_INFO to be the binary representation | Hence, the RS assumes TOKEN_INFO to be the binary representation | |||
of the tagged access token with the CWT as the innermost tag | of the tagged access token with the CWT as the innermost tag | |||
content (as per Section 3). | content (as per Section 3). | |||
3. The RS verifies the access token as per Section 5.10.1.1 of | 3. The RS verifies the access token as per Section 5.10.1.1 of | |||
[RFC9200]. If the verification fails, then the RS does not | [RFC9200]. If the verification fails, then the RS does not | |||
discard the access token yet; instead, it moves to step 4. | discard the access token yet; instead, it moves to Step 4. | |||
Otherwise, the RS stores the access token and computes the | Otherwise, the RS stores the access token and computes the | |||
corresponding token hash as defined in Section 4.4. In | corresponding token hash as defined in Section 4.4. In | |||
particular, the RS considers HASH_INPUT_TEXT as the base64url- | particular, the RS considers HASH_INPUT_TEXT as the base64url- | |||
encoded text string that encodes TOKEN_INFO. Then, HASH_INPUT is | encoded text string that encodes TOKEN_INFO. Then, HASH_INPUT is | |||
the binary representation of HASH_INPUT_TEXT. | the binary representation of HASH_INPUT_TEXT. | |||
After that, the RS stores the computed token hash as associated | After that, the RS stores the computed token hash as associated | |||
with the access token; then, it terminates this algorithm. | with the access token; then, it terminates this algorithm. | |||
skipping to change at line 828 ¶ | skipping to change at line 821 ¶ | |||
In particular, the RS assumes that the client received the access | In particular, the RS assumes that the client received the access | |||
token in an AS-to-Client response encoded in CBOR (see | token in an AS-to-Client response encoded in CBOR (see | |||
Section 4.2.1). Hence, HASH_INPUT is the binary representation | Section 4.2.1). Hence, HASH_INPUT is the binary representation | |||
of HASH_INPUT_TEXT, which, in turn, is the base64url-encoded text | of HASH_INPUT_TEXT, which, in turn, is the base64url-encoded text | |||
string that encodes TOKEN_INFO. | string that encodes TOKEN_INFO. | |||
After that, the RS stores the computed token hash as associated | After that, the RS stores the computed token hash as associated | |||
with the access token. | with the access token. | |||
The RS skips step 3 only if it is certain that all its pertaining | The RS skips Step 3 only if it is certain that all its pertaining | |||
access tokens are provided to any client by means of AS-to-Client | access tokens are provided to any client by means of AS-to-Client | |||
responses encoded as CBOR messages. Otherwise, the RS MUST perform | responses encoded as CBOR messages. Otherwise, the RS MUST perform | |||
step 3. | Step 3. | |||
The RS skips step 4 only if it is certain that all its pertaining | The RS skips Step 4 only if it is certain that all its pertaining | |||
access tokens are provided to any client by means of AS-to-Client | access tokens are provided to any client by means of AS-to-Client | |||
responses encoded as JSON messages. Otherwise, the RS MUST perform | responses encoded as JSON messages. Otherwise, the RS MUST perform | |||
step 4. | Step 4. | |||
If the RS performs both steps 3 and 4 above, then the RS MUST store, | If the RS performs both Steps 3 and 4 above, then the RS MUST store, | |||
maintain, and rely on both token hashes as associated with the access | maintain, and rely on both token hashes as associated with the access | |||
token, consistent with what is specified in Section 11.1. | token, consistent with what is specified in Section 11.1. | |||
Section 14.7 discusses how computing and storing both token hashes | Section 14.7 discusses how computing and storing both token hashes | |||
neutralizes an attack against the RS, where a dishonest client can | neutralizes an attack against the RS, where a dishonest client can | |||
induce the RS to compute a token hash different from the correct one. | induce the RS to compute a token hash different from the correct one. | |||
4.4. Computing the Token Hash | 4.4. Computing the Token Hash | |||
Once HASH_INPUT is determined as defined in Sections 4.2 and 4.3, a | Once HASH_INPUT is determined as defined in Sections 4.2 and 4.3, a | |||
skipping to change at line 868 ¶ | skipping to change at line 861 ¶ | |||
sha-256 as specified in [SHA-256] is mandatory to implement. | sha-256 as specified in [SHA-256] is mandatory to implement. | |||
The AS specifies the used hash function to registered devices during | The AS specifies the used hash function to registered devices during | |||
their registration procedure (see Section 10). | their registration procedure (see Section 10). | |||
5. Token Revocation List (TRL) | 5. Token Revocation List (TRL) | |||
Upon startup, the AS creates a single Token Revocation List (TRL) | Upon startup, the AS creates a single Token Revocation List (TRL) | |||
encoded as a CBOR array. | encoded as a CBOR array. | |||
Each element of the array is a CBOR byte string with value the token | Each element of the array is a CBOR byte string, whose value is the | |||
hash of an access token. The CBOR array MUST be treated as a set, | token hash of an access token. The CBOR array MUST be treated as a | |||
i.e., the order of its elements has no meaning. | set, i.e., the order of its elements has no meaning. | |||
The TRL is initialized as empty, i.e., its initial content MUST be | The TRL is initialized as empty, i.e., its initial content MUST be | |||
the empty CBOR array. The TRL is accessible through the TRL endpoint | the empty CBOR array. The TRL is accessible through the TRL endpoint | |||
at the AS. | at the AS. | |||
5.1. Update of the TRL | 5.1. Update of the TRL | |||
The AS updates the TRL in the following two cases: | The AS updates the TRL in the following two cases: | |||
* When a non-expired access token is revoked, the token hash of the | * When a non-expired access token is revoked, the token hash of the | |||
skipping to change at line 898 ¶ | skipping to change at line 891 ¶ | |||
encoding the TRL. | encoding the TRL. | |||
The AS MAY perform a single update to the TRL such that one or more | The AS MAY perform a single update to the TRL such that one or more | |||
token hashes are added or removed at once. For example, this can be | token hashes are added or removed at once. For example, this can be | |||
the case if multiple access tokens are revoked or expire at the same | the case if multiple access tokens are revoked or expire at the same | |||
time or within an acceptably narrow time frame. | time or within an acceptably narrow time frame. | |||
6. The TRL Endpoint | 6. The TRL Endpoint | |||
Consistent with Section 6.5 of [RFC9200], all communications between | Consistent with Section 6.5 of [RFC9200], all communications between | |||
a requester towards the TRL endpoint and the AS MUST be encrypted, as | the AS and a requester interacting with the TRL endpoint at the AS | |||
well as integrity and replay protected. Furthermore, responses from | MUST be encrypted, as well as integrity and replay protected. | |||
the AS to the requester MUST be bound to the corresponding requests. | Furthermore, responses from the AS to the requester MUST be bound to | |||
the corresponding requests. | ||||
Following a request to the TRL endpoint, the corresponding success | Following a request to the TRL endpoint, the corresponding success | |||
response messages sent by the AS use Content-Format "application/ace- | response messages sent by the AS use Content-Format "application/ace- | |||
trl+cbor". Their payload is formatted as a CBOR map, and the CBOR | trl+cbor". Their payload is formatted as a CBOR map, and the CBOR | |||
values used to abbreviate the parameters included therein are defined | values used to abbreviate the parameters included therein are defined | |||
in Section 12. | in Section 12. | |||
The AS MUST implement measures to prevent access to the TRL endpoint | The AS MUST implement measures to prevent access to the TRL endpoint | |||
by entities other than registered devices and authorized | by entities other than registered devices and authorized | |||
administrators (see Section 10). | administrators (see Section 10). | |||
skipping to change at line 922 ¶ | skipping to change at line 916 ¶ | |||
The TRL endpoint supports only the GET method, and allows two types | The TRL endpoint supports only the GET method, and allows two types | |||
of queries of the TRL: | of queries of the TRL: | |||
1. Full query: the AS returns the token hashes of the revoked access | 1. Full query: the AS returns the token hashes of the revoked access | |||
tokens currently in the TRL and pertaining to the requester. | tokens currently in the TRL and pertaining to the requester. | |||
The AS MUST support this type of query. The processing of a full | The AS MUST support this type of query. The processing of a full | |||
query and the related response format are defined in Section 7. | query and the related response format are defined in Section 7. | |||
2. Diff query: the AS returns a list of diff entries. Each diff | 2. Diff query: the AS returns a list of diff entries. Each diff | |||
entry is related to one update to the TRL, and it contains a set | entry is related to one update that occurred to the TRL, and it | |||
of token hashes pertaining to the requester. In particular, all | contains a set of token hashes pertaining to the requester. In | |||
such token hashes were added to the TRL or removed from the TRL | particular, all such token hashes were added to the TRL or | |||
at the update related to the diff entry in question. | removed from the TRL at the update related to the diff entry in | |||
question. | ||||
The AS MAY support this type of query. In such a case, the AS | The AS MAY support this type of query. In such a case, the AS | |||
maintains the history of updates to the TRL as defined in | maintains the history of updates to the TRL as defined in | |||
Section 6.2. The processing of a diff query and the related | Section 6.2. The processing of a diff query and the related | |||
response format are defined in Section 8. | response format are defined in Section 8. | |||
If it supports diff queries, the AS MAY additionally support its | If it supports diff queries, the AS MAY additionally support its | |||
"Cursor" extension, which has two benefits: | "Cursor" extension, which has two benefits: | |||
1. The AS can avoid excessively long messages when several diff | 1. The AS can avoid excessively long messages when several diff | |||
skipping to change at line 1007 ¶ | skipping to change at line 1002 ¶ | |||
software engineers as well as for device and network operators in | software engineers as well as for device and network operators in | |||
order to aid in debugging and provide context for possible | order to aid in debugging and provide context for possible | |||
intervention. The diagnostic message SHOULD be logged by the AS. | intervention. The diagnostic message SHOULD be logged by the AS. | |||
The 'detail' entry is unlikely to be relevant in an unattended | The 'detail' entry is unlikely to be relevant in an unattended | |||
setup where human intervention is not expected. | setup where human intervention is not expected. | |||
An example of an error response using the problem-details format is | An example of an error response using the problem-details format is | |||
shown in Figure 5. | shown in Figure 5. | |||
Header: Bad Request (Code=4.00) | Header: Bad Request (Code=4.00) | |||
Content-Format: application/concise-problem-details+cbor | Content-Format: 257 (application/concise-problem-details+cbor) | |||
Payload: | Payload: | |||
{ | { | |||
/ title / -1: "Invalid parameter value", | / title / -1: "Invalid parameter value", | |||
/ detail / -2: "Invalid value for 'cursor': -53", | / detail / -2: "Invalid value for 'cursor': -53", | |||
/ ace-trl-error / e'ace-trl-error': { | / ace-trl-error / 1:{ | |||
/ error-id / 0: 0 / "Invalid parameter value" /, | / error-id / 0: 0 / "Invalid parameter value" /, | |||
/ cursor / 1: 42 | / cursor / 1: 42 | |||
} | } | |||
} | } | |||
Figure 5: Example of Error Response with Problem Details | Figure 5: Example of Error Response with Problem Details | |||
The problem-details format in general and the Custom Problem Detail | The problem-details format in general and the Custom Problem Detail | |||
entry 'ace-trl-error' in particular are OPTIONAL to support for | entry 'ace-trl-error' in particular are OPTIONAL to support for | |||
registered devices. A registered device supporting the entry 'ace- | registered devices. A registered device supporting the entry 'ace- | |||
trl-error' and that is able to understand the specified error may use | trl-error' and that is able to understand the specified error may use | |||
that information to determine what actions to take next. | that information to determine what actions to take next. | |||
6.2. Supporting Diff Queries | 6.2. Supporting Diff Queries | |||
If the AS supports diff queries, it is able to transfer a list of | If the AS supports diff queries, it is able to transfer a list of | |||
diff entries, each of which is related to one update that occurred to | diff entries, each of which is related to one update that occurred to | |||
the TRL (see Section 6). That is, when replying to a diff query | the TRL (see Section 6). That is, when replying to a diff query | |||
performed by a requester, the AS specifies the diff entries related | performed by a requester, the AS provides the diff entries related to | |||
to the most recent TRL updates pertaining to the requester. | the most recent TRL updates pertaining to the requester. | |||
The following defines how the AS builds and maintains an ordered list | The following defines how the AS builds and maintains an ordered list | |||
of diff entries, for each registered device and administrator, | of diff entries, for each registered device and administrator, | |||
hereafter referred to as "requesters". In particular, a requester's | hereafter referred to as "requesters". In particular, a requester's | |||
diff entry associated with a TRL update contains a set of token | diff entry associated with a TRL update contains a set of token | |||
hashes pertaining to that requester, each of which was added to the | hashes pertaining to that requester, each of which was added to the | |||
TRL or removed from the TRL at that update. | TRL or removed from the TRL at that update. | |||
The AS defines the single constant positive integer MAX_N >= 1. For | The AS defines the single constant positive integer MAX_N >= 1. For | |||
each requester, the AS maintains an updated collection of maximum | each requester, the AS maintains an update collection of maximum | |||
MAX_N series items, each of which is a diff entry. For each | MAX_N series items, each of which is a diff entry. For each | |||
requester, the AS MUST keep track of the MAX_N most recent TRL | requester, the AS MUST keep track of the MAX_N most recent TRL | |||
updates pertaining to the requester. If the AS supports diff | updates pertaining to the requester. If the AS supports diff | |||
queries, the AS MUST provide requesters with the value of MAX_N upon | queries, the AS MUST provide requesters with the value of MAX_N upon | |||
their registration (see Section 10). | their registration (see Section 10). | |||
The series of items in the update collection MUST be strictly | The series of items in the update collection MUST be strictly | |||
chronologically ordered. That is, at any point in time, the first | chronologically ordered. That is, at any point in time, the first | |||
series item would be the one least recently added to the update | series item is the one least recently added to the update collection | |||
collection and still retained by the AS; the last series item would | and still retained by the AS; the last series item is the one most | |||
be the one most recently added to the update collection. The | recently added to the update collection. The particular method used | |||
particular method used to achieve this is implementation specific. | to achieve this is implementation specific. | |||
Each time the TRL changes, the AS performs the following operations | Each time the TRL changes, the AS performs the following operations | |||
for each requester: | for each requester: | |||
1. The AS considers the subset of the TRL pertaining to that | 1. The AS considers the subset of the TRL pertaining to that | |||
requester. If the TRL subset is not affected by this TRL update, | requester. If the TRL subset is not affected by this TRL update, | |||
the AS stops the processing for that requester. Otherwise, the | the AS stops the processing for that requester. Otherwise, the | |||
AS moves to step 2. | AS moves to Step 2. | |||
2. The AS creates two sets "trl_patch" of token hashes, i.e., one | 2. The AS creates two trl_patch sets of token hashes, i.e., one | |||
"removed" set and one "added" set, as related to this TRL update. | 'removed' set and one 'added' set, as related to this TRL update. | |||
3. The AS fills the two sets with the token hashes of the removed | 3. The AS fills the two sets with the token hashes of the removed | |||
and added access tokens, respectively, from/to the TRL subset | and added access tokens, respectively, from/to the TRL subset | |||
considered at step 1. | considered at Step 1. | |||
4. The AS creates a new series item that includes the two sets from | 4. The AS creates a new series item that includes the two sets from | |||
step 3. | Step 3. | |||
5. If the update collection associated with the requester currently | 5. If the update collection associated with the requester currently | |||
includes MAX_N series items, the AS MUST delete the oldest series | includes MAX_N series items, the AS MUST delete the oldest series | |||
item in the update collection. | item in the update collection. | |||
6. The AS adds the series item to the update collection associated | 6. The AS adds the series item to the update collection associated | |||
with the requester as the last (most recent) entry. | with the requester as the last (most recent) series item. | |||
6.2.1. Supporting the "Cursor" Extension | 6.2.1. Supporting the "Cursor" Extension | |||
If it supports the "Cursor" extension for diff queries, the AS also | If it supports the "Cursor" extension for diff queries, the AS also | |||
performs the following actions: | performs the following actions: | |||
The AS defines the single constant unsigned integer MAX_INDEX <= | The AS defines the single constant unsigned integer MAX_INDEX <= | |||
((2^64) - 1), where "^" is the exponentiation operator. The value of | ((2^64) - 1). The value of MAX_INDEX is REQUIRED to be at least | |||
MAX_INDEX is REQUIRED to be at least (MAX_N - 1) and is RECOMMENDED | (MAX_N - 1) and is RECOMMENDED to be at least ((2^32) - 1). | |||
to be at least ((2^32) - 1). MAX_INDEX SHOULD be orders of magnitude | MAX_INDEX SHOULD be orders of magnitude greater than MAX_N. | |||
greater than MAX_N. | ||||
The following applies separately for each requester's update | The following applies separately for each requester's update | |||
collection: | collection: | |||
* Each series item X in the update collection is also associated | * Each series item X in the update collection is also associated | |||
with an unsigned integer 'index', whose minimum value is 0 and | with an unsigned integer 'index', whose minimum value is 0 and | |||
whose maximum value is MAX_INDEX. The first series item ever | whose maximum value is MAX_INDEX. The first series item ever | |||
added to the update collection MUST have an 'index' with a value | added to the update collection MUST have an 'index' with a value | |||
of 0. | of 0. | |||
skipping to change at line 1159 ¶ | skipping to change at line 1153 ¶ | |||
update collection in question. If supporting the "Cursor" extension, | update collection in question. If supporting the "Cursor" extension, | |||
the AS MUST provide registered devices and administrators with the | the AS MUST provide registered devices and administrators with the | |||
corresponding value of MAX_DIFF_BATCH upon their registration (see | corresponding value of MAX_DIFF_BATCH upon their registration (see | |||
Section 10). | Section 10). | |||
6.3. Query Parameters | 6.3. Query Parameters | |||
A GET request to the TRL endpoint can include the following query | A GET request to the TRL endpoint can include the following query | |||
parameters. The AS MUST silently ignore unknown query parameters. | parameters. The AS MUST silently ignore unknown query parameters. | |||
* 'diff': if included, perform a diff query of the TRL (see | * 'diff': if included, it indicates to perform a diff query of the | |||
Section 8). Its value MUST be either: | TRL (see Section 8). Its value MUST be either: | |||
- the integer 0, indicating that a (notification) response should | - the integer 0, indicating that a (notification) response should | |||
include as many diff entries as the AS can provide in the | include as many diff entries as the AS can provide in the | |||
response; or | response; or | |||
- a positive integer strictly greater than 0, indicating the | - a positive integer strictly greater than 0, indicating the | |||
maximum number of diff entries that a (notification) response | maximum number of diff entries that a (notification) response | |||
should include. | should include. | |||
If the AS does not support diff queries, it ignores the 'diff' | If the AS does not support diff queries, it ignores the 'diff' | |||
query parameter when present in the GET request and proceeds like | query parameter when present in the GET request and proceeds like | |||
when processing a full query of the TRL (see Section 7). | when processing a full query of the TRL (see Section 7). | |||
Otherwise, the AS MUST return a 4.00 (Bad Request) response in | Otherwise, the AS MUST return a 4.00 (Bad Request) response in | |||
case the 'diff' query parameter of the GET request specifies a | case the 'diff' query parameter of the GET request has a value | |||
value that is neither 0 nor a positive integer, irrespective of | that is neither 0 nor a positive integer, irrespective of the | |||
the presence of the 'cursor' parameter and its value (see below). | presence of the 'cursor' query parameter and its value (see | |||
The response MUST have Content-Format set to "application/concise- | below). The response MUST have Content-Format set to | |||
problem-details+cbor", and its payload is formatted as defined in | "application/concise-problem-details+cbor", and its payload is | |||
Section 6.1. Within the Custom Problem Detail entry 'ace-trl- | formatted as defined in Section 6.1. Within the Custom Problem | |||
error', the value of the 'error-id' field MUST be set to 0 | Detail entry 'ace-trl-error', the value of the 'error-id' field | |||
("Invalid parameter value"), and the 'cursor' field MUST NOT be | MUST be set to 0 ("Invalid parameter value"), and the 'cursor' | |||
present. | field MUST NOT be present. | |||
* 'cursor': if included, perform a diff query of the TRL together | * 'cursor': if included, it indicates to perform a diff query of the | |||
with the "Cursor" extension, as defined in Section 9.2. Its value | TRL together with the "Cursor" extension, as defined in | |||
MUST be either 0 or a positive integer. If the 'cursor' query | Section 9.2. Its value MUST be either 0 or a positive integer. | |||
parameter is included, then the 'diff' query parameter MUST also | If the 'cursor' query parameter is included, then the 'diff' query | |||
be included. | parameter MUST also be included. | |||
If included, the 'cursor' query parameter specifies an unsigned | If included, the 'cursor' query parameter has an unsigned integer | |||
integer value that was provided by the AS in a previous response | value that was provided by the AS in a previous response from the | |||
from the TRL endpoint (see Sections 9.1, 9.2.2, and 9.2.3). | TRL endpoint (see Sections 9.1, 9.2.2, and 9.2.3). | |||
If the AS does not support the "Cursor" extension, it ignores the | If the AS does not support the "Cursor" extension, it ignores the | |||
'cursor' query parameter when present in the GET request. In such | 'cursor' query parameter when present in the GET request. In such | |||
a case, the AS proceeds as specified elsewhere in this document, | a case, the AS proceeds as specified elsewhere in this document, | |||
that is: | that is: | |||
1. it performs a diff query of the TRL (see Section 8), if it | 1. it performs a diff query of the TRL (see Section 8), if it | |||
supports diff queries and the 'diff' query parameter is | supports diff queries and the 'diff' query parameter is | |||
present in the GET request; or | present in the GET request; otherwise, | |||
2. it performs a full query of the TRL (see Section 7). | 2. it performs a full query of the TRL (see Section 7). | |||
If the AS supports both diff queries and the "Cursor" extension, | If the AS supports both diff queries and the "Cursor" extension, | |||
and the GET request specifies the 'cursor' query parameter, then | and the GET request includes the 'cursor' query parameter, then | |||
the AS MUST return a 4.00 (Bad Request) response in case any of | the AS MUST return a 4.00 (Bad Request) response in case any of | |||
the conditions below holds. | the conditions below holds. | |||
The 4.00 (Bad Request) response MUST have Content-Format set to | The 4.00 (Bad Request) response MUST have Content-Format set to | |||
"application/concise-problem-details+cbor", and its payload is | "application/concise-problem-details+cbor", and its payload is | |||
formatted as defined in Section 6.1. | formatted as defined in Section 6.1. | |||
- The GET request does not specify the 'diff' query parameter, | - The GET request does not include the 'diff' query parameter, | |||
irrespective of the value of the 'cursor' parameter. | irrespective of the value of the 'cursor' query parameter. | |||
Within the Custom Problem Detail entry 'ace-trl-error', the | Within the Custom Problem Detail entry 'ace-trl-error', the | |||
value of the 'error-id' field MUST be set to 1 ("Invalid set of | value of the 'error-id' field MUST be set to 1 ("Invalid set of | |||
parameters"), and the 'cursor' field MUST NOT be present. | parameters"), and the 'cursor' field MUST NOT be present. | |||
- The 'cursor' query parameter has a value that is neither 0 nor | - The 'cursor' query parameter has a value that is neither 0 nor | |||
a positive integer; otherwise, it has a value strictly greater | a positive integer; or it has a value strictly greater than | |||
than MAX_INDEX (see Section 6.2.1). | MAX_INDEX (see Section 6.2.1). | |||
Within the Custom Problem Detail entry 'ace-trl-error', the | Within the Custom Problem Detail entry 'ace-trl-error', the | |||
value of the 'error-id' field MUST be set to 0 ("Invalid | value of the 'error-id' field MUST be set to 0 ("Invalid | |||
parameter value"). The entry 'ace-trl-error' MUST include the | parameter value"). The entry 'ace-trl-error' MUST include the | |||
'cursor' field, whose value is either: | 'cursor' field, whose value is either: | |||
o the CBOR simple value null (0xf6), if the update collection | o the CBOR simple value null (0xf6), if the update collection | |||
associated with the requester is empty; or | associated with the requester is empty; otherwise, | |||
o the corresponding current value of 'last_index'. | o the corresponding current value of 'last_index'. | |||
- All of the following hold: the update collection associated | - All of the following hold: the update collection associated | |||
with the requester is not empty; no wraparound of its 'index' | with the requester is not empty; no wraparound of the 'index' | |||
value has occurred; and the 'cursor' query parameter has a | value has occurred; and the 'cursor' query parameter has a | |||
value strictly greater than the current 'last_index' on the | value strictly greater than the current 'last_index' on the | |||
update collection (see Section 6.2.1). | update collection (see Section 6.2.1). | |||
Within the Custom Problem Detail entry 'ace-trl-error', the | Within the Custom Problem Detail entry 'ace-trl-error', the | |||
value of the 'error-id' field MUST be set to 2 ("Out of bound | value of the 'error-id' field MUST be set to 2 ("Out of bound | |||
cursor value"), and the 'cursor' field MUST NOT be present. | cursor value"), and the 'cursor' field MUST NOT be present. | |||
7. Full Query of the TRL | 7. Full Query of the TRL | |||
In order to produce a (notification) response to a GET request asking | 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: | for a full query of the TRL, the AS performs the following actions: | |||
1. From the TRL, the AS builds a set of HASHES such that: | 1. From the TRL, the AS builds a set HASHES such that: | |||
* If the requester is a registered device, HASHES specifies the | * If the requester is a registered device, HASHES specifies the | |||
token hashes currently in the TRL and associated with the | token hashes currently in the TRL and associated with the | |||
access tokens pertaining to that registered device. The AS | access tokens pertaining to that registered device. The AS | |||
can always use the authenticated identity of the registered | can always use the authenticated identity of the registered | |||
device to perform the necessary filtering on the TRL content. | device to perform the necessary filtering on the TRL content. | |||
* If the requester is an administrator, HASHES specifies all the | * If the requester is an administrator, HASHES specifies all the | |||
token hashes currently in the TRL. | token hashes currently in the TRL. | |||
2. The AS sends a 2.05 (Content) response to the requester. The | 2. The AS sends a 2.05 (Content) response to the requester. The | |||
response MUST have Content-Format set to "application/ace- | response MUST have Content-Format set to "application/ace- | |||
trl+cbor". The payload of the response is a CBOR map, which MUST | trl+cbor". The payload of the response is a CBOR map, which MUST | |||
be formatted as follows. | be formatted as follows. | |||
* The 'full_set' parameter MUST be included and specifies a CBOR | * The 'full_set' parameter MUST be included and MUST encode a | |||
array 'full_set_value'. Each element of 'full_set_value' is a | CBOR array 'full_set_value'. Each element of 'full_set_value' | |||
CBOR byte string with a value of one of the token hashes from | is a CBOR byte string, whose value is one of the token hashes | |||
the set HASHES. If the set HASHES is empty, the 'full_set' | from the set HASHES. If the set HASHES is empty, the | |||
parameter specifies the empty CBOR array. | 'full_set' parameter specifies the empty CBOR array. | |||
The CBOR array MUST be treated as a set, i.e., the order of | The CBOR array MUST be treated as a set, i.e., the order of | |||
its elements has no meaning. | its elements has no meaning. | |||
* The 'cursor' parameter MUST be included if the AS supports | * The 'cursor' parameter MUST be included if the AS supports | |||
both diff queries and the related "Cursor" extension (see | both diff queries and the related "Cursor" extension (see | |||
Sections 6.2 and 6.2.1). Its value is set as specified in | Sections 6.2 and 6.2.1). Its value is set as specified in | |||
Section 9.1 and provides the requester with information for | Section 9.1 and provides the requester with information for | |||
performing a follow-up diff query using the "Cursor" extension | performing a follow-up diff query using the "Cursor" extension | |||
(see Section 9.2). | (see Section 9.2). | |||
skipping to change at line 1298 ¶ | skipping to change at line 1292 ¶ | |||
Figure 6 provides the CDDL definition [RFC8610] of the CBOR array | Figure 6 provides the CDDL definition [RFC8610] of the CBOR array | |||
'full_set_value' specified in the response from the AS as the value | 'full_set_value' specified in the response from the AS as the value | |||
of the 'full_set' parameter. | of the 'full_set' parameter. | |||
token_hash = bytes | token_hash = bytes | |||
full_set_value = [* token_hash] | full_set_value = [* token_hash] | |||
Figure 6: CDDL Definition of 'full_set_value' | Figure 6: CDDL Definition of 'full_set_value' | |||
Figure 7 shows an example response from the AS following a full query | Figure 7 shows an example of a response from the AS following a full | |||
request to the TRL endpoint. In this example, the AS does not | query request to the TRL endpoint. In this example, the AS does not | |||
support diff queries nor the "Cursor" extension; hence the 'cursor' | support diff queries nor the "Cursor" extension; hence the 'cursor' | |||
parameter is not included in the payload of the response. Also, full | parameter is not included in the payload of the response. Also, full | |||
token hashes are omitted for brevity. | token hashes are omitted for brevity. | |||
Header: Content (Code=2.05) | Header: Content (Code=2.05) | |||
Content-Format: application/ace-trl+cbor | Content-Format: 262 (application/ace-trl+cbor) | |||
Payload: | Payload: | |||
{ | { | |||
e'full_set' : [ | / full_set / 0: [ | |||
h'01fa51cc...4819', / elided for brevity / | h'01fa51cc...4819', / elided for brevity / | |||
h'01748190...223d' / elided for brevity / | h'01748190...223d' / elided for brevity / | |||
] | ] | |||
} | } | |||
Figure 7: Example of Response Following a Full Query Request to | Figure 7: Example of a Response Following a Full Query Request to | |||
the TRL Endpoint | the TRL Endpoint | |||
8. Diff Query of the TRL | 8. Diff Query of the TRL | |||
In order to produce a (notification) response to a GET request asking | 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: | for a diff query of the TRL, the AS performs the following actions: | |||
Note that, if the AS supports both diff queries and the related | Note that, if the AS supports both diff queries and the related | |||
"Cursor" extension, steps 3 and 4 defined below are extended as | "Cursor" extension, Steps 3 and 4 defined below are extended as | |||
defined in Section 9.2. | defined in Section 9.2. | |||
1. The AS defines the positive integer NUM as follows: if the value | 1. The AS defines the positive integer NUM as follows: if the value | |||
N specified in the 'diff' query parameter in the GET request is | N specified in the 'diff' query parameter in the GET request is | |||
equal to 0 or greater than the predefined positive integer MAX_N | equal to 0 or greater than the predefined positive integer MAX_N | |||
(see Section 6.2), then NUM takes the value of MAX_N. Otherwise, | (see Section 6.2), then NUM takes the value of MAX_N. Otherwise, | |||
NUM takes N. | NUM takes N. | |||
2. The AS determines U = min(NUM, SIZE), where SIZE <= MAX_N. In | 2. The AS determines U = min(NUM, SIZE), where SIZE <= MAX_N. In | |||
particular, SIZE is the number of diff entries currently stored | particular, SIZE is the number of diff entries currently stored | |||
in the requester's update collection. | in the requester's update collection. | |||
3. The AS prepares U diff entries. If U is equal to 0 (e.g., | 3. 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 | because SIZE is equal to 0 at Step 2), then no diff entries are | |||
prepared. | prepared. | |||
The prepared diff entries are related to the U most recent TRL | The prepared diff entries are related to the U most recent TRL | |||
updates pertaining to the requester, as maintained in the update | updates pertaining to the requester, as maintained in the update | |||
collection for that requester (see Section 6.2). In particular, | collection for that requester (see Section 6.2). In particular, | |||
the first diff entry refers to the most recent of such updates, | the first diff entry refers to the most recent of such updates, | |||
the second diff entry refers to the second from last of such | the second diff entry refers to the second-to-last of such | |||
updates, and so on. | updates, and so on. | |||
Each diff entry is a CBOR array 'diff_entry', which includes the | Each diff entry is a CBOR array 'diff_entry', which includes the | |||
following two elements: | following two elements: | |||
a. A 'trl_patch' set of token hashes encoded as a CBOR array | a. A trl_patch set of token hashes encoded as a CBOR array | |||
'removed'. Each element of the array is a CBOR byte string | 'removed'. Each element of the array is a CBOR byte string, | |||
with value the token hash of an access token such that it | whose value is the token hash of an access token such that it | |||
pertains to the requester and was removed from the TRL during | pertains to the requester and was removed from the TRL during | |||
the update associated with the diff entry. | the update associated with the diff entry. | |||
b. A 'trl_patch' set of token hashes encoded as a CBOR array | b. A trl_patch set of token hashes encoded as a CBOR array | |||
'added'. Each element of the array is a CBOR byte string | 'added'. Each element of the array is a CBOR byte string, | |||
with value the token hash of an access token such that it | whose value is the token hash of an access token such that it | |||
pertains to the requester and was added to the TRL during the | pertains to the requester and was added to the TRL during the | |||
update associated with the diff entry. | update associated with the diff entry. | |||
The CBOR arrays 'removed' and 'added' MUST be treated as sets, | The CBOR arrays 'removed' and 'added' MUST be treated as sets, | |||
i.e., the order of their elements has no meaning. | i.e., the order of their elements has no meaning. | |||
4. The AS prepares a 2.05 (Content) response for the requester. The | 4. The AS prepares a 2.05 (Content) response for the requester. The | |||
response MUST have Content-Format set to "application/ace- | response MUST have Content-Format set to "application/ace- | |||
trl+cbor". The payload of the response is a CBOR map, which MUST | trl+cbor". The payload of the response is a CBOR map, which MUST | |||
be formatted as follows: | be formatted as follows: | |||
* The 'diff_set' parameter MUST be present and specifies a CBOR | * The 'diff_set' parameter MUST be present and MUST encode a | |||
array 'diff_set_value' of U elements. Each element of | CBOR array 'diff_set_value' of U elements. Each element of | |||
'diff_set_value' specifies one of the CBOR arrays 'diff_entry' | 'diff_set_value' specifies one of the CBOR arrays 'diff_entry' | |||
prepared above as a diff entry. Note that U might have a | prepared above as a diff entry. Note that U might have a | |||
value of 0; in this case, 'diff_set_value' is the empty CBOR | value of 0; in this case, 'diff_set_value' is the empty CBOR | |||
array. | array. | |||
Within 'diff_set_value', any 'diff_entry' CBOR arrays MUST be | Within 'diff_set_value', the 'diff_entry' CBOR arrays MUST be | |||
sorted to reflect the corresponding updates to the TRL in | sorted to reflect the corresponding updates to the TRL in | |||
reverse chronological order. That is, the first 'diff_entry' | reverse chronological order. That is, the first 'diff_entry' | |||
element of 'diff_set_value' relates to the most recent TRL | element of 'diff_set_value' relates to the most recent TRL | |||
update pertaining to the requester. The second 'diff_entry' | update pertaining to the requester. The second 'diff_entry' | |||
element relates to the second-to-last most recent TRL update | element relates to the second-to-last most recent TRL update | |||
pertaining to the requester, and so on. | pertaining to the requester, and so on. | |||
* The 'cursor' parameter and the 'more' parameter MUST be | * The 'cursor' parameter and the 'more' parameter MUST be | |||
included if the AS supports both diff queries and the related | included if the AS supports both diff queries and the related | |||
"Cursor" extension (see Section 6.2.1). Their values are set | "Cursor" extension (see Section 6.2.1). Their values are set | |||
as specified in Section 9.2 and provide the requester with | as specified in Section 9.2 and provide the requester with | |||
information for performing a follow-up query of the TRL (see | information for performing a follow-up query of the TRL (see | |||
Section 9.2). | Section 9.2). | |||
In case the AS supports diff queries but not the "Cursor" | In case the AS supports diff queries but not the "Cursor" | |||
extension, these parameters MUST NOT be included, and the AS | extension, these parameters MUST NOT be included. In case the | |||
MUST silently ignore the 'cursor' parameter and the 'more' | requester supports diff queries but not the "Cursor" | |||
parameter if present. | extension, the requester MUST silently ignore the 'cursor' | |||
parameter and the 'more' parameter, if present. | ||||
Figure 8 provides the CDDL definition [RFC8610] of the CBOR array | Figure 8 provides the CDDL definition [RFC8610] of the CBOR array | |||
'diff_set_value' specified in the response from the AS, as the value | 'diff_set_value' specified in the response from the AS, as the value | |||
of the 'diff_set' parameter. | of the 'diff_set' parameter. | |||
token_hash = bytes | token_hash = bytes | |||
trl_patch = [* token_hash] | trl_patch = [* token_hash] | |||
diff_entry = [removed: trl_patch, added: trl_patch] | diff_entry = [removed: trl_patch, added: trl_patch] | |||
diff_set_value = [* diff_entry] | diff_set_value = [* diff_entry] | |||
Figure 8: CDDL Definition of 'diff_set_value' | Figure 8: CDDL Definition of 'diff_set_value' | |||
Figure 9 shows an example response from the AS following a diff query | Figure 9 shows an example of a response from the AS following a diff | |||
request to the TRL endpoint, where U = 3 diff entries are specified. | query request to the TRL endpoint, where U = 3 diff entries are | |||
In this example, the AS does not support the "Cursor" extension; | included. In this example, the AS does not support the "Cursor" | |||
hence, the 'cursor' parameter and the 'more' parameter are not | extension; hence, the 'cursor' parameter and the 'more' parameter are | |||
included in the payload of the response. Also, full token hashes are | not included in the payload of the response. Also, full token hashes | |||
omitted for brevity. | are omitted for brevity. | |||
Header: Content (Code=2.05) | Header: Content (Code=2.05) | |||
Content-Format: application/ace-trl+cbor | Content-Format: 262 (application/ace-trl+cbor) | |||
Payload: | Payload: | |||
{ | { | |||
e'diff_set' : [ | / diff_set / 1: [ | |||
[ | [ | |||
[ h'01fa51cc...0f6a', / elided for brevity / | [ h'01fa51cc...0f6a', / elided for brevity / | |||
h'01748190...8bce' / elided for brevity / | h'01748190...8bce' / elided for brevity / | |||
], | ], | |||
[ h'01cdf1ca...563d', / elided for brevity / | [ h'01cdf1ca...563d', / elided for brevity / | |||
h'01be41a6...a057' / elided for brevity / | h'01be41a6...a057' / elided for brevity / | |||
] | ] | |||
], | ], | |||
[ | [ | |||
[ h'0144dd12...77bc', / elided for brevity / | [ h'0144dd12...77bc', / elided for brevity / | |||
skipping to change at line 1478 ¶ | skipping to change at line 1473 ¶ | |||
9.1. Response to Full Query | 9.1. Response to Full Query | |||
When processing a full query request to the TRL endpoint, the AS | When processing a full query request to the TRL endpoint, the AS | |||
composes a response as defined in Section 7. | composes a response as defined in Section 7. | |||
In particular, the 'cursor' parameter included in the CBOR map | In particular, the 'cursor' parameter included in the CBOR map | |||
carried in the response payload specifies either the CBOR simple | carried in the response payload specifies either the CBOR simple | |||
value null (0xf6) or a CBOR unsigned integer. | value null (0xf6) or a CBOR unsigned integer. | |||
The 'cursor' parameter MUST specify the CBOR simple value null (0xf6) | The 'cursor' parameter MUST encode the CBOR simple value null (0xf6) | |||
in case there are currently no TRL updates pertaining to the | in case there are currently no TRL updates pertaining to the | |||
requester, i.e., the update collection for that requester is empty. | requester, i.e., the update collection for that requester is empty. | |||
This is the case from when the requester registers at the AS until | This is the case from when the requester registers at the AS until | |||
the first update pertaining to that requester occurs to the TRL. | the first update pertaining to that requester occurs to the TRL. | |||
Otherwise, the 'cursor' parameter MUST specify a CBOR unsigned | Otherwise, the 'cursor' parameter MUST encode a CBOR unsigned | |||
integer. This MUST take the 'index' value of the last series item in | integer. The unsigned integer MUST take the 'index' value of the | |||
the update collection associated with the requester (see | last series item in the update collection associated with the | |||
Section 6.2.1) as corresponding to the most recent TRL update | requester (see Section 6.2.1) as corresponding to the most recent TRL | |||
pertaining to the requester. In fact, such a value is the current | update pertaining to the requester. In fact, such a value is the | |||
value of 'last_index' for the update collection associated with the | current value of 'last_index' for the update collection associated | |||
requester. | with the requester. | |||
9.2. Response to Diff Query | 9.2. Response to Diff Query | |||
When processing a diff query request to the TRL endpoint, the AS | When processing a diff query request to the TRL endpoint, the AS | |||
composes a response as defined in the following subsections. | composes a response as defined in the following subsections. | |||
9.2.1. Empty Collection | 9.2.1. Empty Collection | |||
If the update collection associated with the requester has no | If the update collection associated with the requester has no | |||
elements, the AS returns a 2.05 (Content) response. The response | elements, the AS returns a 2.05 (Content) response. The response | |||
MUST have Content-Format set to "application/ace-trl+cbor", and its | MUST have Content-Format set to "application/ace-trl+cbor", and its | |||
payload MUST be a CBOR map formatted as follows: | payload MUST be a CBOR map formatted as follows: | |||
* The 'diff_set' parameter MUST be included and specifies the empty | * The 'diff_set' parameter MUST be included and MUST encode the | |||
CBOR array. | empty CBOR array. | |||
* The 'cursor' parameter MUST be included and specifies the CBOR | * The 'cursor' parameter MUST be included and MUST encode the CBOR | |||
simple value null (0xf6). | simple value null (0xf6). | |||
* The 'more' parameter MUST be included and specifies the CBOR | * The 'more' parameter MUST be included and MUST encode the CBOR | |||
simple value false (0xf4). | simple value false (0xf4). | |||
Note that the above applies when the update collection associated | Note that the above applies when the update collection associated | |||
with the requester has no elements, regardless of whether or not the | with the requester has no elements, regardless of whether or not the | |||
'cursor' query parameter is included in the diff query request and | 'cursor' query parameter is included in the diff query request and | |||
irrespective of the specified unsigned integer value if present. | irrespective of the specified unsigned integer value if present. | |||
9.2.2. Cursor Not Specified in the Diff Query Request | 9.2.2. Cursor Not Included in the Diff Query Request | |||
If the update collection associated with the requester is not empty | If the update collection associated with the requester is not empty | |||
and the diff query request does not include the 'cursor' query | and the diff query request does not include the 'cursor' query | |||
parameter, the AS performs the actions defined in Section 8, with the | parameter, the AS performs the actions defined in Section 8, with the | |||
following differences: | following differences: | |||
* At step 3, the AS considers the value MAX_DIFF_BATCH (see | * At Step 3, the AS considers the value MAX_DIFF_BATCH (see | |||
Section 6.2.1) and prepares L = min(U, MAX_DIFF_BATCH) diff | Section 6.2.1) and prepares L = min(U, MAX_DIFF_BATCH) diff | |||
entries. | entries. | |||
If U <= MAX_DIFF_BATCH, the prepared diff entries are the last | If U <= MAX_DIFF_BATCH, the prepared diff entries are the last | |||
series items in the update collection associated with the | series items in the update collection associated with the | |||
requester, corresponding to the L most recent TRL updates | requester, corresponding to the L most recent TRL updates | |||
pertaining to the requester. | pertaining to the requester. | |||
If U > MAX_DIFF_BATCH, the prepared diff entries are the eldest of | If U > MAX_DIFF_BATCH, the prepared diff entries are the eldest of | |||
the last U series items in the update collection associated with | the last U series items in the update collection associated with | |||
the requester, as corresponding to the first L of the U most | the requester, as corresponding to the first L of the U most | |||
recent TRL updates pertaining to the requester. | recent TRL updates pertaining to the requester. | |||
* At step 4, the CBOR map to carry in the payload of the 2.05 | * At Step 4, the CBOR map to carry in the payload of the 2.05 | |||
(Content) response MUST be formatted as follows: | (Content) response MUST be formatted as follows: | |||
- The 'diff_set' parameter MUST be present and specifies a CBOR | - The 'diff_set' parameter MUST be present and MUST encode a CBOR | |||
array 'diff_set_value' of L elements. Each element of | array 'diff_set_value' of L elements. Each element of | |||
'diff_set_value' specifies one of the CBOR arrays 'diff_entry' | 'diff_set_value' specifies one of the CBOR arrays 'diff_entry' | |||
prepared as a diff entry. | prepared as a diff entry. | |||
- The 'cursor' parameter MUST be present and specifies a CBOR | - The 'cursor' parameter MUST be present and MUST encode a CBOR | |||
unsigned integer. This MUST take the 'index' value of the | unsigned integer. The unsigned integer MUST take the 'index' | |||
series item of the update collection included as first diff | value of the series item of the update collection included as | |||
entry in the 'diff_set_value' CBOR array, which is specified by | first diff entry in the 'diff_set_value' CBOR array, which is | |||
the 'diff_set' parameter. That is, the 'cursor' parameter | specified by the 'diff_set' parameter. That is, the 'cursor' | |||
takes the 'index' value of the series item in the update | parameter takes the 'index' value of the series item in the | |||
collection corresponding to the most recent TRL update | update collection corresponding to the most recent TRL update | |||
pertaining to the requester and returned in this diff query | pertaining to the requester and returned in this diff query | |||
response. | response. | |||
Note that the 'cursor' parameter takes the same 'index' value | Note that the 'cursor' parameter takes the same 'index' value | |||
of the last series item in the update collection when U <= | of the last series item in the update collection when U <= | |||
MAX_DIFF_BATCH. | MAX_DIFF_BATCH. | |||
- The 'more' parameter MUST be present and MUST specify the CBOR | - The 'more' parameter MUST be present. The parameter MUST | |||
simple value false (0xf4) if U <= MAX_DIFF_BATCH or the CBOR | encode the CBOR simple value false (0xf4) if U <= | |||
simple value true (0xf5) otherwise. | MAX_DIFF_BATCH; otherwise, it MUST encode the CBOR simple value | |||
true (0xf5). | ||||
If the 'more' parameter in the payload of the received 2.05 (Content) | If the 'more' parameter in the payload of the received 2.05 (Content) | |||
response has a value of true, the requester can send a follow-up diff | response has a value of true, the requester can send a follow-up diff | |||
query request including the 'cursor' query parameter with the same | query request including the 'cursor' query parameter with the same | |||
value of the 'cursor' parameter specified in this diff query | value of the 'cursor' parameter specified in this diff query | |||
response. As defined in Section 9.2.3, this would result in the AS | response. As defined in Section 9.2.3, this would result in the AS | |||
transferring the following subset of series items as diff entries, | transferring the following subset of series items as diff entries, | |||
thus resuming from where interrupted in the previous transfer. | thus resuming from where interrupted in the previous transfer. | |||
9.2.3. Cursor Specified in the Diff Query Request | 9.2.3. Cursor Included in the Diff Query Request | |||
If the update collection associated with the requester is not empty | If the update collection associated with the requester is not empty | |||
and the diff query request includes the 'cursor' query parameter with | and the diff query request includes the 'cursor' query parameter with | |||
value P, the AS proceeds as follows, depending on which of the | value P, the AS proceeds as follows, depending on which of the | |||
following two cases hold: | following two cases hold: | |||
Case A: The series item X with 'index' having value P and the series | 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) | item Y with 'index' having value (P + 1) % (MAX_INDEX + 1) | |||
are both not found in the update collection associated with | are both not found in the update collection associated with | |||
the requester. This occurs when the item Y (and possibly | the requester. This occurs when the item Y (and possibly | |||
further ones after it) has been previously removed from the | further ones after it) has been previously removed from the | |||
update collection for that requester (see step 5 at | update collection for that requester (see Step 5 at | |||
Section 6.2). | Section 6.2). | |||
In this case, the AS returns a 2.05 (Content) response. The | In this case, the AS returns a 2.05 (Content) response. The | |||
response MUST have Content-Format set to "application/ace- | response MUST have Content-Format set to "application/ace- | |||
trl+cbor", and its payload MUST be a CBOR map formatted as | trl+cbor", and its payload MUST be a CBOR map formatted as | |||
follows: | follows: | |||
* The 'diff_set' parameter MUST be included and specifies | * The 'diff_set' parameter MUST be included and MUST encode | |||
the empty CBOR array. | the empty CBOR array. | |||
* The 'cursor' parameter MUST be included and specifies the | * The 'cursor' parameter MUST be included and MUST encode | |||
CBOR simple value null (0xf6). | the CBOR simple value null (0xf6). | |||
* The 'more' parameter MUST be included and specifies the | * The 'more' parameter MUST be included and MUST encode the | |||
CBOR simple value true (0xf5). | CBOR simple value true (0xf5). | |||
With the combination ('cursor', 'more') = (null, true), the | With the combination ('cursor', 'more') = (null, true), the | |||
AS is indicating that the update collection is, in fact, not | AS is indicating that the update collection is, in fact, not | |||
empty, but that one or more series items have been lost due | empty, but that one or more series items have been lost due | |||
to their removal. These include the item with 'index' value | to their removal. These include the item with 'index' value | |||
(P + 1) % (MAX_INDEX + 1) that the requester wished to | (P + 1) % (MAX_INDEX + 1) that the requester wished to | |||
obtain as the first one following the specified reference | obtain as the first one following the specified reference | |||
point with 'index' value P. | point with 'index' value P. | |||
When receiving this diff query response, the requester | When receiving this diff query response, the requester | |||
SHOULD send a new full query request to the AS. A | SHOULD send a new full query request to the AS. A | |||
successful response provides the requester with the full | successful response provides the requester with the full | |||
current pertaining subset of the TRL as well as a valid | current pertaining subset of the TRL as well as a valid | |||
value of the 'cursor' parameter (see Section 9.1) to be, | value of the 'cursor' parameter (see Section 9.1) to be, | |||
possibly, used as query parameter in a following diff query | possibly, used as query parameter in a following diff query | |||
request. | request. | |||
Case B: The series item X with 'index' having value P is found in | Case B: The series item X with 'index' having value P is found in | |||
the update collection associated with the requester or the | the update collection associated with the requester, or | |||
series item X is not found and the series item Y with | instead the series item X is not found and the series item Y | |||
'index' having value (P + 1) % (MAX_INDEX + 1) is found in | with 'index' having value (P + 1) % (MAX_INDEX + 1) is found | |||
the update collection associated with the requester. | in the update collection associated with the requester. | |||
In this case, the AS performs the actions defined in | In this case, the AS performs the actions defined in | |||
Section 8 with the following differences: | Section 8 with the following differences: | |||
* At step 3, the AS considers the value MAX_DIFF_BATCH (see | * At Step 3, the AS considers the value MAX_DIFF_BATCH (see | |||
Section 6.2.1) and prepares L = min(SUB_U, | Section 6.2.1) and prepares L = min(SUB_U, | |||
MAX_DIFF_BATCH) diff entries, where SUB_U = min(NUM, | MAX_DIFF_BATCH) diff entries, where SUB_U = min(NUM, | |||
SUB_SIZE) and SUB_SIZE is the number of series items in | SUB_SIZE) and SUB_SIZE is the number of series items in | |||
the update collection starting from and including the | the update collection starting from and including the | |||
series item added immediately after X. If L is equal to | series item added immediately after X. If L is equal to | |||
0 (e.g., because SUB_U is equal to 0), then no diff | 0 (e.g., because SUB_U is equal to 0), then no diff | |||
entries are prepared. | entries are prepared. | |||
If SUB_U <= MAX_DIFF_BATCH, the prepared diff entries are | If SUB_U <= MAX_DIFF_BATCH, the prepared diff entries are | |||
the last series items in the update collection associated | the last series items in the update collection associated | |||
with the requester, corresponding to the L most recent | with the requester, corresponding to the L most recent | |||
TRL updates pertaining to the requester. | TRL updates pertaining to the requester. | |||
If SUB_U > MAX_DIFF_BATCH, the prepared diff entries are | If SUB_U > MAX_DIFF_BATCH, the prepared diff entries are | |||
the eldest of the last SUB_U series items in the update | the eldest of the last SUB_U series items in the update | |||
collection associated with the requester, corresponding | collection associated with the requester, corresponding | |||
to the first L of the SUB_U most recent TRL updates | to the first L of the SUB_U most recent TRL updates | |||
pertaining to the requester. | pertaining to the requester. | |||
* At step 4, the CBOR map to carry in the payload of the | * At Step 4, the CBOR map to carry in the payload of the | |||
2.05 (Content) response MUST be formatted as follows: | 2.05 (Content) response MUST be formatted as follows: | |||
- The 'diff_set' parameter MUST be present and specifies | - The 'diff_set' parameter MUST be present and MUST | |||
a CBOR array 'diff_set_value' of L elements. Each | encode a CBOR array 'diff_set_value' of L elements. | |||
element of 'diff_set_value' specifies one of the CBOR | Each element of 'diff_set_value' specifies one of the | |||
arrays 'diff_entry' prepared as a diff entry. Note | CBOR arrays 'diff_entry' prepared as a diff entry. | |||
that L might have value 0, in which case | Note that L might have value 0, in which case | |||
'diff_set_value' is the empty CBOR array. | 'diff_set_value' is the empty CBOR array. | |||
- The 'cursor' parameter MUST be present and MUST | - The 'cursor' parameter MUST be present and MUST encode | |||
specify a CBOR unsigned integer. In particular: | a CBOR unsigned integer. In particular: | |||
o If L is equal to 0, i.e., the series item X is the | o If L is equal to 0, i.e., the series item X is the | |||
last one in the update collection, then the | last one in the update collection, then the | |||
'cursor' parameter MUST take the same 'index' value | 'cursor' parameter MUST take the same 'index' value | |||
of the last series item in the update collection. | of the last series item in the update collection. | |||
In fact, such a value is the current value of | In fact, such a value is the current value of | |||
'last_index' for the update collection. | 'last_index' for the update collection. | |||
o If L is different than 0, then the 'cursor' | o If L is different than 0, then the 'cursor' | |||
parameter MUST take the 'index' value of the series | parameter MUST take the 'index' value of the series | |||
skipping to change at line 1681 ¶ | skipping to change at line 1677 ¶ | |||
the 'cursor' parameter takes the 'index' value of | the 'cursor' parameter takes the 'index' value of | |||
the series item in the update collection | the series item in the update collection | |||
corresponding to the most recent TRL update | corresponding to the most recent TRL update | |||
pertaining to the requester and returned in this | pertaining to the requester and returned in this | |||
diff query response. | diff query response. | |||
Note that the 'cursor' parameter takes the same | Note that the 'cursor' parameter takes the same | |||
'index' value of the last series item in the update | 'index' value of the last series item in the update | |||
collection when SUB_U <= MAX_DIFF_BATCH. | collection when SUB_U <= MAX_DIFF_BATCH. | |||
- The 'more' parameter MUST be present and MUST specify | - The 'more' parameter MUST be present. The parameter | |||
the CBOR simple value false (0xf4) if SUB_U <= | MUST encode the CBOR simple value false (0xf4) if | |||
MAX_DIFF_BATCH, or the CBOR simple value true (0xf5) | SUB_U <= MAX_DIFF_BATCH; otherwise, it MUST encode the | |||
otherwise. | CBOR simple value true (0xf5). | |||
If the 'more' parameter in the payload of the received 2.05 | If the 'more' parameter in the payload of the received 2.05 | |||
(Content) response has value true, the requester can send a | (Content) response has value true, the requester can send a | |||
follow-up diff query request including the 'cursor' query | follow-up diff query request including the 'cursor' query | |||
parameter with the same value of the 'cursor' parameter | parameter with the same value of the 'cursor' parameter | |||
specified in this diff query response. This would result in | specified in this diff query response. This would result in | |||
the AS transferring the following subset of series items as | the AS transferring the following subset of series items as | |||
diff entries, thus, resuming from where interrupted in the | diff entries, thus resuming from where interrupted in the | |||
previous transfer. | previous transfer. | |||
10. Registration at the Authorization Server | 10. Registration at the Authorization Server | |||
During the registration process at the AS, an administrator or a | During the registration process at the AS, an administrator or a | |||
registered device receives the following information as part of the | registered device receives the following information as part of the | |||
registration response: | registration response: | |||
* The url-path to the TRL endpoint at the AS. | * The url-path to the TRL endpoint at the AS. | |||
skipping to change at line 1717 ¶ | skipping to change at line 1713 ¶ | |||
* A positive integer MAX_N, if the AS supports diff queries of the | * A positive integer MAX_N, if the AS supports diff queries of the | |||
TRL (see Sections 6.2 and 8). | TRL (see Sections 6.2 and 8). | |||
* A positive integer MAX_DIFF_BATCH, if the AS supports diff queries | * A positive integer MAX_DIFF_BATCH, if the AS supports diff queries | |||
of the TRL as well as the related "Cursor" extension (see Sections | of the TRL as well as the related "Cursor" extension (see Sections | |||
6.2.1 and 9). | 6.2.1 and 9). | |||
Once the registration process is completed, the AS maintains the | Once the registration process is completed, the AS maintains the | |||
registration and related information until a possible deregistration | registration and related information until a possible deregistration | |||
occurs, hence, keeping track of active administrators and registered | occurs, hence keeping track of active administrators and registered | |||
devices. The particular way to achieve this is implementation | devices. The particular way to achieve this is implementation | |||
specific. In any case, such a mechanism to maintain registrations is | specific. In any case, such a mechanism to maintain registrations is | |||
enforced at the AS in order to ensure that requests sent by clients | enforced at the AS in order to ensure that requests sent by clients | |||
to the /token endpoint (see Section 5.8 of [RFC9200]) and by RSs to | to the /token endpoint (see Section 5.8 of [RFC9200]) and by RSs to | |||
the /introspect endpoint (see Section 5.9 of [RFC9200]) are processed | the /introspect endpoint (see Section 5.9 of [RFC9200]) are processed | |||
as intended. | as intended. | |||
When communicating with one another, the registered devices and the | When communicating with one another, the registered devices and the | |||
AS have to use a secure communication association and be mutually | AS have to use a secure communication association and be mutually | |||
authenticated (see Section 5 of [RFC9200]). | authenticated (see Section 5 of [RFC9200]). | |||
skipping to change at line 1760 ¶ | skipping to change at line 1756 ¶ | |||
To this end, the AS may rely on a local access control list or | To this end, the AS may rely on a local access control list or | |||
similar, which specifies the authentication credentials of trusted, | similar, which specifies the authentication credentials of trusted, | |||
authorized administrators. In particular, the AS verifies the | authorized administrators. In particular, the AS verifies the | |||
requester to the TRL endpoint as an authorized administrator only if | requester to the TRL endpoint as an authorized administrator only if | |||
the access control list includes the same authentication credential | the access control list includes the same authentication credential | |||
used by the requester when establishing the mutually authenticated | used by the requester when establishing the mutually authenticated | |||
secure communication association with the AS. | secure communication association with the AS. | |||
Further details about the registration process at the AS are out of | Further details about the registration process at the AS are out of | |||
scope for this specification. Note that the registration process is | scope for this specification. Note that the registration process is | |||
also out of the scope of the ACE framework for Authentication and | also out of the scope of the ACE framework (see Section 5.5 of | |||
Authorization (see Section 5.5 of [RFC9200]). | [RFC9200]). | |||
11. Notification of Revoked Access Tokens | 11. Notification of Revoked Access Tokens | |||
Once registered at the AS, the administrator or registered device can | Once registered at the AS, the administrator or registered device can | |||
send a GET request to the TRL endpoint at the AS. The request can | send a GET request to the TRL endpoint at the AS. The request can | |||
express the wish for a full query (see Section 7) or a diff query | express the wish for a full query (see Section 7) or a diff query | |||
(see Section 8) of the TRL. Also, the request can include the CoAP | (see Section 8) of the TRL. Also, the request can include the CoAP | |||
Observe Option set to 0 (register) in order to start an observation | Observe Option set to 0 (register) in order to start an observation | |||
of the TRL endpoint as per Section 3.1 of [RFC7641]. | of the TRL endpoint as per Section 3.1 of [RFC7641]. | |||
In case the request is successfully processed, the AS replies with a | In case the request is successfully processed, the AS replies with a | |||
response specifying the CoAP response code 2.05 (Content). In | 2.05 (Content) response. In particular, if the AS supports diff | |||
particular, if the AS supports diff queries but not the "Cursor" | queries but not the "Cursor" extension (see Sections 6.2 and 6.2.1), | |||
extension (see Sections 6.2 and 6.2.1), then the payload of the | then the payload of the response is formatted as defined in Sections | |||
response is formatted as defined in Sections 7 or 8, in case the GET | 7 or 8, in case the GET request has yielded the execution of a full | |||
request has yielded the execution of a full query or of a diff query | query or of a diff query of the TRL, respectively. Instead, if the | |||
of the TRL, respectively. Instead, if the AS supports both diff | AS supports both diff queries and the related "Cursor" extension, | |||
queries and the related "Cursor" extension, then the payload of the | then the payload of the response is formatted as defined in | |||
response is formatted as defined in Section 9. | Section 9. | |||
In case a requester does not receive a response from the TRL endpoint | In case a requester does not receive a response from the TRL endpoint | |||
or it receives an error response from the TRL endpoint, the requester | or it receives an error response from the TRL endpoint, the requester | |||
does not make any assumptions or draw any conclusions regarding the | does not make any assumptions or draw any conclusions regarding the | |||
revocation or expiration of its pertaining access tokens. The | revocation or expiration of its pertaining access tokens. The | |||
requester MAY try again by sending a new request to the TRL endpoint. | requester MAY try again by sending a new request to the TRL endpoint. | |||
When the TRL is updated (see Section 5.1), the AS sends Observe | When the TRL is updated (see Section 5.1), the AS sends Observe | |||
notifications to the observers whose pertaining subset of the TRL has | notifications to the observers whose pertaining subset of the TRL has | |||
changed. Observe notifications are sent as per Section 4.2 of | changed. Observe notifications are sent as per Section 4.2 of | |||
[RFC7641]. If supported by the AS, an observer may configure the | [RFC7641]. If supported by the AS, an observer may configure the | |||
behavior according to which the AS sends those Observe notifications. | behavior according to which the AS sends those Observe notifications. | |||
To this end, a possible way relies on the conditional control | To this end, a possible way relies on the conditional control | |||
attribute "c.pmax" defined in [CoRE-ATTRIBUTES], which can be | parameter "c.pmax" defined in [COND-PARAMETERS], which can be | |||
included as a "name=value" query parameter in an Observation Request. | included as a "name=value" query parameter in an Observation Request. | |||
This ensures that no more than c.pmax seconds elapse between two | This ensures that no more than c.pmax seconds elapse between two | |||
consecutive notifications sent to that observer, regardless of | consecutive notifications sent to that observer, regardless of | |||
whether or not the TRL has changed. | whether or not the TRL has changed. | |||
Following a first exchange with the AS, an administrator or a | Following a first exchange with the AS, an administrator or a | |||
registered device can send additional GET (Observation) requests to | registered device can send additional GET requests to the TRL | |||
the TRL endpoint at any time, analogously to what is defined above. | endpoint at any time, analogously to what is defined above. When | |||
When doing so, the requester towards the TRL endpoint can perform a | doing so, the requester towards the TRL endpoint can perform a full | |||
full query (see Section 7) or a diff query (see Section 8) of the | query (see Section 7) or a diff query (see Section 8) of the TRL. In | |||
TRL. In the latter case, the requester can additionally rely on the | the latter case, the requester can additionally rely on the "Cursor" | |||
"Cursor" extension (see Sections 6.3 and 9.2). | extension (see Sections 6.3 and 9.2). | |||
As specified in Section 6.2, an AS supporting diff queries maintains | As specified in Section 6.2, an AS supporting diff queries maintains | |||
an update collection of maximum MAX_N series items for each | an update collection of maximum MAX_N series items for each | |||
administrator or registered device, hereafter referred to as a | administrator or registered device, hereafter referred to as a | |||
"requester". In particular, if an update collection includes MAX_N | "requester". In particular, if an update collection includes MAX_N | |||
series items, adding a further series item to that update collection | series items, adding a further series item to that update collection | |||
results in deleting the oldest series item from that update | results in deleting the oldest series item from that update | |||
collection. | collection. | |||
From then on, the requester associated with the update collection | From then on, the requester associated with the update collection | |||
will not be able to retrieve the deleted series item when sending a | will not be able to retrieve the deleted series item when sending a | |||
new diff query request to the TRL endpoint. If that series item | new diff query request to the TRL endpoint. If that series item | |||
reflected the revocation of an access token pertaining to the | reflected the revocation of an access token pertaining to the | |||
requester, then the requester will not learn about that when | requester, then the requester will not learn about that when | |||
receiving the corresponding diff query response from the AS. | receiving the corresponding diff query response from the AS. | |||
Sending a diff query request specifically as an Observation Request, | Sending a diff query request specifically as an Observation Request, | |||
and, thus, relying on Observe notifications, largely reduces the | and, thus, relying on Observe notifications, largely reduces the | |||
chances for a requester to miss updates to its associated update | chances for a requester to miss updates that have occurred to its | |||
collection. In turn, this relies on the requester successfully | associated update collection. In turn, this relies on the requester | |||
receiving the Observe notification responses from the TRL (see also | successfully receiving the Observe notification responses from the | |||
Section 14.3). | TRL (see also Section 14.3). | |||
In order to limit the amount of time during which the requester is | In order to limit the amount of time during which the requester is | |||
unaware of pertaining access tokens that have been revoked but are | unaware of pertaining access tokens that have been revoked but are | |||
not expired yet, a requester SHOULD NOT rely solely on diff query | not expired yet, a requester SHOULD NOT rely solely on diff query | |||
requests. In particular, a requester SHOULD also regularly send a | requests. In particular, a requester SHOULD also regularly send a | |||
full query request to the TRL endpoint according to a related | full query request to the TRL endpoint according to a related | |||
application policy. | application policy. | |||
11.1. Handling of Revoked Access Tokens and Token Hashes | 11.1. Handling of Revoked Access Tokens and Token Hashes | |||
skipping to change at line 1925 ¶ | skipping to change at line 1921 ¶ | |||
AS. | AS. | |||
The RS MUST NOT delete the stored token hashes whose corresponding | The RS MUST NOT delete the stored token hashes whose corresponding | |||
access tokens do not fulfill both the two conditions above, unless it | access tokens do not fulfill both the two conditions above, unless it | |||
becomes necessary due to memory limitations. In such a case, the RS | becomes necessary due to memory limitations. In such a case, the RS | |||
MUST delete the earliest stored token hashes first. | MUST delete the earliest stored token hashes first. | |||
Retaining the stored token hashes as specified above limits the | Retaining the stored token hashes as specified above limits the | |||
impact from a (dishonest) client whose pertaining access token: | impact from a (dishonest) client whose pertaining access token: | |||
1. specifies the 'exi' claim, | 1. includes the 'exi' claim, | |||
2. is uploaded at the RS for the first time after it has been | 2. is uploaded at the RS for the first time after it has been | |||
revoked and later expired, and | revoked and later expired, and | |||
3. has the sequence number encoded in the 'cti' claim (for CWTs) or | 3. has the sequence number encoded in the 'cti' claim (for CWTs) or | |||
in the 'jti' claim (for JWTs) greater than the highest sequence | in the 'jti' claim (for JWTs) greater than the highest sequence | |||
number among the expired access tokens specifying the 'exi' claim | number among the expired access tokens including the 'exi' claim | |||
for the RS (see Section 5.10.3 of [RFC9200]). That is, the RS | for the RS (see Section 5.10.3 of [RFC9200]). | |||
would not accept such a revoked and expired access token as long | ||||
as it stores the corresponding token hash. | ||||
In order to further limit such a risk, when receiving an access token | That is, the RS would not accept such a revoked and expired access | |||
that specifies the 'exi' claim and for which a corresponding token | token as long as it stores the corresponding token hash. | |||
hash is not stored, the RS can introspect the access token (see | ||||
Section 5.9 of [RFC9200]), if token introspection is implemented by | This risk can be further limited. Specifically, if token | |||
both the RS and the AS. | introspection is implemented by both the RS and the AS, the RS can | |||
introspect the access token (see Section 5.9 of [RFC9200]) when | ||||
receiving an access token that includes the 'exi' claim and for which | ||||
a corresponding token hash is not stored. | ||||
When, due to the stored and corresponding token hash th2, an access | 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 | 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 | upon its upload, the RS retrieves the sequence number sn2 encoded in | |||
the 'cti' claim (for CWTs) or in the 'jti' claim (for JWTs) (see | the 'cti' claim (for CWTs) or in the 'jti' claim (for JWTs) (see | |||
Section 5.10.3 of [RFC9200]). Then, the RS stores sn2 as associated | Section 5.10.3 of [RFC9200]). Then, the RS stores sn2 as associated | |||
with th2. If expunging or not accepting t2 yields the deletion of | with th2. If expunging or not accepting t2 yields the deletion of | |||
th2, then the RS MUST associate sn2 with th2 before continuing with | th2, then the RS MUST associate sn2 with th2 before continuing with | |||
the deletion of th2. | the deletion of th2. | |||
When deleting any token hash, the RS checks whether the token hash is | 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 | 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* | checks whether sn_th is greater than the highest sequence number sn* | |||
among the expired access tokens specifying the 'exi' claim for the | among the expired access tokens including the 'exi' claim for the RS. | |||
RS. If that is the case, sn* MUST take the value of sn_th. | If that is the case, sn* MUST take the value of sn_th. | |||
By virtue of what is defined in Section 5.10.3 of [RFC9200], this | By virtue of what is defined in Section 5.10.3 of [RFC9200], this | |||
ensures that, following the deletion of the token hash associated | ensures that, following the deletion of the token hash associated | |||
with an access token specifying the 'exi' claim and uploaded for the | with an access token including the 'exi' claim and uploaded for the | |||
first time after it has been revoked and later expired, the RS will | 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. | not accept the access token at that point in time or in the future. | |||
12. ACE Token Revocation List Parameters | 12. ACE Token Revocation List Parameters | |||
This specification defines a number of parameters that can be | This specification defines a number of parameters that can be | |||
transported in the response from the TRL endpoint, when the response | transported in the response from the TRL endpoint, when the response | |||
payload is a CBOR map. Note that such a response MUST use the | payload is a CBOR map. Note that such a response MUST use the | |||
Content-Format "application/ace-trl+cbor" defined in Section 15.2 of | Content-Format "application/ace-trl+cbor" defined in Section 15.2 of | |||
this specification. | this specification. | |||
skipping to change at line 2016 ¶ | skipping to change at line 2013 ¶ | |||
+-------+---------------------------+ | +-------+---------------------------+ | |||
| 2 | Out of bound cursor value | | | 2 | Out of bound cursor value | | |||
+-------+---------------------------+ | +-------+---------------------------+ | |||
Table 2: ACE Token Revocation | Table 2: ACE Token Revocation | |||
List Error Identifiers | List Error Identifiers | |||
14. Security Considerations | 14. Security Considerations | |||
The protocol defined in this document inherits the security | The protocol defined in this document inherits the security | |||
considerations from the ACE framework for Authentication and | considerations from the ACE framework [RFC9200] and those about the | |||
Authorization [RFC9200], the usage of CWTs from [RFC8392], the usage | usage of CWTs from [RFC8392], the usage of JWTs from [RFC7519] and | |||
of JWTs from [RFC7519] and [RFC8725], the usage of CoAP Observe from | [RFC8725], the usage of CoAP Observe from [RFC7641], and the | |||
[RFC7641], and computation of the token hashes from [RFC6920]. The | computation of the token hashes from [RFC6920]. The following | |||
following considerations also apply. | considerations also apply. | |||
14.1. Content Retrieval from the TRL | 14.1. Content Retrieval from the TRL | |||
The AS MUST ensure that each registered device can access and | The AS MUST ensure that each registered device can access and | |||
retrieve only its pertaining subset of the TRL. To this end, the AS | retrieve only its pertaining subset of the TRL. To this end, the AS | |||
can always perform the required filtering based on the authenticated | can always perform the required filtering based on the authenticated | |||
identity of the registered device, i.e., a (non-public) identifier | identity of the registered device, i.e., a (non-public) identifier | |||
that the AS can securely relate to the registered device and the | that the AS can securely relate to the registered device and the | |||
secure association that they use to communicate. | secure association that they use to communicate. | |||
skipping to change at line 2044 ¶ | skipping to change at line 2041 ¶ | |||
(see Section 10). | (see Section 10). | |||
Note that the TRL endpoint supports only the GET method (see | Note that the TRL endpoint supports only the GET method (see | |||
Section 6). Therefore, as detailed in Sections 7 and 8, access to | Section 6). Therefore, as detailed in Sections 7 and 8, access to | |||
the TRL endpoint is performed only by means of protected and | the TRL endpoint is performed only by means of protected and | |||
authenticated GET requests, which, by definition, are safe in the | authenticated GET requests, which, by definition, are safe in the | |||
REST sense and do not alter the content of the TRL. That is, | REST sense and do not alter the content of the TRL. That is, | |||
registered devices and administrators can perform exclusively read- | registered devices and administrators can perform exclusively read- | |||
only operations when accessing the TRL endpoint. | only operations when accessing the TRL endpoint. | |||
In the two circumstances described in Section 5.1, the content of the | In fact, the content of the TRL can be updated only internally by the | |||
TRL can be updated only internally by the AS. Therefore, an | AS, in the two circumstances described in Section 5.1. Therefore, an | |||
adversary that is not in control of the AS cannot manipulate the | adversary that is not in control of the AS cannot manipulate the | |||
content of the TRL, e.g., by removing a token hash and thereby | content of the TRL, e.g., by removing a token hash and thereby | |||
fraudulently allowing a client to access protected resources in spite | fraudulently allowing a client to access protected resources in spite | |||
of a revoked access token or by adding a token hash and thereby | of a revoked access token or by adding a token hash and thereby | |||
fraudulently stopping a client from accessing protected resources in | fraudulently stopping a client from accessing protected resources in | |||
spite of an access token being still valid. | spite of an access token being still valid. | |||
14.2. Size of the TRL | 14.2. Size of the TRL | |||
If many non-expired access tokens associated with a registered device | If many non-expired access tokens associated with a registered device | |||
skipping to change at line 2104 ¶ | skipping to change at line 2101 ¶ | |||
* the access token has been revoked, the RS has become aware of it, | * the access token has been revoked, the RS has become aware of it, | |||
and the RS has expunged the access token, but the client is not | and the RS has expunged the access token, but the client is not | |||
aware of this (yet). | aware of this (yet). | |||
* the access token is still valid, but an on-path active adversary | * the access token is still valid, but an on-path active adversary | |||
might have injected a forged 4.01 (Unauthorized) response or the | might have injected a forged 4.01 (Unauthorized) response or the | |||
RS might have deleted the access token from its local storage due | RS might have deleted the access token from its local storage due | |||
to its dedicated storage space being all consumed. | to its dedicated storage space being all consumed. | |||
In either case, if the client believes that the access token is still | 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 | valid, it SHOULD NOT immediately ask for a new access token to the AS | |||
authorization server upon receiving a 4.01 (Unauthorized) response | upon receiving a 4.01 (Unauthorized) response from the RS. Instead, | |||
from the RS. Instead, the client SHOULD send a request to the TRL | the client SHOULD send a request to the TRL endpoint at the AS. If | |||
endpoint at the AS. If the client gains knowledge that the access | the client gains knowledge that the access token is not valid | |||
token is not valid anymore, the client expunges the access token and | anymore, the client expunges the access token and can ask for a new | |||
can ask for a new one. Otherwise, the client can try again to upload | one. Otherwise, the client can try again to upload the same access | |||
the same access token to the RS or request a new one. | token to the RS or request a new one. | |||
14.5. Vulnerable Time Window at the RS | 14.5. Vulnerable Time Window at the RS | |||
A client may attempt to access a protected resource at an RS after | A client may attempt to access a protected resource at an RS after | |||
the access token allowing such an access has been revoked but before | the access token allowing such an access has been revoked but before | |||
the RS is aware of the revocation. | the RS is aware of the revocation. | |||
In such a case, if the RS is still storing the access token, the | In such a case, if the RS is still storing the access token, the | |||
client will be able to access the protected resource even though it | client will be able to access the protected resource even though it | |||
should not. Such access is a security violation, even if the client | should not. Such access is a security violation, even if the client | |||
skipping to change at line 2170 ¶ | skipping to change at line 2167 ¶ | |||
After that, the adversary sends the manipulated access token to the | After that, the adversary sends the manipulated access token to the | |||
RS. | RS. | |||
After having successfully validated the manipulated access token, the | After having successfully validated the manipulated access token, the | |||
RS computes a corresponding token hash different from the one | RS computes a corresponding token hash different from the one | |||
computed and stored by C and the AS. Finally, the RS stores the | computed and stored by C and the AS. Finally, the RS stores the | |||
manipulated access token and the corresponding wrong token hash. | manipulated access token and the corresponding wrong token hash. | |||
Later on, if the access token is revoked and the AS provides the RS | Later on, if the access token is revoked and the AS provides the RS | |||
with the corresponding correct token hash, the RS does not recognize | with the corresponding correct token hash, the RS does not recognize | |||
the received token hash among the stored ones; therefore, it does not | the received token hash among the stored ones; therefore, the RS does | |||
delete the revoked access token. | not delete the revoked access token. | |||
14.7. Two Token Hashes at the RS Using JWTs | 14.7. Two Token Hashes at the RS Using JWTs | |||
Section 4.3.2 states that an RS using JWTs as access tokens has to | Section 4.3.2 states that an RS using JWTs as access tokens has to | |||
compute and store two token hashes associated with the same access | compute and store two token hashes associated with the same access | |||
token. This is because, when using JWTs, the RS does not know for | token. This is because the RS does not know for sure if the AS | |||
sure if the AS provided the access token to the client by means of an | provided the access token to the client by means of an AS-to-Client | |||
AS-to-Client response encoded in CBOR or in JSON. | response encoded in CBOR or in JSON. | |||
Taking advantage of that, a dishonest client can attempt to perform | Taking advantage of that, a dishonest client can attempt to perform | |||
an attack against the RS. That is, the client can first receive the | an attack against the RS. That is, the client can first receive the | |||
JWT in an AS-to-Client response encoded in CBOR (JSON). Then, the | JWT in an AS-to-Client response encoded in CBOR (JSON). Then, the | |||
client can upload the JWT to the RS in a way that makes the RS | client can upload the JWT to the RS in a way that makes the RS | |||
believe that the client instead received the JWT in an AS-to-Client | believe that the client instead received the JWT in an AS-to-Client | |||
response encoded in JSON (CBOR). | response encoded in JSON (CBOR). | |||
Consequently, the RS considers a HASH_INPUT different from the one | Consequently, the RS considers a HASH_INPUT different from the one | |||
considered by the AS and the client (see Section 4.2). Hence, the RS | considered by the AS and the client (see Section 4.2). Hence, the RS | |||
computes a token hash h' different from the token hash h computed by | computes a token hash h' different from the token hash h computed by | |||
the AS and the client. It follows that, if the AS revokes the access | the AS and the client. It follows that, if the AS revokes the access | |||
token and advertises the right token hash h, then the RS will not | token and advertises the right token hash h, then the RS will not | |||
learn about the access token revocation; thus, it will not delete the | learn about the access token revocation; therefore, the RS will not | |||
access token. | delete the access token. | |||
Fundamentally, this would happen because the HASH_INPUT used to | Fundamentally, this would happen because the HASH_INPUT used to | |||
compute the token hash of a JWT depends on whether the AS-to-Client | compute the token hash of a JWT depends on whether the AS-to-Client | |||
response is encoded in CBOR or in JSON. This makes the RS vulnerable | response is encoded in CBOR or in JSON. This makes the RS vulnerable | |||
to the attack described above when JWTs are used as access tokens. | to the attack described above when JWTs are used as access tokens. | |||
However, this is not a problem if the access token is a CWT since the | However, this is not a problem if the access token is a CWT since the | |||
HASH_INPUT used to compute the token hash of a CWT does not depend on | HASH_INPUT used to compute the token hash of a CWT does not depend on | |||
whether the AS-to-Client response is encoded in CBOR or in JSON. | whether the AS-to-Client response is encoded in CBOR or in JSON. | |||
While this asymmetry cannot be avoided altogether, the method defined | While this asymmetry cannot be avoided altogether, the method defined | |||
for the AS and the client in Section 4.2 deliberately penalizes the | for the AS and the client in Section 4.2 deliberately penalizes the | |||
case where the RS uses JWTs as access tokens. In such a case, the RS | case where the RS uses JWTs as access tokens. In such a case, the RS | |||
effectively neutralizes the attack described above by computing and | effectively neutralizes the attack described above by computing and | |||
storing two token hashes associated with the same access token (see | storing two token hashes associated with the same access token (see | |||
Section 4.3.2). | Section 4.3.2). | |||
Conversely, this design deliberately favors the case where the RS | Conversely, this design deliberately favors the case where the RS | |||
uses CWTs as access tokens, which is a preferable option for | uses CWTs as access tokens, which is a preferable option for | |||
resource-constrained RSs as well as the default case in the ACE | resource-constrained RSs as well as the default case in the ACE | |||
framework for Authentication and Authorization (see Section 3 of | framework (see Section 3 of [RFC9200]). That is, if an RS uses CWTs | |||
[RFC9200]). That is, if an RS uses CWTs as access tokens, then the | as access tokens, then the RS is not exposed to the attack described | |||
RS is not exposed to the attack described above; thus, it safely | above; therefore, the RS safely computes and stores only one token | |||
computes and stores only one token hash per access token (see | hash per access token (see Section 4.3.1). | |||
Section 4.3.1). | ||||
14.8. Additional Security Measures | 14.8. Additional Security Measures | |||
By accessing the TRL at the AS, registered devices and administrators | By accessing the TRL at the AS, registered devices and administrators | |||
are able to learn that their pertaining access tokens have been | are able to learn that their pertaining access tokens have been | |||
revoked. However, they cannot learn the reason why, including when | revoked. However, they cannot learn the reason why, including when | |||
that reason is the compromise, misbehavior, or decommissioning of a | that reason is the compromise, misbehavior, or decommissioning of a | |||
registered device. | registered device. | |||
In fact, even the AS might not know that a registered device to which | In fact, even the AS might not know that a registered device to which | |||
skipping to change at line 2273 ¶ | skipping to change at line 2269 ¶ | |||
Subtype name: ace-trl+cbor | Subtype name: ace-trl+cbor | |||
Required parameters: N/A | Required parameters: N/A | |||
Optional parameters: N/A | Optional parameters: N/A | |||
Encoding considerations: Must be encoded as a CBOR map containing | Encoding considerations: Must be encoded as a CBOR map containing | |||
the protocol parameters defined in RFC 9770. | the protocol parameters defined in RFC 9770. | |||
Security considerations: See Section 14 of this document. | Security considerations: See Section 14 of RFC 9770. | |||
Interoperability considerations: N/A | Interoperability considerations: N/A | |||
Published specification: RFC 9770 | Published specification: RFC 9770 | |||
Applications that use this media type: The type is used by | Applications that use this media type: The type is used by | |||
authorization servers, clients, and resource servers that support | authorization servers, clients, and RSs that support the | |||
the notification of revoked access tokens according to a Token | notification of revoked access tokens according to a Token | |||
Revocation List maintained by the authorization server as | Revocation List maintained by the authorization server as | |||
specified in RFC 9770. | specified in RFC 9770. | |||
Fragment identifier considerations: N/A | Fragment identifier considerations: N/A | |||
Additional information: N/A | Additional information: N/A | |||
Person & email address to contact for further information: ACE WG | Person & email address to contact for further information: ACE WG | |||
mailing list (ace@ietf.org) or IETF Applications and Real-Time | mailing list (ace@ietf.org) or IETF Applications and Real-Time | |||
Area (art@ietf.org) | Area (art@ietf.org) | |||
Intended usage: COMMON | Intended usage: COMMON | |||
Restrictions on usage: None | Restrictions on usage: None | |||
Author/Change controller: IETF | Author/Change controller: IETF | |||
15.2. CoAP Content-Formats Registry | 15.2. CoAP Content-Formats Registry | |||
IANA has added the following entry to the "CoAP Content-Formats" | IANA has registered the following entry to the "CoAP Content-Formats" | |||
registry within the "Constrained RESTful Environments (CoRE) | registry within the "Constrained RESTful Environments (CoRE) | |||
Parameters" registry group. | Parameters" registry group. | |||
Content Type: application/ace-trl+cbor | Content Type: application/ace-trl+cbor | |||
Content Coding: - | Content Coding: - | |||
ID: 262 | ID: 262 | |||
Reference: RFC 9770 | Reference: RFC 9770 | |||
15.3. Custom Problem Detail Keys Registry | 15.3. Custom Problem Detail Keys Registry | |||
skipping to change at line 2615 ¶ | skipping to change at line 2611 ¶ | |||
DOI 10.17487/RFC9528, March 2024, | DOI 10.17487/RFC9528, March 2024, | |||
<https://www.rfc-editor.org/info/rfc9528>. | <https://www.rfc-editor.org/info/rfc9528>. | |||
[SHA-256] NIST, "Secure Hash Standard", NIST FIPS PUB 180-4, | [SHA-256] NIST, "Secure Hash Standard", NIST FIPS PUB 180-4, | |||
DOI 10.6028/NIST.FIPS.180-4, August 2015, | DOI 10.6028/NIST.FIPS.180-4, August 2015, | |||
<https://nvlpubs.nist.gov/nistpubs/FIPS/ | <https://nvlpubs.nist.gov/nistpubs/FIPS/ | |||
NIST.FIPS.180-4.pdf>. | NIST.FIPS.180-4.pdf>. | |||
16.2. Informative References | 16.2. Informative References | |||
[CoRE-ATTRIBUTES] | [COND-PARAMETERS] | |||
Silverajan, B., Koster, M., and A. Soloway, "Conditional | Silverajan, B., Koster, M., and A. Soloway, "Conditional | |||
Query Parameters for CoAP Observe", Work in Progress, | Query Parameters for CoAP Observe", Work in Progress, | |||
Internet-Draft, draft-ietf-core-conditional-attributes-11, | Internet-Draft, draft-ietf-core-conditional-attributes-11, | |||
16 March 2025, <https://datatracker.ietf.org/doc/html/ | 16 March 2025, <https://datatracker.ietf.org/doc/html/ | |||
draft-ietf-core-conditional-attributes-11>. | draft-ietf-core-conditional-attributes-11>. | |||
[RFC7009] Lodderstedt, T., Ed., Dronia, S., and M. Scurtescu, "OAuth | [RFC7009] Lodderstedt, T., Ed., Dronia, S., and M. Scurtescu, "OAuth | |||
2.0 Token Revocation", RFC 7009, DOI 10.17487/RFC7009, | 2.0 Token Revocation", RFC 7009, DOI 10.17487/RFC7009, | |||
August 2013, <https://www.rfc-editor.org/info/rfc7009>. | August 2013, <https://www.rfc-editor.org/info/rfc7009>. | |||
[STP] Bormann, C. and K. Hartke, "The Series Transfer Pattern | [STP] Bormann, C. and K. Hartke, "The Series Transfer Pattern | |||
(STP)", Work in Progress, Internet-Draft, draft-bormann- | (STP)", Work in Progress, Internet-Draft, draft-bormann- | |||
t2trg-stp-03, 7 April 2020, | t2trg-stp-03, 7 April 2020, | |||
<https://datatracker.ietf.org/doc/html/draft-bormann- | <https://datatracker.ietf.org/doc/html/draft-bormann- | |||
t2trg-stp-03>. | t2trg-stp-03>. | |||
Appendix A. On Using the Series Transfer Pattern | Appendix A. On Using the Series Transfer Pattern | |||
Performing a diff query of the TRL as specified in Section 8 is, in | Performing a diff query of the TRL as specified in Section 8 is, in | |||
fact, a usage example of the Series Transfer Pattern defined in | fact, a usage example of the Series Transfer Pattern (STP) defined in | |||
[STP]. | [STP]. | |||
That is, a diff query enables the transfer of a series of diff | That is, a diff query enables the transfer of a series of diff | |||
entries with the AS specifying U <= MAX_N diff entries as related to | entries with the AS providing U <= MAX_N diff entries as related to | |||
the U most recent TRL updates pertaining to a requester, i.e., a | the U most recent TRL updates pertaining to a requester, i.e., a | |||
registered device or an administrator. | registered device or an administrator. | |||
When responding to a diff query request from a requester (see | When responding to a diff query request from a requester (see | |||
Section 8), 'diff_set' is a subset of the update collection | Section 8), 'diff_set' is a subset of the update collection | |||
associated with the requester where each 'diff_entry' record is a | associated with the requester where each 'diff_entry' record is a | |||
series item from that update collection. Note that 'diff_set' | series item from that update collection. Note that 'diff_set' | |||
specifies the whole current update collection when the value of U is | 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 | equal to SIZE, i.e., the current number of series items in the update | |||
collection. | collection. | |||
skipping to change at line 2664 ¶ | skipping to change at line 2660 ¶ | |||
Since the update collection associated with each requester includes | Since the update collection associated with each requester includes | |||
up to MAX_N series items, the AS deletes the oldest series item when | up to MAX_N series items, the AS deletes the oldest series item when | |||
a new one is generated and added to the end of the update collection, | 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 | due to a new TRL update pertaining to that requester (see | |||
Section 6.2). This addresses the question "When can the server | Section 6.2). This addresses the question "When can the server | |||
decide to no longer retain older items?" raised in Section 3.2 of | decide to no longer retain older items?" raised in Section 3.2 of | |||
[STP]. | [STP]. | |||
Furthermore, performing a diff query of the TRL together with the | Furthermore, performing a diff query of the TRL together with the | |||
"Cursor" extension, as specified in Section 9, in fact, relies on the | "Cursor" extension as specified in Section 9 relies, in fact, on the | |||
"Cursor" pattern of the STP (see Section 3.3 of [STP]). | "cursor" pattern of the STP (see Section 3.3 of [STP]). | |||
Appendix B. Local Supportive Parameters of the TRL Endpoint | Appendix B. Local Supportive Parameters of the TRL Endpoint | |||
Table 3 provides an aggregated overview of the local supportive | Table 3 provides an aggregated overview of the local supportive | |||
parameters that the AS internally uses at its TRL endpoint when | parameters that the AS internally uses at its TRL endpoint when | |||
supporting diff queries (see Section 6) and the "Cursor" extension | supporting diff queries (see Section 6) and the "Cursor" extension | |||
(see Section 6.2.1). | (see Section 6.2.1). | |||
Except for MAX_N defined in Section 6.2, all the other parameters are | Except for MAX_N defined in Section 6.2, all the other parameters are | |||
defined in Section 6.2.1 and are used only if the AS supports the | defined in Section 6.2.1 and are used only if the AS supports the | |||
"Cursor" extension. | "Cursor" extension. | |||
For each parameter, the columns of the table specify the following | For each parameter, the columns of the table provide the following | |||
information. Both a registered device and an administrator are | information. Both a registered device and an administrator are | |||
referred to as "requester". | referred to as "requester". | |||
Name: The parameter name. A name with letters in uppercase denotes | Name: The parameter name. A name with letters in uppercase denotes | |||
a parameter whose value does not change after its initialization. | a parameter whose value does not change after its initialization. | |||
Single instance: "Y" if there is a single parameter instance | Single instance: "Y" if there is a single parameter instance | |||
associated with the TRL or "N" if there is one parameter instance | associated with the TRL or "N" if there is one parameter instance | |||
per update collection (i.e., per requester). | per update collection (i.e., per requester). | |||
Description: A short description of the parameter. | Description: A short description of the parameter. | |||
Values: The unsigned integer values that the parameter can assume, | Values: The unsigned integer values that the parameter can assume, | |||
where LB and UB denote the inclusive lower bound and upper bound, | where LB and UB denote the inclusive lower bound and upper bound, | |||
respectively, and "^" is the exponentiation operator. | respectively. | |||
+================+==========+====================+==================+ | +================+==========+====================+==================+ | |||
| Name | Single | Description | Values | | | Name | Single | Description | Values | | |||
| | instance | | | | | | instance | | | | |||
+================+==========+====================+==================+ | +================+==========+====================+==================+ | |||
| MAX_N | Y | Max number of | LB = 1 | | | MAX_N | Y | Max number of | LB = 1 | | |||
| | | series items in | | | | | | series items in | | | |||
| | | the update | If supporting | | | | | the update | If supporting | | |||
| | | collection of | "Cursor", then | | | | | collection of each | the "Cursor" | | |||
| | | each requester | UB = MAX_INDEX+1 | | | | | requester | extension, then | | |||
| | | | UB = | | ||||
| | | | MAX_INDEX+1 | | ||||
+----------------+----------+--------------------+------------------+ | +----------------+----------+--------------------+------------------+ | |||
| MAX_DIFF_BATCH | N | Max number of | LB = 1 | | | MAX_DIFF_BATCH | N | Max number of diff | LB = 1 | | |||
| | | diff entries | | | | | | entries included | | | |||
| | | included in a | UB = MAX_N | | | | | in a diff query | UB = MAX_N | | |||
| | | diff query | | | ||||
| | | response when | | | | | | response when | | | |||
| | | using "Cursor" | | | | | | using the "Cursor" | | | |||
| | | extension | | | ||||
+----------------+----------+--------------------+------------------+ | +----------------+----------+--------------------+------------------+ | |||
| MAX_INDEX | Y | Max value of each | LB = MAX_N-1 | | | MAX_INDEX | Y | Max value of each | LB = MAX_N-1 | | |||
| | | instance of the | | | | | | instance of | | | |||
| | | 'index' parameter | UB = (2^64)-1 | | | | | 'index' | UB = (2^64)-1 | | |||
+----------------+----------+--------------------+------------------+ | +----------------+----------+--------------------+------------------+ | |||
| index | N | Value associated | LB = 0 | | | index | N | Value associated | LB = 0 | | |||
| | | with a series | | | | | | with a series item | | | |||
| | | item of an update | UB = MAX_INDEX | | | | | of an update | UB = MAX_INDEX | | |||
| | | collection | | | | | | collection | | | |||
+----------------+----------+--------------------+------------------+ | +----------------+----------+--------------------+------------------+ | |||
| last_index | N | The 'index' value | LB = 0 | | | last_index | N | The 'index' value | LB = 0 | | |||
| | | of the most | | | | | | of the most | | | |||
| | | recently added | UB = MAX_INDEX | | | | | recently added | UB = MAX_INDEX | | |||
| | | series item in an | | | | | | series item in an | | | |||
| | | update collection | | | | | | update collection | | | |||
+----------------+----------+--------------------+------------------+ | +----------------+----------+--------------------+------------------+ | |||
Table 3: Local Supportive Parameters of the TRL Endpoint | Table 3: Local Supportive Parameters of the TRL Endpoint | |||
skipping to change at line 2761 ¶ | skipping to change at line 2759 ¶ | |||
* a 'max_n' parameter specifying the value of MAX_N, i.e., the | * a 'max_n' parameter specifying the value of MAX_N, i.e., the | |||
maximum number of series items that the AS retains in the update | maximum number of series items that the AS retains in the update | |||
collection associated with a registered device (see Section 8); | collection associated with a registered device (see Section 8); | |||
* possible further parameters related to the registration process. | * possible further parameters related to the registration process. | |||
Furthermore, 'h(x)' refers to the hash function used to compute the | Furthermore, 'h(x)' refers to the hash function used to compute the | |||
token hashes, as defined in Section 4 of this specification and | token hashes, as defined in Section 4 of this specification and | |||
according to [RFC6920]. Assuming the usage of CWTs transported in | according to [RFC6920]. Assuming the usage of CWTs transported in | |||
AS-to-Client responses encoded in CBOR (see Section 4.2.1), | AS-to-Client responses encoded in CBOR (see Section 4.2.1), | |||
'bstr.h(t1)' and 'bstr.h(t2)' denote the CBOR byte strings with value | 'bstr.h(t1)' and 'bstr.h(t2)' denote CBOR byte strings, whose values | |||
the token hashes of the access tokens t1 and t2, respectively. | are the token hashes of the access tokens t1 and t2, respectively. | |||
C.1. Full Query with Observe | C.1. Full Query with Observe | |||
Figure 10 shows an interaction example considering a CoAP observation | Figure 10 shows an interaction example a CoAP observation and a full | |||
and a full query of the TRL. | query of the TRL. | |||
In this example, the AS does not support the "Cursor" extension. | In this example, the AS does not support the "Cursor" extension. | |||
Hence, the 'cursor' parameter is not included in the payload of the | Hence, the 'cursor' parameter is not included in the payload of the | |||
responses to a full query request. | responses to a full query request. | |||
RS AS | RS AS | |||
| | | | | | |||
| Registration: POST | | | Registration: POST | | |||
+--------------------------------------------------->| | +--------------------------------------------------->| | |||
| | | | | | |||
skipping to change at line 2794 ¶ | skipping to change at line 2792 ¶ | |||
| "max_n" : 10 | | | "max_n" : 10 | | |||
| } | | | } | | |||
| | | | | | |||
| GET coap://as.example.com/revoke/trl/ | | | GET coap://as.example.com/revoke/trl/ | | |||
| Observe: 0 | | | Observe: 0 | | |||
+--------------------------------------------------->| | +--------------------------------------------------->| | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 42 | | | Observe: 42 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [] | | | / full_set / 0: [] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access tokens t1 and t2 issued | | | (Access tokens t1 and t2 issued | | |||
| and successfully submitted to RS) | | | and successfully submitted to RS) | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t1 is revoked) | | | (Access token t1 is revoked) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 53 | | | Observe: 53 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t1)] | | | / full_set / 0: [bstr.h(t1)] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t2 is revoked) | | | (Access token t2 is revoked) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 64 | | | Observe: 64 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t1), bstr.h(t2)] | | | / full_set / 0: [bstr.h(t1), bstr.h(t2)] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t1 expires) | | | (Access token t1 expires) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 75 | | | Observe: 75 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t2)] | | | / full_set / 0: [bstr.h(t2)] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t2 expires) | | | (Access token t2 expires) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 86 | | | Observe: 86 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [] | | | / full_set / 0: [] | | |||
| } | | | } | | |||
| | | | | | |||
Figure 10: Interaction for Full Query with Observe | Figure 10: Interaction for Full Query with Observe | |||
C.2. Diff Query with Observe | C.2. Diff Query with Observe | |||
Figure 11 shows an interaction example of a CoAP observation and a | Figure 11 shows an interaction example of a CoAP observation and a | |||
diff query of the TRL. | diff query of the TRL. | |||
The RS indicates N = 3 as the value of the 'diff' query parameter, | The RS indicates N = 3 as the value of the 'diff' query parameter, | |||
i.e., as the maximum number of diff entries to be specified in a | i.e., as the maximum number of diff entries to be included in a | |||
response from the AS. | response from the AS. | |||
In this example, the AS does not support the "Cursor" extension. | In this example, the AS does not support the "Cursor" extension. | |||
Hence, the 'cursor' parameter and the 'more' parameter are not | Hence, the 'cursor' parameter and the 'more' parameter are not | |||
included in the payload of the responses to a diff query request. | included in the payload of the responses to a diff query request. | |||
RS AS | RS AS | |||
| | | | | | |||
| Registration: POST | | | Registration: POST | | |||
+--------------------------------------------------->| | +--------------------------------------------------->| | |||
skipping to change at line 2889 ¶ | skipping to change at line 2887 ¶ | |||
| "max_n" : 10 | | | "max_n" : 10 | | |||
| } | | | } | | |||
| | | | | | |||
| GET coap://as.example.com/revoke/trl?diff=3 | | | GET coap://as.example.com/revoke/trl?diff=3 | | |||
| Observe: 0 | | | Observe: 0 | | |||
+--------------------------------------------------->| | +--------------------------------------------------->| | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 42 | | | Observe: 42 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [] | | | / diff_set / 1: [] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access tokens t1 and t2 issued | | | (Access tokens t1 and t2 issued | | |||
| and successfully submitted to RS) | | | and successfully submitted to RS) | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t1 is revoked) | | | (Access token t1 is revoked) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 53 | | | Observe: 53 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [], [bstr.h(t1)] ] | | | [ [], [bstr.h(t1)] ] | | |||
| ] | | | ] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t2 is revoked) | | | (Access token t2 is revoked) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 64 | | | Observe: 64 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [], [bstr.h(t2)] ], | | | [ [], [bstr.h(t2)] ], | | |||
| [ [], [bstr.h(t1)] ] | | | [ [], [bstr.h(t1)] ] | | |||
| ] | | | ] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t1 expires) | | | (Access token t1 expires) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 75 | | | Observe: 75 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [bstr.h(t1)], [] ], | | | [ [bstr.h(t1)], [] ], | | |||
| [ [], [bstr.h(t2)] ], | | | [ [], [bstr.h(t2)] ], | | |||
| [ [], [bstr.h(t1)] ] | | | [ [], [bstr.h(t1)] ] | | |||
| ] | | | ] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t2 expires) | | | (Access token t2 expires) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 86 | | | Observe: 86 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [bstr.h(t2)], [] ], | | | [ [bstr.h(t2)], [] ], | | |||
| [ [bstr.h(t1)], [] ], | | | [ [bstr.h(t1)], [] ], | | |||
| [ [], [bstr.h(t2)] ] | | | [ [], [bstr.h(t2)] ] | | |||
| ] | | | ] | | |||
| } | | | } | | |||
| | | | | | |||
Figure 11: Interaction for Diff Query with Observe | Figure 11: Interaction for Diff Query with Observe | |||
C.3. Full Query with Observe Plus Diff Query | C.3. Full Query with Observe and Diff Query | |||
Figure 12 shows an interaction example of a CoAP observation and a | Figure 12 shows an interaction example of a CoAP observation and a | |||
full query of the TRL. | full query of the TRL. | |||
The example also shows one of the notifications from the AS getting | The example also shows one of the notifications from the AS getting | |||
lost in transmission; thus, it does not reach the RS. | lost in transmission; thus, that notification does not reach the RS. | |||
When this happens, and after a waiting time defined by the | When this happens, and after a waiting time defined by the | |||
application has elapsed, the RS sends a GET request with no Observe | 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 | Option to the AS to perform a diff query of the TRL. The RS | |||
indicates N = 8 as the value of the 'diff' query parameter, i.e., as | indicates N = 8 as the value of the 'diff' query parameter, i.e., as | |||
the maximum number of diff entries to be specified in a response from | the maximum number of diff entries to be included in a response from | |||
the AS. | the AS. | |||
In this example, the AS does not support the "Cursor" extension. | In this example, the AS does not support the "Cursor" extension. | |||
Hence, the 'cursor' parameter is not included in the payload of the | Hence, the 'cursor' parameter is not included in the payload of the | |||
responses to a full query request. Also, the 'cursor' parameter and | responses to a full query request. Also, the 'cursor' parameter and | |||
the 'more' parameter are not included in the payload of the responses | the 'more' parameter are not included in the payload of the responses | |||
to a diff query request. | to a diff query request. | |||
RS AS | RS AS | |||
| | | | | | |||
skipping to change at line 3005 ¶ | skipping to change at line 3003 ¶ | |||
| "max_n" : 10 | | | "max_n" : 10 | | |||
| } | | | } | | |||
| | | | | | |||
| GET coap://as.example.com/revoke/trl/ | | | GET coap://as.example.com/revoke/trl/ | | |||
| Observe: 0 | | | Observe: 0 | | |||
+--------------------------------------------------->| | +--------------------------------------------------->| | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 42 | | | Observe: 42 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [] | | | / full_set / 0: [] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access tokens t1 and t2 issued | | | (Access tokens t1 and t2 issued | | |||
| and successfully submitted to RS) | | | and successfully submitted to RS) | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t1 is revoked) | | | (Access token t1 is revoked) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 53 | | | Observe: 53 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t1)] | | | / full_set / 0: [bstr.h(t1)] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t2 is revoked) | | | (Access token t2 is revoked) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 64 | | | Observe: 64 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t1), bstr.h(t2)] | | | / full_set / 0: [bstr.h(t1), bstr.h(t2)] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t1 expires) | | | (Access token t1 expires) | | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 75 | | | Observe: 75 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t2)] | | | / full_set / 0: [bstr.h(t2)] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t2 expires) | | | (Access token t2 expires) | | |||
| | | | | | |||
| Lost X <------------------------------------------+ | | Lost X <------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 86 | | | Observe: 86 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [] | | | / full_set / 0: [] | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Enough time has passed since | | | (Enough time has passed since | | |||
| the latest received notification) | | | the latest received notification) | | |||
| | | | | | |||
| | | | | | |||
| GET coap://as.example.com/revoke/trl?diff=8 | | | GET coap://as.example.com/revoke/trl?diff=8 | | |||
+--------------------------------------------------->| | +--------------------------------------------------->| | |||
| | | | | | |||
|<---------------------------------------------------+ | |<---------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [bstr.h(t2)], [] ], | | | [ [bstr.h(t2)], [] ], | | |||
| [ [bstr.h(t1)], [] ], | | | [ [bstr.h(t1)], [] ], | | |||
| [ [], [bstr.h(t2)] ], | | | [ [], [bstr.h(t2)] ], | | |||
| [ [], [bstr.h(t1)] ] | | | [ [], [bstr.h(t1)] ] | | |||
| ] | | | ] | | |||
| } | | | } | | |||
| | | | | | |||
Figure 12: Interaction for Full Query with Observe Plus Diff Query | Figure 12: Interaction for Full Query with Observe and Diff Query | |||
C.4. Diff Query with Observe and "Cursor" | C.4. Diff Query with Observe and "Cursor" Extension | |||
In this example, the AS supports the "Cursor" extension. Hence, the | In this example, the AS supports the "Cursor" extension. Hence, the | |||
CBOR map conveyed as payload of the registration response | CBOR map conveyed as payload of the registration response | |||
additionally includes a "max_diff_batch" parameter. This specifies | additionally includes a "max_diff_batch" parameter. This specifies | |||
the value of MAX_DIFF_BATCH, i.e., the maximum number of diff entries | the value of MAX_DIFF_BATCH, i.e., the maximum number of diff entries | |||
that can be included in a response to a diff query request from this | that can be included in a response to a diff query request from this | |||
RS. | RS. | |||
Figure 13 shows an interaction example of a CoAP observation and a | Figure 13 shows an interaction example of a CoAP observation and a | |||
diff query of the TRL. | diff query of the TRL. | |||
The RS specifies the query parameter 'diff' with a value of 3, i.e., | The RS specifies the 'diff' query parameter with a value of 3, i.e., | |||
the maximum number of diff entries to be specified in a response from | the maximum number of diff entries to be included in a response from | |||
the AS. | the AS. | |||
If the RS has not received a notification from the AS after a waiting | If the RS has not received a notification from the AS for a waiting | |||
time defined by the application, the RS sends a GET request with no | 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. | Observe Option to the AS to perform a diff query of the TRL. | |||
This is followed up by a further diff query request that specifies | This is followed up by a further diff query request that includes the | |||
the query parameter 'cursor'. Note that the payload of the | 'cursor' query parameter. Note that the payload of the corresponding | |||
corresponding response differs from the payload of the response to | response differs from the payload of the response to the previous | |||
the previous diff query request. | diff query request. | |||
RS AS | RS AS | |||
| | | | | | |||
| Registration: POST | | | Registration: POST | | |||
+------------------------------------------------------->| | +------------------------------------------------------->| | |||
| | | | | | |||
|<-------------------------------------------------------+ | |<-------------------------------------------------------+ | |||
| 2.01 Created | | | 2.01 Created | | |||
| Payload: { | | | Payload: { | | |||
| / ... / | | | / ... / | | |||
| "trl_path" : "/revoke/trl", | | | "trl_path" : "/revoke/trl", | | |||
| "trl_hash" : "sha-256", | | | "trl_hash" : "sha-256", | | |||
| "max_n" : 10, | | | "max_n" : 10, | | |||
| "max_diff_batch": 5 | | | "max_diff_batch" : 5 | | |||
| } | | | } | | |||
| | | | | | |||
| GET coap://as.example.com/revoke/trl?diff=3 | | | GET coap://as.example.com/revoke/trl?diff=3 | | |||
| Observe: 0 | | | Observe: 0 | | |||
+------------------------------------------------------->| | +------------------------------------------------------->| | |||
| | | | | | |||
|<-------------------------------------------------------+ | |<-------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 42 | | | Observe: 42 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [], | | | / diff_set / 1: [], | | |||
| e'cursor' : null, | | | / cursor / 2: null, | | |||
| e'more' : false | | | / more / 3: false | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access tokens t1 and t2 issued | | | (Access tokens t1 and t2 issued | | |||
| and successfully submitted to RS) | | | and successfully submitted to RS) | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t1 is revoked) | | | (Access token t1 is revoked) | | |||
| | | | | | |||
|<-------------------------------------------------------+ | |<-------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 53 | | | Observe: 53 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [], [bstr.h(t1)] ] | | | [ [], [bstr.h(t1)] ] | | |||
| ], | | | ], | | |||
| e'cursor' : 0, | | | / cursor / 2: 0, | | |||
| e'more' : false | | | / more / 3: false | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t2 is revoked) | | | (Access token t2 is revoked) | | |||
| | | | | | |||
|<-------------------------------------------------------+ | |<-------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 64 | | | Observe: 64 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [], [bstr.h(t2)] ], | | | [ [], [bstr.h(t2)] ], | | |||
| [ [], [bstr.h(t1)] ] | | | [ [], [bstr.h(t1)] ] | | |||
| ], | | | ], | | |||
| e'cursor' : 1, | | | / cursor / 2: 1, | | |||
| e'more' : false | | | / more / 3: false | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t1 expires) | | | (Access token t1 expires) | | |||
| | | | | | |||
|<-------------------------------------------------------+ | |<-------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 75 | | | Observe: 75 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [bstr.h(t1)], [] ], | | | [ [bstr.h(t1)], [] ], | | |||
| [ [], [bstr.h(t2)] ], | | | [ [], [bstr.h(t2)] ], | | |||
| [ [], [bstr.h(t1)] ] | | | [ [], [bstr.h(t1)] ] | | |||
| ], | | | ], | | |||
| e'cursor' : 2, | | | / cursor / 2: 2, | | |||
| e'more' : false | | | / more / 3: false | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t2 expires) | | | (Access token t2 expires) | | |||
| | | | | | |||
|<-------------------------------------------------------+ | |<-------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 86 | | | Observe: 86 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [bstr.h(t2)], [] ], | | | [ [bstr.h(t2)], [] ], | | |||
| [ [bstr.h(t1)], [] ], | | | [ [bstr.h(t1)], [] ], | | |||
| [ [], [bstr.h(t2)] ] | | | [ [], [bstr.h(t2)] ] | | |||
| ], | | | ], | | |||
| e'cursor' : 3, | | | / cursor / 2: 3, | | |||
| e'more' : false | | | / more / 3: false | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Enough time has passed since | | | (Enough time has passed since | | |||
| the latest received notification) | | | the latest received notification) | | |||
| | | | | | |||
| | | | | | |||
| GET coap://as.example.com/revoke/trl?diff=3 | | | GET coap://as.example.com/revoke/trl?diff=3 | | |||
+------------------------------------------------------->| | +------------------------------------------------------->| | |||
| | | | | | |||
|<-------------------------------------------------------+ | |<-------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [bstr.h(t2)], [] ], | | | [ [bstr.h(t2)], [] ], | | |||
| [ [bstr.h(t1)], [] ], | | | [ [bstr.h(t1)], [] ], | | |||
| [ [], [bstr.h(t2)] ] | | | [ [], [bstr.h(t2)] ] | | |||
| ], | | | ], | | |||
| e'cursor' : 3, | | | / cursor / 2: 3, | | |||
| e'more' : false | | | / more / 3: false | | |||
| } | | | } | | |||
| | | | | | |||
| GET coap://as.example.com/revoke/trl?diff=3&cursor=3 | | | GET coap://as.example.com/revoke/trl?diff=3&cursor=3 | | |||
+------------------------------------------------------->| | +------------------------------------------------------->| | |||
| | | | | | |||
|<-------------------------------------------------------+ | |<-------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [], | | | / diff_set / 1: [], | | |||
| e'cursor' : 3, | | | / cursor / 2: 3, | | |||
| e'more' : false | | | / more / 3: false | | |||
| } | | | } | | |||
| | | | | | |||
Figure 13: Interaction for Diff Query with Observe and "Cursor" | Figure 13: Interaction for Diff Query with Observe and "Cursor" | |||
Extension | ||||
C.5. Full Query with Observe Plus Diff Query with "Cursor" | C.5. Full Query with Observe and Diff Query with "Cursor" Extension | |||
In this example, the AS supports the "Cursor" extension. Hence, the | In this example, the AS supports the "Cursor" extension. Hence, the | |||
CBOR map conveyed as payload of the registration response | CBOR map conveyed as payload of the registration response | |||
additionally includes a "max_diff_batch" parameter. This specifies | additionally includes a "max_diff_batch" parameter. This specifies | |||
the value of MAX_DIFF_BATCH, i.e., the maximum number of diff entries | the value of MAX_DIFF_BATCH, i.e., the maximum number of diff entries | |||
that can be included in a response to a diff query request from this | that can be included in a response to a diff query request from this | |||
RS. | RS. | |||
Figure 14 shows an interaction example of a CoAP observation and a | Figure 14 shows an interaction example of a CoAP observation and a | |||
full query of the TRL. | full query of the TRL. | |||
The example also shows some of the notifications from the AS getting | The example also shows some of the notifications from the AS getting | |||
lost in transmission; thus, they do not reach the RS. | lost in transmission; thus, those notifications do not reach the RS. | |||
When this happens, and after a waiting time defined by the | When this happens, and after a waiting time defined by the | |||
application has elapsed, the RS sends a GET request with no Observe | 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, | Option to the AS, to perform a diff query of the TRL. In particular, | |||
the RS specifies: | the RS specifies: | |||
* The query parameter 'diff' with a value of 8, i.e., the maximum | * The 'diff' query parameter with a value of 8, i.e., the maximum | |||
number of diff entries to be specified in a response from the AS. | number of diff entries to be included in a response from the AS. | |||
* The query parameter 'cursor' with a value of 2, thus requesting | * The 'cursor' query parameter with a value of 2, thus requesting | |||
from the update collection the series items following the one with | from the update collection the series items following the one with | |||
the 'index' value equal to 2 (i.e., following the last series item | the 'index' value equal to 2 (i.e., following the last series item | |||
that the RS successfully received in an earlier notification | that the RS successfully received in an earlier notification | |||
response). | response). | |||
The response from the AS conveys a first batch of MAX_DIFF_BATCH = 5 | 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 | series items from the update collection corresponding to the RS. The | |||
AS indicates that further series items are actually available in the | AS indicates that further series items are actually available in the | |||
update collection by setting the 'more' parameter of the response to | update collection by setting the 'more' parameter of the response to | |||
true. Also, the 'cursor' parameter of the response is set to 7, | 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 | i.e., to the 'index' value of the most recent series item included in | |||
the response. | the response. | |||
After that, the RS follows up with a further diff query request | After that, the RS follows up with a further diff query request | |||
specifying the query parameter 'cursor' with a value of 7 in order to | including the 'cursor' query parameter with a value of 7 in order to | |||
retrieve the next and last batch of series items from the update | retrieve the next and last batch of series items from the update | |||
collection. | collection. | |||
RS AS | RS AS | |||
| | | | | | |||
| Registration: POST | | | Registration: POST | | |||
+-------------------------------------------------------------->| | +-------------------------------------------------------------->| | |||
| | | | | | |||
|<--------------------------------------------------------------+ | |<--------------------------------------------------------------+ | |||
| 2.01 Created | | | 2.01 Created | | |||
| Payload: { | | | Payload: { | | |||
| / ... / | | | / ... / | | |||
| "trl_path" : "/revoke/trl", | | | "trl_path" : "/revoke/trl", | | |||
| "trl_hash" : "sha-256", | | | "trl_hash" : "sha-256", | | |||
| "max_n" : 10, | | | "max_n" : 10, | | |||
| "max_diff_batch": 5 | | | "max_diff_batch" : 5 | | |||
| } | | | } | | |||
| | | | | | |||
| GET coap://as.example.com/revoke/trl/ | | | GET coap://as.example.com/revoke/trl/ | | |||
| Observe: 0 | | | Observe: 0 | | |||
+-------------------------------------------------------------->| | +-------------------------------------------------------------->| | |||
| | | | | | |||
|<--------------------------------------------------------------+ | |<--------------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 42 | | | Observe: 42 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [], | | | / full_set / 0: [], | | |||
| e'cursor' : null | | | / cursor / 2: null | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access tokens t1, t2, t3 issued | | | (Access tokens t1, t2, t3 issued | | |||
| and successfully submitted to RS) | | | and successfully submitted to RS) | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access tokens t4, t5, t6 issued | | | (Access tokens t4, t5, t6 issued | | |||
| and successfully submitted to RS) | | | and successfully submitted to RS) | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t1 is revoked) | | | (Access token t1 is revoked) | | |||
| | | | | | |||
|<--------------------------------------------------------------+ | |<--------------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 53 | | | Observe: 53 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t1)], | | | / full_set / 0: [bstr.h(t1)], | | |||
| e'cursor' : 0 | | | / cursor /2: 0 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t2 is revoked) | | | (Access token t2 is revoked) | | |||
| | | | | | |||
|<--------------------------------------------------------------+ | |<--------------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 64 | | | Observe: 64 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t1), bstr.h(t2)], | | | / full_set / 0: [bstr.h(t1), bstr.h(t2)], | | |||
| e'cursor' : 1 | | | / cursor / 2: 1 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t1 expires) | | | (Access token t1 expires) | | |||
| | | | | | |||
|<--------------------------------------------------------------+ | |<--------------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 75 | | | Observe: 75 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t2)], | | | / full_set / 0: [bstr.h(t2)], | | |||
| e'cursor' : 2 | | | / cursor / 2: 2 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t2 expires) | | | (Access token t2 expires) | | |||
| | | | | | |||
| Lost X <-----------------------------------------------------+ | | Lost X <-----------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 86 | | | Observe: 86 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [], | | | / full_set / 0: [], | | |||
| e'cursor' : 3 | | | / cursor / 2: 3 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t3 is revoked) | | | (Access token t3 is revoked) | | |||
| | | | | | |||
| Lost X <-----------------------------------------------------+ | | Lost X <-----------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 88 | | | Observe: 88 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t3)], | | | / full_set / 0: [bstr.h(t3)], | | |||
| e'cursor' : 4 | | | / cursor / 2: 4 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t4 is revoked) | | | (Access token t4 is revoked) | | |||
| | | | | | |||
| Lost X <-----------------------------------------------------+ | | Lost X <-----------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 89 | | | Observe: 89 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t3), bstr.h(t4)], | | | / full_set / 0: [bstr.h(t3), bstr.h(t4)], | | |||
| e'cursor' : 5 | | | / cursor / 2: 5 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t3 expires) | | | (Access token t3 expires) | | |||
| | | | | | |||
| Lost X <-----------------------------------------------------+ | | Lost X <-----------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 90 | | | Observe: 90 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t4)], | | | / full_set / 0: [bstr.h(t4)], | | |||
| e'cursor' : 6 | | | / cursor / 2: 6 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t4 expires) | | | (Access token t4 expires) | | |||
| | | | | | |||
| Lost X <-----------------------------------------------------+ | | Lost X <-----------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 91 | | | Observe: 91 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [], | | | / full_set / 0: [], | | |||
| e'cursor' : 7 | | | / cursor / 2: 7 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access tokens t5 and t6 are revoked) | | | (Access tokens t5 and t6 are revoked) | | |||
| | | | | | |||
| Lost X <-----------------------------------------------------+ | | Lost X <-----------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 92 | | | Observe: 92 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t5), bstr.h(t6)], | | | /full_set / 0: [bstr.h(t5), bstr.h(t6)], | | |||
| e'cursor' : 8 | | | / cursor / 2: 8 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t5 expires) | | | (Access token t5 expires) | | |||
| | | | | | |||
| Lost X <-----------------------------------------------------+ | | Lost X <-----------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 93 | | | Observe: 93 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [bstr.h(t6)], | | | / full_set / 0: [bstr.h(t6)], | | |||
| e'cursor' : 9 | | | / cursor / 2: 9 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Access token t6 expires) | | | (Access token t6 expires) | | |||
| | | | | | |||
| Lost X <-----------------------------------------------------+ | | Lost X <-----------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Observe: 94 | | | Observe: 94 | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'full_set' : [], | | | / full_set / 0: [], | | |||
| e'cursor' : 10 | | | / cursor / 2: 10 | | |||
| } | | | } | | |||
| | | | | | |||
| ... | | | ... | | |||
| | | | | | |||
| (Enough time has passed since | | | (Enough time has passed since | | |||
| the latest received notification) | | | the latest received notification) | | |||
| | | | | | |||
| | | | | | |||
| GET coap://as.example.com/revoke/trl?diff=8&cursor=2 | | | GET coap://as.example.com/revoke/trl?diff=8&cursor=2 | | |||
+-------------------------------------------------------------->| | +-------------------------------------------------------------->| | |||
| | | | | | |||
|<--------------------------------------------------------------+ | |<--------------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor)| | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [bstr.h(t4)], [] ], | | | [ [bstr.h(t4)], [] ], | | |||
| [ [bstr.h(t3)], [] ], | | | [ [bstr.h(t3)], [] ], | | |||
| [ [], [bstr.h(t4)] ], | | | [ [], [bstr.h(t4)] ], | | |||
| [ [], [bstr.h(t3)] ], | | | [ [], [bstr.h(t3)] ], | | |||
| [ [bstr.h(t2)], [] ] | | | [ [bstr.h(t2)], [] ] | | |||
| ], | | | ], | | |||
| e'cursor' : 7, | | | / cursor / 2: 7, | | |||
| e'more' : true | | | / more / 3: true | | |||
| } | | | } | | |||
| | | | | | |||
| GET coap://as.example.com/revoke/trl?diff=8&cursor=7 | | | GET coap://as.example.com/revoke/trl?diff=8&cursor=7 | | |||
+-------------------------------------------------------------->| | +-------------------------------------------------------------->| | |||
| | | | | | |||
|<--------------------------------------------------------------+ | |<--------------------------------------------------------------+ | |||
| 2.05 Content | | | 2.05 Content | | |||
| Content-Format: application/ace-trl+cbor | | | Content-Format:262(application/ace-trl+cbor) | | |||
| Payload: { | | | Payload: { | | |||
| e'diff_set' : [ | | | / diff_set / 1: [ | | |||
| [ [bstr.h(t6)], [] ], | | | [ [bstr.h(t6)], [] ], | | |||
| [ [bstr.h(t5)], [] ], | | | [ [bstr.h(t5)], [] ], | | |||
| [ [], [bstr.h(t5), bstr.h(t6)] ] | | | [ [], [bstr.h(t5), bstr.h(t6)] ] | | |||
| ], | | | ], | | |||
| e'cursor' : 10, | | | / cursor / 2: 10, | | |||
| e'more' : false | | | / more / 3: false | | |||
| } | | | } | | |||
| | | | | | |||
Figure 14: Interaction for Full Query with Observe Plus Diff | Figure 14: Interaction for Full Query with Observe and Diff Query | |||
Query with "Cursor" | with "Cursor" Extension | |||
Appendix D. CDDL Model | ||||
full_set = 0 | ||||
diff_set = 1 | ||||
cursor = 2 | ||||
more = 3 | ||||
ace-trl-error = 1 | ||||
Figure 15: CDDL Model | ||||
Acknowledgments | Acknowledgments | |||
Ludwig Seitz contributed as a coauthor of initial versions of this | Ludwig Seitz contributed as a coauthor of initial versions of this | |||
document. | document. | |||
The authors sincerely thank Christian Amsüss, Carsten Bormann, Deb | The authors sincerely thank Christian Amsüss, Carsten Bormann, Deb | |||
Cooley, Roman Danyliw, Dhruv Dhody, Rikard Höglund, Benjamin Kaduk, | Cooley, Roman Danyliw, Dhruv Dhody, Rikard Höglund, Benjamin Kaduk, | |||
David Navarro, Joerg Ott, Marco Rasori, Michael Richardson, Kyle | David Navarro, Joerg Ott, Marco Rasori, Michael Richardson, Kyle | |||
Rose, Zaheduzzaman Sarker, Jim Schaad, Göran Selander, Travis | Rose, Zaheduzzaman Sarker, Jim Schaad, Göran Selander, Travis | |||
skipping to change at line 3552 ¶ | skipping to change at line 3540 ¶ | |||
The work on this document has been partly supported by the Sweden's | The work on this document has been partly supported by the Sweden's | |||
Innovation Agency VINNOVA and the Celtic-Next projects CRITISEC and | Innovation Agency VINNOVA and the Celtic-Next projects CRITISEC and | |||
CYPRESS; and by the H2020 project SIFIS-Home (Grant agreement | CYPRESS; and by the H2020 project SIFIS-Home (Grant agreement | |||
952652). | 952652). | |||
Authors' Addresses | Authors' Addresses | |||
Marco Tiloca | Marco Tiloca | |||
RISE AB | RISE AB | |||
Isafjordsgatan 22 | Isafjordsgatan 22 | |||
SE-16440 Kista | SE-SE-164 40 Kista | |||
Sweden | Sweden | |||
Email: marco.tiloca@ri.se | Email: marco.tiloca@ri.se | |||
Francesca Palombini | Francesca Palombini | |||
Ericsson AB | Ericsson AB | |||
Torshamnsgatan 23 | Torshamnsgatan 23 | |||
SE-16440 Kista | SE-16440 Kista | |||
Sweden | Sweden | |||
Email: francesca.palombini@ericsson.com | Email: francesca.palombini@ericsson.com | |||
End of changes. 241 change blocks. | ||||
469 lines changed or deleted | 457 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |