Internet-Draft | CoAP-EDHOC-OSCORE | July 2022 |
Selander, et al. | Expires 12 January 2023 | [Page] |
This document specifies a profile for the Authentication and Authorization for Constrained Environments (ACE) framework. It utilizes Ephemeral Diffie-Hellman Over COSE (EDHOC) for achieving mutual authentication between an OAuth 2.0 Client and Resource Server, and it binds an authentication credential of the Client to an OAuth 2.0 access token. EDHOC also establishes an Object Security for Constrained RESTful Environments (OSCORE) Security Context, which is used to secure communications when accessing protected resources according to the authorization information indicated in the access token. A resource-constrained server can use this profile to delegate management of authorization information to a trusted host with less severe limitations regarding processing power and memory.¶
This note is to be removed before publishing as an RFC.¶
Discussion of this document takes place on the Authentication and Authorization for Constrained Environments Working Group mailing list (ace@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/ace/.¶
Source for this draft and an issue tracker can be found at https://github.com/EricssonResearch/ace-edhoc-oscore-profile.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 12 January 2023.¶
Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
This document defines the "coap_edhoc_oscore" profile of the ACE framework [I-D.ietf-ace-oauth-authz]. This profile addresses a "zero-touch" constrained setting where trusted operations can be performed with low overhead without endpoint specific configurations.¶
Like in the "coap_oscore" profile [I-D.ietf-ace-oscore-profile], also in this profile a client (C) and a resource server (RS) use the Constrained Application Protocol (CoAP) [RFC7252] to communicate, and Object Security for Constrained RESTful Environments (OSCORE) [RFC8613] to protect their communications. Also, the processing of requests for specific protected resources is identical to what is defined in the "coap_oscore" profile.¶
When using this profile, C accesses protected resources hosted at RS with the use of an access token issued by a trusted authorization server (AS) and bound to an authentication credential of C. This differs from the "coap_oscore" profile, where the access token is bound to a symmetric key used to derive OSCORE keying material. As recommended in [I-D.ietf-ace-oauth-authz], this document recommends the use of CBOR Web Tokens (CWTs) [RFC8392] as access tokens.¶
The authentication and authorization processing requires C and RS to have access to each other's authentication credentials. C can obtain the authentication credential of RS from AS together with the access token. RS can obtain the authentication credential of C together with the associated access token in different ways. If RS successfully verifies the access token, then C and RS run the Ephemeral Diffie-Hellman Over COSE (EDHOC) protocol [I-D.ietf-lake-edhoc] using the authentication credentials.¶
Once the EDHOC execution is completed, C and RS are mutually authenticated and can derive an OSCORE Security Context to protect subsequent communications.¶
An authentication credential can be a raw public key, e.g., encoded as a CWT Claims Set (CCS, [RFC8392]); or a public key certificate, e.g., encoded as an X.509 certificate or as a CBOR encoded X.509 certificate (C509, [I-D.ietf-cose-cbor-encoded-cert]); or a different type of data structure containing the public key of the peer in question.¶
The ACE protocol establishes what those authentication credentials are, and may transport the actual authentication credentials by value or uniquely refer to them. If an authentication credential is pre-provisioned or can be obtained over less constrained links, then it suffices that ACE provides a unique reference such as a certificate hash (e.g., by using the COSE header parameter "x5t", see [I-D.ietf-cose-x509]). This is in the same spirit as EDHOC, where the authentication credentials may be transported or referenced in the ID_CRED_x message fields (see Section 3.5.3 of [I-D.ietf-lake-edhoc]).¶
In general, AS and RS are likely to have trusted access to each other's authentication credentials, since AS acts on behalf of RS as per the trust model of ACE. Also, AS needs to have some information about C, including the relevant authentication credential, in order to identify C when it requests an access token and to determine what access rights it can be granted. However, the authentication credential of C may potentially be conveyed (or uniquely referred to) within the request for access which C makes to AS.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
Certain security-related terms such as "authentication", "authorization", "confidentiality", "(data) integrity", "Message Authentication Code (MAC)", "Hash-based Message Authentication Code (HMAC)", and "verify" are taken from [RFC4949].¶
RESTful terminology follows HTTP [RFC9110].¶
Readers are expected to be familiar with the terms and concepts defined in CoAP [RFC7252], OSCORE [RFC8613] and EDHOC [I-D.ietf-lake-edhoc].¶
Readers are also expected to be familiar with the terms and concepts of the ACE framework described in [I-D.ietf-ace-oauth-authz] and in [I-D.ietf-ace-oauth-params].¶
Terminology for entities in the architecture is defined in OAuth 2.0 [RFC6749], such as the client (C), the resource server (RS), and the authorization server (AS). It is assumed in this document that a given resource on a specific RS is associated with a unique AS.¶
Note that the term "endpoint" is used here, as in [I-D.ietf-ace-oauth-authz], following its OAuth definition, which is to denote resources such as /token and /introspect at AS and /authz-info at RS. The CoAP [RFC7252] definition, which is "An entity participating in the CoAP protocol" is not used in this document.¶
The authorization information (authz-info) resource refers to the authorization information endpoint as specified in [I-D.ietf-ace-oauth-authz]. The term "claim" is used in this document with the same semantics as in [I-D.ietf-ace-oauth-authz], i.e., it denotes information carried in the access token or returned from introspection.¶
This document defines "token series" as a series of access tokens sorted in chronological order as they are released, characterized by the following properties:¶
When an access token becomes invalid (e.g., due to its expiration or revocation), the token series it belongs to ends.¶
Concise Binary Object Representation (CBOR) [RFC8949][RFC8742] and Concise Data Definition Language (CDDL) [RFC8610] are used in this document. CDDL predefined type names, especially bstr for CBOR byte strings and tstr for CBOR text strings, are used extensively in this document.¶
Examples throughout this document are expressed in CBOR diagnostic notation without the tag and value abbreviations.¶
This section gives an overview of how to use the ACE framework [I-D.ietf-ace-oauth-authz] together with the authenticated key establishment protocol EDHOC [I-D.ietf-lake-edhoc]. By doing so, a client (C) and a resource server (RS) generate an OSCORE Security Context [RFC8613] associated with authorization information, and use that Security Context to protect their communications. The parameters needed by C to negotiate the use of this profile with the authorization server (AS), as well as the OSCORE setup process, are described in detail in the following sections.¶
RS maintains a collection of authentication credentials. These are related to OSCORE Security Contexts associated with authorization information for all the clients that RS is communicating with. The authorization information is maintained as policy that is used as input to the processing of requests from those clients.¶
This profile specifies how C requests an access token from AS for the resources it wants to access on an RS, by sending an access token request to the /token endpoint, as specified in Section 5.8 of [I-D.ietf-ace-oauth-authz]. The access token request and response MUST be confidentiality protected and ensure authenticity. The use of EDHOC and OSCORE between C and AS is RECOMMENDED in this profile, in order to reduce the number of libraries that C has to support. However, other protocols fulfilling the security requirements defined in Section 5 of [I-D.ietf-ace-oauth-authz] MAY alternatively be used, such as TLS [RFC8446] or DTLS [RFC9147].¶
If C has retrieved an access token, there are two different options for C to upload it to RS, as further detailed in this document.¶
When running the EDHOC protocol, C uses the authentication credential of RS specified by AS together with the access token, while RS uses the authentication credential of C bound to and specified within the access token. If C and RS complete the EDHOC execution successfully, they are mutually authenticated and they derive an OSCORE Security Context as per Appendix A.1 of [I-D.ietf-lake-edhoc]. Also, RS associates the two used authentication credentials and the completed EDHOC execution with the derived Security Context. The latter is in turn associated with the access token and the access rights of C specified therein.¶
From then on, C effectively gains authorized and secure access to protected resources on RS, for as long as the access token is valid. Until then, C can communicate with RS by sending a request protected with the established OSCORE Security Context above. The Security Context is discarded when an access token (whether the same or a different one) is used to successfully derive a new Security Context for C, either by exchanging nonces and using the EDHOC-KeyUpdate function (see Section 5), or by re-running EDHOC. In particular, when supporting this profile, both C and RS MUST support the EDHOC-KeyUpdate function, and they MUST use it instead of re-running EDHOC if the outcome of their previously completed EDHOC execution is still valid.¶
After the whole procedure has completed and while the access token is valid, C can contact AS to request an update of its access rights, by sending a similar request to the /token endpoint. This request also includes an identifier, which allows AS to find the data it has previously shared with C. This specific identifier, encoded as a byte string, is assigned by AS to a "token series" (see Section 1.1). Upon a successful update of access rights, the new issued access token becomes the latest in its token series. When the latest access token of a token series becomes invalid (e.g., when it expires or gets revoked), that token series ends.¶
An overview of the profile flow for the "coap_edhoc_oscore" profile is given in Figure 1. The names of messages coincide with those of [I-D.ietf-ace-oauth-authz] when applicable.¶
The following subsections describe the details of the POST request and response to the /token endpoint between C and AS.¶
In this exchange, AS provides C with the access token, together with a set of parameters that enable C to run EDHOC with RS. In particular, these include information about the authorization credential of RS, AUTH_CRED_RS, transported by value or uniquely referred to.¶
The access token is securely associated with the authentication credential of C, AUTH_CRED_C, by including it or uniquely referring to it in the access token.¶
AUTH_CRED_C is specified in the "req_cnf" parameter defined in [I-D.ietf-ace-oauth-params] of the POST request to the /token endpoint from C to AS, either transported by value or uniquely referred to.¶
The request to the /token endpoint and the corresponding response can include EDHOC_Information, which is a CBOR map object defined in Section 3.3. This object is transported in the "edhoc_info" parameter registered in Section 10.2 and Section 10.3.¶
The client-to-AS request is specified in Section 5.8.1 of [I-D.ietf-ace-oauth-authz].¶
The client must send this POST request to the /token endpoint over a secure channel that guarantees authentication, message integrity and confidentiality (see Section 6).¶
Editor's note: This formulation overlaps with 3rd para in Section 2, which has normative language. Preferable to keep normative language here.¶
An example of such a request is shown in Figure 2. In this example, C specifies its own authentication credential by reference, as the hash of an X.509 certificate carried in the "x5t" field of the "req_cnf" parameter. In fact, it is expected that C can typically specify its own authentication credential by reference, since AS is expected to obtain the actual authentication credential during an early client registration process or during a previous secure association establishment with C.¶
If C wants to update its access rights without changing an existing OSCORE Security Context, it MUST include EDHOC_Information in its POST request to the /token endpoint. In turn, EDHOC_Information MUST include the "id" field, carrying a CBOR byte string containing the identifier of the token series to which the current, still valid access token shared with RS belongs to. This POST request MUST omit the "req_cnf" parameter.¶
This identifier is assigned by AS as discussed in Section 3.2, and, together with other information such as audience (see Section 5.8.1 of [I-D.ietf-ace-oauth-authz]), can be used by AS to determine the token series to which the new requested access token has to be added. Therefore, the identifier MUST identify the pair (AUTH_CRED_C, AUTH_CRED_RS) associated with a still valid access token previously issued for C and RS by AS.¶
AS MUST verify that the received value identifies a token series to which a still valid access token issued for C and RS belongs to. If that is not the case, the Client-to-AS request MUST be declined with the error code "invalid_request" as defined in Section 5.8.3 of [I-D.ietf-ace-oauth-authz].¶
An example of such a request is shown in Figure 3.¶
After verifying the POST request to the /token endpoint and that C is authorized to obtain an access token corresponding to its access token request, AS responds as defined in Section 5.8.2 of [I-D.ietf-ace-oauth-authz]. If the request from C was invalid, or not authorized, AS returns an error response as described in Section 5.8.3 of [I-D.ietf-ace-oauth-authz].¶
AS can signal that the use of EDHOC and OSCORE as per this profile is REQUIRED for a specific access token, by including the "ace_profile" parameter with the value "coap_edhoc_oscore" in the access token response. This means that C MUST use EDHOC with RS and derive an OSCORE Security Context, as specified in Section 4.3. After that, C MUST use the established OSCORE Security Context to protect communications with RS, when accessing protected resources at RS according to the authorization information indicated in the access token. Usually, it is assumed that constrained devices will be pre-configured with the necessary profile, so that this kind of profile signaling can be omitted.¶
When issuing any access token of a token series, AS MUST send the following data in the response to C.¶
The identifier of the token series to which the issued access token belongs to. This is specified in the "id" field of EDHOC_Information.¶
All the access tokens belonging to the same token series are associated with the same identifier, which does not change throughout the series lifetime. A token series ends when the latest issued access token in the series becomes invalid (e.g., when it expires or gets revoked).¶
AS assigns an identifier to a token series when issuing the first access token T of that series. When assigning the identifier, AS MUST ensure that this was never used in a previous series of access tokens such that: i) they were issued for the same RS for which the access token T is being issued; and ii) they were bound to the same authentication credential AUTH_CRED_C of the requesting client to which the access token T is being issued (irrespectively of the exact way AUTH_CRED_C is specified in such access tokens).¶
When issuing the first access token of a token series, AS MUST send the following data in the response to C.¶
The authentication credential of RS, namely AUTH_CRED_RS. This is specified in the "rs_cnf" parameter defined in [I-D.ietf-ace-oauth-params]. AUTH_CRED_RS can be transported by value or referred to by means of an appropriate identifier.¶
When issuing the first access token ever to a pair (C, RS) using a pair of corresponding authentication credentials (AUTH_CRED_C, AUTH_CRED_RS), it is typically expected that the response to C specifies AUTH_CRED_RS by value.¶
When later issuing further access tokens to the same pair (C, RS) using the same AUTH_CRED_RS, it is typically expected that the response to C specifies AUTH_CRED_RS by reference.¶
When issuing the first access token of a token series, AS MAY send the following data in the response to C. If present, this data MUST be included in the corresponding fields of EDHOC_Information. Some of this information takes advantage of the knowledge that AS may have about C and RS since a previous registration process, with particular reference to what they support as EDHOC peers.¶
When issuing any access token of a token series, AS MUST specify the following data in the claims associated with the access token.¶
The same authentication credential of C that C specified in its POST request to the /token endpoint (see Section 3.1), namely AUTH_CRED_C. If the access token is a CWT, this information MUST be specified in the "cnf" claim.¶
In the access token, AUTH_CRED_C can be transported by value or referred to by means of an appropriate identifier, regardless of how C specified it in the request to the /token endpoint. Thus, the specific field carried in the access token claim and specifying AUTH_CRED_C depends on the specific way used by AS.¶
When issuing the first access token ever to a pair (C, RS) using a pair of corresponding authentication credentials (AUTH_CRED_C, AUTH_CRED_RS), it is typically expected that AUTH_CRED_C is specified by value.¶
When later issuing further access tokens to the same pair (C, RS) using the same AUTH_CRED_C, it is typically expected that AUTH_CRED_C is specified by reference.¶
When issuing the first access token of a token series, AS MAY specify the following data in the claims associated with the access token. If these data are specified in the response to C from the /token endpoint, they MUST be included in the access token and specify the same values that they have in the response from the /token endpoint.¶
When issuing the first access token of a token series, AS can take either of the two possible options.¶
AS does not provide the access token to C. Rather, AS uploads the access token to the /authz-info endpoint at RS, exactly like C would do, and as defined in Section 4.1 and Section 4.2. Then, when replying to C with the access token response as defined above, the response MUST NOT include the parameter "access_token", and MUST include the parameter "token_uploaded" encoding the CBOR simple value "true" (0xf5). This is shown by the example in Appendix A.3.¶
Note that, in case C and RS have already completed an EDHOC execution leveraging a previous access token series, using this approach implies that C and RS have to re-run the EDHOC protocol. That is, they cannot more efficiently make use of the EDHOC-KeyUpdate function, as defined in Section 5, see Section 4.¶
Also note that this approach is not applicable when issuing access tokens following the first one in the same token series, i.e., when updating access rights.¶
When CWTs are used as access tokens, EDHOC_Information MUST be transported in the "edhoc_info" claim, defined in Section 10.5.¶
Since the access token does not contain secret information, only its integrity and source authentication are strictly necessary to ensure. Therefore, AS can protect the access token with either of the means discussed in Section 6.1 of [I-D.ietf-ace-oauth-authz]. Nevertheless, when using this profile, it is RECOMMENDED that the access token is a CBOR web token (CWT) protected with COSE_Encrypt/COSE_Encrypt0 as specified in [RFC8392].¶
Figure 4 shows an example of an AS response. The "rs_cnf" parameter specifies the authentication credential of RS, as an X.509 certificate transported by value in the "x5chain" field. The access token and the authentication credential of RS have been truncated for readability.¶
Figure 5 shows an example CWT Claims Set, including the relevant EDHOC parameters in the "edhoc_info" claim. The "cnf" claim specifies the authentication credential of C, as an X.509 certificate transported by value in the "x5chain" field. The authentication credential of C has been truncated for readability.¶
If C has requested an update to its access rights using the same OSCORE Security Context, which is valid and authorized, then:¶
This identifier of the token series needs to be included in the new access token in order for RS to identify the old access token to supersede, as well as the OSCORE Security Context already shared between C and RS and to be associated with the new access token.¶
An EDHOC_Information is an object including information that guides two peers towards executing the EDHOC protocol. In particular, the EDHOC_Information is defined to be serialized and transported between nodes, as specified by this document, but it can also be used by other specifications if needed.¶
The EDHOC_Information can either be encoded as a JSON object or as a CBOR map. The set of common fields that can appear in an EDHOC_Information can be found in the IANA "EDHOC Information" registry (see Section 10.9), defined for extensibility, and the initial set of parameters defined in this document is specified below. All parameters are optional.¶
Figure 6 provides a summary of the EDHOC_Information parameters defined in this section.¶
An example of JSON EDHOC_Information is given in Figure 7.¶
The CDDL grammar describing the CBOR EDHOC_Information is:¶
EDHOC_Information = { ? 0 => bstr, ; id ? 1 => int / array, ; methods ? 2 => int / array, ; cipher_suites ? 3 => true / false, ; key_update ? 4 => true / false, ; message_4 ? 5 => true / false, ; comb_req ? 6 => tstr, ; uri_path ? 7 => uint, ; osc_ms_len ? 8 => uint, ; osc_salt_len ? 9 => uint, ; osc_version * int / tstr => any }¶
The following subsections describe the exchanges between C and RS, which comprise the token uploading to RS, and the execution of the EDHOC protocol. Note that, as defined in Section 3.2, AS may not have provided C with the access token, and have rather uploaded the access token to the /authz-info endpoint at RS on behalf of C.¶
In order to upload the access token to RS, C can send a POST request to the /authz-info endpoint at RS. This is detailed in Section 4.1 and Section 4.2, and it is shown by the example in Appendix A.1.¶
Alternatively, C can upload the access token while executing the EDHOC protocol, by transporting the access token in the EAD_1 field of the first EDHOC message sent to RS. This is further discussed in Section 4.3, and it is shown by the example in Appendix A.2.¶
In either case, following the uploading of the access token, C and RS run the EDHOC protocol to completion, by exchanging POST requests and related responses to a dedicated EDHOC resource at RS (see Section 4.3). Once completed the EDHOC execution, C and RS have agreed on a common secret key PRK_out (see Section 4.1.3 of [I-D.ietf-lake-edhoc]), from which they establish an OSCORE Security Context (see Section 4.3). After that, C and RS use the established OSCORE Security Context to protect their communications when accessing protected resources at RS, as per the access rights specified in the access token (see Section 4.4).¶
Note that, by means of the respective authentication credentials, C and RS are mutually authenticated once they have successfully completed the execution of the EDHOC protocol.¶
As to proof-of-possession, RS always gains knowledge that C has PRK_out at the end of the successful EDHOC execution. Conversely, C gains knowledge that RS has PRK_out either when receiving and successfully verifying the optional EDHOC message_4 from RS, or when successfully verifying a response from RS protected with the generated OSCORE Security Context.¶
The access token can be uploaded to RS by using the /authz-info endpoint at RS. To this end, C MUST use CoAP [RFC7252] and the Authorization Information endpoint described in Section 5.10.1 of [I-D.ietf-ace-oauth-authz] in order to transport the access token.¶
That is, C sends a POST request to the /authz-info endpoint at RS, with the request payload conveying the access token without any CBOR wrapping. As per Section 5.10.1 of [I-D.ietf-ace-oauth-authz], the Content-Format of the POST request has to reflect the format of the transported access token. In particular, if the access token is a CWT, the content-format MUST be "application/cwt".¶
The communication with the /authz-info endpoint does not have to be protected, except for the update of access rights case described below.¶
In case of initial access token provisioning to RS for this Client, or in other cases without a valid EDHOC session, the uploading of the access token is followed by the execution of the EDHOC protocol (or combined using EAD as described in Section 4.3) and by the derivation of an OSCORE Security Context, as detailed later in this section.¶
In the following, we outline some alternative processing, which occur when the provisioned access token or the established OSCORE Security Context for various reasons is no longer available or sufficient. In the cases below, it is assumed that the EDHOC session is still valid, otherwise the processing essentially falls back to the case discussed above.¶
C may need to update the OSCORE Security Context, e.g., due to a policy limiting its use in terms of time or amount of processed data, or to the imminent exhaustion of the OSCORE Sender Sequence Number space. The OSCORE Security Context can be updated by:¶
a. using the KUDOS key update protocol specified in [I-D.ietf-core-oscore-key-update], if supported by both C and RS; or¶
b. re-posting the access token using the same procedure as in case 1 above.¶
In cases 1, 2 and 3b, C and RS rely on a protocol similar to the coap_oscore
profile [I-D.ietf-ace-oscore-profile], but leveraging the EDHOC-KeyUpdate function (see Section 5) before deriving a new OSCORE Security Context.¶
Case 3a provides a lightweight alternative independent of ACE, and does not require the posting of an access token.¶
In either case, C and RS establish a new OSCORE Security Context that replaces the old one and will be used for protecting their communications from then on. In particular, RS MUST associate the new OSCORE Security Context with the current (potentially re-posted) access token. Note that, unless C and RS re-run the EDHOC protocol, they preserve their same OSCORE identifiers, i.e., their OSCORE Sender/Recipient IDs.¶
If C has already posted a valid access token, has already established an OSCORE Security Context with RS, and wants to update its access rights, then C can do so by posting a new access token to the /authz-info endpoint. The new access token contains the updated access rights for C to access protected resources at RS, and C has to obtain it from AS as a new access token in the same token series of the current one (see Section 3.1 and Section 3.2). When posting the new access token to the /authz-info endpoint, C MUST protect the POST request using the current OSCORE Security Context shared with RS. After successful verification (see Section 4.2), RS will replace the old access token with the new one, while preserving the same OSCORE Security Context. In particular, C and RS do not re-run the EDHOC protocol and they do not establish a new OSCORE Security Context.¶
Upon receiving an access token from C, RS MUST follow the procedures defined in Section 5.10.1 of [I-D.ietf-ace-oauth-authz]. That is, RS must verify the validity of the access token. RS may make an introspection request (see Section 5.9.1 of [I-D.ietf-ace-oauth-authz]) to validate the access token.¶
If the access token is valid, RS proceeds as follows.¶
RS checks whether it is already storing the authentication credential of C, namely AUTH_CRED_C, specified as PoP-key in the access token by value or reference. In such a case, RS stores the access token and MUST reply to the POST request with a 2.01 (Created) response.¶
Otherwise, RS retrieves AUTH_CRED_C, e.g., from the access token if the authentication credential is specified therein by value, or from a further trusted source pointed to by the AUTH_CRED_C identifier included in the access token. After that, RS validates the actual AUTH_CRED_C. In case of successful validation, RS stores AUTH_CRED_C as a valid authentication credential. Then, RS stores the access token and MUST reply to the POST request with a 2.01 (Created) response.¶
If RS does not find an already stored AUTH_CRED_C, or fails to retrieve it or to validate it, then RS MUST respond with an error response code equivalent to the CoAP code 4.00 (Bad Request). RS may provide additional information in the payload of the error response, in order to clarify what went wrong.¶
Instead, if the access token is valid but it is associated with claims that RS cannot process (e.g., an unknown scope), or if any of the expected parameters is missing (e.g., any of the mandatory parameters from AS or the identifier "id"), or if any parameters received in the EDHOC_Information is unrecognized, then RS MUST respond with an error response code equivalent to the CoAP code 4.00 (Bad Request). In the latter two cases, RS may provide additional information in the payload of the error response, in order to clarify what went wrong.¶
When an access token becomes invalid (e.g., due to its expiration or revocation), RS MUST delete the access token and the associated OSCORE Security Context, and MUST notify C with an error response with code 4.01 (Unauthorized) for any long running request, as specified in Section 5.8.3 of [I-D.ietf-ace-oauth-authz].¶
If RS receives an access token in an OSCORE protected request, it means that C is requesting an update of access rights. In such a case, RS MUST check that both the following conditions hold.¶
If both the conditions above hold, RS MUST replace the old access token T_OLD with the new access token T_NEW, and associate T_NEW with the OSCORE Security Context CTX. Then, RS MUST respond with a 2.01 (Created) response protected with the same OSCORE Security Context, with no payload.¶
Otherwise, RS MUST respond with a 4.01 (Unauthorized) error response. RS may provide additional information in the payload of the error response, in order to clarify what went wrong.¶
As specified in Section 5.10.1 of [I-D.ietf-ace-oauth-authz], when receiving an updated access token with updated authorization information from C (see Section 4.1), it is recommended that RS overwrites the previous access token. That is, only the latest authorization information in the access token received by RS is valid. This simplifies the process needed by RS to keep track of authorization information for a given client.¶
In order to mutually authenticate and establish a long-term secret key PRK_out with forward secrecy, C and RS run the EDHOC protocol [I-D.ietf-lake-edhoc]. In particular, C acts as EDHOC Initiator thus sending EDHOC message_1, while RS acts as EDHOC Responder.¶
As per Appendix A.2 of [I-D.ietf-lake-edhoc], C sends EDHOC message_1 and EDHOC message_3 to an EDHOC resource at RS, as CoAP POST requests. Also RS sends EDHOC message_2 and (optionally) EDHOC message_4 as 2.04 (Changed) CoAP responses. If, in the access token response received from AS (see Section 3.1), the "uri_path" field of the EDHOC_Information was included, then C MUST target the EDHOC resource at RS with the URI path specified in the "uri_path" field.¶
In order to seamlessly run EDHOC, a client does not have to first upload to RS an access token whose scope explicitly indicates authorized access to the EDHOC resource. At the same time, RS has to ensure that attackers cannot perform requests on the EDHOC resource, other than sending EDHOC messages. Specifically, it SHOULD NOT be possible to perform anything else than POST on an EDHOC resource.¶
When preparing EDHOC message_1, C performs the following steps, in additions to those defined in Section 5.2.1 of [I-D.ietf-lake-edhoc].¶
Rather than first uploading the access token to the /authz-info endpoint at RS as described in Section 4.1, C MAY include the access token in the EAD_1 field of EDHOC message_1 (see Section 3.8 of [I-D.ietf-lake-edhoc]). This is shown by the example in Appendix A.2.¶
In such a case, as per Section 3.8 of [I-D.ietf-lake-edhoc], C adds the EAD item EAD_ACCESS_TOKEN = (ead_label, ead_value) to the EAD_1 field. In particular, ead_label is the integer value TBD registered in Section 10.8 of this document, while ead_value is a CBOR byte string with value the access token. That is, the value of the CBOR byte string is the content of the "access_token" field of the access token response from AS (see Section 3.2).¶
If EDHOC message_1 includes the EAD item EAD_ACCESS_TOKEN within the field EAD_1, then RS MUST process the access token carried out in ead_value as specified in Section 4.2. If such a process fails, RS MUST reply to C as specified in Section 4.2, it MUST discontinue the EDHOC protocol, and it MUST NOT send an EDHOC error message (see Section 6 of [I-D.ietf-lake-edhoc]). RS MUST have successfully completed the processing of the access token before continuing the EDHOC execution by sending EDHOC message_2.¶
Note that the EAD_1 field of EDHOC message_1 cannot carry an access token for the update of access rights, but rather only an access token issued as the first of a token series.¶
In EDHOC message_2, the authentication credential CRED_R indicated by the message field ID_CRED_R is the authentication credential of RS, namely AUTH_CRED_RS, that C obtained from AS. The processing of EDHOC message_2 is defined in detail in Section 5.3 of [I-D.ietf-lake-edhoc].¶
In EDHOC message_3, the authentication credential CRED_I indicated by the message field ID_CRED_I is the authentication credential of C, namely AUTH_CRED_C, i.e., the PoP key bound to the access token and specified therein. The processing of EDHOC message_3 is defined in detail in Section 5.4 of [I-D.ietf-lake-edhoc].¶
Once successfully completed the EDHOC execution, C and RS have both derived the long-term secret key PRK_out (see Section 4.1.3 of [I-D.ietf-lake-edhoc]), from which they both derive the key PRK_Exporter (see Section 4.2.1 of [I-D.ietf-lake-edhoc]). Then, C and RS derive an OSCORE Security Context, as defined in Appendix A.1 of [I-D.ietf-lake-edhoc]. In addition, the following applies.¶
If C supports it, C MAY use the EDHOC + OSCORE combined request defined in [I-D.ietf-core-oscore-edhoc], as also shown by the example in Appendix A.2. In such a case, both EDHOC message_3 and the first OSCORE-protected application request to a protected resource are sent to RS as combined together in a single OSCORE-protected CoAP request, thus saving one round trip. This requires C to derive the OSCORE Security Context with RS already after having successfully processed the received EDHOC message_2. If, in the access token response received from AS (see Section 3.1), the "comb_req" field of the EDHOC_Information was included and specified the CBOR simple value "false" (0xf4), then C MUST NOT use the EDHOC + OSCORE combined request with RS.¶
RS MUST follow the procedures defined in Section 5.10.2 of [I-D.ietf-ace-oauth-authz]. That is, if RS receives an OSCORE-protected request targeting a protected resource from C, then RS processes the request according to [RFC8613], when Version 1 of OSCORE is used. Future specifications may define new versions of OSCORE, that AS can indicate C and RS to use by means of the "osc_version" field of EDHOC_Information (see Section 3).¶
If OSCORE verification succeeds and the target resource requires authorization, RS retrieves the authorization information using the access token associated with the OSCORE Security Context. Then, RS must verify that the authorization information covers the target resource and the action intended by C on it.¶
Once successfully completed an EDHOC execution, C and RS are expected to preserve the EDHOC state of such an execution, as long as the authentication credentials of both C and RS, namely AUTH_CRED_C and AUTH_CRED_RS are valid. This especially consists in preserving the secret key PRK_out attained at the end of the EDHOC execution.¶
In case C has to establish a new OSCORE Security Context with RS, and as long as the outcome of their previously completed EDHOC execution is still valid, C and RS MUST rely on the EDHOC-KeyUpdate function defined in Section 4.2.2 of [I-D.ietf-lake-edhoc] as further specified in the rest of this section, rather than re-running the EDHOC protocol. When supporting this profile, both C and RS MUST support the EDHOC-KeyUpdate function. The procedure is sketched in Figure 8.¶
Establishing a new OSCORE Security Context by leveraging the EDHOC-KeyUpdate function is possible in the following cases.¶
In either case, C and RS have to establish a new OSCORE Security Context and to associate it with the (re-)uploaded access token.¶
When using this approach, C and RS perform the following actions.¶
C MUST generate a nonce value N1 very unlikely to have been used with the same pair of authentication credentials (AUTH_CRED_C, AUTH_CRED_RS). When using this profile, it is RECOMMENDED to use a 64-bit long random number as the nonce's value. C MUST store the nonce N1 as long as the response from RS is not received and the access token related to it is still valid (to the best of C's knowledge).¶
C MUST use CoAP [RFC7252] and the Authorization Information resource as described in Section 5.10.1 of [I-D.ietf-ace-oauth-authz] to transport the access token and N1 to RS.¶
Note that, unlike what is defined in Section 4.1, the use of the payload and of the Content-Format is different from what is described in Section 5.10.1 of [I-D.ietf-ace-oauth-authz], where only the access token is transported and without any CBOR wrapping. That is, C MUST wrap the access token and N1 in a CBOR map, and MUST use the Content-Format "application/ace+cbor" defined in Section 8.16 of [I-D.ietf-ace-oauth-authz]. The CBOR map MUST specify the access token using the "access_token" parameter, and N1 using the "nonce1" parameter defined in Section 4.1.1 of [I-D.ietf-ace-oscore-profile].¶
The communication with the /authz-info endpoint at RS MUST NOT be protected. This approach is not applicable when C uploads to RS for the first time an access token to update access rights (which rather requires protected communication and does not result in deriving a new OSCORE Security Context).¶
Figure 9 shows an example of the POST request sent by C to RS. The access token has been truncated for readability.¶
Upon receiving the POST request from C, RS MUST follow the procedures defined in Section 5.10.1 of [I-D.ietf-ace-oauth-authz]. That is, RS must verify the validity of the access token. RS may make an introspection request (see Section 5.9.1 of [I-D.ietf-ace-oauth-authz]) to validate the access token.¶
If the access token is valid, RS proceeds as follows.¶
RS checks whether it is already storing the authentication credential of C, namely AUTH_CRED_C, specified as PoP-key in the access token by value or reference.¶
If RS does not find AUTH_CRED_C among the stored authentication credentials, RS retrieves AUTH_CRED_C, e.g., from the access token if the authentication credential is specified therein by value, or from a further trusted source pointed to by the AUTH_CRED_C identifier included in the access token. After that, RS validates the actual AUTH_CRED_C. In case of successful validation, RS stores AUTH_CRED_C as a valid authentication credential.¶
If RS does not find an already stored AUTH_CRED_C, or fails to retrieve it or to validate it, then RS MUST respond with an error response code equivalent to the CoAP code 4.00 (Bad Request). RS may provide additional information in the payload of the error response, in order to clarify what went wrong.¶
If the access token is valid but it is associated with claims that RS cannot process (e.g., an unknown scope), or if any of the expected parameters is missing (e.g., any of the mandatory parameters from AS or the identifier "id"), or if any parameters received in the EDHOC_Information is unrecognized, then RS MUST respond with an error response code equivalent to the CoAP code 4.00 (Bad Request). In the latter two cases, RS may provide additional information in the payload of the error response, in order to clarify what went wrong.¶
If RS does not find the stored state of a completed EDHOC execution where the authentication credential AUTH_CRED_C was used as CRED_I, then RS MUST respond with an error response code equivalent to the CoAP code 4.00 (Bad Request). RS may provide additional information in the payload of the error response, in order to clarify what went wrong.¶
Otherwise, if all the steps above are successful, RS stores the access token and MUST generate a nonce N2 very unlikely to have been previously used with the same pair of authentication credentials (AUTH_CRED_C, AUTH_CRED_RS). When using this profile, it is RECOMMENDED to use a 64-bit long random number as the nonce's value. Then, RS MUST reply to the POST request with a 2.01 (Created) response, for which RS MUST use the Content-Format "application/ace+cbor" defined in Section 8.16 of [I-D.ietf-ace-oauth-authz]. The payload of the response MUST be a CBOR map, which MUST specify N2 using the "nonce2" parameter defined in Section 4.2.1 of [I-D.ietf-ace-oscore-profile].¶
Figure 10 shows an example of the response sent by RS to C.¶
Once they have exchanged N1 and N2, both C and RS build a CBOR byte string EXTENDED_NONCE as follows.¶
First, RAW_STRING is prepared as the concatenation of N1 and N2, in this order: RAW_STRING = N1 | N2, where | denotes byte string concatenation, and N1 and N2 are the two nonces encoded as CBOR byte strings. Then, the resulting RAW_STRING is wrapped into the CBOR byte string EXTENDED_NONCE.¶
An example is given in Figure 11, with reference to the values of N1 and N2 shown in Figure 9 and Figure 10.¶
If JSON is used instead of CBOR, then RAW_STRING is the Base64 encoding of the concatenation of the same parameters, each of them prefixed by their size encoded in 1 byte. When using JSON, the nonces have a maximum size of 255 bytes. An example is given in Figure 12, where the nonces and RAW_STRING are encoded in Base64.¶
Once computed the CBOR byte string EXTENDED_NONCE, both C and RS perform the following steps.¶
As specified in the ACE framework (see Sections 5.8 and 5.9 of [I-D.ietf-ace-oauth-authz]), the requesting entity (RS and/or C) and AS communicates via the /introspect or /token endpoint. When using this profile, the use of CoAP [RFC7252] and OSCORE [RFC8613] for this communication is RECOMMENDED. Other protocols fulfilling the security requirements defined in Section 5 of [I-D.ietf-ace-oauth-authz] (such as HTTP and DTLS or TLS) MAY be used instead.¶
If OSCORE is used, the requesting entity and AS need to have a OSCORE Security Context in place. While this can be pre-installed, the requesting entity and AS can establish such an OSCORE Security Context, for example, by running the EDHOC protocol, as shown between C and AS by the examples in Appendix A.1, Appendix A.2 and Appendix A.3. The requesting entity and AS communicate through the /introspect endpoint as specified in Section 5.9 of [I-D.ietf-ace-oauth-authz] and through the /token endpoint as specified in Section 5.8 of [I-D.ietf-ace-oauth-authz].¶
Furthermore, as defined in Section 3.2 and shown by the example in Appendix A.3, AS may upload the access token to the /authz-info endpoint at RS, on behalf of C. In such a case, that exchange between AS and RS is not protected, just like when C uploads the access token to RS by itself.¶
There are a number of cases where C or RS have to discard the OSCORE Security Context, and possibly establish a new one.¶
C MUST discard the current OSCORE Security Context shared with RS when any of the following occurs.¶
RS MUST discard the current OSCORE Security Context shared with C when any of the following occurs:¶
After a new access token is successfully uploaded to RS, and a new OSCORE Security Context is established between C and RS, messages still in transit that were protected with the previous OSCORE Security Context might not be successfully verified by the recipient, since the old OSCORE Security Context might have been discarded. This means that messages sent shortly before C has uploaded the new access token to RS might not be successfully accepted by the recipient.¶
Furthermore, implementations may want to cancel CoAP observations at RS, if registered before the new OSCORE Security Context has been established. Alternatively, applications need to implement a mechanism to ensure that, from then on, messages exchanged within those observations are going to be protected with the newly derived OSCORE Security Context.¶
This document specifies a profile for the Authentication and Authorization for Constrained Environments (ACE) framework [I-D.ietf-ace-oauth-authz]. Thus, the general security considerations from the ACE framework also apply to this profile.¶
Furthermore, the security considerations from OSCORE [RFC8613] and from EDHOC [I-D.ietf-lake-edhoc] also apply to this specific use of the OSCORE and EDHOC protocols.¶
As previously stated, once completed the EDHOC execution, C and RS are mutually authenticated through their respective authentication credentials, whose retrieval has been facilitated by AS. Also once completed the EDHOC execution, C and RS have established a long-term secret key PRK_out enjoying forward secrecy. This is in turn used by C and RS to establish an OSCORE Security Context.¶
Furthermore, RS achieves confirmation that C has PRK_out (proof-of-possession) when completing the EDHOC execution. Rather, C achieves confirmation that RS has PRK_out (proof-of-possession) either when receiving the optional EDHOC message_4 from RS, or when successfully verifying a response from RS protected with the established OSCORE Security Context.¶
OSCORE is designed to secure point-to-point communication, providing a secure binding between a request and the corresponding response(s). Thus, the basic OSCORE protocol is not intended for use in point-to-multipoint communication (e.g., enforced via multicast or a publish-subscribe model). Implementers of this profile should make sure that their use case of OSCORE corresponds to the expected one, in order to prevent weakening the security assurances provided by OSCORE.¶
As defined in Section 5, C can (re-)post an access token to RS and contextually exchange two nonces N1 and N2, in order to efficiently use the EDHOC-KeyUpdate function rather than re-running the EDHOC protocol with RS. The use of nonces guarantees uniqueness of the new PRK_out derived by running EDHOC_KeyUpdate. Consequently, it ensures uniqueness of the AEAD (nonce, key) pairs later used by C and RS, when protecting their communications with the OSCORE Security Context established after updating PRK_out. Thus, it is REQUIRED that the exchanged nonces are not reused with the same pair of authentication credentials (AUTH_CRED_C, AUTH_CRED_RS), even in case of reboot. When using this profile, it is RECOMMENDED to use a 64-bit long random numbers as a nonce's value. Considering the birthday paradox, the average collision for each nonce will happen after 2^32 messages, which amounts to considerably more issued access token than it would be expected for intended applications. If applications use something else, such as a counter, they need to guarantee that reboot and loss of state on either node does not yield reuse of nonces. If that is not guaranteed, nodes are susceptible to reuse of AEAD (nonce, key) pairs, especially since an on-path attacker can cause the use of a previously exchanged nonce N1 by replaying the corresponding C-to-RS message.¶
When using this profile, it is RECOMMENDED that RS stores only one access token per client. The use of multiple access tokens for a single client increases the strain on RS, since it must consider every access token associated with the client and calculate the actual permissions that client has. Also, access tokens indicating different or disjoint permissions from each other may lead RS to enforce wrong permissions. If one of the access tokens expires earlier than others, the resulting permissions may offer insufficient protection. Developers SHOULD avoid using multiple access tokens for a same client. Furthermore, RS MUST NOT store more than one access token per client per PoP-key (i.e., per client's authentication credential).¶
This document specifies a profile for the Authentication and Authorization for Constrained Environments (ACE) framework [I-D.ietf-ace-oauth-authz]. Thus, the general privacy considerations from the ACE framework also apply to this profile.¶
Furthermore, the privacy considerations from OSCORE [RFC8613] and from EDHOC [I-D.ietf-lake-edhoc] also apply to this specific use of the OSCORE and EDHOC protocols.¶
An unprotected response to an unauthorized request may disclose information about RS and/or its existing relationship with C. It is advisable to include as little information as possible in an unencrypted response. When an OSCORE Security Context already exists between C and RS, more detailed information may be included.¶
Except for the case where C attempts to update its access rights, the (encrypted) access token is sent in an unprotected POST request to the /authz-info endpoint at RS. Thus, if C uses the same single access token from multiple locations, it can risk being tracked by the access token's value even when the access token is encrypted.¶
As defined in Section 5, C can (re-)post an access token to RS and contextually exchange two nonces N1 and N2, in order to efficiently use the EDHOC-KeyUpdate function rather than re-running the EDHOC protocol with RS. Since the exchanged nonces are also sent in the clear, using random nonces is best for privacy, as opposed to, e.g., a counter that might leak some information about C.¶
The identifiers used in OSCORE, i.e., the OSCORE Sender/Recipient IDs, are negotiated by C and RS during the EDHOC execution. That is, the EDHOC Connection Identifier C_I of C is going to be the OSCORE Recipient ID of C (the OSCORE Sender ID of RS). Conversely, the EDHOC Connection Identifier C_R of RS is going to be the OSCORE Recipient ID of RS (the OSCORE Sender ID of C). These OSCORE identifiers are privacy sensitive (see Section 12.8 of [RFC8613]). In particular, they could reveal information about C, or may be used for correlating different requests from C, e.g., across different networks that C has joined and left over time. This can be mitigated if C and RS dynamically update their OSCORE identifiers, e.g., by using the method defined in [I-D.ietf-core-oscore-key-update].¶
This document has the following actions for IANA.¶
Note to RFC Editor: Please replace all occurrences of "[RFC-XXXX]" with the RFC number of this specification and delete this paragraph.¶
IANA is asked to add the following entry to the "ACE OAuth Profile" Registry following the procedure specified in [I-D.ietf-ace-oauth-authz].¶
IANA is asked to add the following entries to the "OAuth Parameters" registry.¶
IANA is asked to add the following entries to the "OAuth Parameters CBOR Mappings" following the procedure specified in [I-D.ietf-ace-oauth-authz].¶
IANA is asked to add the following entries to the "JSON Web Token Claims" registry following the procedure specified in [RFC7519].¶
IANA is asked to add the following entries to the "CBOR Web Token Claims" registry following the procedure specified in [RFC8392].¶
IANA is asked to add the following entries to the "JWT Confirmation Methods" registry following the procedure specified in [RFC7800].¶
IANA is asked to add the following entries to the "CWT Confirmation Methods" registry following the procedure specified in [RFC8747].¶
IANA is asked to add the following entry to the "EDHOC External Authorization Data" registry defined in Section 9.5 of [I-D.ietf-lake-edhoc].¶
It is requested that IANA create a new registry entitled "EDHOC Information" registry. The registry is to be created with registration policy Expert Review [RFC8126]. Guidelines for the experts are provided in Section 10.10. It should be noted that in addition to the expert review, some portions of the registry require a specification, potentially on Standards Track, be supplied as well.¶
The columns of the registry are:¶
Name: A descriptive name that enables easier reference to this item. Because a core goal of this document is for the resulting representations to be compact, it is RECOMMENDED that the name be short.¶
This name is case sensitive. Names may not match other registered names in a case-insensitive manner unless the Designated Experts determine that there is a compelling reason to allow an exception. The name is not used in the CBOR encoding.¶
CBOR Value: The value to be used as CBOR abbreviation of the item.¶
The value MUST be unique. The value can be a positive integer, a negative integer or a string. Integer values between -256 and 255 and strings of length 1 are to be registered by Standards Track documents (Standards Action). Integer values from -65536 to -257 and from 256 to 65535 and strings of maximum length 2 are to be registered by public specifications (Specification Required). Integer values greater than 65535 and strings of length greater than 2 are subject to the Expert Review policy. Integer values less than -65536 are marked as private use.¶
This registry will be initially populated by the values in Figure 6. The "Specification" column for all of these entries will be this document and [I-D.ietf-lake-edhoc].¶
The IANA registry established in this document is defined to use the registration policy Expert Review. This section gives some general guidelines for what the experts should be looking for, but they are being designated as experts for a reason so they should be given substantial latitude.¶
Expert reviewers should take into consideration the following points:¶
This appendix provides examples where this profile of ACE is used. In particular:¶
All these examples build on the following assumptions, as relying on expected early procedures performed at AS. These include the registration of RSs by the respective Resource Owners as well as the registrations of Clients authorized to request access token for those RSs.¶
RS knows the authentication credential AUTH_CRED_AS of AS.¶
This is relevant in case AS and RS actually require a secure association (e.g., for RS to perform token introspection at AS, or for AS to upload an access token to RS on behalf of the Client).¶
As a result of the assumptions above, it is possible to limit the transport of AUTH_CRED_C and AUTH_CRED_RS by value only to the following two cases, and only when the Client requests an access token for RS in question for the first time when considering the pair (AUTH_CRED_C, AUTH_CRED_RS).¶
In the access token, where AUTH_CRED_C is specified by the 'cnf' claim.¶
Note that, even under the circumstances mentioned above, AUTH_CRED_C might rather be indicated by reference. This is possible if RS can effectively use such a reference from the access token to retrieve AUTH_CRED_C (e.g., from a trusted repository of authentication credentials reachable through a non-constrained link), and if AS is in turn aware of that.¶
In any other case, it is otherwise possible to indicate both AUTH_CRED_C and AUTH_CRED_RS by reference, when performing the ACE access control workflow as well as later on when the Client and RS run EDHOC.¶
The example below considers the simplest (though least efficient) interaction between the Client and RS. That is: first C uploads the access token to RS; then C and RS run EDHOC; and, finally, the Client accesses the protected resource at RS.¶
C AS RS | | | | EDHOC message_1 to /edhoc | | M01 |--------------------------------->| | | | | | | | | EDHOC message_2 | | M02 |<---------------------------------| | | ID_CRED_R identifies | | | CRED_R = AUTH_CRED_AS | | | by reference | | | | | | | | | EDHOC message_3 to /edhoc | | M03 |--------------------------------->| | | ID_CRED_I identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | | | | | | | Token request to /token | | | (OSCORE-protected message) | | M04 |--------------------------------->| | | 'req_cnf' identifies | | | AUTH_CRED_C by reference | | | | | | | | | Token response | | | (OSCORE-protected message) | | M05 |<---------------------------------| | | 'rs_cnf' specifies | | | AUTH_CRED_RS by value | | | | | | 'ace_profile' = | | | coap_edhoc_oscore | | | | | | 'edhoc_info' specifies: | | | { | | | id : h'01', | | | suite : 2, | | | methods: 3 | | | } | | | | | | In the access token: | | | * the 'cnf' claim specifies | | | AUTH_CRED_C by value | | | * the 'edhoc_info' claim | | | specifies the same as | | | 'edhoc_info' above | | | | | // Possibly after chain verification, the Client adds AUTH_CRED_RS // to the set of its trusted peer authentication credentials, // relying on AS as trusted provider | | | | Token upload to /authz-info | | | (unprotected message) | | M06 |---------------------------------------------------------------->| | | | // Possibly after chain verification, RS adds AUTH_CRED_C // to the set of its trusted peer authentication credentials, // relying on AS as trusted provider | | | | 2.01 (Created) | | | (unprotected message) | | M07 |<----------------------------------------------------------------| | | | | | | | EDHOC message_1 to /edhoc | | | (no access control is enforced) | | M08 |---------------------------------------------------------------->| | | | | | | | EDHOC message_2 | | M09 |<----------------------------------------------------------------| | ID_CRED_R identifies | | | CRED_R = AUTH_CRED_RS | | | by reference | | | | | | | | | EDHOC message_3 to /edhoc | | | (no access control is enforced) | | M10 |---------------------------------------------------------------->| | ID_CRED_I identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | | | | | | | Access to protected resource | | | (OSCORE-protected message) | | | (access control is enforced) | | M11 |---------------------------------------------------------------->| | | | | Response | | | (OSCORE-protected message) | | M12 |<----------------------------------------------------------------| | | | // Later on, the access token expires ... // - The Client and RS delete their OSCORE Security Context and // purge the EDHOC session used to derive it (unless the same // session is also used for other reasons). // - RS retains AUTH_CRED_C as still valid, // and AS knows about it. // - The Client retains AUTH_CRED_RS as still valid, // and AS knows about it. | | | | | | // Time passes ... | | | | | | // The Client asks for a new access token; now all the // authentication credentials can be indicated by reference // The price to pay is on AS, about remembering that at least // one access token has been issued for the pair (Client, RS) // and considering the pair (AUTH_CRED_C, AUTH_CRED_RS) | | | | Token request to /token | | | (OSCORE-protected message) | | M13 |--------------------------------->| | | 'req_cnf' identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | | | | | | | Token response | | | (OSCORE-protected message) | | M14 |<---------------------------------| | | 'rs_cnf' identifies | | | AUTH_CRED_RS by reference | | | | | | 'ace_profile' = | | | coap_edhoc_oscore | | | | | | 'edhoc_info' specifies: | | | { | | | id : h'05', | | | suite : 2, | | | methods: 3 | | | } | | | | | | In the access token: | | | * the 'cnf' claim specifies | | | AUTH_CRED_C by reference | | | * the 'edhoc_info' claim | | | specifies the same as | | | 'edhoc_info' above | | | | | | | | | Token upload to /authz-info | | | (unprotected message) | | M15 |---------------------------------------------------------------->| | | | | | | | 2.01 (Created) | | | (unprotected message) | | M16 |<----------------------------------------------------------------| | | | | | | | EDHOC message_1 to /edhoc | | | (no access control is enforced) | | M17 |---------------------------------------------------------------->| | | | | | | | EDHOC message_2 | | | (no access control is enforced) | | M18 |<----------------------------------------------------------------| | ID_CRED_R specifies | | | CRED_R = AUTH_CRED_RS | | | by reference | | | | | | | | | EDHOC message_3 to /edhoc | | | (no access control is enforced) | | M19 |---------------------------------------------------------------->| | ID_CRED_I identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | | | | | | | Access to protected resource /r | | | (OSCORE-protected message) | | | (access control is enforced) | | M20 |---------------------------------------------------------------->| | | | | | | | Response | | | (OSCORE-protected message) | | M21 |<----------------------------------------------------------------| | | |¶
The example below builds on the example in Appendix A.1, while additionally relying on the two following optimizations.¶
These two optimizations used together result in the most efficient interaction between the C and RS, as consisting of only two roundtrips to upload the access token, run EDHOC and access the protected resource at RS.¶
Also, a further optimization is used upon uploading a second access token to RS, following the expiration of the first one. That is, after posting the second access token, the Client and RS do not run EDHOC again, but rather EDHOC-KeyUpdate() and EDHOC-Exporter() building on the same, previously completed EDHOC execution.¶
C AS RS | | | | EDHOC message_1 to /edhoc | | M01 |--------------------------------->| | | | | | | | | EDHOC message_2 | | M02 |<---------------------------------| | | ID_CRED_R identifies | | | CRED_R = AUTH_CRED_AS | | | by reference | | | | | | | | | EDHOC+OSCORE request to /token | | M03 |--------------------------------->| | | * EDHOC message_3 | | | ID_CRED_I identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | --- --- --- | | | * OSCORE-protected part | | | Token request | | | 'req_cnf' identifies | | | AUTH_CRED_C by reference | | | | | | | | | Token response | | | (OSCORE-protected message) | | M04 |<---------------------------------| | | 'rs_cnf' specifies | | | AUTH_CRED_RS by value | | | | | | 'ace_profile' = | | | coap_edhoc_oscore | | | | | | 'edhoc_info' specifies: | | | { | | | id : h'01', | | | suite : 2, | | | methods: 3 | | | } | | | | | | In the access token: | | | * the 'cnf' claim specifies | | | AUTH_CRED_C by value | | | * the 'edhoc_info' claim | | | specifies the same as | | | 'edhoc_info' above | | | | | // Possibly after chain verification, the Client adds AUTH_CRED_RS // to the set of its trusted peer authentication credentials, // relying on AS as trusted provider | | | | EDHOC message_1 to /edhoc | | | (no access control is enforced) | | M05 |---------------------------------------------------------------->| | Access token specified in EAD_1 | | | | | // Possibly after chain verification, RS adds AUTH_CRED_C // to the set of its trusted peer authentication credentials, // relying on AS as trusted provider | | | | EDHOC message_2 | | M06 |<----------------------------------------------------------------| | ID_CRED_R identifies | | | CRED_R = AUTH_CRED_RS | | | by reference | | | | | | | | | EDHOC+OSCORE request to /r | | M07 |---------------------------------------------------------------->| | * EDHOC message_3 | | | ID_CRED_I identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | --- --- --- | | | * OSCORE-protected part | | | Application request to /r | | | | | // After the EDHOC processing is completed, access control // is enforced on the rebuilt OSCORE-protected request, // like if it had been sent stand-alone | | | | Response | | | (OSCORE-protected message) | | M08 |<----------------------------------------------------------------| | | | // Later on, the access token expires ... // - The Client and RS delete their OSCORE Security Context // but do not purge the EDHOC session used to derive it. // - RS retains AUTH_CRED_C as still valid, // and AS knows about it. // - The Client retains AUTH_CRED_RS as still valid, // and AS knows about it. | | | | | | // Time passes ... | | | | | | // The Client asks for a new access token; now all the // authentication credentials can be indicated by reference // The price to pay is on AS, about remembering that at least // one access token has been issued for the pair (Client, RS) // and considering the pair (AUTH_CRED_C, AUTH_CRED_RS) | | | | Token request to /token | | | (OSCORE-protected message) | | M09 |--------------------------------->| | | 'req_cnf' identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | | | | Token response | | | (OSCORE-protected message) | | M10 |<---------------------------------| | | 'rs_cnf' identifies | | | AUTH_CRED_RS by reference | | | | | | 'ace_profile' = | | | coap_edhoc_oscore | | | | | | 'edhoc_info' specifies: | | | { | | | id : h'05', | | | suite : 2, | | | methods: 3 | | | } | | | | | | In the access token: | | | * the 'cnf' claim specifies | | | AUTH_CRED_C by reference | | | * the 'edhoc_info' claim | | | specifies the same as | | | 'edhoc_info' above | | | | | | | | | Token upload to /authz-info | | | (unprotected message) | | M11 |---------------------------------------------------------------->| | Payload { | | | access_token: access token | | | nonce_1: N1 // nonce | | | } | | | | | | | | | 2.01 (Created) | | | (unprotected message) | | M12 |<----------------------------------------------------------------| | Payload { | | | nonce_2: N2 // nonce | | | } | | | | | // The Client and RS first run EDHOC-KeyUpdate(N1 | N2), and // then EDHOC-Exporter() to derive a new OSCORE Master Secret and // OSCORE Master Salt, from which a new OSCORE Security Context is // derived. The Sender/Recipient IDs are the same C_I and C_R from // the previous EDHOC execution | | | | Access to protected resource /r | | | (OSCORE-protected message) | | | (access control is enforced) | | M13 |---------------------------------------------------------------->| | | | | | | | Response | | | (OSCORE-protected message) | | M14 |<----------------------------------------------------------------| | | |¶
The example below builds on the example in Appendix A.1, but assumes that AS is uploading the access token to RS on behalf of C.¶
In order to save roundtrips between the Client and RS, further, more efficient interactions can be seamlessly considered, e.g., as per the example in Appendix A.2.¶
C AS RS | | | | | Establish secure association | | | (e.g., OSCORE using EDHOC) | | |<---------------------------->| | | | | | | | EDHOC message_1 to /edhoc | | M01 |--------------------------------->| | | | | | | | | EDHOC message_2 | | M02 |<---------------------------------| | | ID_CRED_R identifies | | | CRED_R = AUTH_CRED_AS | | | by reference | | | | | | | | | EDHOC message_3 to /edhoc | | M03 |--------------------------------->| | | ID_CRED_I identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | | | | | | | Token request to /token | | | (OSCORE-protected message) | | M04 |--------------------------------->| | | 'req_cnf' identifies | | | AUTH_CRED_C by reference | | | | | | | | | | Token upload to /authz-info | | | (OSCORE-protected message) | M05 | |----------------------------->| | | In the access token: | | | * the 'cnf' claim | | | specifies AUTH_CRED_C | | | by value | | | * the 'edhoc_info' | | | claim specifies | | | { | | | id : h'01', | | | suite : 2, | | | methods: 3 | | | } | | | | // Possibly after chain verification, RS adds AUTH_CRED_C // to the set of its trusted peer authentication credentials, // relying on AS as trusted provider | | | | | 2.01 (Created) | | | (OSCORE-protected message) | M06 | |<-----------------------------| | | | | | | | Token response | | | (OSCORE-protected message) | | M07 |<---------------------------------| | | 'rs_cnf' specifies | | | AUTH_CRED_RS by value | | | | | | 'ace_profile' = | | | coap_edhoc_oscore | | | | | | 'token_uploaded' = true | | | | | | 'edhoc_info' specifies: | | | { | | | id : h'01', | | | suite : 2, | | | methods: 3 | | | } | | | | | // Possibly after chain verification, the Client adds AUTH_CRED_RS // to the set of its trusted peer authentication credentials, // relying on AS as trusted provider | | | | EDHOC message_1 to /edhoc | | | (no access control is enforced) | | M08 |---------------------------------------------------------------->| | | | | | | | EDHOC message_2 | | M09 |<----------------------------------------------------------------| | ID_CRED_R identifies | | | CRED_R = AUTH_CRED_RS | | | by reference | | | | | | | | | EDHOC message_3 to /edhoc | | | (no access control is enforced) | | M10 |---------------------------------------------------------------->| | ID_CRED_I identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | | | | | | | Access to protected resource | | | (OSCORE-protected message) | | | (access control is enforced) | | M11 |---------------------------------------------------------------->| | | | | | | | Response | | | (OSCORE-protected message) | | M12 |<----------------------------------------------------------------| | | | // Later on, the access token expires ... // - The Client and RS delete their OSCORE Security Context and // purge the EDHOC session used to derive it (unless the same // session is also used for other reasons). // - RS retains AUTH_CRED_C as still valid, // and AS knows about it. // - The Client retains AUTH_CRED_RS as still valid, // and AS knows about it. | | | | | | // Time passes ... | | | | | | // The Client asks for a new access token; now all the // authentication credentials can be indicated by reference // The price to pay is on AS, about remembering that at least // one access token has been issued for the pair (Client, RS) // and considering the pair (AUTH_CRED_C, AUTH_CRED_RS) | | | | Token request to /token | | | (OSCORE-protected message) | | M13 |--------------------------------->| | | 'req_cnf' identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | | | | | | | | Token upload to /authz-info | | | (OSCORE-protected message) | M14 | |----------------------------->| | | In the access token: | | | * the 'cnf' claim | | | specifies AUTH_CRED_C | | | by reference | | | * the 'edhoc_info' | | | claim specifies | | | { | | | id : h'05', | | | suite : 2, | | | methods: 3 | | | } | | | | | | | | | 2.01 (Created) | | | (OSCORE-protected message) | M15 | |<-----------------------------| | | | | | | | Token response | | | (OSCORE-protected message) | | M16 |<---------------------------------| | | 'rs_cnf' specifies | | | AUTH_CRED_RS by reference | | | | | | 'ace_profile' = | | | coap_edhoc_oscore | | | | | | 'token_uploaded' = true | | | | | | 'edhoc_info' specifies: | | | { | | | id : h'05', | | | suite : 2, | | | methods: 3 | | | } | | | | | | | | | EDHOC message_1 to /edhoc | | | (no access control is enforced) | | M17 |---------------------------------------------------------------->| | | | | | | | EDHOC message_2 | | | (no access control is enforced) | | M18 |<----------------------------------------------------------------| | ID_CRED_R specifies | | | CRED_R = AUTH_CRED_RS | | | by reference | | | | | | | | | EDHOC message_3 to /edhoc | | | (no access control is enforced) | | M19 |---------------------------------------------------------------->| | ID_CRED_I identifies | | | CRED_I = AUTH_CRED_C | | | by reference | | | | | | | | | Access to protected resource /r | | | (OSCORE-protected message) | | | (access control is enforced) | | M20 |---------------------------------------------------------------->| | | | | | | | Response | | | (OSCORE-protected message) | | M21 |<----------------------------------------------------------------| | | |¶
Work on this document has in part been supported by the H2020 project SIFIS-Home (grant agreement 952652).¶