draft-ietf-ace-oscore-profile-12.txt | draft-ietf-ace-oscore-profile-13.txt | |||
---|---|---|---|---|
ACE Working Group F. Palombini | ACE Working Group F. Palombini | |||
Internet-Draft Ericsson AB | Internet-Draft Ericsson AB | |||
Intended status: Standards Track L. Seitz | Intended status: Standards Track L. Seitz | |||
Expires: March 25, 2021 Combitech | Expires: April 30, 2021 Combitech | |||
G. Selander | G. Selander | |||
Ericsson AB | Ericsson AB | |||
M. Gunnarsson | M. Gunnarsson | |||
RISE | RISE | |||
September 21, 2020 | October 27, 2020 | |||
OSCORE Profile of the Authentication and Authorization for Constrained | OSCORE Profile of the Authentication and Authorization for Constrained | |||
Environments Framework | Environments Framework | |||
draft-ietf-ace-oscore-profile-12 | draft-ietf-ace-oscore-profile-13 | |||
Abstract | Abstract | |||
This memo specifies a profile for the Authentication and | This memo specifies a profile for the Authentication and | |||
Authorization for Constrained Environments (ACE) framework. It | Authorization for Constrained Environments (ACE) framework. It | |||
utilizes Object Security for Constrained RESTful Environments | utilizes Object Security for Constrained RESTful Environments | |||
(OSCORE) to provide communication security and proof-of-possession | (OSCORE) to provide communication security and proof-of-possession | |||
for a key owned by the client and bound to an OAuth 2.0 access token. | for a key owned by the client and bound to an OAuth 2.0 access token. | |||
Status of This Memo | Status of This Memo | |||
skipping to change at page 1, line 40 ¶ | skipping to change at page 1, line 40 ¶ | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on March 25, 2021. | This Internet-Draft will expire on April 30, 2021. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 | 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2. Protocol Overview . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Protocol Overview . . . . . . . . . . . . . . . . . . . . . . 4 | |||
3. Client-AS Communication . . . . . . . . . . . . . . . . . . . 6 | 3. Client-AS Communication . . . . . . . . . . . . . . . . . . . 6 | |||
3.1. C-to-AS: POST to token endpoint . . . . . . . . . . . . . 6 | 3.1. C-to-AS: POST to token endpoint . . . . . . . . . . . . . 6 | |||
3.2. AS-to-C: Access Token . . . . . . . . . . . . . . . . . . 8 | 3.2. AS-to-C: Access Token . . . . . . . . . . . . . . . . . . 8 | |||
3.2.1. The OSCORE_Input_Material . . . . . . . . . . . . . . 13 | 3.2.1. The OSCORE_Input_Material . . . . . . . . . . . . . . 12 | |||
4. Client-RS Communication . . . . . . . . . . . . . . . . . . . 16 | 4. Client-RS Communication . . . . . . . . . . . . . . . . . . . 15 | |||
4.1. C-to-RS: POST to authz-info endpoint . . . . . . . . . . 17 | 4.1. C-to-RS: POST to authz-info endpoint . . . . . . . . . . 16 | |||
4.1.1. The Nonce 1 Parameter . . . . . . . . . . . . . . . . 18 | 4.1.1. The Nonce 1 Parameter . . . . . . . . . . . . . . . . 17 | |||
4.2. RS-to-C: 2.01 (Created) . . . . . . . . . . . . . . . . . 18 | 4.1.2. The ace_client_recipientid Parameter . . . . . . . . 17 | |||
4.2.1. The Nonce 2 Parameter . . . . . . . . . . . . . . . . 20 | 4.2. RS-to-C: 2.01 (Created) . . . . . . . . . . . . . . . . . 17 | |||
4.3. OSCORE Setup . . . . . . . . . . . . . . . . . . . . . . 20 | 4.2.1. The Nonce 2 Parameter . . . . . . . . . . . . . . . . 19 | |||
4.2.2. The ace_server_recipientid Parameter . . . . . . . . 19 | ||||
4.3. OSCORE Setup . . . . . . . . . . . . . . . . . . . . . . 19 | ||||
4.4. Access rights verification . . . . . . . . . . . . . . . 22 | 4.4. Access rights verification . . . . . . . . . . . . . . . 22 | |||
5. Secure Communication with AS . . . . . . . . . . . . . . . . 22 | 5. Secure Communication with AS . . . . . . . . . . . . . . . . 22 | |||
6. Discarding the Security Context . . . . . . . . . . . . . . . 23 | 6. Discarding the Security Context . . . . . . . . . . . . . . . 22 | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 24 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 23 | |||
8. Privacy Considerations . . . . . . . . . . . . . . . . . . . 25 | 8. Privacy Considerations . . . . . . . . . . . . . . . . . . . 25 | |||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 26 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 25 | |||
9.1. ACE Profile Registry . . . . . . . . . . . . . . . . . . 26 | 9.1. ACE Profile Registry . . . . . . . . . . . . . . . . . . 25 | |||
9.2. OAuth Parameters Registry . . . . . . . . . . . . . . . . 26 | 9.2. OAuth Parameters Registry . . . . . . . . . . . . . . . . 26 | |||
9.3. OAuth Parameters CBOR Mappings Registry . . . . . . . . . 26 | 9.3. OAuth Parameters CBOR Mappings Registry . . . . . . . . . 26 | |||
9.4. OSCORE Security Context Parameters Registry . . . . . . . 27 | 9.4. OSCORE Security Context Parameters Registry . . . . . . . 27 | |||
9.5. CWT Confirmation Methods Registry . . . . . . . . . . . . 28 | 9.5. CWT Confirmation Methods Registry . . . . . . . . . . . . 28 | |||
9.6. JWT Confirmation Methods Registry . . . . . . . . . . . . 28 | 9.6. JWT Confirmation Methods Registry . . . . . . . . . . . . 28 | |||
9.7. Expert Review Instructions . . . . . . . . . . . . . . . 28 | 9.7. Expert Review Instructions . . . . . . . . . . . . . . . 28 | |||
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
10.1. Normative References . . . . . . . . . . . . . . . . . . 29 | 10.1. Normative References . . . . . . . . . . . . . . . . . . 29 | |||
10.2. Informative References . . . . . . . . . . . . . . . . . 30 | 10.2. Informative References . . . . . . . . . . . . . . . . . 30 | |||
Appendix A. Profile Requirements . . . . . . . . . . . . . . . . 31 | Appendix A. Profile Requirements . . . . . . . . . . . . . . . . 31 | |||
skipping to change at page 4, line 29 ¶ | skipping to change at page 4, line 35 ¶ | |||
This profile requires a client to retrieve an access token from the | This profile requires a client to retrieve an access token from the | |||
AS for the resource it wants to access on an RS, by sending an access | AS for the resource it wants to access on an RS, by sending an access | |||
token request to the token endpoint, as specified in section 5.6 of | token request to the token endpoint, as specified in section 5.6 of | |||
[I-D.ietf-ace-oauth-authz]. The access token request and response | [I-D.ietf-ace-oauth-authz]. The access token request and response | |||
MUST be confidentiality-protected and ensure authenticity. This | MUST be confidentiality-protected and ensure authenticity. This | |||
profile RECOMMENDS the use of OSCORE between client and AS, but other | profile RECOMMENDS the use of OSCORE between client and AS, but other | |||
protocols (such as TLS or DTLS) can be used as well. | protocols (such as TLS or DTLS) can be used as well. | |||
Once the client has retrieved the access token, it generates a nonce | Once the client has retrieved the access token, it generates a nonce | |||
N1 and posts both the token and N1 to the RS using the authz-info | N1. The client also generates its OSCORE Recipient ID (see | |||
endpoint and mechanisms specified in section 5.8 of | Section 3.1 of [RFC8613]), ID1, for use with the keying material | |||
[I-D.ietf-ace-oauth-authz] and Content-Format = application/ace+cbor. | associated to the RS. The client posts the token, N1 and its | |||
When using this profile, the communication with the authz-info | Recipient ID to the RS using the authz-info endpoint and mechanisms | |||
endpoint is not protected, except for update of access rights. | specified in section 5.8 of [I-D.ietf-ace-oauth-authz] and Content- | |||
Format = application/ace+cbor. When using this profile, the | ||||
communication with the authz-info endpoint is not protected, except | ||||
for update of access rights. | ||||
If the access token is valid, the RS replies to this request with a | If the access token is valid, the RS replies to this request with a | |||
2.01 (Created) response with Content-Format = application/ace+cbor, | 2.01 (Created) response with Content-Format = application/ace+cbor, | |||
which contains a nonce N2 in a CBOR map. Moreover, the server | which contains a nonce N2 and its newly generated OSCORE Recipient | |||
concatenates the input salt received in the token, N1, and N2 to | ID, ID2, for use with the keying material associated to the client. | |||
obtain the Master Salt of the OSCORE Security Context (see section 3 | Moreover, the server concatenates the input salt received in the | |||
of [RFC8613]). The RS then derives the complete Security Context | token, N1, and N2 to obtain the Master Salt of the OSCORE Security | |||
associated with the received token from it plus the parameters | Context (see section 3 of [RFC8613]). The RS then derives the | |||
received in the access token from the AS, following section 3.2 of | complete Security Context associated with the received token from the | |||
[RFC8613]. | Master Salt, the OSCORE Recipient ID generated by the client (set as | |||
its OSCORE Sender ID), its own OSCORE Recipient ID, plus the | ||||
parameters received in the access token from the AS, following | ||||
section 3.2 of [RFC8613]. | ||||
After receiving the nonce N2, the client concatenates the input salt | In a similar way, after receiving the nonce N2, the client | |||
(received from the AS), N1 and N2 to obtain the Master Salt of the | concatenates the input salt, N1 and N2 to obtain the Master Salt of | |||
OSCORE Security Context (see section 3 of [RFC8613]). The client | the OSCORE Security Context. The client then derives the complete | |||
then derives the complete Security Context from the nonces plus the | Security Context from the Master Salt, the OSCORE Recipient ID | |||
parameters received from the AS. | generated by the RS (set as its OSCORE Sender ID), its own OSCORE | |||
Recipient ID, plus the parameters received from the AS. | ||||
Finally, the client sends a request protected with OSCORE to the RS. | Finally, the client sends a request protected with OSCORE to the RS. | |||
If the request verifies, the server stores the complete Security | If the request verifies, the server stores the complete Security | |||
Context state that is ready for use in protecting messages, and uses | Context state that is ready for use in protecting messages, and uses | |||
it in the response, and in further communications with the client, | it in the response, and in further communications with the client, | |||
until token expiration. This Security Context is discarded when a | until token expiration. This Security Context is discarded when a | |||
token (whether the same or different) is used to successfully derive | token (whether the same or different) is used to successfully derive | |||
a new Security Context for that client. | a new Security Context for that client. | |||
The use of random nonces during the exchange prevents the reuse of an | The use of random nonces during the exchange prevents the reuse of an | |||
skipping to change at page 5, line 30 ¶ | skipping to change at page 5, line 43 ¶ | |||
[RFC8613]). Therefore, the main requirement for the nonces is that | [RFC8613]). Therefore, the main requirement for the nonces is that | |||
they have a good amount of randomness. If random nonces were not | they have a good amount of randomness. If random nonces were not | |||
used, a node re-using a non-expired old token would be susceptible to | used, a node re-using a non-expired old token would be susceptible to | |||
on-path attackers provoking the creation of OSCORE messages using old | on-path attackers provoking the creation of OSCORE messages using old | |||
AEAD keys and nonces. | AEAD keys and nonces. | |||
After the whole message exchange has taken place, the client can | After the whole message exchange has taken place, the client can | |||
contact the AS to request an update of its access rights, sending a | contact the AS to request an update of its access rights, sending a | |||
similar request to the token endpoint that also includes an | similar request to the token endpoint that also includes an | |||
identifier so that the AS can find the correct OSCORE security | identifier so that the AS can find the correct OSCORE security | |||
material it has previously shared with the Client. This specific | material it has previously shared with the client. This specific | |||
identifier, which [I-D.ietf-ace-oauth-authz] encodes as a bstr, is | identifier, encoded as a byte string, is assigned by the AS to be | |||
formatted to include two OSCORE identifiers, namely ID context and | unique in the sets of its OSCORE Security Contexts, and is not used | |||
client ID, that are necessary to determine the correct OSCORE Input | as input material to derive the full OSCORE Security Context. | |||
material. | ||||
An overview of the profile flow for the OSCORE profile is given in | An overview of the profile flow for the OSCORE profile is given in | |||
Figure 1. The names of messages coincide with those of | Figure 1. The names of messages coincide with those of | |||
[I-D.ietf-ace-oauth-authz] when applicable. | [I-D.ietf-ace-oauth-authz] when applicable. | |||
C RS AS | C RS AS | |||
| | | | | | | | |||
| ----- POST /token ----------------------------> | | | ----- POST /token ----------------------------> | | |||
| | | | | | | | |||
| <---------------------------- Access Token ----- | | | <---------------------------- Access Token ----- | | |||
| + Access Information | | | + Access Information | | |||
| ---- POST /authz-info ---> | | | | ---- POST /authz-info ---> | | | |||
| (access_token, N1) | | | | (access_token, N1, ID1) | | | |||
| | | | | | | | |||
| <--- 2.01 Created (N2) --- | | | | <- 2.01 Created (N2, ID2)- | | | |||
| | | | | | | | |||
/Sec Context /Sec Context | | /Sec Context /Sec Context | | |||
derivation/ derivation/ | | derivation/ derivation/ | | |||
| | | | | | | | |||
| ---- OSCORE Request -----> | | | | ---- OSCORE Request -----> | | | |||
| | | | | | | | |||
| /proof-of-possession | | | /proof-of-possession | | |||
| Sec Context storage/ | | | Sec Context storage/ | | |||
| | | | | | | | |||
| <--- OSCORE Response ----- | | | | <--- OSCORE Response ----- | | | |||
skipping to change at page 7, line 28 ¶ | skipping to change at page 7, line 28 ¶ | |||
{ | { | |||
"req_aud" : "tempSensor4711", | "req_aud" : "tempSensor4711", | |||
"scope" : "read" | "scope" : "read" | |||
} | } | |||
Figure 2: Example C-to-AS POST /token request for an access token | Figure 2: Example C-to-AS POST /token request for an access token | |||
bound to a symmetric key. | bound to a symmetric key. | |||
If the client wants to update its access rights without changing an | If the client wants to update its access rights without changing an | |||
existing OSCORE Security Context, it MUST include in its POST request | existing OSCORE Security Context, it MUST include in its POST request | |||
to the token endpoint a req_cnf object. The req_cnf MUST include a | to the token endpoint a req_cnf object. kid field carrying a CBOR | |||
kid field carrying a bstr-wrapped CBOR array object containing the | byte string containing the OSCORE_Input_Material Identifier (assigned | |||
client's identifier (assigned as discussed in Section 3.2) and the | as discussed in Section 3.2). This identifier, together with other | |||
context identifier (if assigned as discussed in Section 3.2). The | information such as audience (see Section 5.6.1 of | |||
CBOR array is defined in Figure 3, and follows the notation of | [I-D.ietf-ace-oauth-authz]), can be used by the AS to determine the | |||
[RFC8610]. These identifiers, together with other information such | shared secret bound to the proof-of-possession token and therefore | |||
as audience (see Section 5.6.1 of [I-D.ietf-ace-oauth-authz]), can be | MUST identify a symmetric key that was previously generated by the AS | |||
used by the AS to determine the shared secret bound to the proof-of- | as a shared secret for the communication between the client and the | |||
possession token and therefore MUST identify a symmetric key that was | RS. The AS MUST verify that the received value identifies a proof- | |||
previously generated by the AS as a shared secret for the | of-possession key that has previously been issued to the requesting | |||
communication between the client and the RS. The AS MUST verify that | client. If that is not the case, the Client-to-AS request MUST be | |||
the received value identifies a proof-of-possession key that has | declined with the error code 'invalid_request' as defined in | |||
previously been issued to the requesting client. If that is not the | Section 5.6.3 of [I-D.ietf-ace-oauth-authz]. | |||
case, the Client-to-AS request MUST be declined with the error code | ||||
'invalid_request' as defined in Section 5.6.3 of | ||||
[I-D.ietf-ace-oauth-authz]. | ||||
kid_arr = [ | ||||
clientId, | ||||
?ContextId | ||||
] | ||||
kid = bstr .cbor kid_arr | ||||
Figure 3: CDDL Notation of kid for Update of Access Rights | ||||
An example of such a request, with payload in CBOR diagnostic | An example of such a request, with payload in CBOR diagnostic | |||
notation without the tag and value abbreviations is reported in | notation without the tag and value abbreviations is reported in | |||
Figure 4 | Figure 3 | |||
Header: POST (Code=0.02) | Header: POST (Code=0.02) | |||
Uri-Host: "as.example.com" | Uri-Host: "as.example.com" | |||
Uri-Path: "token" | Uri-Path: "token" | |||
Content-Format: "application/ace+cbor" | Content-Format: "application/ace+cbor" | |||
Payload: | Payload: | |||
{ | { | |||
"req_aud" : "tempSensor4711", | "req_aud" : "tempSensor4711", | |||
"scope" : "write", | "scope" : "write", | |||
"req_cnf" : { | "req_cnf" : { | |||
"kid" : << ["myclient","contextid1"] >> | "kid" : h'01' | |||
} | } | |||
Figure 4: Example C-to-AS POST /token request for updating rights to | Figure 3: Example C-to-AS POST /token request for updating rights to | |||
an access token bound to a symmetric key. | an access token bound to a symmetric key. | |||
3.2. AS-to-C: Access Token | 3.2. AS-to-C: Access Token | |||
After verifying the POST request to the token endpoint and that the | After verifying the POST request to the token endpoint and that the | |||
client is authorized to obtain an access token corresponding to its | client is authorized to obtain an access token corresponding to its | |||
access token request, the AS responds as defined in section 5.6.2 of | access token request, the AS responds as defined in section 5.6.2 of | |||
[I-D.ietf-ace-oauth-authz]. If the client request was invalid, or | [I-D.ietf-ace-oauth-authz]. If the client request was invalid, or | |||
not authorized, the AS returns an error response as described in | not authorized, the AS returns an error response as described in | |||
section 5.6.3 of [I-D.ietf-ace-oauth-authz]. | section 5.6.3 of [I-D.ietf-ace-oauth-authz]. | |||
skipping to change at page 9, line 9 ¶ | skipping to change at page 8, line 41 ¶ | |||
client MUST use OSCORE towards all resource servers for which this | client MUST use OSCORE towards all resource servers for which this | |||
access token is valid, and follow Section 4.3 to derive the security | access token is valid, and follow Section 4.3 to derive the security | |||
context to run OSCORE. Usually it is assumed that constrained | context to run OSCORE. Usually it is assumed that constrained | |||
devices will be pre-configured with the necessary profile, so that | devices will be pre-configured with the necessary profile, so that | |||
this kind of profile negotiation can be omitted. | this kind of profile negotiation can be omitted. | |||
Moreover, the AS MUST send the following data: | Moreover, the AS MUST send the following data: | |||
o a master secret | o a master secret | |||
o a server identifier | o an identifier of the OSCORE Input Material | |||
o a client identifier | ||||
Additionally, the AS MAY send the following data, in the same | Additionally, the AS MAY send the following data, in the same | |||
response. | response. | |||
o a context identifier | o a context identifier | |||
o an AEAD algorithm | o an AEAD algorithm | |||
o an HMAC-based key derivation function (HKDF) algorithm | o an HMAC-based key derivation function (HKDF) algorithm | |||
o a salt | o a salt | |||
o the OSCORE version number | o the OSCORE version number | |||
This data is transported in the the OSCORE_Input_Material. The | This data is transported in the the OSCORE_Input_Material. The | |||
OSCORE_Input_Material is a CBOR map object, defined in Section 3.2.1. | OSCORE_Input_Material is a CBOR map object, defined in Section 3.2.1. | |||
This object is transported in the 'cnf' parameter of the access token | This object is transported in the 'cnf' parameter of the access token | |||
response as defined in Section 3.2 of [I-D.ietf-ace-oauth-params], as | response as defined in Section 3.2 of [I-D.ietf-ace-oauth-params], as | |||
the value of a field named 'osc', registered in Section 9.5 and | the value of a field named 'osc', registered in Section 9.5 and | |||
Section 9.6. | Section 9.6. | |||
skipping to change at page 9, line 33 ¶ | skipping to change at page 9, line 15 ¶ | |||
o the OSCORE version number | o the OSCORE version number | |||
This data is transported in the the OSCORE_Input_Material. The | This data is transported in the the OSCORE_Input_Material. The | |||
OSCORE_Input_Material is a CBOR map object, defined in Section 3.2.1. | OSCORE_Input_Material is a CBOR map object, defined in Section 3.2.1. | |||
This object is transported in the 'cnf' parameter of the access token | This object is transported in the 'cnf' parameter of the access token | |||
response as defined in Section 3.2 of [I-D.ietf-ace-oauth-params], as | response as defined in Section 3.2 of [I-D.ietf-ace-oauth-params], as | |||
the value of a field named 'osc', registered in Section 9.5 and | the value of a field named 'osc', registered in Section 9.5 and | |||
Section 9.6. | Section 9.6. | |||
The AS MUST assign an identifier to the RS (server identifier), and | The AS MAY assign an identifier to the context (context identifier). | |||
to the client (client identifier), and MAY assign an identifier to | This identifier is used as ID Context in the OSCORE context as | |||
the context (context identifier). These identifiers are then used as | described in section 3.1 of [RFC8613]. If assigned, this parameters | |||
Sender ID, Recipient ID and ID Context in the OSCORE context as | MUST be communicated as the 'contextId' field in the | |||
described in section 3.1 of [RFC8613]: specifically, the server | OSCORE_Input_Material. The applications needs to consider that this | |||
identifier is used as Sender ID of the node acting as RS in this | identifier is sent in the clear and may reveal information about the | |||
profile, and the client identifier is used as Sender ID of the node | endpoints, as mentioned in section 12.8 of [RFC8613]. | |||
acting as ACE client. These parameters are sent as clientId, | ||||
serverId and (when assigned) contextId in the OSCORE_Input_Material. | ||||
ClientId and serverId MUST be included in the OSCORE_Input_Material, | ||||
contextId MUST be included when assigned. The applications need to | ||||
consider that these identifiers are sent in the clear and may reveal | ||||
information about the endpoints, as mentioned in section 12.8 of | ||||
[RFC8613]. The pair (client identifier, context identifier) MUST be | ||||
unique in the set of all clients for a single RS. | ||||
The master secret MUST be communicated as the 'ms' field in the 'osc' | The master secret and the identifier of the OSCORE_Input_Material | |||
field in the 'cnf' parameter of the access token response. If | MUST be communicated as the 'ms' and 'id' field in the 'osc' field in | |||
included, the AEAD algorithm is sent in the 'alg' parameter in the | the 'cnf' parameter of the access token response. If included, the | |||
AEAD algorithm is sent in the 'alg' parameter in the | ||||
OSCORE_Input_Material; the HKDF algorithm in the 'hkdf' parameter of | OSCORE_Input_Material; the HKDF algorithm in the 'hkdf' parameter of | |||
the OSCORE_Input_Material; a salt in the 'salt' parameter of the | the OSCORE_Input_Material; a salt in the 'salt' parameter of the | |||
OSCORE_Input_Material; and the OSCORE version in the 'version' | OSCORE_Input_Material; and the OSCORE version in the 'version' | |||
parameter of the OSCORE_Input_Material. | parameter of the OSCORE_Input_Material. | |||
The same parameters MUST be included in the claims associated with | The same parameters MUST be included in the claims associated with | |||
the access token. This profile RECOMMENDS the use of CBOR web token | the access token. This profile RECOMMENDS the use of CBOR web token | |||
(CWT) as specified in [RFC8392]. If the token is a CWT, the same | (CWT) as specified in [RFC8392]. If the token is a CWT, the same | |||
OSCORE_Input_Material structure defined above MUST be placed in the | OSCORE_Input_Material structure defined above MUST be placed in the | |||
'osc' field of the 'cnf' claim of this token. | 'osc' field of the 'cnf' claim of this token. | |||
We assume in this document that an RS is associated to one single AS, | ||||
which makes it possible for the AS to enforce uniqueness of | ||||
identifiers for each client sending requests to an RS. If this is | ||||
not the case, collisions of identifiers may occur at the RS, in which | ||||
case the RS needs to have a mechanism in place to disambiguate | ||||
identifiers or mitigate the effect of the collisions. | ||||
Moreover, implementers of this specification need to be aware that if | ||||
other authentication mechanisms are used to set up OSCORE between the | ||||
same client and RS, that do not rely on AS assigning identifiers, | ||||
collisions may happen and need to be mitigated. A mitigation example | ||||
would be to use distinct namespaces of identifiers for different | ||||
authentication mechanisms. | ||||
The AS MUST send different OSCORE_Input_Material (and therefore | The AS MUST send different OSCORE_Input_Material (and therefore | |||
different access tokens) to different authorized clients, in order | different access tokens) to different authorized clients, in order | |||
for the RS to differentiate between clients. | for the RS to differentiate between clients. | |||
Note that in Section 4.3 C sets the Sender ID of its Security Context | Figure 4 shows an example of an AS response, with payload in CBOR | |||
to the clientId value received and the Recipient ID to the serverId | ||||
value, and RS does the opposite. | ||||
Figure 5 shows an example of an AS response, with payload in CBOR | ||||
diagnostic notation without the tag and value abbreviations. The | diagnostic notation without the tag and value abbreviations. The | |||
access token has been truncated for readability. | access token has been truncated for readability. | |||
Header: Created (Code=2.01) | Header: Created (Code=2.01) | |||
Content-Type: "application/ace+cbor" | Content-Type: "application/ace+cbor" | |||
Payload: | Payload: | |||
{ | { | |||
"access_token" : h'8343a1010aa2044c53 ... | "access_token" : h'8343a1010aa2044c53 ... | |||
(remainder of access token (CWT) omitted for brevity)', | (remainder of access token (CWT) omitted for brevity)', | |||
"profile" : "coap_oscore", | "profile" : "coap_oscore", | |||
"expires_in" : "3600", | "expires_in" : "3600", | |||
"cnf" : { | "cnf" : { | |||
"osc" : { | "osc" : { | |||
"alg" : "AES-CCM-16-64-128", | "id" : h'01', | |||
"clientId" : h'00', | ||||
"serverId" : h'01', | ||||
"ms" : h'f9af838368e353e78888e1426bd94e6f' | "ms" : h'f9af838368e353e78888e1426bd94e6f' | |||
} | } | |||
} | } | |||
} | } | |||
Figure 5: Example AS-to-C Access Token response with OSCORE profile. | Figure 4: Example AS-to-C Access Token response with OSCORE profile. | |||
Figure 6 shows an example CWT Claims Set, including the relevant | Figure 5 shows an example CWT Claims Set, including the relevant | |||
OSCORE parameters in the 'cnf' claim, in CBOR diagnostic notation | OSCORE parameters in the 'cnf' claim, in CBOR diagnostic notation | |||
without tag and value abbreviations. | without tag and value abbreviations. | |||
{ | { | |||
"aud" : "tempSensorInLivingRoom", | "aud" : "tempSensorInLivingRoom", | |||
"iat" : "1360189224", | "iat" : "1360189224", | |||
"exp" : "1360289224", | "exp" : "1360289224", | |||
"scope" : "temperature_g firmware_p", | "scope" : "temperature_g firmware_p", | |||
"cnf" : { | "cnf" : { | |||
"osc" : { | "osc" : { | |||
"alg" : "AES-CCM-16-64-128", | "ms" : h'f9af838368e353e78888e1426bd94e6f', | |||
"clientId" : h'00', | "id" : h'01' | |||
"serverId" : h'01', | ||||
"ms" : h'f9af838368e353e78888e1426bd94e6f' | ||||
} | } | |||
} | } | |||
} | ||||
Figure 6: Example CWT Claims Set with OSCORE parameters. | Figure 5: Example CWT Claims Set with OSCORE parameters. | |||
The same CWT Claims Set as in Figure 6, using the value abbreviations | The same CWT Claims Set as in Figure 5, using the value abbreviations | |||
defined in [I-D.ietf-ace-oauth-authz] and [RFC8747] and encoded in | defined in [I-D.ietf-ace-oauth-authz] and [RFC8747] and encoded in | |||
CBOR is shown in Figure 7. The bytes in hexadecimal are reported in | CBOR is shown in Figure 6. The bytes in hexadecimal are reported in | |||
the first column, while their corresponding CBOR meaning is reported | the first column, while their corresponding CBOR meaning is reported | |||
after the '#' sign on the second column, for easiness of readability. | after the '#' sign on the second column, for easiness of readability. | |||
NOTE TO THE RFC EDITOR: before publishing, it should be checked (and | NOTE TO THE RFC EDITOR: before publishing, it should be checked (and | |||
in case fixed) that the values used below (which are not yet | in case fixed) that the values used below (which are not yet | |||
registered) are the final values registered in IANA. | registered) are the final values registered in IANA. | |||
A5 # map(5) | A5 # map(5) | |||
03 # unsigned(3) | 63 # text(3) | |||
617564 # "aud" | ||||
76 # text(22) | 76 # text(22) | |||
74656D7053656E736F72496E4C6976696E67526F6F6D | 74656D7053656E736F72496E4C6976696E67526F6F6D | |||
# "tempSensorInLivingRoom" | # "tempSensorInLivingRoom" | |||
06 # unsigned(6) | 63 # text(3) | |||
1A 5112D728 # unsigned(1360189224) | 696174 # "iat" | |||
04 # unsigned(4) | 6A # text(10) | |||
1A 51145DC8 # unsigned(1360289224) | 31333630313839323234 # "1360189224" | |||
09 # unsigned(9) | 63 # text(3) | |||
657870 # "exp" | ||||
6A # text(10) | ||||
31333630323839323234 # "1360289224" | ||||
65 # text(5) | ||||
73636F7065 # "scope" | ||||
78 18 # text(24) | 78 18 # text(24) | |||
74656D70657261747572655F67206669726D776172655F70 | 74656D70657261747572655F67206669726D776172655F70 | |||
# "temperature_g firmware_p" | # "temperature_g firmware_p" | |||
08 # unsigned(8) | 63 # text(3) | |||
636E66 # "cnf" | ||||
A1 # map(1) | A1 # map(1) | |||
04 # unsigned(4) | 63 # text(3) | |||
A4 # map(4) | 6F7363 # "osc" | |||
05 # unsigned(5) | A2 # map(2) | |||
0A # unsigned(10) | 62 # text(2) | |||
02 # unsigned(2) | 6D73 # "ms" | |||
46 # bytes(6) | ||||
636C69656E74 # "client" | ||||
03 # unsigned(3) | ||||
46 # bytes(6) | ||||
736572766572 # "server" | ||||
01 # unsigned(1) | ||||
50 # bytes(16) | 50 # bytes(16) | |||
F9AF838368E353E78888E1426BD94E6F | F9AF838368E353E78888E1426BD94E6F | |||
# "\xF9\xAF\x83\x83h\xE3S\xE7 | # "\xF9\xAF\x83\x83h\xE3S\xE7 | |||
\x88\x88\xE1Bk\xD9No" | \x88\x88\xE1Bk\xD9No" | |||
62 # text(2) | ||||
6964 # "id" | ||||
41 # bytes(1) | ||||
01 # "\x01" | ||||
Figure 7: Example CWT Claims Set with OSCORE parameters, CBOR | Figure 6: Example CWT Claims Set with OSCORE parameters, CBOR | |||
encoded. | encoded. | |||
If the client has requested an update to its access rights using the | If the client has requested an update to its access rights using the | |||
same OSCORE Security Context, which is valid and authorized, the AS | same OSCORE Security Context, which is valid and authorized, the AS | |||
MUST omit the 'cnf' parameter in the response, and MUST carry the | MUST omit the 'cnf' parameter in the response, and MUST carry the | |||
client identifier and the context identifier (if it was set and | OSCORE Input Material identifier in the 'kid' field in the 'cnf' | |||
included in the initial access token response by the AS) in the 'kid' | parameter of the token. This identifier needs to be included in the | |||
field in the 'cnf' parameter of the token, with the same structure | token in order for the RS to identify the correct OSCORE Input | |||
defined in Figure 3. These identifiers need to be included in the | Material. | |||
token in order for the RS to identify the previously generated | ||||
Security Context. | ||||
Figure 8 shows an example of such an AS response, with payload in | Figure 7 shows an example of such an AS response, with payload in | |||
CBOR diagnostic notation without the tag and value abbreviations. | CBOR diagnostic notation without the tag and value abbreviations. | |||
The access token has been truncated for readability. | The access token has been truncated for readability. | |||
Header: Created (Code=2.01) | Header: Created (Code=2.01) | |||
Content-Type: "application/ace+cbor" | Content-Type: "application/ace+cbor" | |||
Payload: | Payload: | |||
{ | { | |||
"access_token" : h'8343a1010aa2044c53 ... | "access_token" : h'8343a1010aa2044c53 ... | |||
(remainder of access token (CWT) omitted for brevity)', | (remainder of access token (CWT) omitted for brevity)', | |||
"profile" : "coap_oscore", | "profile" : "coap_oscore", | |||
"expires_in" : "3600" | "expires_in" : "3600" | |||
} | } | |||
Figure 8: Example AS-to-C Access Token response with OSCORE profile, | Figure 7: Example AS-to-C Access Token response with OSCORE profile, | |||
for update of access rights. | for update of access rights. | |||
Figure 9 shows an example CWT Claims Set, containing the necessary | Figure 8 shows an example CWT Claims Set, containing the necessary | |||
OSCORE parameters in the 'cnf' claim for update of access rights, in | OSCORE parameters in the 'cnf' claim for update of access rights, in | |||
CBOR diagnostic notation without tag and value abbreviations. | CBOR diagnostic notation without tag and value abbreviations. | |||
{ | { | |||
"aud" : "tempSensorInLivingRoom", | "aud" : "tempSensorInLivingRoom", | |||
"iat" : "1360189224", | "iat" : "1360189224", | |||
"exp" : "1360289224", | "exp" : "1360289224", | |||
"scope" : "temperature_h", | "scope" : "temperature_h", | |||
"cnf" : { | "cnf" : { | |||
"kid" : h'43814100' | "kid" : h'01' | |||
} | } | |||
} | } | |||
Figure 9: Example CWT Claims Set with OSCORE parameters for update of | Figure 8: Example CWT Claims Set with OSCORE parameters for update of | |||
access rights. | access rights. | |||
3.2.1. The OSCORE_Input_Material | 3.2.1. The OSCORE_Input_Material | |||
An OSCORE_Input_Material is an object that represents the input | An OSCORE_Input_Material is an object that represents the input | |||
material to derive an OSCORE Security Context, i.e., the local set of | material to derive an OSCORE Security Context, i.e., the local set of | |||
information elements necessary to carry out the cryptographic | information elements necessary to carry out the cryptographic | |||
operations in OSCORE (Section 3.1 of [RFC8613]). In particular, the | operations in OSCORE (Section 3.1 of [RFC8613]). In particular, the | |||
OSCORE_Input_Material is defined to be serialized and transported | OSCORE_Input_Material is defined to be serialized and transported | |||
between nodes, as specified by this document, but can also be used by | between nodes, as specified by this document, but can also be used by | |||
skipping to change at page 14, line 23 ¶ | skipping to change at page 13, line 20 ¶ | |||
| | label | | | | | | | label | | | | | |||
+-----------+-------+-------------+-------------------+-------------+ | +-----------+-------+-------------+-------------------+-------------+ | |||
| version | 0 | unsigned | | OSCORE | | | version | 0 | unsigned | | OSCORE | | |||
| | | integer | | Version | | | | | integer | | Version | | |||
| | | | | | | | | | | | | | |||
| ms | 1 | byte string | | OSCORE | | | ms | 1 | byte string | | OSCORE | | |||
| | | | | Master | | | | | | | Master | | |||
| | | | | Secret | | | | | | | Secret | | |||
| | | | | value | | | | | | | value | | |||
| | | | | | | | | | | | | | |||
| clientId | 2 | byte string | | OSCORE | | | id | 2 | byte string | | OSCORE | | |||
| | | | | Sender ID | | | | | | | Input | | |||
| | | | | value of | | | | | | | Material | | |||
| | | | | the client, | | | | | | | Identifier | | |||
| | | | | OSCORE | | ||||
| | | | | Recipient | | ||||
| | | | | ID value of | | ||||
| | | | | the server | | ||||
| | | | | | | ||||
| serverId | 3 | byte string | | OSCORE | | ||||
| | | | | Sender ID | | ||||
| | | | | value of | | ||||
| | | | | the server, | | ||||
| | | | | OSCORE | | ||||
| | | | | Recipient | | ||||
| | | | | ID value of | | ||||
| | | | | the client | | ||||
| | | | | | | | | | | | | | |||
| hkdf | 4 | text string | [COSE.Algorithms] | OSCORE HKDF | | | hkdf | 3 | text string | [COSE.Algorithms] | OSCORE HKDF | | |||
| | | / integer | Values (HMAC- | value | | | | | / integer | Values (HMAC- | value | | |||
| | | | based) | | | | | | | based) | | | |||
| | | | | | | | | | | | | | |||
| alg | 5 | text string | [COSE.Algorithms] | OSCORE AEAD | | | alg | 4 | text string | [COSE.Algorithms] | OSCORE AEAD | | |||
| | | / integer | Values (AEAD) | Algorithm | | | | | / integer | Values (AEAD) | Algorithm | | |||
| | | | | value | | | | | | | value | | |||
| | | | | | | | | | | | | | |||
| salt | 6 | byte string | | an input to | | | salt | 5 | byte string | | an input to | | |||
| | | | | OSCORE | | | | | | | OSCORE | | |||
| | | | | Master Salt | | | | | | | Master Salt | | |||
| | | | | value | | | | | | | value | | |||
| | | | | | | | | | | | | | |||
| contextId | 7 | byte string | | OSCORE ID | | | contextId | 6 | byte string | | OSCORE ID | | |||
| | | | | Context | | | | | | | Context | | |||
| | | | | value | | | | | | | value | | |||
+-----------+-------+-------------+-------------------+-------------+ | +-----------+-------+-------------+-------------------+-------------+ | |||
Table 1: OSCORE_Input_Material Parameters | Table 1: OSCORE_Input_Material Parameters | |||
version: This parameter identifies the OSCORE Version number, which | version: This parameter identifies the OSCORE Version number, which | |||
is an unsigned integer. For more information about this field, | is an unsigned integer. For more information about this field, | |||
see section 5.4 of [RFC8613]. In JSON, the "version" value is an | see section 5.4 of [RFC8613]. In JSON, the "version" value is an | |||
integer. In CBOR, the "version" type is int, and has label 0. | integer. In CBOR, the "version" type is int, and has label 0. | |||
ms: This parameter identifies the OSCORE Master Secret value, which | ms: This parameter identifies the OSCORE Master Secret value, which | |||
is a byte string. For more information about this field, see | is a byte string. For more information about this field, see | |||
section 3.1 of [RFC8613]. In JSON, the "ms" value is a Base64 | section 3.1 of [RFC8613]. In JSON, the "ms" value is a Base64 | |||
encoded byte string. In CBOR, the "ms" type is bstr, and has | encoded byte string. In CBOR, the "ms" type is bstr, and has | |||
label 1. | label 1. | |||
clientId: This parameter identifies a client identifier as a byte | id: This parameter identifies the OSCORE_Input_Material and is | |||
string. This identifier is used as OSCORE Sender ID in the client | encoded as a byte string. In JSON, the "id" value is a Base64 | |||
and OSCORE Recipient ID in the server. For more information about | encoded byte string. In CBOR, the "id" type is byte string, and | |||
this field, see section 3.1 of [RFC8613]. In JSON, the "clientId" | has label 8. | |||
value is a Base64 encoded byte string. In CBOR, the "clientId" | ||||
type is bstr, and has label 2. | ||||
serverId: This parameter identifies a server identifier as a byte | ||||
string. This identifier is used as OSCORE Sender ID in the server | ||||
and OSCORE Recipient ID in the client. For more information about | ||||
this field, see section 3.1 of [RFC8613]. In JSON, the "serverId" | ||||
value is a Base64 encoded byte string. In CBOR, the "serverId" | ||||
type is bstr, and has label 3. | ||||
hkdf: This parameter identifies the OSCORE HKDF Algorithm. For more | hkdf: This parameter identifies the OSCORE HKDF Algorithm. For more | |||
information about this field, see section 3.1 of [RFC8613]. The | information about this field, see section 3.1 of [RFC8613]. The | |||
values used MUST be registered in the IANA "COSE Algorithms" | values used MUST be registered in the IANA "COSE Algorithms" | |||
registry (see [COSE.Algorithms]) and MUST be HMAC-based HKDF | registry (see [COSE.Algorithms]) and MUST be HMAC-based HKDF | |||
algorithms. The value can either be the integer or the text | algorithms. The value can either be the integer or the text | |||
string value of the HMAC-based HKDF algorithm in the "COSE | string value of the HMAC-based HKDF algorithm in the "COSE | |||
Algorithms" registry. In JSON, the "hkdf" value is a case- | Algorithms" registry. In JSON, the "hkdf" value is a case- | |||
sensitive ASCII string or an integer. In CBOR, the "hkdf" type is | sensitive ASCII string or an integer. In CBOR, the "hkdf" type is | |||
tstr or int, and has label 4. | tstr or int, and has label 4. | |||
skipping to change at page 16, line 21 ¶ | skipping to change at page 14, line 44 ¶ | |||
field, see section 3.1 of [RFC8613]. In JSON, the "salt" value is | field, see section 3.1 of [RFC8613]. In JSON, the "salt" value is | |||
a Base64 encoded byte string. In CBOR, the "salt" type is bstr, | a Base64 encoded byte string. In CBOR, the "salt" type is bstr, | |||
and has label 6. | and has label 6. | |||
contextId: This parameter identifies the security context as a byte | contextId: This parameter identifies the security context as a byte | |||
string. This identifier is used as OSCORE ID Context. For more | string. This identifier is used as OSCORE ID Context. For more | |||
information about this field, see section 3.1 of [RFC8613]. In | information about this field, see section 3.1 of [RFC8613]. In | |||
JSON, the "contextID" value is a Base64 encoded byte string. In | JSON, the "contextID" value is a Base64 encoded byte string. In | |||
CBOR, the "contextID" type is bstr, and has label 7. | CBOR, the "contextID" type is bstr, and has label 7. | |||
An example of JSON OSCORE_Input_Material is given in Figure 10. | An example of JSON OSCORE_Input_Material is given in Figure 9. | |||
"osc" : { | "osc" : { | |||
"alg" : "AES-CCM-16-64-128", | "alg" : "AES-CCM-16-64-128", | |||
"clientId" : b64'AA', | "id" : b64'AQ==' | |||
"serverId" : b64'AQ', | ||||
"ms" : b64'+a+Dg2jjU+eIiOFCa9lObw' | "ms" : b64'+a+Dg2jjU+eIiOFCa9lObw' | |||
} | } | |||
Figure 10: Example JSON OSCORE_Input_Material | Figure 9: Example JSON OSCORE_Input_Material | |||
The CDDL grammar describing the CBOR OSCORE_Input_Material is: | The CDDL grammar describing the CBOR OSCORE_Input_Material is: | |||
OSCORE_Input_Material = { | OSCORE_Input_Material = { | |||
? 0 => int, ; version | ? 0 => int, ; version | |||
? 1 => bstr, ; ms | ? 1 => bstr, ; ms | |||
? 2 => bstr, ; clientId | ? 2 => bstr, ; id | |||
? 3 => bstr, ; serverId | ? 3 => tstr / int, ; hkdf | |||
? 4 => tstr / int, ; hkdf | ? 4 => tstr / int, ; alg | |||
? 5 => tstr / int, ; alg | ? 5 => bstr, ; salt | |||
? 6 => bstr, ; salt | ? 6 => bstr, ; contextId | |||
? 7 => bstr, ; contextId | ||||
* int / tstr => any | * int / tstr => any | |||
} | } | |||
4. Client-RS Communication | 4. Client-RS Communication | |||
The following subsections describe the details of the POST request | The following subsections describe the details of the POST request | |||
and response to the authz-info endpoint between client and RS. The | and response to the authz-info endpoint between client and RS. The | |||
client generates a nonce N1, and posts it together with the token | client generates a nonce N1 and an identifier ID1 unique in the sets | |||
that includes the materials (e.g., OSCORE parameters) received from | of its own Recipient IDs, and posts them together with the token that | |||
the AS to the RS. The RS then generates a nonce N2, and uses | includes the materials (e.g., OSCORE parameters) received from the AS | |||
Section 3.2 of [RFC8613] to derive a security context based on a | to the RS. The RS then generates a nonce N2 and an identifier ID2 | |||
shared master secret and the two nonces, established between client | unique in the sets of its own Recipient IDs, and uses Section 3.2 of | |||
and server. The nonces are encoded as bstr if CBOR is used, and as | [RFC8613] to derive a security context based on a shared master | |||
Base64 string if JSON is used. This security context is used to | secret, the two nonces and the two identifiers, established between | |||
protect all future communication between client and RS using OSCORE, | client and server. The nonces and identifiers are encoded as CBOR | |||
as long as the access token is valid. | byte string if CBOR is used, and as Base64 string if JSON is used. | |||
This security context is used to protect all future communication | ||||
between client and RS using OSCORE, as long as the access token is | ||||
valid. | ||||
Note that the RS and client authenticates themselves by generating | Note that the RS and client authenticates themselves by generating | |||
the shared OSCORE Security Context using the pop-key as master | the shared OSCORE Security Context using the pop-key as master | |||
secret. An attacker posting a valid token to the RS will not be able | secret. An attacker posting a valid token to the RS will not be able | |||
to generate a valid OSCORE context and thus not be able to prove | to generate a valid OSCORE context and thus not be able to prove | |||
possession of the pop-key. Additionally, the mutual authentication | possession of the pop-key. Additionally, the mutual authentication | |||
is only achieved after the client has successfully verified the | is only achieved after the client has successfully verified the | |||
response from the RS. | response from the RS. | |||
4.1. C-to-RS: POST to authz-info endpoint | 4.1. C-to-RS: POST to authz-info endpoint | |||
The client MUST generate a nonce value very unlikely to have been | The client MUST generate a nonce value very unlikely to have been | |||
previously used with the same input keying material. This profile | previously used with the same input keying material. This profile | |||
RECOMMENDS to use a 64-bit long random number as nonce's value. The | RECOMMENDS to use a 64-bit long random number as nonce's value. The | |||
client MUST store the nonce N1 as long as the response from the RS is | client MUST store the nonce N1 as long as the response from the RS is | |||
not received and the access token related to it is still valid. The | not received and the access token related to it is still valid. | |||
client MUST use CoAP and the Authorization Information resource as | ||||
described in section 5.8.1 of [I-D.ietf-ace-oauth-authz] to transport | The client generates its own Recipient ID, ID1, for the OSCORE | |||
the token and N1 to the RS. | Security Context that it is establishing with the RS. By generating | |||
its own Recipient ID, the client makes sure that it does not collide | ||||
with any of its Recipient IDs. | ||||
The client MUST use CoAP and the Authorization Information resource | ||||
as described in section 5.8.1 of [I-D.ietf-ace-oauth-authz] to | ||||
transport the token, N1 and ID1 to the RS. | ||||
Note that the use of the payload and the Content-Format is different | Note that the use of the payload and the Content-Format is different | |||
from what is described in section 5.8.1 of | from what is described in section 5.8.1 of | |||
[I-D.ietf-ace-oauth-authz], which only transports the token without | [I-D.ietf-ace-oauth-authz], which only transports the token without | |||
any CBOR wrapping. In this profile, the client MUST wrap the token | any CBOR wrapping. In this profile, the client MUST wrap the token | |||
and N1 in a CBOR map. The client MUST use the Content-Format | and N1 in a CBOR map. The client MUST use the Content-Format | |||
"application/ace+cbor" defined in section 8.14 of | "application/ace+cbor" defined in section 8.14 of | |||
[I-D.ietf-ace-oauth-authz]. The client MUST include the access token | [I-D.ietf-ace-oauth-authz]. The client MUST include the access token | |||
using the "access_token" parameter and N1 using the 'nonce1' | using the "access_token" parameter, N1 using the 'nonce1' parameter | |||
parameter defined in Section 4.1.1. | defined in Section 4.1.1, and ID1 using the 'ace_client_recipientid' | |||
parameter defined in Section 4.1.2. | ||||
The communication with the authz-info endpoint does not have to be | The communication with the authz-info endpoint does not have to be | |||
protected, except for the update of access rights case described | protected, except for the update of access rights case described | |||
below. | below. | |||
Note that a client may be required to re-POST the access token in | Note that a client may be required to re-POST the access token in | |||
order to complete a request, since an RS may delete a stored access | order to complete a request, since an RS may delete a stored access | |||
token (and associated Security Context) at any time, for example due | token (and associated Security Context) at any time, for example due | |||
to all storage space being consumed. This situation is detected by | to all storage space being consumed. This situation is detected by | |||
the client when it receives an AS Request Creation Hints response. | the client when it receives an AS Request Creation Hints response. | |||
Reposting the same access token will result in deriving a new OSCORE | Reposting the same access token will result in deriving a new OSCORE | |||
Security Context to be used with the RS, as different nonces will be | Security Context to be used with the RS, as different nonces will be | |||
used. | used. | |||
Figure 11 shows an example of the request sent from the client to the | Figure 10 shows an example of the request sent from the client to the | |||
RS, with payload in CBOR diagnostic notation without the tag and | RS, with payload in CBOR diagnostic notation without the tag and | |||
value abbreviations. The access token has been truncated for | value abbreviations. The access token has been truncated for | |||
readability. | readability. | |||
Header: POST (Code=0.02) | Header: POST (Code=0.02) | |||
Uri-Host: "rs.example.com" | Uri-Host: "rs.example.com" | |||
Uri-Path: "authz-info" | Uri-Path: "authz-info" | |||
Content-Format: "application/ace+cbor" | Content-Format: "application/ace+cbor" | |||
Payload: | Payload: | |||
{ | { | |||
"access_token": h'8343a1010aa2044c53 ... | "access_token": h'8343a1010aa2044c53 ... | |||
(remainder of access token (CWT) omitted for brevity)', | (remainder of access token (CWT) omitted for brevity)', | |||
"nonce1": h'018a278f7faab55a' | "nonce1": h'018a278f7faab55a', | |||
"ace_client_recipientid" : h'1645' | ||||
} | } | |||
Figure 11: Example C-to-RS POST /authz-info request using CWT | Figure 10: Example C-to-RS POST /authz-info request using CWT | |||
If the client has already posted a valid token, has already | If the client has already posted a valid token, has already | |||
established a security association with the RS, and wants to update | established a security association with the RS, and wants to update | |||
its access rights, the client can do so by posting the new token | its access rights, the client can do so by posting the new token | |||
(retrieved from the AS and containing the update of access rights) to | (retrieved from the AS and containing the update of access rights) to | |||
the /authz-info endpoint. The client MUST protect the request using | the /authz-info endpoint. The client MUST protect the request using | |||
the OSCORE Security Context established during the first token | the OSCORE Security Context established during the first token | |||
exchange. The client MUST only send the access token in the payload, | exchange. The client MUST only send the access token in the payload, | |||
no nonce is sent. After proper verification (see Section 4.2), the | no nonce or identifier are sent. After proper verification (see | |||
RS will replace the old token with the new one, maintaining the same | Section 4.2), the RS will replace the old token with the new one, | |||
Security Context. | maintaining the same Security Context. | |||
4.1.1. The Nonce 1 Parameter | 4.1.1. The Nonce 1 Parameter | |||
This parameter MUST be sent from the client to the RS, together with | This parameter MUST be sent from the client to the RS, together with | |||
the access token, if the ace profile used is coap_oscore. The | the access token, if the ace profile used is coap_oscore. The | |||
parameter is encoded as a byte string for CBOR-based interactions, | parameter is encoded as a byte string for CBOR-based interactions, | |||
and as a string (Base64 encoded binary) for JSON-based interactions. | and as a string (Base64 encoded binary) for JSON-based interactions. | |||
This parameter is registered in Section 9.2. | This parameter is registered in Section 9.2. | |||
4.1.2. The ace_client_recipientid Parameter | ||||
This parameter MUST be sent from the client to the RS, together with | ||||
the access token, if the ace profile used is coap_oscore. The | ||||
parameter is encoded as a byte string for CBOR-based interactions, | ||||
and as a string (Base64 encoded binary) for JSON-based interactions. | ||||
This parameter is registered in Section 9.2. | ||||
4.2. RS-to-C: 2.01 (Created) | 4.2. RS-to-C: 2.01 (Created) | |||
The RS MUST follow the procedures defined in section 5.8.1 of | The RS MUST follow the procedures defined in section 5.8.1 of | |||
[I-D.ietf-ace-oauth-authz]: the RS must verify the validity of the | [I-D.ietf-ace-oauth-authz]: the RS must verify the validity of the | |||
token. If the token is valid, the RS must respond to the POST | token. If the token is valid, the RS must respond to the POST | |||
request with 2.01 (Created). If the token is valid but is associated | request with 2.01 (Created). If the token is valid but is associated | |||
to claims that the RS cannot process (e.g., an unknown scope), or if | to claims that the RS cannot process (e.g., an unknown scope), or if | |||
any of the expected parameters in the 'osc' is missing (e.g., any of | any of the expected parameters is missing (e.g., any of the mandatory | |||
the mandatory parameters from the AS), or if any parameters received | parameters from the AS or the identifier), or if any parameters | |||
in the 'osc' is unrecognized, the RS must respond with an error | received in the 'osc' is unrecognized, the RS must respond with an | |||
response code equivalent to the CoAP code 4.00 (Bad Request). In the | error response code equivalent to the CoAP code 4.00 (Bad Request). | |||
latter two cases, the RS may provide additional information in the | In the latter two cases, the RS may provide additional information in | |||
error response, in order to clarify what went wrong. The RS may make | the error response, in order to clarify what went wrong. The RS may | |||
an introspection request (see Section 5.7.1 of | make an introspection request (see Section 5.7.1 of | |||
[I-D.ietf-ace-oauth-authz]) to validate the token before responding | [I-D.ietf-ace-oauth-authz]) to validate the token before responding | |||
to the POST request to the authz-info endpoint. | to the POST request to the authz-info endpoint. | |||
Additionally, the RS MUST generate a nonce N2 very unlikely to have | Additionally, the RS MUST generate a nonce N2 very unlikely to have | |||
been previously used with the same input keying material, and send it | been previously used with the same input keying material, and its own | |||
within the 2.01 (Created) response. The payload of the 2.01 | Recipient ID, ID2. The RS makes sure that ID2 does not collide with | |||
(Created) response MUST be a CBOR map containing the 'nonce2' | any of its Recipient IDs. The RS MUST ensure that ID2 is different | |||
parameter defined in Section 4.2.1, set to N2. This profile | from the ace_client_recipientid. The RS sends N2 and ID2 within the | |||
RECOMMENDS to use a 64-bit long random number as nonce's value. The | 2.01 (Created) response. The payload of the 2.01 (Created) response | |||
RS MUST use the Content-Format "application/ace+cbor" defined in | MUST be a CBOR map containing the 'nonce2' parameter defined in | |||
section 8.14 of [I-D.ietf-ace-oauth-authz]. | Section 4.2.1, set to N2, and the 'ace_server_recipientid' parameter | |||
defined in Section 4.2.2, set to ID2. This profile RECOMMENDS to use | ||||
a 64-bit long random number as nonce's value. The RS MUST use the | ||||
Content-Format "application/ace+cbor" defined in section 8.14 of | ||||
[I-D.ietf-ace-oauth-authz]. | ||||
Figure 12 shows an example of the response sent from the RS to the | Figure 11 shows an example of the response sent from the RS to the | |||
client, with payload in CBOR diagnostic notation without the tag and | client, with payload in CBOR diagnostic notation without the tag and | |||
value abbreviations. | value abbreviations. | |||
Header: Created (Code=2.01) | Header: Created (Code=2.01) | |||
Content-Format: "application/ace+cbor" | Content-Format: "application/ace+cbor" | |||
Payload: | Payload: | |||
{ | { | |||
"nonce2": h'25a8991cd700ac01' | "nonce2": h'25a8991cd700ac01', | |||
"ace_server_recipientid" : h'0000' | ||||
} | } | |||
Figure 12: Example RS-to-C 2.01 (Created) response | Figure 11: Example RS-to-C 2.01 (Created) response | |||
As specified in section 5.8.3 of [I-D.ietf-ace-oauth-authz], the RS | As specified in section 5.8.3 of [I-D.ietf-ace-oauth-authz], the RS | |||
must notify the client with an error response with code 4.01 | must notify the client with an error response with code 4.01 | |||
(Unauthorized) for any long running request before terminating the | (Unauthorized) for any long running request before terminating the | |||
session, when the access token expires. | session, when the access token expires. | |||
If the RS receives the token in a OSCORE protected message, it means | If the RS receives the token in a OSCORE protected message, it means | |||
that the client is requesting an update of access rights. The RS | that the client is requesting an update of access rights. The RS | |||
MUST discard any nonce in the request, if any was sent. The RS MUST | MUST discard any nonce and identifiers in the request, if any was | |||
check that the "kid" of the "cnf" parameter of the new access token | sent. The RS MUST check that the "kid" of the "cnf" parameter of the | |||
matches the OSCORE Security Context used to protect the message. If | new access token matches the OSCORE Input Material of the context | |||
that is the case, the RS MUST discard the old token and associate the | used to protect the message. If that is the case, the RS MUST | |||
new token to the Security Context identified by the "kid" value in | discard the old token and associate the new token to the Security | |||
the "cnf" parameter. The RS MUST respond with a 2.01 (Created) | Context identified by the "kid" value in the "cnf" parameter. The RS | |||
response protected with the same Security Context, with no payload. | MUST respond with a 2.01 (Created) response protected with the same | |||
Security Context, with no payload. If any verification fails, the RS | ||||
If any verification fails, the RS MUST respond with a 4.01 | MUST respond with a 4.01 (Unauthorized) error response. | |||
(Unauthorized) error response. | ||||
As specified in section 5.8.1 of [I-D.ietf-ace-oauth-authz], when | As specified in section 5.8.1 of [I-D.ietf-ace-oauth-authz], when | |||
receiving an updated access token with updated authorization | receiving an updated access token with updated authorization | |||
information from the client (see Section 3.1), it is recommended that | information from the client (see Section 3.1), it is recommended that | |||
the RS overwrites the previous token, that is only the latest | the RS overwrites the previous token, that is only the latest | |||
authorization information in the token received by the RS is valid. | authorization information in the token received by the RS is valid. | |||
This simplifies the process needed by the RS to keep track of | This simplifies the process needed by the RS to keep track of | |||
authorization information for a given client. | authorization information for a given client. | |||
4.2.1. The Nonce 2 Parameter | 4.2.1. The Nonce 2 Parameter | |||
This parameter MUST be sent from the RS to the Client if the ace | This parameter MUST be sent from the RS to the client if the ace | |||
profile used is coap_oscore. The parameter is encoded as a byte | profile used is coap_oscore. The parameter is encoded as a byte | |||
string for CBOR-based interactions, and as a string (Base64 encoded | string for CBOR-based interactions, and as a string (Base64 encoded | |||
binary) for JSON-based interactions. This parameter is registered in | binary) for JSON-based interactions. This parameter is registered in | |||
Section 9.2. | Section 9.2 | |||
4.2.2. The ace_server_recipientid Parameter | ||||
This parameter MUST be sent from the RS to the client if the ace | ||||
profile used is coap_oscore. The parameter is encoded as a byte | ||||
string for CBOR-based interactions, and as a string (Base64 encoded | ||||
binary) for JSON-based interactions. This parameter is registered in | ||||
Section 9.2 | ||||
4.3. OSCORE Setup | 4.3. OSCORE Setup | |||
Once receiving the 2.01 (Created) response from the RS, following the | Once receiving the 2.01 (Created) response from the RS, following the | |||
POST request to authz-info endpoint, the client MUST extract the bstr | POST request to authz-info endpoint, the client MUST extract the bstr | |||
nonce N2 from the 'nonce2' parameter in the CBOR map in the payload | nonce N2 from the 'nonce2' parameter in the CBOR map in the payload | |||
of the response. Then, the client MUST set the Master Salt of the | of the response. Then, the client MUST set the Master Salt of the | |||
Security Context created to communicate with the RS to the | Security Context created to communicate with the RS to the | |||
concatenation of salt, N1, and N2, in this order: Master Salt = | concatenation of salt, N1, and N2, in this order: Master Salt = | |||
salt | N1 | N2, where | denotes byte string concatenation, where salt | salt | N1 | N2, where | denotes byte string concatenation, where salt | |||
is the CBOR byte string received from the AS in Section 3.2, and | is the CBOR byte string received from the AS in Section 3.2, and | |||
where N1 and N2 are the two nonces encoded as CBOR byte strings. An | where N1 and N2 are the two nonces encoded as CBOR byte strings. An | |||
example of Master Salt construction using CBOR encoding is given in | example of Master Salt construction using CBOR encoding is given in | |||
Figure 13. | Figure 12. | |||
N1, N2 and input salt expressed in CBOR diagnostic notation: | N1, N2 and input salt expressed in CBOR diagnostic notation: | |||
nonce1 = h'018a278f7faab55a' | nonce1 = h'018a278f7faab55a' | |||
nonce2 = h'25a8991cd700ac01' | nonce2 = h'25a8991cd700ac01' | |||
input salt = h'f9af838368e353e78888e1426bd94e6f' | input salt = h'f9af838368e353e78888e1426bd94e6f' | |||
N1, N2 and input salt as CBOR encoded byte strings: | N1, N2 and input salt as CBOR encoded byte strings: | |||
nonce1 = 0x48018a278f7faab55a | nonce1 = 0x48018a278f7faab55a | |||
nonce2 = 0x4825a8991cd700ac01 | nonce2 = 0x4825a8991cd700ac01 | |||
input salt = 0x50f9af838368e353e78888e1426bd94e6f | input salt = 0x50f9af838368e353e78888e1426bd94e6f | |||
Master Salt = 0x50 f9af838368e353e78888e1426bd94e6f 48 018a278f7faab55a 48 25a8991cd700ac01 | Master Salt = 0x50 f9af838368e353e78888e1426bd94e6f 48 018a278f7faab55a 48 25a8991cd700ac01 | |||
Figure 13: Example of Master Salt construction using CBOR encoding | Figure 12: Example of Master Salt construction using CBOR encoding | |||
If JSON is used instead of CBOR, the Master Salt of the Security | If JSON is used instead of CBOR, the Master Salt of the Security | |||
Context is the Base64 encoding of the concatenation of the same | Context is the Base64 encoding of the concatenation of the same | |||
parameters, each of them prefixed by their size, encoded in 1 byte. | parameters, each of them prefixed by their size, encoded in 1 byte. | |||
When using JSON, the nonces and input salt have a maximum size of 255 | When using JSON, the nonces and input salt have a maximum size of 255 | |||
bytes. An example of Master Salt construction using Base64 encoding | bytes. An example of Master Salt construction using Base64 encoding | |||
is given in Figure 14. | is given in Figure 13. | |||
N1, N2 and input salt values: | N1, N2 and input salt values: | |||
nonce1 = 0x018a278f7faab55a (8 bytes) | nonce1 = 0x018a278f7faab55a (8 bytes) | |||
nonce2 = 0x25a8991cd700ac01 (8 bytes) | nonce2 = 0x25a8991cd700ac01 (8 bytes) | |||
input salt = 0xf9af838368e353e78888e1426bd94e6f (16 bytes) | input salt = 0xf9af838368e353e78888e1426bd94e6f (16 bytes) | |||
Input to Base64 encoding: 0x10 f9af838368e353e78888e1426bd94e6f 08 018a278f7faab55a 08 25a8991cd700ac01 | Input to Base64 encoding: 0x10 f9af838368e353e78888e1426bd94e6f 08 018a278f7faab55a 08 25a8991cd700ac01 | |||
Master Salt = b64'EPmvg4No41PniIjhQmvZTm8IAYonj3+qtVoIJaiZHNcArAE=' | Master Salt = b64'EPmvg4No41PniIjhQmvZTm8IAYonj3+qtVoIJaiZHNcArAE=' | |||
Figure 14: Example of Master Salt construction using Base64 encoding | Figure 13: Example of Master Salt construction using Base64 encoding | |||
The client MUST set the Master Secret, Sender ID and Recipient ID | The client MUST set the Sender ID to the ace_server_recipientid | |||
from the parameters received from the AS in Section 3.2. The client | received in Section 4.2, and the Recipient ID to the | |||
MUST set the AEAD Algorithm, ID Context, HKDF, and OSCORE Version | ace_client_recipientid sent in Section 4.1. The client MUST set the | |||
from the parameters received from the AS in Section 3.2, if present. | Master Secret from the parameter received from the AS in Section 3.2. | |||
In case an optional parameter is omitted, the default value SHALL be | The client MUST set the AEAD Algorithm, ID Context, HKDF, and OSCORE | |||
used as described in sections 3.2 and 5.4 of [RFC8613]. After that, | Version from the parameters received from the AS in Section 3.2, if | |||
the client MUST derive the complete Security Context following | present. In case an optional parameter is omitted, the default value | |||
section 3.2.1 of [RFC8613]. From this point on, the client MUST use | SHALL be used as described in sections 3.2 and 5.4 of [RFC8613]. | |||
this Security Context to communicate with the RS when accessing the | After that, the client MUST derive the complete Security Context | |||
resources as specified by the authorization information. | following section 3.2.1 of [RFC8613]. From this point on, the client | |||
MUST use this Security Context to communicate with the RS when | ||||
accessing the resources as specified by the authorization | ||||
information. | ||||
If any of the expected parameters is missing (e.g., any of the | If any of the expected parameters is missing (e.g., any of the | |||
mandatory parameters from the AS, the client MUST stop the exchange, | mandatory parameters from the AS or the RS), or if | |||
and MUST NOT derive the Security Context. The client MAY restart the | ace_client_recipientid equals ace_server_recipientid, then the client | |||
exchange, to get the correct security material. | MUST stop the exchange, and MUST NOT derive the Security Context. | |||
The client MAY restart the exchange, to get the correct security | ||||
material. | ||||
The client then uses this Security Context to send requests to RS | The client then uses this Security Context to send requests to RS | |||
using OSCORE. | using OSCORE. | |||
After sending the 2.01 (Created) response, the RS MUST set the Master | After sending the 2.01 (Created) response, the RS MUST set the Master | |||
Salt of the Security Context created to communicate with the client | Salt of the Security Context created to communicate with the client | |||
to the concatenation of salt, N1, and N2, in the same way described | to the concatenation of salt, N1, and N2, in the same way described | |||
above. An example of Master Salt construction using CBOR encoding is | above. An example of Master Salt construction using CBOR encoding is | |||
given in Figure 13 and using Base64 encoding is given in Figure 14. | given in Figure 12 and using Base64 encoding is given in Figure 13. | |||
The RS MUST set the Master Secret, Sender ID and Recipient ID from | The RS MUST set the Sender ID from the ace_client_recipientid | |||
the parameters, received from the AS and forwarded by the client in | received in Section 4.1, and the Recipient ID from the | |||
the access token in Section 4.1 after validation of the token as | ace_server_recipientid sent in Section 4.2. The RS MUST set the | |||
specified in Section 4.2. The RS MUST set the AEAD Algorithm, ID | Master Secret from the parameter, received from the AS and forwarded | |||
Context, HKDF, and OSCORE Version from the parameters received from | by the client in the access token in Section 4.1 after validation of | |||
the AS and forwarded by the client in the access token in Section 4.1 | the token as specified in Section 4.2. The RS MUST set the AEAD | |||
after validation of the token as specified in Section 4.2, if | Algorithm, ID Context, HKDF, and OSCORE Version from the parameters | |||
present. In case an optional parameter is omitted, the default value | received from the AS and forwarded by the client in the access token | |||
SHALL be used as described in sections 3.2 and 5.4 of [RFC8613]. | in Section 4.1 after validation of the token as specified in | |||
After that, the RS MUST derive the complete Security Context | Section 4.2, if present. In case an optional parameter is omitted, | |||
following section 3.2.1 of [RFC8613], and MUST associate this | the default value SHALL be used as described in sections 3.2 and 5.4 | |||
of [RFC8613]. After that, the RS MUST derive the complete Security | ||||
Context following section 3.2.1 of [RFC8613], and MUST associate this | ||||
Security Context with the authorization information from the access | Security Context with the authorization information from the access | |||
token. | token. | |||
The RS then uses this Security Context to verify requests and send | The RS then uses this Security Context to verify requests and send | |||
responses to C using OSCORE. If OSCORE verification fails, error | responses to C using OSCORE. If OSCORE verification fails, error | |||
responses are used, as specified in section 8 of [RFC8613]. | responses are used, as specified in section 8 of [RFC8613]. | |||
Additionally, if OSCORE verification succeeds, the verification of | Additionally, if OSCORE verification succeeds, the verification of | |||
access rights is performed as described in section Section 4.4. The | access rights is performed as described in section Section 4.4. The | |||
RS MUST NOT use the Security Context after the related token has | RS MUST NOT use the Security Context after the related token has | |||
expired, and MUST respond with a unprotected 4.01 (Unauthorized) | expired, and MUST respond with a unprotected 4.01 (Unauthorized) | |||
error message to requests received that correspond to a Security | error message to requests received that correspond to a Security | |||
Context with an expired token. | Context with an expired token. | |||
Note that the ID Context can be assigned by the AS, communicated and | Note that the ID Context can be assigned by the AS, communicated and | |||
set in both the RS and client after the exchange specified in this | set in both the RS and client after the exchange specified in this | |||
profile is executed. Subsequently, client and RS can update their ID | profile is executed. Subsequently, client and RS can update their ID | |||
Context by running a mechanism such as the one defined in | Context by running a mechanism such as the one defined in | |||
Appendix B.2 of [RFC8613] if they support it. In that case, the ID | Appendix B.2 of [RFC8613] if they both support it and are configured | |||
Context in the OSCORE Security Context will not match the "contextId" | to do so. In that case, the ID Context in the OSCORE Security | |||
parameter of the corresponding OSCORE_Input_Material. That is fine, | Context will not match the "contextId" parameter of the corresponding | |||
as long as the nodes store and use the "contextId" value to identify | OSCORE_Input_Material. Running Appendix B.2 results in the keying | |||
the correct OSCORE_Input_Material at the AS. | material in the Security Contexts of client and RS being updated; | |||
this same result can also be achieved by the client reposting the | ||||
access token as described in Section 4.1, but without updating the ID | ||||
Context. | ||||
4.4. Access rights verification | 4.4. Access rights verification | |||
The RS MUST follow the procedures defined in section 5.8.2 of | The RS MUST follow the procedures defined in section 5.8.2 of | |||
[I-D.ietf-ace-oauth-authz]: if an RS receives an OSCORE-protected | [I-D.ietf-ace-oauth-authz]: if an RS receives an OSCORE-protected | |||
request from a client, then the RS processes it according to | request from a client, then the RS processes it according to | |||
[RFC8613]. If OSCORE verification succeeds, and the target resource | [RFC8613]. If OSCORE verification succeeds, and the target resource | |||
requires authorization, the RS retrieves the authorization | requires authorization, the RS retrieves the authorization | |||
information using the access token associated to the Security | information using the access token associated to the Security | |||
Context. The RS then must verify that the authorization information | Context. The RS then must verify that the authorization information | |||
skipping to change at page 24, line 22 ¶ | skipping to change at page 23, line 51 ¶ | |||
Authorization for Constrained Environments (ACE) framework | Authorization for Constrained Environments (ACE) framework | |||
[I-D.ietf-ace-oauth-authz]. Thus the general security considerations | [I-D.ietf-ace-oauth-authz]. Thus the general security considerations | |||
from the framework also apply to this profile. | from the framework also apply to this profile. | |||
Furthermore the general security considerations of OSCORE [RFC8613] | Furthermore the general security considerations of OSCORE [RFC8613] | |||
also apply to this specific use of the OSCORE protocol. | also apply to this specific use of the OSCORE protocol. | |||
As previously stated, the proof-of-possession in this profile is | As previously stated, the proof-of-possession in this profile is | |||
performed by both parties verifying that they have established the | performed by both parties verifying that they have established the | |||
same Security Context, as specified in Section 4.3, which means that | same Security Context, as specified in Section 4.3, which means that | |||
both the OSCORE request and OSCORE pass verification. RS | both the OSCORE request and OSCORE response pass verification. RS | |||
authentication requires both that the client trusts the AS and that | authentication requires both that the client trusts the AS and that | |||
the OSCORE response from the RS pass verification. | the OSCORE response from the RS pass verification. | |||
OSCORE is designed to secure point-to-point communication, providing | OSCORE is designed to secure point-to-point communication, providing | |||
a secure binding between the request and the response(s). Thus the | a secure binding between the request and the response(s). Thus the | |||
basic OSCORE protocol is not intended for use in point-to-multipoint | basic OSCORE protocol is not intended for use in point-to-multipoint | |||
communication (e.g., multicast, publish-subscribe). Implementers of | communication (e.g., multicast, publish-subscribe). Implementers of | |||
this profile should make sure that their usecase corresponds to the | this profile should make sure that their usecase corresponds to the | |||
expected use of OSCORE, to prevent weakening the security assurances | expected use of OSCORE, to prevent weakening the security assurances | |||
provided by OSCORE. | provided by OSCORE. | |||
skipping to change at page 25, line 48 ¶ | skipping to change at page 25, line 32 ¶ | |||
The token is sent in the clear to the authz-info endpoint, so if a | The token is sent in the clear to the authz-info endpoint, so if a | |||
client uses the same single token from multiple locations with | client uses the same single token from multiple locations with | |||
multiple Resource Servers, it can risk being tracked by the token's | multiple Resource Servers, it can risk being tracked by the token's | |||
value even when the access token is encrypted. | value even when the access token is encrypted. | |||
The nonces exchanged in the request and response to the authz-info | The nonces exchanged in the request and response to the authz-info | |||
endpoint are also sent in the clear, so using random nonces is best | endpoint are also sent in the clear, so using random nonces is best | |||
for privacy (as opposed to, e.g., a counter, that might leak some | for privacy (as opposed to, e.g., a counter, that might leak some | |||
information about the client). | information about the client). | |||
The AS is the party tasked with assigning the identifiers used in | The identifiers used in OSCORE, negotiated between client and RS are | |||
OSCORE, which are privacy sensitive (see Section 12.8 of [RFC8613]), | privacy sensitive (see Section 12.8 of [RFC8613]), and could reveal | |||
and which could reveal information about the client, or may be used | information about the client, or may be used for correlating requests | |||
for correlating requests from one client. | from one client. | |||
Note that some information might still leak after OSCORE is | Note that some information might still leak after OSCORE is | |||
established, due to observable message sizes, the source, and the | established, due to observable message sizes, the source, and the | |||
destination addresses. | destination addresses. | |||
9. IANA Considerations | 9. IANA Considerations | |||
Note to RFC Editor: Please replace all occurrences of "[[this | Note to RFC Editor: Please replace all occurrences of "[[this | |||
specification]]" with the RFC number of this specification and delete | specification]]" with the RFC number of this specification and delete | |||
this paragraph. | this paragraph. | |||
skipping to change at page 26, line 44 ¶ | skipping to change at page 26, line 28 ¶ | |||
o Parameter name: nonce1 | o Parameter name: nonce1 | |||
o Parameter usage location: client-rs request | o Parameter usage location: client-rs request | |||
o Change Controller: IESG | o Change Controller: IESG | |||
o Specification Document(s): [[this specification]] | o Specification Document(s): [[this specification]] | |||
o Parameter name: nonce2 | o Parameter name: nonce2 | |||
o Parameter usage location: rs-client response | o Parameter usage location: rs-client response | |||
o Change Controller: IESG | o Change Controller: IESG | |||
o Specification Document(s): [[this specification]] | o Specification Document(s): [[this specification]] | |||
o Parameter name: ace_client_recipientid | ||||
o Parameter usage location: client-rs request | ||||
o Change Controller: IESG | ||||
o Specification Document(s): [[this specification]] | ||||
o Parameter name: ace_server_recipientid | ||||
o Parameter usage location: rs-client response | ||||
o Change Controller: IESG | ||||
o Specification Document(s): [[this specification]] | ||||
9.3. OAuth Parameters CBOR Mappings Registry | 9.3. OAuth Parameters CBOR Mappings Registry | |||
The following registrations are done for the OAuth Parameters CBOR | The following registrations are done for the OAuth Parameters CBOR | |||
Mappings Registry following the procedure specified in section 8.10 | Mappings Registry following the procedure specified in section 8.10 | |||
of [I-D.ietf-ace-oauth-authz]: | of [I-D.ietf-ace-oauth-authz]: | |||
o Name: nonce1 | o Name: nonce1 | |||
o CBOR Key: TBD1 | o CBOR Key: TBD1 | |||
o Value Type: bstr | o Value Type: bstr | |||
o Reference: [[this specification]] | o Reference: [[this specification]] | |||
o Name: nonce2 | o Name: nonce2 | |||
o CBOR Key: TBD2 | o CBOR Key: TBD2 | |||
o Value Type: bstr | o Value Type: bstr | |||
o Reference: [[this specification]] | o Reference: [[this specification]] | |||
o Name: ace_client_recipientid | ||||
o CBOR Key: TBD3 | ||||
o Value Type: bstr | ||||
o Reference: [[this specification]] | ||||
o Name: ace_server_recipientid | ||||
o CBOR Key: TBD4 | ||||
o Value Type: bstr | ||||
o Reference: [[this specification]] | ||||
9.4. OSCORE Security Context Parameters Registry | 9.4. OSCORE Security Context Parameters Registry | |||
It is requested that IANA create a new registry entitled "OSCORE | It is requested that IANA create a new registry entitled "OSCORE | |||
Security Context Parameters" registry. The registry is to be created | Security Context Parameters" registry. The registry is to be created | |||
as Expert Review Required. Guidelines for the experts is provided | as Expert Review Required. Guidelines for the experts is provided | |||
Section 9.7. It should be noted that in addition to the expert | Section 9.7. It should be noted that in addition to the expert | |||
review, some portions of the registry require a specification, | review, some portions of the registry require a specification, | |||
potentially on standards track, be supplied as well. | potentially on standards track, be supplied as well. | |||
skipping to change at page 29, line 42 ¶ | skipping to change at page 29, line 42 ¶ | |||
Framework (ACE-OAuth)", draft-ietf-ace-oauth-authz-35 | Framework (ACE-OAuth)", draft-ietf-ace-oauth-authz-35 | |||
(work in progress), June 2020. | (work in progress), June 2020. | |||
[I-D.ietf-ace-oauth-params] | [I-D.ietf-ace-oauth-params] | |||
Seitz, L., "Additional OAuth Parameters for Authorization | Seitz, L., "Additional OAuth Parameters for Authorization | |||
in Constrained Environments (ACE)", draft-ietf-ace-oauth- | in Constrained Environments (ACE)", draft-ietf-ace-oauth- | |||
params-13 (work in progress), April 2020. | params-13 (work in progress), April 2020. | |||
[I-D.ietf-cbor-7049bis] | [I-D.ietf-cbor-7049bis] | |||
Bormann, C. and P. Hoffman, "Concise Binary Object | Bormann, C. and P. Hoffman, "Concise Binary Object | |||
Representation (CBOR)", draft-ietf-cbor-7049bis-14 (work | Representation (CBOR)", draft-ietf-cbor-7049bis-16 (work | |||
in progress), June 2020. | in progress), September 2020. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | |||
Application Protocol (CoAP)", RFC 7252, | Application Protocol (CoAP)", RFC 7252, | |||
DOI 10.17487/RFC7252, June 2014, | DOI 10.17487/RFC7252, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7252>. | <https://www.rfc-editor.org/info/rfc7252>. | |||
End of changes. 83 change blocks. | ||||
295 lines changed or deleted | 298 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |