draft-ietf-lake-edhoc-07.txt | draft-ietf-lake-edhoc-08.txt | |||
---|---|---|---|---|
Network Working Group G. Selander | Network Working Group G. Selander | |||
Internet-Draft J. Mattsson | Internet-Draft J. Mattsson | |||
Intended status: Standards Track F. Palombini | Intended status: Standards Track F. Palombini | |||
Expires: 25 November 2021 Ericsson AB | Expires: January 13, 2022 Ericsson AB | |||
24 May 2021 | July 12, 2021 | |||
Ephemeral Diffie-Hellman Over COSE (EDHOC) | Ephemeral Diffie-Hellman Over COSE (EDHOC) | |||
draft-ietf-lake-edhoc-07 | draft-ietf-lake-edhoc-08 | |||
Abstract | Abstract | |||
This document specifies Ephemeral Diffie-Hellman Over COSE (EDHOC), a | This document specifies Ephemeral Diffie-Hellman Over COSE (EDHOC), a | |||
very compact and lightweight authenticated Diffie-Hellman key | very compact and lightweight authenticated Diffie-Hellman key | |||
exchange with ephemeral keys. EDHOC provides mutual authentication, | exchange with ephemeral keys. EDHOC provides mutual authentication, | |||
perfect forward secrecy, and identity protection. EDHOC is intended | perfect forward secrecy, and identity protection. EDHOC is intended | |||
for usage in constrained scenarios and a main use case is to | for usage in constrained scenarios and a main use case is to | |||
establish an OSCORE security context. By reusing COSE for | establish an OSCORE security context. By reusing COSE for | |||
cryptography, CBOR for encoding, and CoAP for transport, the | cryptography, CBOR for encoding, and CoAP for transport, the | |||
skipping to change at page 1, line 38 ¶ | skipping to change at page 1, line 38 ¶ | |||
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 25 November 2021. | This Internet-Draft will expire on January 13, 2022. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 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 (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Simplified BSD License text | to this document. Code Components extracted from this document must | |||
as described in Section 4.e of the Trust Legal Provisions and are | include Simplified BSD License text as described in Section 4.e of | |||
provided without warranty as described in the Simplified BSD License. | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Motivation . . . . . . . . . . . . . . . . . . . . . . . 4 | 1.1. Motivation . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.2. Use of EDHOC . . . . . . . . . . . . . . . . . . . . . . 5 | 1.2. Use of EDHOC . . . . . . . . . . . . . . . . . . . . . . 4 | |||
1.3. Message Size Examples . . . . . . . . . . . . . . . . . . 6 | 1.3. Message Size Examples . . . . . . . . . . . . . . . . . . 5 | |||
1.4. Document Structure . . . . . . . . . . . . . . . . . . . 6 | 1.4. Document Structure . . . . . . . . . . . . . . . . . . . 6 | |||
1.5. Terminology and Requirements Language . . . . . . . . . . 6 | 1.5. Terminology and Requirements Language . . . . . . . . . . 6 | |||
2. EDHOC Outline . . . . . . . . . . . . . . . . . . . . . . . . 7 | 2. EDHOC Outline . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
3. Protocol Elements . . . . . . . . . . . . . . . . . . . . . . 9 | 3. Protocol Elements . . . . . . . . . . . . . . . . . . . . . . 8 | |||
3.1. General . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3.1. General . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
3.2. Method and Correlation . . . . . . . . . . . . . . . . . 10 | 3.2. Method . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
3.2.1. Method . . . . . . . . . . . . . . . . . . . . . . . 10 | 3.3. Connection Identifiers . . . . . . . . . . . . . . . . . 9 | |||
3.2.2. Connection Identifiers . . . . . . . . . . . . . . . 10 | 3.4. Transport . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
3.2.3. Transport . . . . . . . . . . . . . . . . . . . . . . 11 | 3.5. Authentication Parameters . . . . . . . . . . . . . . . . 11 | |||
3.2.4. Message Correlation . . . . . . . . . . . . . . . . . 11 | 3.6. Cipher Suites . . . . . . . . . . . . . . . . . . . . . . 16 | |||
3.3. Authentication Parameters . . . . . . . . . . . . . . . . 11 | 3.7. Ephemeral Public Keys . . . . . . . . . . . . . . . . . . 18 | |||
3.3.1. Authentication Keys . . . . . . . . . . . . . . . . . 11 | 3.8. External Authorization Data . . . . . . . . . . . . . . . 18 | |||
3.3.2. Identities . . . . . . . . . . . . . . . . . . . . . 12 | 3.9. Applicability Statement . . . . . . . . . . . . . . . . . 19 | |||
3.3.3. Authentication Credentials . . . . . . . . . . . . . 13 | 4. Key Derivation . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
3.3.4. Identification of Credentials . . . . . . . . . . . . 15 | ||||
3.4. Cipher Suites . . . . . . . . . . . . . . . . . . . . . . 16 | ||||
3.5. Ephemeral Public Keys . . . . . . . . . . . . . . . . . . 18 | ||||
3.6. External Authorization Data . . . . . . . . . . . . . . . 18 | ||||
3.7. Applicability Statement . . . . . . . . . . . . . . . . . 19 | ||||
4. Key Derivation . . . . . . . . . . . . . . . . . . . . . . . 20 | ||||
4.1. EDHOC-Exporter Interface . . . . . . . . . . . . . . . . 23 | 4.1. EDHOC-Exporter Interface . . . . . . . . . . . . . . . . 23 | |||
5. Message Formatting and Processing . . . . . . . . . . . . . . 23 | 5. Message Formatting and Processing . . . . . . . . . . . . . . 24 | |||
5.1. Encoding of bstr_identifier . . . . . . . . . . . . . . . 24 | 5.1. Message Processing Outline . . . . . . . . . . . . . . . 24 | |||
5.2. Message Processing Outline . . . . . . . . . . . . . . . 24 | 5.2. EDHOC Message 1 . . . . . . . . . . . . . . . . . . . . . 25 | |||
5.3. EDHOC Message 1 . . . . . . . . . . . . . . . . . . . . . 25 | 5.3. EDHOC Message 2 . . . . . . . . . . . . . . . . . . . . . 27 | |||
5.3.1. Formatting of Message 1 . . . . . . . . . . . . . . . 25 | 5.4. EDHOC Message 3 . . . . . . . . . . . . . . . . . . . . . 30 | |||
5.3.2. Initiator Processing of Message 1 . . . . . . . . . . 26 | 5.5. EDHOC Message 4 . . . . . . . . . . . . . . . . . . . . . 33 | |||
5.3.3. Responder Processing of Message 1 . . . . . . . . . . 27 | 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
5.4. EDHOC Message 2 . . . . . . . . . . . . . . . . . . . . . 28 | ||||
5.4.1. Formatting of Message 2 . . . . . . . . . . . . . . . 28 | ||||
5.4.2. Responder Processing of Message 2 . . . . . . . . . . 28 | ||||
5.4.3. Initiator Processing of Message 2 . . . . . . . . . . 30 | ||||
5.5. EDHOC Message 3 . . . . . . . . . . . . . . . . . . . . . 31 | ||||
5.5.1. Formatting of Message 3 . . . . . . . . . . . . . . . 31 | ||||
5.5.2. Initiator Processing of Message 3 . . . . . . . . . . 31 | ||||
5.5.3. Responder Processing of Message 3 . . . . . . . . . . 34 | ||||
6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 34 | ||||
6.1. Success . . . . . . . . . . . . . . . . . . . . . . . . . 36 | 6.1. Success . . . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
6.2. Unspecified . . . . . . . . . . . . . . . . . . . . . . . 36 | 6.2. Unspecified . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
6.3. Wrong Selected Cipher Suite . . . . . . . . . . . . . . . 36 | 6.3. Wrong Selected Cipher Suite . . . . . . . . . . . . . . . 36 | |||
6.3.1. Cipher Suite Negotiation . . . . . . . . . . . . . . 37 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 38 | |||
6.3.2. Examples . . . . . . . . . . . . . . . . . . . . . . 37 | 7.1. Security Properties . . . . . . . . . . . . . . . . . . . 38 | |||
7. Transferring EDHOC and Deriving an OSCORE Context . . . . . . 38 | 7.2. Cryptographic Considerations . . . . . . . . . . . . . . 40 | |||
7.1. EDHOC Message 4 . . . . . . . . . . . . . . . . . . . . . 38 | 7.3. Cipher Suites and Cryptographic Algorithms . . . . . . . 41 | |||
7.1.1. Formatting of Message 4 . . . . . . . . . . . . . . . 39 | 7.4. Unprotected Data . . . . . . . . . . . . . . . . . . . . 42 | |||
7.1.2. Responder Processing of Message 4 . . . . . . . . . . 39 | 7.5. Denial-of-Service . . . . . . . . . . . . . . . . . . . . 42 | |||
7.1.3. Initiator Processing of Message 4 . . . . . . . . . . 40 | 7.6. Implementation Considerations . . . . . . . . . . . . . . 43 | |||
7.2. Transferring EDHOC in CoAP . . . . . . . . . . . . . . . 40 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 44 | |||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 42 | 8.1. EDHOC Exporter Label . . . . . . . . . . . . . . . . . . 44 | |||
8.1. Security Properties . . . . . . . . . . . . . . . . . . . 42 | 8.2. EDHOC Cipher Suites Registry . . . . . . . . . . . . . . 45 | |||
8.2. Cryptographic Considerations . . . . . . . . . . . . . . 45 | 8.3. EDHOC Method Type Registry . . . . . . . . . . . . . . . 47 | |||
8.3. Cipher Suites and Cryptographic Algorithms . . . . . . . 46 | 8.4. EDHOC Error Codes Registry . . . . . . . . . . . . . . . 47 | |||
8.4. Unprotected Data . . . . . . . . . . . . . . . . . . . . 46 | 8.5. COSE Header Parameters Registry . . . . . . . . . . . . . 47 | |||
8.5. Denial-of-Service . . . . . . . . . . . . . . . . . . . . 47 | 8.6. COSE Header Parameters Registry . . . . . . . . . . . . . 47 | |||
8.6. Implementation Considerations . . . . . . . . . . . . . . 47 | 8.7. COSE Key Common Parameters Registry . . . . . . . . . . . 48 | |||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 49 | 8.8. The Well-Known URI Registry . . . . . . . . . . . . . . . 48 | |||
9.1. EDHOC Exporter Label . . . . . . . . . . . . . . . . . . 49 | 8.9. Media Types Registry . . . . . . . . . . . . . . . . . . 48 | |||
9.2. EDHOC Cipher Suites Registry . . . . . . . . . . . . . . 49 | 8.10. CoAP Content-Formats Registry . . . . . . . . . . . . . . 49 | |||
9.3. EDHOC Method Type Registry . . . . . . . . . . . . . . . 50 | 8.11. EDHOC External Authorization Data . . . . . . . . . . . . 49 | |||
9.4. EDHOC Error Codes Registry . . . . . . . . . . . . . . . 51 | 8.12. Expert Review Instructions . . . . . . . . . . . . . . . 50 | |||
9.5. The Well-Known URI Registry . . . . . . . . . . . . . . . 51 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 50 | |||
9.6. Media Types Registry . . . . . . . . . . . . . . . . . . 51 | 9.1. Normative References . . . . . . . . . . . . . . . . . . 50 | |||
9.7. CoAP Content-Formats Registry . . . . . . . . . . . . . . 52 | 9.2. Informative References . . . . . . . . . . . . . . . . . 53 | |||
9.8. Expert Review Instructions . . . . . . . . . . . . . . . 52 | Appendix A. Use with OSCORE and Transfer over CoAP . . . . . . . 55 | |||
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 53 | A.1. Selecting EDHOC Connection Identifier . . . . . . . . . . 55 | |||
10.1. Normative References . . . . . . . . . . . . . . . . . . 53 | A.2. Deriving the OSCORE Security Context . . . . . . . . . . 56 | |||
10.2. Informative References . . . . . . . . . . . . . . . . . 55 | A.3. Transferring EDHOC over CoAP . . . . . . . . . . . . . . 57 | |||
Appendix A. Compact Representation . . . . . . . . . . . . . . . 58 | Appendix B. Compact Representation . . . . . . . . . . . . . . . 60 | |||
Appendix B. Use of CBOR, CDDL and COSE in EDHOC . . . . . . . . 58 | Appendix C. Use of CBOR, CDDL and COSE in EDHOC . . . . . . . . 60 | |||
B.1. CBOR and CDDL . . . . . . . . . . . . . . . . . . . . . . 59 | C.1. CBOR and CDDL . . . . . . . . . . . . . . . . . . . . . . 60 | |||
B.2. CDDL Definitions . . . . . . . . . . . . . . . . . . . . 59 | C.2. CDDL Definitions . . . . . . . . . . . . . . . . . . . . 61 | |||
B.3. COSE . . . . . . . . . . . . . . . . . . . . . . . . . . 61 | C.3. COSE . . . . . . . . . . . . . . . . . . . . . . . . . . 62 | |||
Appendix C. Test Vectors . . . . . . . . . . . . . . . . . . . . 61 | Appendix D. Test Vectors . . . . . . . . . . . . . . . . . . . . 63 | |||
C.1. Test Vectors for EDHOC Authenticated with Signature Keys | D.1. Test Vectors for EDHOC Authenticated with Signature Keys | |||
(x5t) . . . . . . . . . . . . . . . . . . . . . . . . . . 62 | (x5t) . . . . . . . . . . . . . . . . . . . . . . . . . . 63 | |||
C.1.1. Message_1 . . . . . . . . . . . . . . . . . . . . . . 62 | D.2. Test Vectors for EDHOC Authenticated with Static Diffie- | |||
C.1.2. Message_2 . . . . . . . . . . . . . . . . . . . . . . 63 | Hellman Keys . . . . . . . . . . . . . . . . . . . . . . 81 | |||
C.1.3. Message_3 . . . . . . . . . . . . . . . . . . . . . . 71 | Appendix E. Applicability Template . . . . . . . . . . . . . . . 96 | |||
C.1.4. OSCORE Security Context Derivation . . . . . . . . . 77 | Appendix F. EDHOC Message Deduplication . . . . . . . . . . . . 96 | |||
C.2. Test Vectors for EDHOC Authenticated with Static | Appendix G. Transports Not Natively Providing Correlation . . . 97 | |||
Diffie-Hellman Keys . . . . . . . . . . . . . . . . . . . 79 | Appendix H. Change Log . . . . . . . . . . . . . . . . . . . . . 98 | |||
C.2.1. Message_1 . . . . . . . . . . . . . . . . . . . . . . 80 | Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 101 | |||
C.2.2. Message_2 . . . . . . . . . . . . . . . . . . . . . . 81 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 101 | |||
C.2.3. Message_3 . . . . . . . . . . . . . . . . . . . . . . 87 | ||||
C.2.4. OSCORE Security Context Derivation . . . . . . . . . 92 | ||||
Appendix D. Applicability Template . . . . . . . . . . . . . . . 94 | ||||
Appendix E. EDHOC Message Deduplication . . . . . . . . . . . . 95 | ||||
Appendix F. Change Log . . . . . . . . . . . . . . . . . . . . . 96 | ||||
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 99 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 99 | ||||
1. Introduction | 1. Introduction | |||
1.1. Motivation | 1.1. Motivation | |||
Many Internet of Things (IoT) deployments require technologies which | Many Internet of Things (IoT) deployments require technologies which | |||
are highly performant in constrained environments [RFC7228]. IoT | are highly performant in constrained environments [RFC7228]. IoT | |||
devices may be constrained in various ways, including memory, | devices may be constrained in various ways, including memory, | |||
storage, processing capacity, and power. The connectivity for these | storage, processing capacity, and power. The connectivity for these | |||
settings may also exhibit constraints such as unreliable and lossy | settings may also exhibit constraints such as unreliable and lossy | |||
skipping to change at page 5, line 40 ¶ | skipping to change at page 5, line 18 ¶ | |||
actuators. | actuators. | |||
A typical setting is when one of the endpoints is constrained or in a | A typical setting is when one of the endpoints is constrained or in a | |||
constrained network, and the other endpoint is a node on the Internet | constrained network, and the other endpoint is a node on the Internet | |||
(such as a mobile phone) or at the edge of the constrained network | (such as a mobile phone) or at the edge of the constrained network | |||
(such as a gateway). Thing-to-thing interactions over constrained | (such as a gateway). Thing-to-thing interactions over constrained | |||
networks are also relevant since both endpoints would then benefit | networks are also relevant since both endpoints would then benefit | |||
from the lightweight properties of the protocol. EDHOC could e.g. be | from the lightweight properties of the protocol. EDHOC could e.g. be | |||
run when a device connects for the first time, or to establish fresh | run when a device connects for the first time, or to establish fresh | |||
keys which are not revealed by a later compromise of the long-term | keys which are not revealed by a later compromise of the long-term | |||
keys. Further security properties are described in Section 8.1. | keys. Further security properties are described in Section 7.1. | |||
EDHOC enables the reuse of the same lightweight primitives as OSCORE: | EDHOC enables the reuse of the same lightweight primitives as OSCORE: | |||
CBOR for encoding, COSE for cryptography, and CoAP for transport. By | CBOR for encoding, COSE for cryptography, and CoAP for transport. By | |||
reusing existing libraries the additional code size can be kept very | reusing existing libraries the additional code size can be kept very | |||
low. Note that, while CBOR and COSE primitives are built into the | low. Note that, while CBOR and COSE primitives are built into the | |||
protocol messages, EDHOC is not bound to a particular transport. | protocol messages, EDHOC is not bound to a particular transport. | |||
However, it is recommended to transfer EDHOC messages in CoAP | However, it is recommended to transfer EDHOC messages in CoAP | |||
payloads as is detailed in Section 7.2. | payloads as is detailed in Appendix A.3. | |||
1.3. Message Size Examples | 1.3. Message Size Examples | |||
Compared to the DTLS 1.3 handshake [I-D.ietf-tls-dtls13] with ECDHE | Compared to the DTLS 1.3 handshake [I-D.ietf-tls-dtls13] with ECDHE | |||
and connection ID, the number of bytes in EDHOC + CoAP can be less | and connection ID, the number of bytes in EDHOC + CoAP can be less | |||
than 1/6 when RPK authentication is used, see | than 1/6 when RPK authentication is used, see | |||
[I-D.ietf-lwig-security-protocol-comparison]. Figure 1 shows two | [I-D.ietf-lwig-security-protocol-comparison]. Figure 1 shows two | |||
examples of message sizes for EDHOC with different kinds of | examples of message sizes for EDHOC with different kinds of | |||
authentication keys and different COSE header parameters for | authentication keys and different COSE header parameters for | |||
identification: static Diffie-Hellman keys identified by 'kid' | identification: static Diffie-Hellman keys identified by 'kid' | |||
[I-D.ietf-cose-rfc8152bis-struct], and X.509 signature certificates | [I-D.ietf-cose-rfc8152bis-struct], and X.509 signature certificates | |||
identified by a hash value using 'x5t' [I-D.ietf-cose-x509]. | identified by a hash value using 'x5t' [I-D.ietf-cose-x509]. | |||
================================= | ================================= | |||
kid x5t | kid x5t | |||
--------------------------------- | --------------------------------- | |||
message_1 37 37 | message_1 37 37 | |||
message_2 46 117 | message_2 45 116 | |||
message_3 20 91 | message_3 20 91 | |||
--------------------------------- | --------------------------------- | |||
Total 103 245 | Total 103 245 | |||
================================= | ================================= | |||
Figure 1: Example of message sizes in bytes. | Figure 1: Example of message sizes in bytes. | |||
1.4. Document Structure | 1.4. Document Structure | |||
The remainder of the document is organized as follows: Section 2 | The remainder of the document is organized as follows: Section 2 | |||
outlines EDHOC authenticated with digital signatures, Section 3 | outlines EDHOC authenticated with digital signatures, Section 3 | |||
describes the protocol elements of EDHOC, including message flow, and | describes the protocol elements of EDHOC, including message flow, and | |||
formatting of the ephemeral public keys, Section 4 describes the key | formatting of the ephemeral public keys, Section 4 describes the key | |||
derivation, Section 5 specifies EDHOC with authentication based on | derivation, Section 5 specifies EDHOC with authentication based on | |||
signature keys or static Diffie-Hellman keys, Section 6 specifies the | signature keys or static Diffie-Hellman keys, Section 6 specifies the | |||
EDHOC error message, and Section 7 describes how EDHOC can be | EDHOC error message, and Appendix A describes how EDHOC can be | |||
transferred in CoAP and used to establish an OSCORE security context. | transferred in CoAP and used to establish an OSCORE security context. | |||
1.5. Terminology and Requirements Language | 1.5. Terminology and Requirements Language | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
Readers are expected to be familiar with the terms and concepts | Readers are expected to be familiar with the terms and concepts | |||
described in CBOR [RFC8949], CBOR Sequences [RFC8742], COSE | described in CBOR [RFC8949], CBOR Sequences [RFC8742], COSE | |||
structures and process [I-D.ietf-cose-rfc8152bis-struct], COSE | structures and process [I-D.ietf-cose-rfc8152bis-struct], COSE | |||
algorithms [I-D.ietf-cose-rfc8152bis-algs], and CDDL [RFC8610]. The | algorithms [I-D.ietf-cose-rfc8152bis-algs], and CDDL [RFC8610]. The | |||
Concise Data Definition Language (CDDL) is used to express CBOR data | Concise Data Definition Language (CDDL) is used to express CBOR data | |||
structures [RFC8949]. Examples of CBOR and CDDL are provided in | structures [RFC8949]. Examples of CBOR and CDDL are provided in | |||
Appendix B.1. When referring to CBOR, this specification always | Appendix C.1. When referring to CBOR, this specification always | |||
refer to Deterministically Encoded CBOR as specified in Sections | refer to Deterministically Encoded CBOR as specified in Sections | |||
4.2.1 and 4.2.2 of [RFC8949]. | 4.2.1 and 4.2.2 of [RFC8949]. | |||
The single output from authenticated encryption (including the | The single output from authenticated encryption (including the | |||
authentication tag) is called 'ciphertext', following [RFC5116]. | authentication tag) is called 'ciphertext', following [RFC5116]. | |||
2. EDHOC Outline | 2. EDHOC Outline | |||
EDHOC specifies different authentication methods of the Diffie- | EDHOC specifies different authentication methods of the Diffie- | |||
Hellman key exchange: digital signatures and static Diffie-Hellman | Hellman key exchange: digital signatures and static Diffie-Hellman | |||
skipping to change at page 7, line 47 ¶ | skipping to change at page 7, line 23 ¶ | |||
+-------------------------------------------------------->| | +-------------------------------------------------------->| | |||
| | | | | | |||
Figure 2: Authenticated encryption variant of the SIGMA-I protocol. | Figure 2: Authenticated encryption variant of the SIGMA-I protocol. | |||
The parties exchanging messages are called Initiator (I) and | The parties exchanging messages are called Initiator (I) and | |||
Responder (R). They exchange ephemeral public keys, compute a shared | Responder (R). They exchange ephemeral public keys, compute a shared | |||
secret, and derive symmetric application keys used to protect | secret, and derive symmetric application keys used to protect | |||
application data. | application data. | |||
* G_X and G_Y are the ECDH ephemeral public keys of I and R, | o G_X and G_Y are the ECDH ephemeral public keys of I and R, | |||
respectively. | respectively. | |||
* CRED_I and CRED_R are the credentials containing the public | o CRED_I and CRED_R are the credentials containing the public | |||
authentication keys of I and R, respectively. | authentication keys of I and R, respectively. | |||
* ID_CRED_I and ID_CRED_R are credential identifiers enabling the | o ID_CRED_I and ID_CRED_R are credential identifiers enabling the | |||
recipient party to retrieve the credential of I and R, | recipient party to retrieve the credential of I and R, | |||
respectively. | respectively. | |||
* Sig(I; . ) and Sig(R; . ) denote signatures made with the private | o Sig(I; . ) and Sig(R; . ) denote signatures made with the private | |||
authentication key of I and R, respectively. | authentication key of I and R, respectively. | |||
* AEAD(K; . ) denotes authenticated encryption with additional data | o AEAD(K; . ) denotes authenticated encryption with additional data | |||
using a key K derived from the shared secret. | using a key K derived from the shared secret. | |||
In order to create a "full-fledged" protocol some additional protocol | In order to create a "full-fledged" protocol some additional protocol | |||
elements are needed. EDHOC adds: | elements are needed. EDHOC adds: | |||
* Explicit connection identifiers C_I, C_R chosen by I and R, | o Transcript hashes (hashes of message data) TH_2, TH_3, TH_4 used | |||
respectively, enabling the recipient to find the protocol state. | ||||
* Transcript hashes (hashes of message data) TH_2, TH_3, TH_4 used | ||||
for key derivation and as additional authenticated data. | for key derivation and as additional authenticated data. | |||
* Computationally independent keys derived from the ECDH shared | o Computationally independent keys derived from the ECDH shared | |||
secret and used for authenticated encryption of different | secret and used for authenticated encryption of different | |||
messages. | messages. | |||
* An optional fourth message giving explicit key confirmation to I | o An optional fourth message giving explicit key confirmation to I | |||
in deployments where no protected application data is sent from R | in deployments where no protected application data is sent from R | |||
to I. | to I. | |||
* A key material exporter and a key update function enabling | o A key material exporter and a key update function enabling | |||
frequent forward secrecy. | frequent forward secrecy. | |||
* Verification of a common preferred cipher suite: | o Verification of a common preferred cipher suite: | |||
- The Initiator lists supported cipher suites in order of | * The Initiator lists supported cipher suites in order of | |||
preference | preference | |||
- The Responder verifies that the selected cipher suite is the | * The Responder verifies that the selected cipher suite is the | |||
first supported cipher suite (or else rejects and states | first supported cipher suite (or else rejects and states | |||
supported cipher suites). | supported cipher suites). | |||
* Method types and error handling. | o Method types and error handling. | |||
* Transport of external authorization data. | o Selection of connection identifiers C_I and C_R which may be used | |||
to identify established keys or protocol state. | ||||
o Transport of external authorization data. | ||||
EDHOC is designed to encrypt and integrity protect as much | EDHOC is designed to encrypt and integrity protect as much | |||
information as possible, and all symmetric keys are derived using as | information as possible, and all symmetric keys are derived using as | |||
much previous information as possible. EDHOC is furthermore designed | much previous information as possible. EDHOC is furthermore designed | |||
to be as compact and lightweight as possible, in terms of message | to be as compact and lightweight as possible, in terms of message | |||
sizes, processing, and the ability to reuse already existing CBOR, | sizes, processing, and the ability to reuse already existing CBOR, | |||
COSE, and CoAP libraries. | COSE, and CoAP libraries. | |||
To simplify for implementors, the use of CBOR and COSE in EDHOC is | To simplify for implementors, the use of CBOR and COSE in EDHOC is | |||
summarized in Appendix B and test vectors including CBOR diagnostic | summarized in Appendix C and test vectors including CBOR diagnostic | |||
notation are given in Appendix C. | notation are given in Appendix D. | |||
3. Protocol Elements | 3. Protocol Elements | |||
3.1. General | 3.1. General | |||
An EDHOC message flow consists of three mandatory messages | An EDHOC message flow consists of three mandatory messages | |||
(message_1, message_2, message_3) between Initiator and Responder, an | (message_1, message_2, message_3) between Initiator and Responder, an | |||
optional fourth message (message_4), plus an EDHOC error message. | optional fourth message (message_4), plus an EDHOC error message. | |||
EDHOC messages are CBOR Sequences [RFC8742], see Figure 3. The | EDHOC messages are CBOR Sequences [RFC8742], see Figure 3. The | |||
protocol elements in the figure are introduced in the following | protocol elements in the figure are introduced in the following | |||
sections. Message formatting and processing is specified in | sections. Message formatting and processing is specified in | |||
Section 5 and Section 6. An implementation may support only | Section 5 and Section 6. An implementation may support only | |||
Initiator or only Responder. | Initiator or only Responder. | |||
Application data is protected using the agreed application algorithms | Application data is protected using the agreed application algorithms | |||
(AEAD, hash) in the selected cipher suite (see Section 3.4) and the | (AEAD, hash) in the selected cipher suite (see Section 3.6) and the | |||
application can make use of the established connection identifiers | application can make use of the established connection identifiers | |||
C_1, C_I, and C_R (see Section 3.2.4). EDHOC may be used with the | C_I and C_R (see Section 3.3). EDHOC may be used with the media type | |||
media type application/edhoc defined in Section 9. | application/edhoc defined in Section 8. | |||
The Initiator can derive symmetric application keys after creating | The Initiator can derive symmetric application keys after creating | |||
EDHOC message_3, see Section 4.1. Application protected data can | EDHOC message_3, see Section 4.1. Application protected data can | |||
therefore be sent in parallel or together with EDHOC message_3. | therefore be sent in parallel or together with EDHOC message_3. | |||
Initiator Responder | Initiator Responder | |||
| C_1, METHOD_CORR, SUITES_I, G_X, C_I, EAD_1 | | | METHOD, SUITES_I, G_X, C_I, EAD_1 | | |||
+------------------------------------------------------------------>| | +------------------------------------------------------------------>| | |||
| message_1 | | | message_1 | | |||
| | | | | | |||
| C_I, G_Y, C_R, Enc(ID_CRED_R, Signature_or_MAC_2, EAD_2) | | | G_Y, C_R, Enc(ID_CRED_R, Signature_or_MAC_2, EAD_2) | | |||
|<------------------------------------------------------------------+ | |<------------------------------------------------------------------+ | |||
| message_2 | | | message_2 | | |||
| | | | | | |||
| C_R, AEAD(K_3ae; ID_CRED_I, Signature_or_MAC_3, EAD_3) | | | AEAD(K_3ae; ID_CRED_I, Signature_or_MAC_3, EAD_3) | | |||
+------------------------------------------------------------------>| | +------------------------------------------------------------------>| | |||
| message_3 | | | message_3 | | |||
Figure 3: EDHOC Message Flow | Figure 3: EDHOC Message Flow | |||
3.2. Method and Correlation | ||||
The data item METHOD_CORR in message_1 (see Section 5.3.1), is an | ||||
integer specifying the method and the correlation properties of the | ||||
transport, which are described in this section. | ||||
3.2.1. Method | 3.2. Method | |||
EDHOC supports authentication with signature or static Diffie-Hellman | The data item METHOD in message_1 (see Section 5.2.1), is an integer | |||
keys, as defined in the four authentication methods: 0, 1, 2, and 3, | specifying the authentication method. EDHOC supports authentication | |||
see Figure 4. (Method 0 corresponds to the case outlined in | with signature or static Diffie-Hellman keys, as defined in the four | |||
Section 2 where both Initiator and Responder authenticate with | authentication methods: 0, 1, 2, and 3, see Figure 4. (Method 0 | |||
signature keys.) | corresponds to the case outlined in Section 2 where both Initiator | |||
and Responder authenticate with signature keys.) | ||||
An implementation may support only a single method. The Initiator | An implementation may support only a single method. The Initiator | |||
and the Responder need to have agreed on a single method to be used | and the Responder need to have agreed on a single method to be used | |||
for EDHOC, see Section 3.7. | for EDHOC, see Section 3.9. | |||
+-------+-------------------+-------------------+-------------------+ | +-------+-------------------+-------------------+-------------------+ | |||
| Value | Initiator | Responder | Reference | | | Value | Initiator | Responder | Reference | | |||
+-------+-------------------+-------------------+-------------------+ | +-------+-------------------+-------------------+-------------------+ | |||
| 0 | Signature Key | Signature Key | [[this document]] | | | 0 | Signature Key | Signature Key | [[this document]] | | |||
| 1 | Signature Key | Static DH Key | [[this document]] | | | 1 | Signature Key | Static DH Key | [[this document]] | | |||
| 2 | Static DH Key | Signature Key | [[this document]] | | | 2 | Static DH Key | Signature Key | [[this document]] | | |||
| 3 | Static DH Key | Static DH Key | [[this document]] | | | 3 | Static DH Key | Static DH Key | [[this document]] | | |||
+-------+-------------------+-------------------+-------------------+ | +-------+-------------------+-------------------+-------------------+ | |||
Figure 4: Method Types | Figure 4: Method Types | |||
3.2.2. Connection Identifiers | 3.3. Connection Identifiers | |||
EDHOC includes optional connection identifiers (C_1, C_I, C_R). The | EDHOC includes the selection of connection identifiers (C_I, C_R) | |||
connection identifiers C_1, C_I, and C_R do not have any | identifying a connection for which keys are agreed. Connection | |||
cryptographic purpose in EDHOC. They contain information | identifiers may be used in the ongoing EDHOC protocol (see | |||
facilitating retrieval of the protocol state and may therefore be | Section 3.3.2) or in a subsequent application protocol, e.g., OSCORE | |||
very short. C_1 is always set to "null", while C_I and C_R are | (see Section 3.3.3). The connection identifiers do not have any | |||
chosen by I and R, respectively. One byte connection identifiers are | cryptographic purpose in EDHOC. | |||
realistic in many scenarios as most constrained devices only have a | ||||
few connections. In cases where a node only has one connection, the | ||||
identifiers may even be the empty byte string. | ||||
The connection identifier MAY be used with an application protocol | Connection identifiers in EDHOC are byte strings or integers, encoded | |||
(e.g. OSCORE) for which EDHOC establishes keys, in which case the | in CBOR. One byte connection identifiers (the integers -24 to 23 and | |||
connection identifiers SHALL adhere to the requirements for that | the empty bytestring h'') are realistic in many scenarios as most | |||
protocol. Each party choses a connection identifier it desires the | constrained devices only have a few connections. | |||
other party to use in outgoing messages. (For OSCORE this results in | ||||
the endpoint selecting its Recipient ID, see Section 3.1 of | ||||
[RFC8613]). | ||||
3.2.3. Transport | 3.3.1. Selection of Connection Identifiers | |||
C_I and C_R are chosen by I and R, respectively. The Initiator | ||||
selects C_I and sends it in message_1 for the Responder to use as a | ||||
reference to the connection in communications with the Initiator. | ||||
The Responder selects C_R and sends in message_2 for the Initiator to | ||||
use as a reference to the connection in communications with the | ||||
Responder. | ||||
If connection identifiers are used by an application protocol for | ||||
which EDHOC establishes keys then the selected connection identifiers | ||||
SHALL adhere to the requirements for that protocol, see Section 3.3.3 | ||||
for an example. | ||||
3.3.2. Use of Connection Identifiers in EDHOC | ||||
Connection identifiers may be used to correlate EDHOC messages and | ||||
facilitate the retrieval of protocol state during EDHOC protocol | ||||
execution. EDHOC transports that do not inherently provide | ||||
correlation across all messages of an exchange can send connection | ||||
identifiers along with EDHOC messages to gain that required | ||||
capability, see Section 3.4. For an example when CoAP is used as | ||||
transport, see Appendix A.3. | ||||
3.3.3. Use of Connection Identifiers in OSCORE | ||||
For OSCORE, the choice of a connection identifier results in the | ||||
endpoint selecting its Recipient ID, see Section 3.1 of [RFC8613]), | ||||
for which certain uniqueness requirements apply, see Section 3.3 of | ||||
[RFC8613]). Therefore the Initiator and the Responder MUST NOT | ||||
select connection identifiers such that it results in same OSCORE | ||||
Recipient ID. Since the Recipient ID is a byte string and a EDHOC | ||||
connection identifier is either a CBOR byte string or a CBOR integer, | ||||
care must be taken when selecting the connection identifiers and | ||||
converting them to Recipient IDs. A mapping from EDHOC connection | ||||
identifier to OSCORE Recipient ID is specified in Appendix A.1. | ||||
3.4. Transport | ||||
Cryptographically, EDHOC does not put requirements on the lower | Cryptographically, EDHOC does not put requirements on the lower | |||
layers. EDHOC is not bound to a particular transport layer, and can | layers. EDHOC is not bound to a particular transport layer, and can | |||
be used in environments without IP. The application using EDHOC is | even be used in environments without IP. The transport is | |||
responsible to handle message loss, reordering, message duplication, | responsible, where necessary, to handle: | |||
fragmentation, demultiplex EDHOC messages from other types of | ||||
messages, and denial of service protection, where necessary. | ||||
The Initiator and the Responder need to have agreed on a transport to | o message loss, | |||
be used for EDHOC, see Section 3.7. It is recommended to transport | ||||
EDHOC in CoAP payloads, see Section 7. | ||||
3.2.4. Message Correlation | o message reordering, | |||
If the whole transport path provides a mechanism for correlating | o message duplication, | |||
messages received with messages previously sent, then some of the | ||||
connection identifiers may be omitted. There are four cases: | ||||
* corr = 0, the transport does not provide a correlation mechanism. | o fragmentation, | |||
* corr = 1, the transport provides a correlation mechanism that | o demultiplex EDHOC messages from other types of messages, and | |||
enables the Responder to correlate message_2 and message_1 as well | ||||
as message_4 and message_3. | ||||
* corr = 2, the transport provides a correlation mechanism that | o denial of service protection. | |||
enables the Initiator to correlate message_3 and message_2. | ||||
* corr = 3, the transport provides a correlation mechanism that | Besides these common transport oriented properties, EDHOC transport | |||
enables both parties to correlate all three messages. | additionally needs to support the correlation between EDHOC messages, | |||
including an indication of a message being message_1. The | ||||
correlation may reuse existing mechanisms in the transport protocol. | ||||
For example, the CoAP Token may be used to correlate EDHOC messages | ||||
in a CoAP response and an associated CoAP request. In the absense of | ||||
correlation between a message received and a message previously sent | ||||
inherent to the transport, the EDHOC connection identifiers may be | ||||
added, e.g. by prepending the appropriate connection identifier (when | ||||
available from the EDHOC protocol) to the EDHOC message. Transport | ||||
of EDHOC in CoAP payloads is described in Appendix A.3, which also | ||||
shows how to use connection identifiers and message_1 indication with | ||||
CoAP. | ||||
For example, if the key exchange is transported over CoAP, the CoAP | The Initiator and the Responder need to have agreed on a transport to | |||
Token can be used to correlate messages, see Section 7.2. | be used for EDHOC, see Section 3.9. | |||
3.3. Authentication Parameters | 3.5. Authentication Parameters | |||
3.3.1. Authentication Keys | 3.5.1. Authentication Keys | |||
The authentication key MUST be a signature key or static Diffie- | The authentication key MUST be a signature key or static Diffie- | |||
Hellman key. The Initiator and the Responder MAY use different types | Hellman key. The Initiator and the Responder MAY use different types | |||
of authentication keys, e.g. one uses a signature key and the other | of authentication keys, e.g. one uses a signature key and the other | |||
uses a static Diffie-Hellman key. When using a signature key, the | uses a static Diffie-Hellman key. When using a signature key, the | |||
authentication is provided by a signature. When using a static | authentication is provided by a signature. When using a static | |||
Diffie-Hellman key the authentication is provided by a Message | Diffie-Hellman key the authentication is provided by a Message | |||
Authentication Code (MAC) computed from an ephemeral-static ECDH | Authentication Code (MAC) computed from an ephemeral-static ECDH | |||
shared secret which enables significant reductions in message sizes. | shared secret which enables significant reductions in message sizes. | |||
The MAC is implemented with an AEAD algorithm. When using static | The MAC is implemented with an AEAD algorithm. When using static | |||
Diffie-Hellman keys the Initiator's and Responder's private | Diffie-Hellman keys the Initiator's and Responder's private | |||
authentication keys are called I and R, respectively, and the public | authentication keys are called I and R, respectively, and the public | |||
authentication keys are called G_I and G_R, respectively. The | authentication keys are called G_I and G_R, respectively. The | |||
authentication key algorithm needs to specified with enough | authentication key algorithm needs to specified with enough | |||
parameters to make it completely determined. Note that for most | parameters to make it completely determined. Note that for most | |||
signature algorithms, the signature is determined by the signature | signature algorithms, the signature is determined by the signature | |||
algorithm and the authentication key algorithm together. For | algorithm and the authentication key algorithm together. For | |||
example, the curve used in the signature is typically determined by | example, the curve used in the signature is typically determined by | |||
the authentication key parameters. | the authentication key parameters. | |||
skipping to change at page 12, line 13 ¶ | skipping to change at page 12, line 16 ¶ | |||
Diffie-Hellman keys the Initiator's and Responder's private | Diffie-Hellman keys the Initiator's and Responder's private | |||
authentication keys are called I and R, respectively, and the public | authentication keys are called I and R, respectively, and the public | |||
authentication keys are called G_I and G_R, respectively. The | authentication keys are called G_I and G_R, respectively. The | |||
authentication key algorithm needs to specified with enough | authentication key algorithm needs to specified with enough | |||
parameters to make it completely determined. Note that for most | parameters to make it completely determined. Note that for most | |||
signature algorithms, the signature is determined by the signature | signature algorithms, the signature is determined by the signature | |||
algorithm and the authentication key algorithm together. For | algorithm and the authentication key algorithm together. For | |||
example, the curve used in the signature is typically determined by | example, the curve used in the signature is typically determined by | |||
the authentication key parameters. | the authentication key parameters. | |||
* Only the Responder SHALL have access to the Responder's private | o Only the Responder SHALL have access to the Responder's private | |||
authentication key. | authentication key. | |||
* Only the Initiator SHALL have access to the Initiator's private | o Only the Initiator SHALL have access to the Initiator's private | |||
authentication key. | authentication key. | |||
3.3.2. Identities | 3.5.2. Identities | |||
EDHOC assumes the existence of mechanisms (certification authority, | EDHOC assumes the existence of mechanisms (certification authority, | |||
trusted third party, manual distribution, etc.) for specifying and | trusted third party, manual distribution, etc.) for specifying and | |||
distributing authentication keys and identities. Policies are set | distributing authentication keys and identities. Policies are set | |||
based on the identity of the other party, and parties typically only | based on the identity of the other party, and parties typically only | |||
allow connections from a specific identity or a small restricted set | allow connections from a specific identity or a small restricted set | |||
of identities. For example, in the case of a device connecting to a | of identities. For example, in the case of a device connecting to a | |||
network, the network may only allow connections from devices which | network, the network may only allow connections from devices which | |||
authenticate with certificates having a particular range of serial | authenticate with certificates having a particular range of serial | |||
numbers in the subject field and signed by a particular CA. On the | numbers in the subject field and signed by a particular CA. On the | |||
other side, the device may only be allowed to connect to a network | other side, the device may only be allowed to connect to a network | |||
which authenticates with a particular public key (information of | which authenticates with a particular public key (information of | |||
which may be provisioned, e.g., out of band or in the external | which may be provisioned, e.g., out of band or in the external | |||
authorization data, see Section 3.6). | authorization data, see Section 3.8). | |||
The EDHOC implementation must be able to receive and enforce | The EDHOC implementation must be able to receive and enforce | |||
information from the application about what is the intended endpoint, | information from the application about what is the intended endpoint, | |||
and in particular whether it is a specific identity or a set of | and in particular whether it is a specific identity or a set of | |||
identities. | identities. | |||
* When a Public Key Infrastructure (PKI) is used, the trust anchor | o When a Public Key Infrastructure (PKI) is used, the trust anchor | |||
is a Certification Authority (CA) certificate, and the identity is | is a Certification Authority (CA) certificate, and the identity is | |||
the subject whose unique name (e.g. a domain name, NAI, or EUI) is | the subject whose unique name (e.g. a domain name, NAI, or EUI) is | |||
included in the endpoint's certificate. Before running EDHOC each | included in the endpoint's certificate. Before running EDHOC each | |||
party needs at least one CA public key certificate, or just the | party needs at least one CA public key certificate, or just the | |||
public key, and a specific identity or set of identities it is | public key, and a specific identity or set of identities it is | |||
allowed to communicate with. Only validated public-key | allowed to communicate with. Only validated public-key | |||
certificates with an allowed subject name, as specified by the | certificates with an allowed subject name, as specified by the | |||
application, are to be accepted. EDHOC provides proof that the | application, are to be accepted. EDHOC provides proof that the | |||
other party possesses the private authentication key corresponding | other party possesses the private authentication key corresponding | |||
to the public authentication key in its certificate. The | to the public authentication key in its certificate. The | |||
certification path provides proof that the subject of the | certification path provides proof that the subject of the | |||
certificate owns the public key in the certificate. | certificate owns the public key in the certificate. | |||
* When public keys are used but not with a PKI (RPK, self-signed | o When public keys are used but not with a PKI (RPK, self-signed | |||
certificate), the trust anchor is the public authentication key of | certificate), the trust anchor is the public authentication key of | |||
the other party. In this case, the identity is typically directly | the other party. In this case, the identity is typically directly | |||
associated to the public authentication key of the other party. | associated to the public authentication key of the other party. | |||
For example, the name of the subject may be a canonical | For example, the name of the subject may be a canonical | |||
representation of the public key. Alternatively, if identities | representation of the public key. Alternatively, if identities | |||
can be expressed in the form of unique subject names assigned to | can be expressed in the form of unique subject names assigned to | |||
public keys, then a binding to identity can be achieved by | public keys, then a binding to identity can be achieved by | |||
including both public key and associated subject name in the | including both public key and associated subject name in the | |||
protocol message computation: CRED_I or CRED_R may be a self- | protocol message computation: CRED_I or CRED_R may be a self- | |||
signed certificate or COSE_Key containing the public | signed certificate or COSE_Key containing the public | |||
authentication key and the subject name, see Section 3.3.3. | authentication key and the subject name, see Section 3.5.3. | |||
Before running EDHOC, each endpoint needs a specific public | Before running EDHOC, each endpoint needs a specific public | |||
authentication key/unique associated subject name, or a set of | authentication key/unique associated subject name, or a set of | |||
public authentication keys/unique associated subject names, which | public authentication keys/unique associated subject names, which | |||
it is allowed to communicate with. EDHOC provides proof that the | it is allowed to communicate with. EDHOC provides proof that the | |||
other party possesses the private authentication key corresponding | other party possesses the private authentication key corresponding | |||
to the public authentication key. | to the public authentication key. | |||
3.3.3. Authentication Credentials | 3.5.3. Authentication Credentials | |||
The authentication credentials, CRED_I and CRED_R, contain the public | The authentication credentials, CRED_I and CRED_R, contain the public | |||
authentication key of the Initiator and the Responder, respectively. | authentication key of the Initiator and the Responder, respectively. | |||
The Initiator and the Responder MAY use different types of | The Initiator and the Responder MAY use different types of | |||
credentials, e.g. one uses an RPK and the other uses a public key | credentials, e.g. one uses an RPK and the other uses a public key | |||
certificate. | certificate. | |||
The credentials CRED_I and CRED_R are signed or MAC:ed (depending on | The credentials CRED_I and CRED_R are signed or MAC:ed (depending on | |||
method) by the Initiator and the Responder, respectively, see | method) by the Initiator and the Responder, respectively, see | |||
Section 5.5 and Section 5.4. | Section 5.4 and Section 5.3. | |||
When the credential is a certificate, CRED_x is an end-entity | When the credential is a certificate, CRED_x is an end-entity | |||
certificate (i.e. not the certificate chain) encoded as a CBOR bstr. | certificate (i.e. not the certificate chain) encoded as a CBOR bstr. | |||
In X.509 certificates, signature keys typically have key usage | In X.509 certificates, signature keys typically have key usage | |||
"digitalSignature" and Diffie-Hellman keys typically have key usage | "digitalSignature" and Diffie-Hellman keys typically have key usage | |||
"keyAgreement". | "keyAgreement". | |||
To prevent misbinding attacks in systems where an attacker can | To prevent misbinding attacks in systems where an attacker can | |||
register public keys without proving knowledge of the private key, | register public keys without proving knowledge of the private key, | |||
SIGMA [SIGMA] enforces a MAC to be calculated over the "Identity", | SIGMA [SIGMA] enforces a MAC to be calculated over the "Identity", | |||
skipping to change at page 14, line 32 ¶ | skipping to change at page 14, line 19 ¶ | |||
key, and optionally the "Identity". CRED_x needs to be defined such | key, and optionally the "Identity". CRED_x needs to be defined such | |||
that it is identical when generated by Initiator or Responder. The | that it is identical when generated by Initiator or Responder. The | |||
parameters SHALL be encoded in bytewise lexicographic order of their | parameters SHALL be encoded in bytewise lexicographic order of their | |||
deterministic encodings as specified in Section 4.2.1 of [RFC8949]. | deterministic encodings as specified in Section 4.2.1 of [RFC8949]. | |||
If the parties have agreed on an identity besides the public key, the | If the parties have agreed on an identity besides the public key, the | |||
identity is included in the CBOR map with the label "subject name", | identity is included in the CBOR map with the label "subject name", | |||
otherwise the subject name is the empty text string. The public key | otherwise the subject name is the empty text string. The public key | |||
parameters depend on key type. | parameters depend on key type. | |||
* For COSE_Keys of type OKP the CBOR map SHALL, except for subject | o For COSE_Keys of type OKP the CBOR map SHALL, except for subject | |||
name, only include the parameters 1 (kty), -1 (crv), and -2 | name, only include the parameters 1 (kty), -1 (crv), and -2 | |||
(x-coordinate). | (x-coordinate). | |||
* For COSE_Keys of type EC2 the CBOR map SHALL, except for subject | o For COSE_Keys of type EC2 the CBOR map SHALL, except for subject | |||
name, only include the parameters 1 (kty), -1 (crv), -2 | name, only include the parameters 1 (kty), -1 (crv), -2 | |||
(x-coordinate), and -3 (y-coordinate). | (x-coordinate), and -3 (y-coordinate). | |||
An example of CRED_x when the RPK contains an X25519 static Diffie- | An example of CRED_x when the RPK contains an X25519 static Diffie- | |||
Hellman key and the parties have agreed on an EUI-64 identity is | Hellman key and the parties have agreed on an EUI-64 identity is | |||
shown below: | shown below: | |||
CRED_x = { | CRED_x = { | |||
1: 1, | 1: 1, | |||
-1: 4, | -1: 4, | |||
-2: h'b1a3e89460e88d3a8d54211dc95f0b90 | -2: h'b1a3e89460e88d3a8d54211dc95f0b90 | |||
3ff205eb71912d6db8f4af980d2db83a', | 3ff205eb71912d6db8f4af980d2db83a', | |||
"subject name" : "42-50-31-FF-EF-37-32-39" | "subject name" : "42-50-31-FF-EF-37-32-39" | |||
} | } | |||
3.3.4. Identification of Credentials | 3.5.4. Identification of Credentials | |||
ID_CRED_I and ID_CRED_R are used to identify and optionally transport | ID_CRED_I and ID_CRED_R are used to identify and optionally transport | |||
the public authentication keys of the Initiator and the Responder, | the public authentication keys of the Initiator and the Responder, | |||
respectively. ID_CRED_I and ID_CRED_R do not have any cryptographic | respectively. ID_CRED_I and ID_CRED_R do not have any cryptographic | |||
purpose in EDHOC. | purpose in EDHOC. | |||
* ID_CRED_R is intended to facilitate for the Initiator to retrieve | o ID_CRED_R is intended to facilitate for the Initiator to retrieve | |||
the Responder's public authentication key. | the Responder's public authentication key. | |||
* ID_CRED_I is intended to facilitate for the Responder to retrieve | o ID_CRED_I is intended to facilitate for the Responder to retrieve | |||
the Initiator's public authentication key. | the Initiator's public authentication key. | |||
The identifiers ID_CRED_I and ID_CRED_R are COSE header_maps, i.e. | The identifiers ID_CRED_I and ID_CRED_R are COSE header_maps, i.e. | |||
CBOR maps containing Common COSE Header Parameters, see Section 3.1 | CBOR maps containing Common COSE Header Parameters, see Section 3.1 | |||
of [I-D.ietf-cose-rfc8152bis-struct]). In the following we give some | of [I-D.ietf-cose-rfc8152bis-struct]). In the following we give some | |||
examples of COSE header_maps. | examples of COSE header_maps. | |||
Raw public keys are most optimally stored as COSE_Key objects and | Raw public keys are most optimally stored as COSE_Key objects and | |||
identified with a 'kid' parameter: | identified with a 'kid2' parameter (see Section 8.6 and Section 8.7): | |||
* ID_CRED_x = { 4 : kid_x }, where kid_x : bstr, for x = I or R. | o ID_CRED_x = { 4 : kid_x }, where kid_x : bstr / int, for x = I or | |||
R. | ||||
Note that the integers -24 to 23 and the empty bytestring h'' are | ||||
encoded as one byte. | ||||
Public key certificates can be identified in different ways. Header | Public key certificates can be identified in different ways. Header | |||
parameters for identifying C509 certificates and X.509 certificates | parameters for identifying C509 certificates and X.509 certificates | |||
are defined in [I-D.ietf-cose-cbor-encoded-cert] and | are defined in [I-D.ietf-cose-cbor-encoded-cert] and | |||
[I-D.ietf-cose-x509], for example: | [I-D.ietf-cose-x509], for example: | |||
* by a hash value with the 'c5t' or 'x5t' parameters; | o by a hash value with the 'c5t' or 'x5t' parameters; | |||
- ID_CRED_x = { 34 : COSE_CertHash }, for x = I or R, | * ID_CRED_x = { 34 : COSE_CertHash }, for x = I or R, | |||
- ID_CRED_x = { TDB3 : COSE_CertHash }, for x = I or R, | * ID_CRED_x = { TDB3 : COSE_CertHash }, for x = I or R, | |||
* by a URI with the 'c5u' or 'x5u' parameters; | o by a URI with the 'c5u' or 'x5u' parameters; | |||
- ID_CRED_x = { 35 : uri }, for x = I or R, | * ID_CRED_x = { 35 : uri }, for x = I or R, | |||
- ID_CRED_x = { TBD4 : uri }, for x = I or R, | * ID_CRED_x = { TBD4 : uri }, for x = I or R, | |||
* ID_CRED_x MAY contain the actual credential used for | o ID_CRED_x MAY contain the actual credential used for | |||
authentication, CRED_x. For example, a certificate chain can be | authentication, CRED_x. For example, a certificate chain can be | |||
transported in ID_CRED_x with COSE header parameter c5c or | transported in ID_CRED_x with COSE header parameter c5c or | |||
x5chain, defined in [I-D.ietf-cose-cbor-encoded-cert] and | x5chain, defined in [I-D.ietf-cose-cbor-encoded-cert] and | |||
[I-D.ietf-cose-x509]. | [I-D.ietf-cose-x509]. | |||
It is RECOMMENDED that ID_CRED_x uniquely identify the public | It is RECOMMENDED that ID_CRED_x uniquely identify the public | |||
authentication key as the recipient may otherwise have to try several | authentication key as the recipient may otherwise have to try several | |||
keys. ID_CRED_I and ID_CRED_R are transported in the 'ciphertext', | keys. ID_CRED_I and ID_CRED_R are transported in the 'ciphertext', | |||
see Section 5.5 and Section 5.4. | see Section 5.4 and Section 5.3. | |||
When ID_CRED_x does not contain the actual credential it may be very | When ID_CRED_x does not contain the actual credential it may be very | |||
short. One byte credential identifiers are realistic in many | short. One byte credential identifiers are realistic in many | |||
scenarios as most constrained devices only have a few keys. In cases | scenarios as most constrained devices only have a few keys. In cases | |||
where a node only has one key, the identifier may even be the empty | where a node only has one key, the identifier may even be the empty | |||
byte string. | byte string. | |||
3.4. Cipher Suites | 3.6. Cipher Suites | |||
An EDHOC cipher suite consists of an ordered set of algorithms from | An EDHOC cipher suite consists of an ordered set of algorithms from | |||
the "COSE Algorithms" and "COSE Elliptic Curves" registries. | the "COSE Algorithms" and "COSE Elliptic Curves" registries. | |||
Algorithms need to be specified with enough parameters to make them | Algorithms need to be specified with enough parameters to make them | |||
completely determined. Currently, none of the algorithms require | completely determined. Currently, none of the algorithms require | |||
parameters. EDHOC is only specified for use with key exchange | parameters. EDHOC is only specified for use with key exchange | |||
algorithms of type ECDH curves. Use with other types of key exchange | algorithms of type ECDH curves. Use with other types of key exchange | |||
algorithms would likely require a specification updating EDHOC. Note | algorithms would likely require a specification updating EDHOC. Note | |||
that for most signature algorithms, the signature is determined by | that for most signature algorithms, the signature is determined by | |||
the signature algorithm and the authentication key algorithm | the signature algorithm and the authentication key algorithm | |||
together, see Section 3.3.1. | together, see Section 3.5.1. | |||
* EDHOC AEAD algorithm | o EDHOC AEAD algorithm | |||
* EDHOC hash algorithm | o EDHOC hash algorithm | |||
* EDHOC key exchange algorithm (ECDH curve) | o EDHOC key exchange algorithm (ECDH curve) | |||
* EDHOC signature algorithm | o EDHOC signature algorithm | |||
* Application AEAD algorithm | o Application AEAD algorithm | |||
* Application hash algorithm | o Application hash algorithm | |||
Each cipher suite is identified with a pre-defined int label. | Each cipher suite is identified with a pre-defined int label. | |||
EDHOC can be used with all algorithms and curves defined for COSE. | EDHOC can be used with all algorithms and curves defined for COSE. | |||
Implementation can either use one of the pre-defined cipher suites | Implementation can either use one of the pre-defined cipher suites | |||
(Section 9.2) or use any combination of COSE algorithms and | (Section 8.2) or use any combination of COSE algorithms and | |||
parameters to define their own private cipher suite. Private cipher | parameters to define their own private cipher suite. Private cipher | |||
suites can be identified with any of the four values -24, -23, -22, | suites can be identified with any of the four values -24, -23, -22, | |||
-21. | -21. | |||
The following cipher suites are for constrained IoT where message | The following CCM cipher suites are for constrained IoT where message | |||
overhead is a very important factor: | overhead is a very important factor. Cipher suites 1 and 3 use a | |||
larger tag length (128-bit) in the EDHOC AEAD algorithm than the | ||||
Application AEAD algorithm (64-bit): | ||||
0. ( 10, -16, 4, -8, 10, -16 ) | 0. ( 10, -16, 4, -8, 10, -16 ) | |||
(AES-CCM-16-64-128, SHA-256, X25519, EdDSA, | (AES-CCM-16-64-128, SHA-256, X25519, EdDSA, | |||
AES-CCM-16-64-128, SHA-256) | AES-CCM-16-64-128, SHA-256) | |||
1. ( 30, -16, 4, -8, 10, -16 ) | 1. ( 30, -16, 4, -8, 10, -16 ) | |||
(AES-CCM-16-128-128, SHA-256, X25519, EdDSA, | (AES-CCM-16-128-128, SHA-256, X25519, EdDSA, | |||
AES-CCM-16-64-128, SHA-256) | AES-CCM-16-64-128, SHA-256) | |||
2. ( 10, -16, 1, -7, 10, -16 ) | 2. ( 10, -16, 1, -7, 10, -16 ) | |||
(AES-CCM-16-64-128, SHA-256, P-256, ES256, | (AES-CCM-16-64-128, SHA-256, P-256, ES256, | |||
AES-CCM-16-64-128, SHA-256) | AES-CCM-16-64-128, SHA-256) | |||
3. ( 30, -16, 1, -7, 10, -16 ) | 3. ( 30, -16, 1, -7, 10, -16 ) | |||
(AES-CCM-16-128-128, SHA-256, P-256, ES256, | (AES-CCM-16-128-128, SHA-256, P-256, ES256, | |||
AES-CCM-16-64-128, SHA-256) | AES-CCM-16-64-128, SHA-256) | |||
The following cipher suite is for general non-constrained | The following ChaCha20 cipher suites are for less constrained | |||
applications. It uses very high performance algorithms that also are | applications and only use 128-bit tag lengths. | |||
widely supported: | ||||
4. ( 1, -16, 4, -7, 1, -16 ) | 4. ( 24, -16, 4, -8, 24, -16 ) | |||
(ChaCha20/Poly1305, SHA-256, X25519, EdDSA, | ||||
ChaCha20/Poly1305, SHA-256) | ||||
5. ( 24, -16, 1, -7, 24, -16 ) | ||||
(ChaCha20/Poly1305, SHA-256, P-256, ES256, | ||||
ChaCha20/Poly1305, SHA-256) | ||||
The following GCM cipher suite is for general non-constrained | ||||
applications. It uses high performance algorithms that are widely | ||||
supported: | ||||
6. ( 1, -16, 4, -7, 1, -16 ) | ||||
(A128GCM, SHA-256, X25519, ES256, | (A128GCM, SHA-256, X25519, ES256, | |||
A128GCM, SHA-256) | A128GCM, SHA-256) | |||
The following cipher suite is for high security application such as | The following two cipher suites are for high security application | |||
government use and financial applications. It is compatible with the | such as government use and financial applications. The two cipher | |||
CNSA suite [CNSA]. | suites do not share any algorithms. The first of the two cipher | |||
suites is compatible with the CNSA suite [CNSA]. | ||||
5. ( 3, -43, 2, -35, 3, -43 ) | 24. ( 3, -43, 2, -35, 3, -43 ) | |||
(A256GCM, SHA-384, P-384, ES384, | (A256GCM, SHA-384, P-384, ES384, | |||
A256GCM, SHA-384) | A256GCM, SHA-384) | |||
25. ( 24, -45, 5, -8, 24, -45 ) | ||||
(ChaCha20/Poly1305, SHAKE256, X448, EdDSA, | ||||
ChaCha20/Poly1305, SHAKE256) | ||||
The different methods use the same cipher suites, but some algorithms | The different methods use the same cipher suites, but some algorithms | |||
are not used in some methods. The EDHOC signature algorithm is not | are not used in some methods. The EDHOC signature algorithm is not | |||
used in methods without signature authentication. | used in methods without signature authentication. | |||
The Initiator needs to have a list of cipher suites it supports in | The Initiator needs to have a list of cipher suites it supports in | |||
order of preference. The Responder needs to have a list of cipher | order of preference. The Responder needs to have a list of cipher | |||
suites it supports. SUITES_I is a CBOR array containing cipher | suites it supports. SUITES_I is a CBOR array containing cipher | |||
suites that the Initiator supports. SUITES_I is formatted and | suites that the Initiator supports. SUITES_I is formatted and | |||
processed as detailed in Section 5.3.1 to secure the cipher suite | processed as detailed in Section 5.2.1 to secure the cipher suite | |||
negotiation. Examples of cipher suite negotiation are given in | negotiation. Examples of cipher suite negotiation are given in | |||
Section 6.3.2. | Section 6.3.2. | |||
3.5. Ephemeral Public Keys | 3.7. Ephemeral Public Keys | |||
EDHOC always uses compact representation of elliptic curve points, | EDHOC always uses compact representation of elliptic curve points, | |||
see Appendix A. In COSE compact representation is achieved by | see Appendix B. In COSE compact representation is achieved by | |||
formatting the ECDH ephemeral public keys as COSE_Keys of type EC2 or | formatting the ECDH ephemeral public keys as COSE_Keys of type EC2 or | |||
OKP according to Sections 7.1 and 7.2 of | OKP according to Sections 7.1 and 7.2 of | |||
[I-D.ietf-cose-rfc8152bis-algs], but only including the 'x' parameter | [I-D.ietf-cose-rfc8152bis-algs], but only including the 'x' parameter | |||
in G_X and G_Y. For Elliptic Curve Keys of type EC2, compact | in G_X and G_Y. For Elliptic Curve Keys of type EC2, compact | |||
representation MAY be used also in the COSE_Key. If the COSE | representation MAY be used also in the COSE_Key. If the COSE | |||
implementation requires an 'y' parameter, the value y = false SHALL | implementation requires an 'y' parameter, the value y = false SHALL | |||
be used. COSE always use compact output for Elliptic Curve Keys of | be used. COSE always use compact output for Elliptic Curve Keys of | |||
type EC2. | type EC2. | |||
3.6. External Authorization Data | 3.8. External Authorization Data | |||
In order to reduce round trips and number of messages or to simplify | In order to reduce round trips and number of messages or to simplify | |||
processing, external security applications may be integrated into | processing, external security applications may be integrated into | |||
EDHOC by transporting authorization related data together with the | EDHOC by transporting authorization related data together with the | |||
messages. One example is the transport third-party identity and | messages. One example is the transport third-party identity and | |||
authorization information protected out of scope of EDHOC | authorization information protected out of scope of EDHOC | |||
[I-D.selander-ace-ake-authz]. Another example is the embedding of a | [I-D.selander-ace-ake-authz]. Another example is the embedding of a | |||
certificate enrolment request or a newly issued certificate. | certificate enrolment request or a newly issued certificate. | |||
EDHOC allows opaque external authorization data (EAD) to be sent in | EDHOC allows opaque external authorization data (EAD) to be sent in | |||
the EDHOC messages. External authorization data sent in message_1 | the EDHOC messages. External authorization data sent in message_1 | |||
(EAD_1) or message_2 (EAD_2) must be considered unprotected by EDHOC, | (EAD_1) or message_2 (EAD_2) must be considered unprotected by EDHOC, | |||
see Section 8.4. External authorization data sent in message_3 | see Section 7.4. External authorization data sent in message_3 | |||
(EAD_3) or message_4 (EAD_4) is protected between Initiator and | (EAD_3) or message_4 (EAD_4) is protected between Initiator and | |||
Responder. | Responder. | |||
External authorization data is a CBOR sequence (see Appendix B.1) as | External authorization data is a CBOR sequence (see Appendix C.1) as | |||
defined below: | defined below: | |||
EAD = ( | EAD = ( | |||
type : int, | type : int, | |||
1* ext_authz_data : any, | 1* ext_authz_data : any, | |||
) | ) | |||
where type is an int and is followed by one or more ext_authz_data | where type is an int and is followed by one or more ext_authz_data | |||
depending on type as defined in a separate specification. | depending on type as defined in a separate specification. | |||
The EAD fields of EDHOC are not intended for generic application | The EAD fields of EDHOC are not intended for generic application | |||
data. Since data carried in EAD_1 and EAD_2 fields may not be | data. Since data carried in EAD_1 and EAD_2 fields may not be | |||
protected, special considerations need to be made such that a) it | protected, special considerations need to be made such that a) it | |||
does not violate security, privacy etc. requirements of the service | does not violate security, privacy etc. requirements of the service | |||
which uses this data, and b) it does not violate the security | which uses this data, and b) it does not violate the security | |||
properties of EDHOC. Security applications making use of the EAD | properties of EDHOC. Security applications making use of the EAD | |||
fields must perform the necessary security analysis. | fields must perform the necessary security analysis. | |||
3.7. Applicability Statement | 3.9. Applicability Statement | |||
EDHOC requires certain parameters to be agreed upon between Initiator | EDHOC requires certain parameters to be agreed upon between Initiator | |||
and Responder. Some parameters can be agreed through the protocol | and Responder. Some parameters can be agreed through the protocol | |||
execution (specifically cipher suite negotiation, see Section 3.4) | execution (specifically cipher suite negotiation, see Section 3.6) | |||
but other parameters may need to be known out-of-band (e.g., which | but other parameters may need to be known out-of-band (e.g., which | |||
authentication method is used, see Section 3.2.1). | authentication method is used, see Section 3.2). | |||
The purpose of the applicability statement is describe the intended | The purpose of the applicability statement is describe the intended | |||
use of EDHOC to allow for the relevant processing and verifications | use of EDHOC to allow for the relevant processing and verifications | |||
to be made, including things like: | to be made, including things like: | |||
1. How the endpoint detects that an EDHOC message is received. This | 1. How the endpoint detects that an EDHOC message is received. This | |||
includes how EDHOC messages are transported, for example in the | includes how EDHOC messages are transported, for example in the | |||
payload of a CoAP message with a certain Uri-Path or Content- | payload of a CoAP message with a certain Uri-Path or Content- | |||
Format; see Section 7.2. | Format; see Appendix A.3. * The method of transporting EDHOC | |||
messages may also describe data carried along with the messages | ||||
2. Method and correlation of underlying transport messages | that are needed for the transport to satisfy the requirements of | |||
(METHOD_CORR; see Section 3.2.1 and Section 3.2.4). This gives | Section 3.4, e.g., connection identifiers used with certain | |||
information about the optional connection identifier fields. | messages, see Appendix A.3. | |||
3. How message_1 is identified, in particular if the optional | 2. Authentication method (METHOD; see Section 3.2). | |||
initial C_1 = "null" of message_1 is present; see Section 5.3.1 | ||||
4. Profile for authentication credentials (CRED_I, CRED_R; see | 3. Profile for authentication credentials (CRED_I, CRED_R; see | |||
Section 3.3.3), e.g., profile for certificate or COSE_key, | Section 3.5.3), e.g., profile for certificate or COSE_key, | |||
including supported authentication key algorithms (subject public | including supported authentication key algorithms (subject public | |||
key algorithm in X.509 certificate). | key algorithm in X.509 certificate). | |||
5. Type used to identify authentication credentials (ID_CRED_I, | 4. Type used to identify authentication credentials (ID_CRED_I, | |||
ID_CRED_R; see Section 3.3.4). | ID_CRED_R; see Section 3.5.4). | |||
6. Use and type of external authorization data (EAD_1, EAD_2, EAD_3, | 5. Use and type of external authorization data (EAD_1, EAD_2, EAD_3, | |||
EAD_4; see Section 3.6). | EAD_4; see Section 3.8). | |||
7. Identifier used as identity of endpoint; see Section 3.3.2. | 6. Identifier used as identity of endpoint; see Section 3.5.2. | |||
8. If message_4 shall be sent/expected, and if not, how to ensure a | 7. If message_4 shall be sent/expected, and if not, how to ensure a | |||
protected application message is sent from the Responder to the | protected application message is sent from the Responder to the | |||
Initiator; see Section 7.1. | Initiator; see Section 5.5. | |||
The applicability statement may also contain information about | The applicability statement may also contain information about | |||
supported cipher suites. The procedure for selecting and verifying | supported cipher suites. The procedure for selecting and verifying | |||
cipher suite is still performed as specified by the protocol, but it | cipher suite is still performed as specified by the protocol, but it | |||
may become simplified by this knowledge. | may become simplified by this knowledge. | |||
An example of an applicability statement is shown in Appendix D. | An example of an applicability statement is shown in Appendix E. | |||
For some parameters, like METHOD_CORR, ID_CRED_x, type of EAD, the | For some parameters, like METHOD, ID_CRED_x, type of EAD, the | |||
receiver is able to verify compliance with applicability statement, | receiver is able to verify compliance with applicability statement, | |||
and if it needs to fail because of incompliance, to infer the reason | and if it needs to fail because of incompliance, to infer the reason | |||
why the protocol failed. | why the protocol failed. | |||
For other parameters, like CRED_x in the case that it is not | For other parameters, like CRED_x in the case that it is not | |||
transported, it may not be possible to verify that incompliance with | transported, it may not be possible to verify that incompliance with | |||
applicability statement was the reason for failure: Integrity | applicability statement was the reason for failure: Integrity | |||
verification in message_2 or message_3 may fail not only because of | verification in message_2 or message_3 may fail not only because of | |||
wrong authentication credential. For example, in case the Initiator | wrong authentication credential. For example, in case the Initiator | |||
uses public key certificate by reference (i.e. not transported within | uses public key certificate by reference (i.e. not transported within | |||
skipping to change at page 21, line 18 ¶ | skipping to change at page 21, line 29 ¶ | |||
If the EDHOC hash algorithm is SHAKE256, then Extract( salt, IKM ) = | If the EDHOC hash algorithm is SHAKE256, then Extract( salt, IKM ) = | |||
KMAC256( salt, IKM, 512, "" ). | KMAC256( salt, IKM, 512, "" ). | |||
PRK_2e is used to derive a keystream to encrypt message_2. PRK_3e2m | PRK_2e is used to derive a keystream to encrypt message_2. PRK_3e2m | |||
is used to derive keys and IVs to produce a MAC in message_2 and to | is used to derive keys and IVs to produce a MAC in message_2 and to | |||
encrypt message_3. PRK_4x3m is used to derive keys and IVs to | encrypt message_3. PRK_4x3m is used to derive keys and IVs to | |||
produce a MAC in message_3 and to derive application specific data. | produce a MAC in message_3 and to derive application specific data. | |||
PRK_2e is derived with the following input: | PRK_2e is derived with the following input: | |||
* The salt SHALL be the empty byte string. Note that [RFC5869] | o The salt SHALL be the empty byte string. Note that [RFC5869] | |||
specifies that if the salt is not provided, it is set to a string | specifies that if the salt is not provided, it is set to a string | |||
of zeros (see Section 2.2 of [RFC5869]). For implementation | of zeros (see Section 2.2 of [RFC5869]). For implementation | |||
purposes, not providing the salt is the same as setting the salt | purposes, not providing the salt is the same as setting the salt | |||
to the empty byte string. | to the empty byte string. | |||
* The input keying material (IKM) SHALL be the ECDH shared secret | o The input keying material (IKM) SHALL be the ECDH shared secret | |||
G_XY (calculated from G_X and Y or G_Y and X) as defined in | G_XY (calculated from G_X and Y or G_Y and X) as defined in | |||
Section 6.3.1 of [I-D.ietf-cose-rfc8152bis-algs]. | Section 6.3.1 of [I-D.ietf-cose-rfc8152bis-algs]. | |||
Example: Assuming the use of SHA-256 the extract phase of HKDF | Example: Assuming the use of SHA-256 the extract phase of HKDF | |||
produces PRK_2e as follows: | produces PRK_2e as follows: | |||
PRK_2e = HMAC-SHA-256( salt, G_XY ) | PRK_2e = HMAC-SHA-256( salt, G_XY ) | |||
where salt = 0x (the empty byte string). | where salt = 0x (the empty byte string). | |||
The pseudorandom keys PRK_3e2m and PRK_4x3m are defined as follow: | The pseudorandom keys PRK_3e2m and PRK_4x3m are defined as follow: | |||
* If the Responder authenticates with a static Diffie-Hellman key, | o If the Responder authenticates with a static Diffie-Hellman key, | |||
then PRK_3e2m = Extract( PRK_2e, G_RX ), where G_RX is the ECDH | then PRK_3e2m = Extract( PRK_2e, G_RX ), where G_RX is the ECDH | |||
shared secret calculated from G_R and X, or G_X and R, else | shared secret calculated from G_R and X, or G_X and R, else | |||
PRK_3e2m = PRK_2e. | PRK_3e2m = PRK_2e. | |||
* If the Initiator authenticates with a static Diffie-Hellman key, | o If the Initiator authenticates with a static Diffie-Hellman key, | |||
then PRK_4x3m = Extract( PRK_3e2m, G_IY ), where G_IY is the ECDH | then PRK_4x3m = Extract( PRK_3e2m, G_IY ), where G_IY is the ECDH | |||
shared secret calculated from G_I and Y, or G_Y and I, else | shared secret calculated from G_I and Y, or G_Y and I, else | |||
PRK_4x3m = PRK_3e2m. | PRK_4x3m = PRK_3e2m. | |||
Example: Assuming the use of curve25519, the ECDH shared secrets | Example: Assuming the use of curve25519, the ECDH shared secrets | |||
G_XY, G_RX, and G_IY are the outputs of the X25519 function | G_XY, G_RX, and G_IY are the outputs of the X25519 function | |||
[RFC7748]: | [RFC7748]: | |||
G_XY = X25519( Y, G_X ) = X25519( X, G_Y ) | G_XY = X25519( Y, G_X ) = X25519( X, G_Y ) | |||
skipping to change at page 22, line 23 ¶ | skipping to change at page 22, line 34 ¶ | |||
info = [ | info = [ | |||
edhoc_aead_id : int / tstr, | edhoc_aead_id : int / tstr, | |||
transcript_hash : bstr, | transcript_hash : bstr, | |||
label : tstr, | label : tstr, | |||
length : uint | length : uint | |||
] | ] | |||
where | where | |||
* edhoc_aead_id is an int or tstr containing the algorithm | o edhoc_aead_id is an int or tstr containing the algorithm | |||
identifier of the EDHOC AEAD algorithm in the selected cipher | identifier of the EDHOC AEAD algorithm in the selected cipher | |||
suite encoded as defined in [I-D.ietf-cose-rfc8152bis-algs]. Note | suite encoded as defined in [I-D.ietf-cose-rfc8152bis-algs]. Note | |||
that a single fixed edhoc_aead_id is used in all invocations of | that a single fixed edhoc_aead_id is used in all invocations of | |||
EDHOC-KDF, including the derivation of KEYSTREAM_2 and invocations | EDHOC-KDF, including the derivation of KEYSTREAM_2 and invocations | |||
of the EDHOC-Exporter. | of the EDHOC-Exporter. | |||
* transcript_hash is a bstr set to one of the transcript hashes | o transcript_hash is a bstr set to one of the transcript hashes | |||
TH_2, TH_3, or TH_4 as defined in Sections 5.4.1, 5.5.1, and 4.1. | TH_2, TH_3, or TH_4 as defined in Sections 5.3.1, 5.4.1, and 4.1. | |||
* label is a tstr set to the name of the derived key or IV, i.e. | o label is a tstr set to the name of the derived key or IV, i.e. | |||
"K_2m", "IV_2m", "KEYSTREAM_2", "K_3m", "IV_3m", "K_3ae", or | "K_2m", "IV_2m", "KEYSTREAM_2", "K_3m", "IV_3m", "K_3ae", or | |||
"IV_3ae". | "IV_3ae". | |||
* length is the length of output keying material (OKM) in bytes | o length is the length of output keying material (OKM) in bytes | |||
If the EDHOC hash algorithm is SHA-2, then Expand( PRK, info, length | If the EDHOC hash algorithm is SHA-2, then Expand( PRK, info, length | |||
) = HKDF-Expand( PRK, info, length ) [RFC5869]. If the EDHOC hash | ) = HKDF-Expand( PRK, info, length ) [RFC5869]. If the EDHOC hash | |||
algorithm is SHAKE128, then Expand( PRK, info, length ) = KMAC128( | algorithm is SHAKE128, then Expand( PRK, info, length ) = KMAC128( | |||
PRK, info, L, "" ). If the EDHOC hash algorithm is SHAKE256, then | PRK, info, L, "" ). If the EDHOC hash algorithm is SHAKE256, then | |||
Expand( PRK, info, length ) = KMAC256( PRK, info, L, "" ). | Expand( PRK, info, length ) = KMAC256( PRK, info, L, "" ). | |||
KEYSTREAM_2 are derived using the transcript hash TH_2 and the | KEYSTREAM_2 are derived using the transcript hash TH_2 and the | |||
pseudorandom key PRK_2e. K_2m and IV_2m are derived using the | pseudorandom key PRK_2e. K_2m and IV_2m are derived using the | |||
transcript hash TH_2 and the pseudorandom key PRK_3e2m. K_3ae and | transcript hash TH_2 and the pseudorandom key PRK_3e2m. K_3ae and | |||
skipping to change at page 23, line 21 ¶ | skipping to change at page 23, line 31 ¶ | |||
= EDHOC-KDF(PRK_4x3m, TH_4, label_context, length) | = EDHOC-KDF(PRK_4x3m, TH_4, label_context, length) | |||
label_context is a CBOR sequence: | label_context is a CBOR sequence: | |||
label_context = ( | label_context = ( | |||
label : tstr, | label : tstr, | |||
context : bstr, | context : bstr, | |||
) | ) | |||
where label is a registered tstr from the EDHOC Exporter Label | where label is a registered tstr from the EDHOC Exporter Label | |||
registry (Section 9.1), context is a bstr defined by the application, | registry (Section 8.1), context is a bstr defined by the application, | |||
and length is a uint defined by the application. The (label, | and length is a uint defined by the application. The (label, | |||
context) pair must be unique, i.e. a (label, context) MUST NOT be | context) pair must be unique, i.e. a (label, context) MUST NOT be | |||
used for two different purposes. However an application can re- | used for two different purposes. However an application can re- | |||
derive the same key several times as long as it is done in a secure | derive the same key several times as long as it is done in a secure | |||
way. For example, in most encryption algorithms the same (key, | way. For example, in most encryption algorithms the same (key, | |||
nonce) pair must not be reused. | nonce) pair must not be reused. | |||
The transcript hash TH_4 is a CBOR encoded bstr and the input to the | The transcript hash TH_4 is a CBOR encoded bstr and the input to the | |||
hash function is a CBOR Sequence. | hash function is a CBOR Sequence. | |||
TH_4 = H( TH_3, CIPHERTEXT_3 ) | TH_4 = H( TH_3, CIPHERTEXT_3 ) | |||
where H() is the hash function in the selected cipher suite. | where H() is the hash function in the selected cipher suite. | |||
Examples of use of the EDHOC-Exporter are given in Section 7.1.2 and | Examples of use of the EDHOC-Exporter are given in Section 5.5.2 and | |||
[I-D.ietf-core-oscore-edhoc]. | Appendix A. | |||
To provide forward secrecy in an even more efficient way than re- | To provide forward secrecy in an even more efficient way than re- | |||
running EDHOC, EDHOC provides the function EDHOC-KeyUpdate. When | running EDHOC, EDHOC provides the function EDHOC-KeyUpdate. When | |||
EDHOC-KeyUpdate is called the old PRK_4x3m is deleted and the new | EDHOC-KeyUpdate is called the old PRK_4x3m is deleted and the new | |||
PRK_4x3m is calculated as a "hash" of the old key using the Extract | PRK_4x3m is calculated as a "hash" of the old key using the Extract | |||
function as illustrated by the following pseudocode: | function as illustrated by the following pseudocode: | |||
EDHOC-KeyUpdate( nonce ): | EDHOC-KeyUpdate( nonce ): | |||
PRK_4x3m = Extract( nonce, PRK_4x3m ) | PRK_4x3m = Extract( nonce, PRK_4x3m ) | |||
skipping to change at page 24, line 15 ¶ | skipping to change at page 24, line 25 ¶ | |||
An EDHOC message is encoded as a sequence of CBOR data (CBOR | An EDHOC message is encoded as a sequence of CBOR data (CBOR | |||
Sequence, [RFC8742]). Additional optimizations are made to reduce | Sequence, [RFC8742]). Additional optimizations are made to reduce | |||
message overhead. | message overhead. | |||
While EDHOC uses the COSE_Key, COSE_Sign1, and COSE_Encrypt0 | While EDHOC uses the COSE_Key, COSE_Sign1, and COSE_Encrypt0 | |||
structures, only a subset of the parameters is included in the EDHOC | structures, only a subset of the parameters is included in the EDHOC | |||
messages. The unprotected COSE header in COSE_Sign1, and | messages. The unprotected COSE header in COSE_Sign1, and | |||
COSE_Encrypt0 (not included in the EDHOC message) MAY contain | COSE_Encrypt0 (not included in the EDHOC message) MAY contain | |||
parameters (e.g. 'alg'). | parameters (e.g. 'alg'). | |||
5.1. Encoding of bstr_identifier | 5.1. Message Processing Outline | |||
Byte strings are encoded in CBOR as two or more bytes, whereas | ||||
integers in the interval -24 to 23 are encoded in CBOR as one byte. | ||||
bstr_identifier is a special encoding of byte strings, used | ||||
throughout the protocol to enable the encoding of the shortest byte | ||||
strings as integers that only require one byte of CBOR encoding. | ||||
The bstr_identifier encoding is defined as follows: Byte strings in | ||||
the interval h'00' to h'2f' are encoded as the corresponding integer | ||||
minus 24, which are all represented by one byte CBOR ints. Other | ||||
byte strings are encoded as CBOR byte strings. | ||||
For example, the byte string h'59e9' encoded as a bstr_identifier is | ||||
equal to h'59e9', while the byte string h'2a' is encoded as the | ||||
integer 18. | ||||
The CDDL definition of the bstr_identifier is given below: | ||||
bstr_identifier = bstr / int | ||||
Note that, despite what could be interpreted by the CDDL definition | ||||
only, bstr_identifier once decoded are always byte strings. | ||||
5.2. Message Processing Outline | ||||
This section outlines the message processing of EDHOC. | This section outlines the message processing of EDHOC. | |||
For each session, the endpoints are assumed to keep an associated | For each session, the endpoints are assumed to keep an associated | |||
protocol state containing connection identifiers, keys, etc. used for | protocol state containing identifiers, keys, etc. used for subsequent | |||
subsequent processing of protocol related data. The protocol state | processing of protocol related data. The protocol state is assumed | |||
is assumed to be associated to an applicability statement | to be associated to an applicability statement (Section 3.9) which | |||
(Section 3.7) which provides the context for how messages are | provides the context for how messages are transported, identified and | |||
transported, identified and processed. | processed. | |||
EDHOC messages SHALL be processed according to the current protocol | EDHOC messages SHALL be processed according to the current protocol | |||
state. The following steps are expected to be performed at reception | state. The following steps are expected to be performed at reception | |||
of an EDHOC message: | of an EDHOC message: | |||
1. Detect that an EDHOC message has been received, for example by | 1. Detect that an EDHOC message has been received, for example by | |||
means of port number, URI, or media type (Section 3.7). | means of port number, URI, or media type (Section 3.9). | |||
2. Retrieve the protocol state, e.g. using the received connection | 2. Retrieve the protocol state according to the message correlation | |||
identifier (Section 3.2.2) or with the help of message | provided by the transport, see Section 3.4. If there is no | |||
correlation provided by the transport protocol (Section 3.2.4). | protocol state, in the case of message_1, a new protocol state is | |||
If there is no protocol state, in the case of message_1, a new | created. The Responder endpoint needs to make use of available | |||
protocol state is created. An initial C_1 = "null" byte in | Denial-of-Service mitigation (Section 7.5). | |||
message_1 (Section 5.3.1) can be used to distinguish message_1 | ||||
from other messages. The Responder endpoint needs to make use of | ||||
available Denial-of-Service mitigation (Section 8.5). | ||||
3. If the message received is an error message then process | 3. If the message received is an error message then process | |||
according to Section 6, else process as the expected next message | according to Section 6, else process as the expected next message | |||
according to the protocol state. | according to the protocol state. | |||
If the processing fails, then the protocol is discontinued, an error | If the processing fails, then the protocol is discontinued, an error | |||
message sent, and the protocol state erased. Further details are | message sent, and the protocol state erased. Further details are | |||
provided in the following subsections. | provided in the following subsections. | |||
Different instances of the same message MUST NOT be processed in one | Different instances of the same message MUST NOT be processed in one | |||
session. Note that processing will fail if the same message appears | session. Note that processing will fail if the same message appears | |||
a second time for EDHOC processing because the state of the protocol | a second time for EDHOC processing because the state of the protocol | |||
has moved on and now expects something else. This assumes that | has moved on and now expects something else. This assumes that | |||
message duplication due to re-transmissions is handled by the | message duplication due to re-transmissions is handled by the | |||
transport protocol, see Section 3.2.3. The case when the transport | transport protocol, see Section 3.4. The case when the transport | |||
does not support message deduplication is addressed in Appendix E. | does not support message deduplication is addressed in Appendix F. | |||
5.3. EDHOC Message 1 | 5.2. EDHOC Message 1 | |||
5.3.1. Formatting of Message 1 | 5.2.1. Formatting of Message 1 | |||
message_1 SHALL be a CBOR Sequence (see Appendix B.1) as defined | message_1 SHALL be a CBOR Sequence (see Appendix C.1) as defined | |||
below | below | |||
message_1 = ( | message_1 = ( | |||
? C_1 : null, | METHOD : int, | |||
METHOD_CORR : int, | ||||
SUITES_I : [ selected : suite, supported : 2* suite ] / suite, | SUITES_I : [ selected : suite, supported : 2* suite ] / suite, | |||
G_X : bstr, | G_X : bstr, | |||
C_I : bstr_identifier, | C_I : bstr / int, | |||
? EAD ; EAD_1 | ? EAD ; EAD_1 | |||
) | ) | |||
suite = int | suite = int | |||
where: | where: | |||
* C_1 - an initial CBOR simple value "null" (= 0xf6) MAY be used to | o METHOD = 0, 1, 2, or 3 (see Figure 4). | |||
distinguish message_1 from other messages. | ||||
* METHOD_CORR = 4 * method + corr, where method = 0, 1, 2, or 3 (see | ||||
Figure 4) and the correlation parameter corr is chosen based on | ||||
the transport and determines which connection identifiers that are | ||||
omitted (see Section 3.2.4). | ||||
* SUITES_I - cipher suites which the Initiator supports in order of | o SUITES_I - cipher suites which the Initiator supports in order of | |||
(decreasing) preference. The list of supported cipher suites can | (decreasing) preference. The list of supported cipher suites can | |||
be truncated at the end, as is detailed in the processing steps | be truncated at the end, as is detailed in the processing steps | |||
below and Section 6.3. One of the supported cipher suites is | below and Section 6.3. One of the supported cipher suites is | |||
selected. The selected suite is the first suite in the SUITES_I | selected. The selected suite is the first suite in the SUITES_I | |||
CBOR array. If a single supported cipher suite is conveyed then | CBOR array. If a single supported cipher suite is conveyed then | |||
that cipher suite is selected and SUITES_I is encoded as an int | that cipher suite is selected and SUITES_I is encoded as an int | |||
instead of an array. | instead of an array. | |||
* G_X - the ephemeral public key of the Initiator | o G_X - the ephemeral public key of the Initiator | |||
* C_I - variable length connection identifier, encoded as a | o C_I - variable length connection identifier | |||
bstr_identifier (see Section 5.1). | ||||
* EAD_1 - unprotected external authorization data, see Section 3.6. | o EAD_1 - unprotected external authorization data, see Section 3.8. | |||
5.3.2. Initiator Processing of Message 1 | 5.2.2. Initiator Processing of Message 1 | |||
The Initiator SHALL compose message_1 as follows: | The Initiator SHALL compose message_1 as follows: | |||
* The supported cipher suites and the order of preference MUST NOT | o The supported cipher suites and the order of preference MUST NOT | |||
be changed based on previous error messages. However, the list | be changed based on previous error messages. However, the list | |||
SUITES_I sent to the Responder MAY be truncated such that cipher | SUITES_I sent to the Responder MAY be truncated such that cipher | |||
suites which are the least preferred are omitted. The amount of | suites which are the least preferred are omitted. The amount of | |||
truncation MAY be changed between sessions, e.g. based on previous | truncation MAY be changed between sessions, e.g. based on previous | |||
error messages (see next bullet), but all cipher suites which are | error messages (see next bullet), but all cipher suites which are | |||
more preferred than the least preferred cipher suite in the list | more preferred than the least preferred cipher suite in the list | |||
MUST be included in the list. | MUST be included in the list. | |||
* The Initiator MUST select its most preferred cipher suite, | o The Initiator MUST select its most preferred cipher suite, | |||
conditioned on what it can assume to be supported by the | conditioned on what it can assume to be supported by the | |||
Responder. If the Initiator previously received from the | Responder. If the Initiator previously received from the | |||
Responder an error message with error code 2 (see Section 6.3) | Responder an error message with error code 2 (see Section 6.3) | |||
indicating cipher suites supported by the Responder which also are | indicating cipher suites supported by the Responder which also are | |||
supported by the Initiator, then the Initiator SHOULD select the | supported by the Initiator, then the Initiator SHOULD select the | |||
most preferred cipher suite of those (note that error messages are | most preferred cipher suite of those (note that error messages are | |||
not authenticated and may be forged). | not authenticated and may be forged). | |||
* Generate an ephemeral ECDH key pair using the curve in the | o Generate an ephemeral ECDH key pair using the curve in the | |||
selected cipher suite and format it as a COSE_Key. Let G_X be the | selected cipher suite and format it as a COSE_Key. Let G_X be the | |||
'x' parameter of the COSE_Key. | 'x' parameter of the COSE_Key. | |||
* Choose a connection identifier C_I and store it for the length of | o Choose a connection identifier C_I and store it for the length of | |||
the protocol. | the protocol. | |||
* Encode message_1 as a sequence of CBOR encoded data items as | o Encode message_1 as a sequence of CBOR encoded data items as | |||
specified in Section 5.3.1 | specified in Section 5.2.1 | |||
5.3.3. Responder Processing of Message 1 | 5.2.3. Responder Processing of Message 1 | |||
The Responder SHALL process message_1 as follows: | The Responder SHALL process message_1 as follows: | |||
* Decode message_1 (see Appendix B.1). | o Decode message_1 (see Appendix C.1). | |||
* Verify that the selected cipher suite is supported and that no | o Verify that the selected cipher suite is supported and that no | |||
prior cipher suite in SUITES_I is supported. | prior cipher suite in SUITES_I is supported. | |||
* Pass EAD_1 to the security application. | o Pass EAD_1 to the security application. | |||
If any processing step fails, the Responder SHOULD send an EDHOC | If any processing step fails, the Responder SHOULD send an EDHOC | |||
error message back, formatted as defined in Section 6, and the | error message back, formatted as defined in Section 6, and the | |||
session MUST be discontinued. Sending error messages is essential | session MUST be discontinued. Sending error messages is essential | |||
for debugging but MAY e.g. be skipped due to denial of service | for debugging but MAY e.g. be skipped due to denial of service | |||
reasons, see Section 8. | reasons, see Section 7. | |||
5.4. EDHOC Message 2 | 5.3. EDHOC Message 2 | |||
5.4.1. Formatting of Message 2 | 5.3.1. Formatting of Message 2 | |||
message_2 and data_2 SHALL be CBOR Sequences (see Appendix B.1) as | message_2 and data_2 SHALL be CBOR Sequences (see Appendix C.1) as | |||
defined below | defined below | |||
message_2 = ( | message_2 = ( | |||
data_2, | data_2, | |||
CIPHERTEXT_2 : bstr, | CIPHERTEXT_2 : bstr, | |||
) | ) | |||
data_2 = ( | data_2 = ( | |||
? C_I : bstr_identifier, | ||||
G_Y : bstr, | G_Y : bstr, | |||
C_R : bstr_identifier, | C_R : bstr / int, | |||
) | ) | |||
where: | where: | |||
* G_Y - the ephemeral public key of the Responder | o G_Y - the ephemeral public key of the Responder | |||
* C_R - variable length connection identifier, encoded as a | o C_R - variable length connection identifier | |||
bstr_identifier (see Section 5.1). | ||||
5.4.2. Responder Processing of Message 2 | 5.3.2. Responder Processing of Message 2 | |||
The Responder SHALL compose message_2 as follows: | The Responder SHALL compose message_2 as follows: | |||
* If corr (METHOD_CORR mod 4) equals 1 or 3, C_I is omitted, | o Generate an ephemeral ECDH key pair using the curve in the | |||
otherwise C_I is not omitted. | ||||
* Generate an ephemeral ECDH key pair using the curve in the | ||||
selected cipher suite and format it as a COSE_Key. Let G_Y be the | selected cipher suite and format it as a COSE_Key. Let G_Y be the | |||
'x' parameter of the COSE_Key. | 'x' parameter of the COSE_Key. | |||
* Choose a connection identifier C_R and store it for the length of | o Choose a connection identifier C_R and store it for the length of | |||
the protocol. | the protocol. | |||
* Compute the transcript hash TH_2 = H( H(message_1), data_2 ) where | o Compute the transcript hash TH_2 = H( H(message_1), data_2 ) where | |||
H() is the hash function in the selected cipher suite. The | H() is the hash function in the selected cipher suite. The | |||
transcript hash TH_2 is a CBOR encoded bstr and the input to the | transcript hash TH_2 is a CBOR encoded bstr and the input to the | |||
hash function is a CBOR Sequence. Note that H(message_1) can be | hash function is a CBOR Sequence. Note that H(message_1) can be | |||
computed and cached already in the processing of message_1. | computed and cached already in the processing of message_1. | |||
* Compute an inner COSE_Encrypt0 as defined in Section 5.3 of | o Compute an inner COSE_Encrypt0 as defined in Section 5.3 of | |||
[I-D.ietf-cose-rfc8152bis-struct], with the EDHOC AEAD algorithm | [I-D.ietf-cose-rfc8152bis-struct], with the EDHOC AEAD algorithm | |||
in the selected cipher suite, K_2m, IV_2m, and the following | in the selected cipher suite, K_2m, IV_2m, and the following | |||
parameters: | parameters: | |||
- protected = << ID_CRED_R >> | * protected = << ID_CRED_R >> | |||
+ ID_CRED_R - identifier to facilitate retrieval of CRED_R, | ||||
o ID_CRED_R - identifier to facilitate retrieval of CRED_R, | see Section 3.5.4 | |||
see Section 3.3.4 | ||||
- external_aad = << TH_2, CRED_R, ? EAD_2 >> | * external_aad = << TH_2, CRED_R, ? EAD_2 >> | |||
o CRED_R - bstr containing the credential of the Responder, | + CRED_R - bstr containing the credential of the Responder, | |||
see Section 3.3.4 | see Section 3.5.4 | |||
o EAD_2 = unprotected external authorization data, see | + EAD_2 = unprotected external authorization data, see | |||
Section 3.6 | Section 3.8 | |||
- plaintext = h'' | * plaintext = h'' | |||
COSE constructs the input to the AEAD [RFC5116] as follows: | COSE constructs the input to the AEAD [RFC5116] as follows: | |||
- Key K = EDHOC-KDF( PRK_3e2m, TH_2, "K_2m", length ) | * Key K = EDHOC-KDF( PRK_3e2m, TH_2, "K_2m", length ) | |||
- Nonce N = EDHOC-KDF( PRK_3e2m, TH_2, "IV_2m", length ) | * Nonce N = EDHOC-KDF( PRK_3e2m, TH_2, "IV_2m", length ) | |||
- Plaintext P = 0x (the empty string) | * Plaintext P = 0x (the empty string) | |||
- Associated data A = | * Associated data A = | |||
[ "Encrypt0", << ID_CRED_R >>, << TH_2, CRED_R, ? EAD_2 >> ] | [ "Encrypt0", << ID_CRED_R >>, << TH_2, CRED_R, ? EAD_2 >> ] | |||
MAC_2 is the 'ciphertext' of the inner COSE_Encrypt0. | MAC_2 is the 'ciphertext' of the inner COSE_Encrypt0. | |||
* If the Responder authenticates with a static Diffie-Hellman key | o If the Responder authenticates with a static Diffie-Hellman key | |||
(method equals 1 or 3), then Signature_or_MAC_2 is MAC_2. If the | (method equals 1 or 3), then Signature_or_MAC_2 is MAC_2. If the | |||
Responder authenticates with a signature key (method equals 0 or | Responder authenticates with a signature key (method equals 0 or | |||
2), then Signature_or_MAC_2 is the 'signature' of a COSE_Sign1 | 2), then Signature_or_MAC_2 is the 'signature' of a COSE_Sign1 | |||
object as defined in Section 4.4 of | object as defined in Section 4.4 of | |||
[I-D.ietf-cose-rfc8152bis-struct] using the signature algorithm in | [I-D.ietf-cose-rfc8152bis-struct] using the signature algorithm in | |||
the selected cipher suite, the private authentication key of the | the selected cipher suite, the private authentication key of the | |||
Responder, and the following parameters: | Responder, and the following parameters: | |||
- protected = << ID_CRED_R >> | * protected = << ID_CRED_R >> | |||
- external_aad = << TH_2, CRED_R, ? EAD_2 >> | * external_aad = << TH_2, CRED_R, ? EAD_2 >> | |||
* payload = MAC_2 | ||||
- payload = MAC_2 | ||||
COSE constructs the input to the Signature Algorithm as: | COSE constructs the input to the Signature Algorithm as: | |||
- The key is the private authentication key of the Responder. | * The key is the private authentication key of the Responder. | |||
- The message M to be signed = | * The message M to be signed = | |||
[ "Signature1", << ID_CRED_R >>, << TH_2, CRED_R, ? EAD_2 >>, | [ "Signature1", << ID_CRED_R >>, << TH_2, CRED_R, ? EAD_2 >>, | |||
MAC_2 ] | MAC_2 ] | |||
* CIPHERTEXT_2 is encrypted by using the Expand function as a binary | o CIPHERTEXT_2 is encrypted by using the Expand function as a binary | |||
additive stream cipher. | additive stream cipher. | |||
- plaintext = ( ID_CRED_R / bstr_identifier, Signature_or_MAC_2, | * plaintext = ( ID_CRED_R / bstr / int, Signature_or_MAC_2, ? | |||
? EAD_2 ) | EAD_2 ) | |||
o Note that if ID_CRED_R contains a single 'kid' parameter, | + Note that if ID_CRED_R contains a single 'kid2' parameter, | |||
i.e., ID_CRED_R = { 4 : kid_R }, only the byte string kid_R | i.e., ID_CRED_R = { 4 : kid_R }, only the byte string or | |||
is conveyed in the plaintext encoded as a bstr_identifier, | integer kid_R is conveyed in the plaintext encoded as a bstr | |||
see Section 3.3.4 and Section 5.1. | / int. | |||
- CIPHERTEXT_2 = plaintext XOR KEYSTREAM_2 | * CIPHERTEXT_2 = plaintext XOR KEYSTREAM_2 | |||
* Encode message_2 as a sequence of CBOR encoded data items as | o Encode message_2 as a sequence of CBOR encoded data items as | |||
specified in Section 5.4.1. | specified in Section 5.3.1. | |||
5.4.3. Initiator Processing of Message 2 | 5.3.3. Initiator Processing of Message 2 | |||
The Initiator SHALL process message_2 as follows: | The Initiator SHALL process message_2 as follows: | |||
* Decode message_2 (see Appendix B.1). | o Decode message_2 (see Appendix C.1). | |||
* Retrieve the protocol state using the connection identifier C_I | o Retrieve the protocol state using the message correlation provided | |||
and/or other external information such as the CoAP Token and the | by the transport (e.g., the CoAP Token and the 5-tuple as a | |||
5-tuple. | client, or the prepended C_I as a server). | |||
* Decrypt CIPHERTEXT_2, see Section 5.4.2. | o Decrypt CIPHERTEXT_2, see Section 5.3.2. | |||
* Pass EAD_2 to the security application. | o Pass EAD_2 to the security application. | |||
* Verify that the identity of the Responder is an allowed identity | o Verify that the identity of the Responder is an allowed identity | |||
for this connection, see Section 3.3. | for this connection, see Section 3.5. | |||
* Verify Signature_or_MAC_2 using the algorithm in the selected | o Verify Signature_or_MAC_2 using the algorithm in the selected | |||
cipher suite. The verification process depends on the method, see | cipher suite. The verification process depends on the method, see | |||
Section 5.4.2. | Section 5.3.2. | |||
If any processing step fails, the Initiator SHOULD send an EDHOC | If any processing step fails, the Initiator SHOULD send an EDHOC | |||
error message back, formatted as defined in Section 6. Sending error | error message back, formatted as defined in Section 6. Sending error | |||
messages is essential for debugging but MAY e.g.be skipped if a | messages is essential for debugging but MAY e.g.be skipped if a | |||
session cannot be found or due to denial of service reasons, see | session cannot be found or due to denial of service reasons, see | |||
Section 8. If an error message is sent, the session MUST be | Section 7. If an error message is sent, the session MUST be | |||
discontinued. | discontinued. | |||
5.5. EDHOC Message 3 | 5.4. EDHOC Message 3 | |||
5.5.1. Formatting of Message 3 | 5.4.1. Formatting of Message 3 | |||
message_3 and data_3 SHALL be CBOR Sequences (see Appendix B.1) as | message_3 SHALL be a CBOR Sequence (see Appendix C.1) as defined | |||
defined below | below | |||
message_3 = ( | message_3 = ( | |||
data_3, | ||||
CIPHERTEXT_3 : bstr, | CIPHERTEXT_3 : bstr, | |||
) | ) | |||
data_3 = ( | 5.4.2. Initiator Processing of Message 3 | |||
? C_R : bstr_identifier, | ||||
) | ||||
5.5.2. Initiator Processing of Message 3 | ||||
The Initiator SHALL compose message_3 as follows: | The Initiator SHALL compose message_3 as follows: | |||
* If corr (METHOD_CORR mod 4) equals 2 or 3, C_R is omitted, | o Compute the transcript hash TH_3 = H(TH_2, CIPHERTEXT_2) where H() | |||
otherwise C_R is not omitted. | is the hash function in the selected cipher suite. The transcript | |||
hash TH_3 is a CBOR encoded bstr and the input to the hash | ||||
* Compute the transcript hash TH_3 = H( H(TH_2, CIPHERTEXT_2), | function is a CBOR Sequence. Note that H(TH_2, CIPHERTEXT_2) can | |||
data_3 ) where H() is the hash function in the selected cipher | be computed and cached already in the processing of message_2. | |||
suite. The transcript hash TH_3 is a CBOR encoded bstr and the | ||||
input to the hash function is a CBOR Sequence. Note that H(TH_2, | ||||
CIPHERTEXT_2) can be computed and cached already in the processing | ||||
of message_2. | ||||
* Compute an inner COSE_Encrypt0 as defined in Section 5.3 of | o Compute an inner COSE_Encrypt0 as defined in Section 5.3 of | |||
[I-D.ietf-cose-rfc8152bis-struct], with the EDHOC AEAD algorithm | [I-D.ietf-cose-rfc8152bis-struct], with the EDHOC AEAD algorithm | |||
in the selected cipher suite, K_3m, IV_3m, and the following | in the selected cipher suite, K_3m, IV_3m, and the following | |||
parameters: | parameters: | |||
- protected = << ID_CRED_I >> | * protected = << ID_CRED_I >> | |||
o ID_CRED_I - identifier to facilitate retrieval of CRED_I, | + ID_CRED_I - identifier to facilitate retrieval of CRED_I, | |||
see Section 3.3.4 | see Section 3.5.4 | |||
- external_aad = << TH_3, CRED_I, ? EAD_3 >> | * external_aad = << TH_3, CRED_I, ? EAD_3 >> | |||
o CRED_I - bstr containing the credential of the Initiator, | ||||
see Section 3.3.4. | ||||
o EAD_3 = protected external authorization data, see | + CRED_I - bstr containing the credential of the Initiator, | |||
Section 3.6 | see Section 3.5.4. | |||
- plaintext = h'' | + EAD_3 = protected external authorization data, see | |||
Section 3.8 | ||||
COSE constructs the input to the AEAD [RFC5116] as follows: | * plaintext = h'' | |||
- Key K = EDHOC-KDF( PRK_4x3m, TH_3, "K_3m", length ) | COSE constructs the input to the AEAD [RFC5116] as follows: | |||
- Nonce N = EDHOC-KDF( PRK_4x3m, TH_3, "IV_3m", length ) | * Key K = EDHOC-KDF( PRK_4x3m, TH_3, "K_3m", length ) | |||
- Plaintext P = 0x (the empty string) | * Nonce N = EDHOC-KDF( PRK_4x3m, TH_3, "IV_3m", length ) | |||
- Associated data A = | * Plaintext P = 0x (the empty string) | |||
* Associated data A = | ||||
[ "Encrypt0", << ID_CRED_I >>, << TH_3, CRED_I, ? EAD_3 >> ] | [ "Encrypt0", << ID_CRED_I >>, << TH_3, CRED_I, ? EAD_3 >> ] | |||
MAC_3 is the 'ciphertext' of the inner COSE_Encrypt0. | MAC_3 is the 'ciphertext' of the inner COSE_Encrypt0. | |||
* If the Initiator authenticates with a static Diffie-Hellman key | o If the Initiator authenticates with a static Diffie-Hellman key | |||
(method equals 2 or 3), then Signature_or_MAC_3 is MAC_3. If the | (method equals 2 or 3), then Signature_or_MAC_3 is MAC_3. If the | |||
Initiator authenticates with a signature key (method equals 0 or | Initiator authenticates with a signature key (method equals 0 or | |||
1), then Signature_or_MAC_3 is the 'signature' of a COSE_Sign1 | 1), then Signature_or_MAC_3 is the 'signature' of a COSE_Sign1 | |||
object as defined in Section 4.4 of | object as defined in Section 4.4 of | |||
[I-D.ietf-cose-rfc8152bis-struct] using the signature algorithm in | [I-D.ietf-cose-rfc8152bis-struct] using the signature algorithm in | |||
the selected cipher suite, the private authentication key of the | the selected cipher suite, the private authentication key of the | |||
Initiator, and the following parameters: | Initiator, and the following parameters: | |||
- protected = << ID_CRED_I >> | * protected = << ID_CRED_I >> | |||
- external_aad = << TH_3, CRED_I, ? EAD_3 >> | * external_aad = << TH_3, CRED_I, ? EAD_3 >> | |||
- payload = MAC_3 | * payload = MAC_3 | |||
COSE constructs the input to the Signature Algorithm as: | COSE constructs the input to the Signature Algorithm as: | |||
- The key is the private authentication key of the Initiator. | * The key is the private authentication key of the Initiator. | |||
- The message M to be signed = | * The message M to be signed = | |||
[ "Signature1", << ID_CRED_I >>, << TH_3, CRED_I, ? EAD_3 >>, | [ "Signature1", << ID_CRED_I >>, << TH_3, CRED_I, ? EAD_3 >>, | |||
MAC_3 ] | MAC_3 ] | |||
* Compute an outer COSE_Encrypt0 as defined in Section 5.3 of | o Compute an outer COSE_Encrypt0 as defined in Section 5.3 of | |||
[I-D.ietf-cose-rfc8152bis-struct], with the EDHOC AEAD algorithm | [I-D.ietf-cose-rfc8152bis-struct], with the EDHOC AEAD algorithm | |||
in the selected cipher suite, K_3ae, IV_3ae, and the following | in the selected cipher suite, K_3ae, IV_3ae, and the following | |||
parameters. The protected header SHALL be empty. | parameters. The protected header SHALL be empty. | |||
- external_aad = TH_3 | * external_aad = TH_3 | |||
- plaintext = ( ID_CRED_I / bstr_identifier, Signature_or_MAC_3, | * plaintext = ( ID_CRED_I / bstr / int, Signature_or_MAC_3, ? | |||
? EAD_3 ) | EAD_3 ) | |||
o Note that if ID_CRED_I contains a single 'kid' parameter, | + Note that if ID_CRED_I contains a single 'kid2' parameter, | |||
i.e., ID_CRED_I = { 4 : kid_I }, only the byte string kid_I | i.e., ID_CRED_I = { 4 : kid_I }, only the byte string or | |||
is conveyed in the plaintext encoded as a bstr_identifier, | integer kid_I is conveyed in the plaintext encoded as a bstr | |||
see Section 3.3.4 and Section 5.1. | or int. | |||
COSE constructs the input to the AEAD [RFC5116] as follows: | COSE constructs the input to the AEAD [RFC5116] as follows: | |||
- Key K = EDHOC-KDF( PRK_3e2m, TH_3, "K_3ae", length ) | * Key K = EDHOC-KDF( PRK_3e2m, TH_3, "K_3ae", length ) | |||
* Nonce N = EDHOC-KDF( PRK_3e2m, TH_3, "IV_3ae", length ) | ||||
- Nonce N = EDHOC-KDF( PRK_3e2m, TH_3, "IV_3ae", length ) | ||||
- Plaintext P = ( ID_CRED_I / bstr_identifier, | * Plaintext P = ( ID_CRED_I / bstr / int, Signature_or_MAC_3, ? | |||
Signature_or_MAC_3, ? EAD_3 ) | EAD_3 ) | |||
- Associated data A = [ "Encrypt0", h'', TH_3 ] | * Associated data A = [ "Encrypt0", h'', TH_3 ] | |||
CIPHERTEXT_3 is the 'ciphertext' of the outer COSE_Encrypt0. | CIPHERTEXT_3 is the 'ciphertext' of the outer COSE_Encrypt0. | |||
* Encode message_3 as a sequence of CBOR encoded data items as | o Encode message_3 as a sequence of CBOR encoded data items as | |||
specified in Section 5.5.1. | specified in Section 5.4.1. | |||
Pass the connection identifiers (C_I, C_R) and the application | Pass the connection identifiers (C_I, C_R) and the application | |||
algorithms in the selected cipher suite to the application. The | algorithms in the selected cipher suite to the application. The | |||
application can now derive application keys using the EDHOC-Exporter | application can now derive application keys using the EDHOC-Exporter | |||
interface. | interface. | |||
After sending message_3, the Initiator is assured that no other party | After sending message_3, the Initiator is assured that no other party | |||
than the Responder can compute the key PRK_4x3m (implicit key | than the Responder can compute the key PRK_4x3m (implicit key | |||
authentication). The Initiator can securely derive application keys | authentication). The Initiator can securely derive application keys | |||
and send protected application data. However, the Initiator does not | and send protected application data. However, the Initiator does not | |||
know that the Responder has actually computed the key PRK_4x3m and | know that the Responder has actually computed the key PRK_4x3m and | |||
therefore the Initiator SHOULD NOT permanently store the keying | therefore the Initiator SHOULD NOT permanently store the keying | |||
material PRK_4x3m and TH_4, or derived application keys, until the | material PRK_4x3m and TH_4, or derived application keys, until the | |||
Initiator is assured that the Responder has actually computed the key | Initiator is assured that the Responder has actually computed the key | |||
PRK_4x3m (explicit key confirmation). This is similar to waiting for | PRK_4x3m (explicit key confirmation). This is similar to waiting for | |||
acknowledgement (ACK) in a transport protocol. Explicit key | acknowledgement (ACK) in a transport protocol. Explicit key | |||
confirmation is e.g. assured when the Initiator has verified an | confirmation is e.g. assured when the Initiator has verified an | |||
OSCORE message or message_4 from the Responder. | OSCORE message or message_4 from the Responder. | |||
5.5.3. Responder Processing of Message 3 | 5.4.3. Responder Processing of Message 3 | |||
The Responder SHALL process message_3 as follows: | The Responder SHALL process message_3 as follows: | |||
* Decode message_3 (see Appendix B.1). | o Decode message_3 (see Appendix C.1). | |||
* Retrieve the protocol state using the connection identifier C_R | o Retrieve the protocol state using the message correlation provided | |||
and/or other external information such as the CoAP Token and the | by the transport (e.g., the CoAP Token and the 5-tuple as a | |||
5-tuple. | client, or the prepended C_R as a server). | |||
* Decrypt and verify the outer COSE_Encrypt0 as defined in | o Decrypt and verify the outer COSE_Encrypt0 as defined in | |||
Section 5.3 of [I-D.ietf-cose-rfc8152bis-struct], with the EDHOC | Section 5.3 of [I-D.ietf-cose-rfc8152bis-struct], with the EDHOC | |||
AEAD algorithm in the selected cipher suite, K_3ae, and IV_3ae. | AEAD algorithm in the selected cipher suite, K_3ae, and IV_3ae. | |||
* Pass EAD_3 to the security application. | o Pass EAD_3 to the security application. | |||
* Verify that the identity of the Initiator is an allowed identity | o Verify that the identity of the Initiator is an allowed identity | |||
for this connection, see Section 3.3. | for this connection, see Section 3.5. | |||
* Verify Signature_or_MAC_3 using the algorithm in the selected | o Verify Signature_or_MAC_3 using the algorithm in the selected | |||
cipher suite. The verification process depends on the method, see | cipher suite. The verification process depends on the method, see | |||
Section 5.5.2. | Section 5.4.2. | |||
* Pass the connection identifiers (C_I, C_R), and the application | o Pass the connection identifiers (C_I, C_R), and the application | |||
algorithms in the selected cipher suite to the security | algorithms in the selected cipher suite to the security | |||
application. The application can now derive application keys | application. The application can now derive application keys | |||
using the EDHOC-Exporter interface. | using the EDHOC-Exporter interface. | |||
If any processing step fails, the Responder SHOULD send an EDHOC | If any processing step fails, the Responder SHOULD send an EDHOC | |||
error message back, formatted as defined in Section 6. Sending error | error message back, formatted as defined in Section 6. Sending error | |||
messages is essential for debugging but MAY e.g.be skipped if a | messages is essential for debugging but MAY e.g.be skipped if a | |||
session cannot be found or due to denial of service reasons, see | session cannot be found or due to denial of service reasons, see | |||
Section 8. If an error message is sent, the session MUST be | Section 7. If an error message is sent, the session MUST be | |||
discontinued. | discontinued. | |||
After verifying message_3, the Responder is assured that the | After verifying message_3, the Responder is assured that the | |||
Initiator has calculated the key PRK_4x3m (explicit key confirmation) | Initiator has calculated the key PRK_4x3m (explicit key confirmation) | |||
and that no other party than the Responder can compute the key. The | and that no other party than the Responder can compute the key. The | |||
Responder can securely send protected application data and store the | Responder can securely send protected application data and store the | |||
keying material PRK_4x3m and TH_4. | keying material PRK_4x3m and TH_4. | |||
5.5. EDHOC Message 4 | ||||
This section specifies message_4 which is OPTIONAL to support. Key | ||||
confirmation is normally provided by sending an application message | ||||
from the Responder to the Initiator protected with a key derived with | ||||
the EDHOC-Exporter, e.g., using OSCORE (see Appendix A). In | ||||
deployments where no protected application message is sent from the | ||||
Responder to the Initiator, the Responder MUST send message_4. Two | ||||
examples of such deployments: | ||||
1. When EDHOC is only used for authentication and no application | ||||
data is sent. | ||||
2. When application data is only sent from the Initiator to the | ||||
Responder. | ||||
Further considerations are provided in Section 3.9. | ||||
5.5.1. Formatting of Message 4 | ||||
message_4 SHALL be a CBOR Sequence (see Appendix C.1) as defined | ||||
below | ||||
message_4 = ( | ||||
CIPHERTEXT_4 : bstr, | ||||
) | ||||
5.5.2. Responder Processing of Message 4 | ||||
The Responder SHALL compose message_4 as follows: | ||||
o Compute a COSE_Encrypt0 as defined in Section 5.3 of | ||||
[I-D.ietf-cose-rfc8152bis-struct], with the EDHOC AEAD algorithm | ||||
in the selected cipher suite, and the following parameters. The | ||||
protected header SHALL be empty. | ||||
* protected = h'' | ||||
* external_aad = TH_4 | ||||
* plaintext = ( ? EAD_4 ) | ||||
where EAD_4 is protected external authorization data, see | ||||
Section 3.8. COSE constructs the input to the AEAD [RFC5116] as | ||||
follows: | ||||
* Key K = EDHOC-Exporter( "EDHOC_message_4_Key", h'', length ) | ||||
* Nonce N = EDHOC-Exporter( "EDHOC_message_4_Nonce", h'', length | ||||
) | ||||
* Plaintext P = ( ? EAD_4 ) | ||||
* Associated data A = [ "Encrypt0", h'', TH_4 ] | ||||
CIPHERTEXT_4 is the 'ciphertext' of the COSE_Encrypt0. | ||||
o Encode message_4 as a sequence of CBOR encoded data items as | ||||
specified in Section 5.5.1. | ||||
5.5.3. Initiator Processing of Message 4 | ||||
The Initiator SHALL process message_4 as follows: | ||||
o Decode message_4 (see Appendix C.1). | ||||
o Retrieve the protocol state using the message correlation provided | ||||
by the transport (e.g., the CoAP Token and the 5-tuple as a | ||||
client, or the prepended C_I as a server). | ||||
o Decrypt and verify the outer COSE_Encrypt0 as defined in | ||||
Section 5.3 of [I-D.ietf-cose-rfc8152bis-struct], with the EDHOC | ||||
AEAD algorithm in the selected cipher suite, and the parameters | ||||
defined in Section 5.5.2. | ||||
o Pass EAD_4 to the security application. | ||||
If any verification step fails the Initiator MUST send an EDHOC error | ||||
message back, formatted as defined in Section 6, and the session MUST | ||||
be discontinued. | ||||
6. Error Handling | 6. Error Handling | |||
This section defines the format for error messages. | This section defines the format for error messages. | |||
An EDHOC error message can be sent by either endpoint as a reply to | An EDHOC error message can be sent by either endpoint as a reply to | |||
any non-error EDHOC message. How errors at the EDHOC layer are | any non-error EDHOC message. How errors at the EDHOC layer are | |||
transported depends on lower layers, which need to enable error | transported depends on lower layers, which need to enable error | |||
messages to be sent and processed as intended. | messages to be sent and processed as intended. | |||
Errors in EDHOC are fatal. After sending an error message, the | Errors in EDHOC are fatal. After sending an error message, the | |||
sender MUST discontinue the protocol. The receiver SHOULD treat an | sender MUST discontinue the protocol. The receiver SHOULD treat an | |||
error message as an indication that the other party likely has | error message as an indication that the other party likely has | |||
discontinued the protocol. But as the error message is not | discontinued the protocol. But as the error message is not | |||
authenticated, a received error message might also have been sent by | authenticated, a received error message might also have been sent by | |||
an attacker and the receiver MAY therefore try to continue the | an attacker and the receiver MAY therefore try to continue the | |||
protocol. | protocol. | |||
error SHALL be a CBOR Sequence (see Appendix B.1) as defined below | error SHALL be a CBOR Sequence (see Appendix C.1) as defined below | |||
error = ( | error = ( | |||
? C_x : bstr_identifier, | ||||
ERR_CODE : int, | ERR_CODE : int, | |||
ERR_INFO : any | ERR_INFO : any | |||
) | ) | |||
Figure 5: EDHOC Error Message | Figure 5: EDHOC Error Message | |||
where: | where: | |||
* C_x - (optional) variable length connection identifier, encoded as | o ERR_CODE - error code encoded as an integer. The value 0 is used | |||
a bstr_identifier (see Section 5.1). If error is sent by the | ||||
Responder and corr (METHOD_CORR mod 4) equals 0 or 2 then C_x is | ||||
set to C_I, else if error is sent by the Initiator and corr | ||||
(METHOD_CORR mod 4) equals 0 or 1 then C_x is set to C_R, else C_x | ||||
is omitted. | ||||
* ERR_CODE - error code encoded as an integer. The value 0 is used | ||||
for success, all other values (negative or positive) indicate | for success, all other values (negative or positive) indicate | |||
errors. | errors. | |||
* ERR_INFO - error information. Content and encoding depend on | o ERR_INFO - error information. Content and encoding depend on | |||
error code. | error code. | |||
The remainder of this section specifies the currently defined error | The remainder of this section specifies the currently defined error | |||
codes, see Figure 6. Error codes 1 and 2 MUST be supported. | codes, see Figure 6. Error codes 1 and 2 MUST be supported. | |||
Additional error codes and corresponding error information may be | Additional error codes and corresponding error information may be | |||
specified. | specified. | |||
+----------+---------------+----------------------------------------+ | +----------+---------------+----------------------------------------+ | |||
| ERR_CODE | ERR_INFO Type | Description | | | ERR_CODE | ERR_INFO Type | Description | | |||
+==========+===============+========================================+ | +==========+===============+========================================+ | |||
skipping to change at page 36, line 39 ¶ | skipping to change at page 36, line 39 ¶ | |||
message is mainly intended for software engineers that during | message is mainly intended for software engineers that during | |||
debugging need to interpret it in the context of the EDHOC | debugging need to interpret it in the context of the EDHOC | |||
specification. The diagnostic message SHOULD be provided to the | specification. The diagnostic message SHOULD be provided to the | |||
calling application where it SHOULD be logged. | calling application where it SHOULD be logged. | |||
6.3. Wrong Selected Cipher Suite | 6.3. Wrong Selected Cipher Suite | |||
Error code 2 MUST only be used in a response to message_1 in case the | Error code 2 MUST only be used in a response to message_1 in case the | |||
cipher suite selected by the Initiator is not supported by the | cipher suite selected by the Initiator is not supported by the | |||
Responder, or if the Responder supports a cipher suite more preferred | Responder, or if the Responder supports a cipher suite more preferred | |||
by the Initiator than the selected cipher suite, see Section 5.3.3. | by the Initiator than the selected cipher suite, see Section 5.2.3. | |||
ERR_INFO is of type SUITES_R: | ERR_INFO is of type SUITES_R: | |||
SUITES_R : [ supported : 2* suite ] / suite | SUITES_R : [ supported : 2* suite ] / suite | |||
If the Responder does not support the selected cipher suite, then | If the Responder does not support the selected cipher suite, then | |||
SUITES_R MUST include one or more supported cipher suites. If the | SUITES_R MUST include one or more supported cipher suites. If the | |||
Responder does not support the selected cipher suite, but supports | Responder does not support the selected cipher suite, but supports | |||
another cipher suite in SUITES_I, then SUITES_R MUST include the | another cipher suite in SUITES_I, then SUITES_R MUST include the | |||
first supported cipher suite in SUITES_I. | first supported cipher suite in SUITES_I. | |||
skipping to change at page 37, line 31 ¶ | skipping to change at page 37, line 31 ¶ | |||
Assume that the Initiator supports the five cipher suites 5, 6, 7, 8, | Assume that the Initiator supports the five cipher suites 5, 6, 7, 8, | |||
and 9 in decreasing order of preference. Figures 7 and 8 show | and 9 in decreasing order of preference. Figures 7 and 8 show | |||
examples of how the Initiator can truncate SUITES_I and how SUITES_R | examples of how the Initiator can truncate SUITES_I and how SUITES_R | |||
is used by Responders to give the Initiator information about the | is used by Responders to give the Initiator information about the | |||
cipher suites that the Responder supports. | cipher suites that the Responder supports. | |||
In the first example (Figure 7), the Responder supports cipher suite | In the first example (Figure 7), the Responder supports cipher suite | |||
6 but not the initially selected cipher suite 5. | 6 but not the initially selected cipher suite 5. | |||
Initiator Responder | Initiator Responder | |||
| METHOD_CORR, SUITES_I = 5, G_X, C_I, EAD_1 | | | METHOD, SUITES_I = 5, G_X, C_I, EAD_1 | | |||
+------------------------------------------------------------------>| | +------------------------------------------------------------------>| | |||
| message_1 | | | message_1 | | |||
| | | | | | |||
| C_I, DIAG_MSG, SUITES_R = 6 | | | DIAG_MSG, SUITES_R = 6 | | |||
|<------------------------------------------------------------------+ | |<------------------------------------------------------------------+ | |||
| error | | | error | | |||
| | | | | | |||
| METHOD_CORR, SUITES_I = [6, 5, 6], G_X, C_I, EAD_1 | | | METHOD, SUITES_I = [6, 5, 6], G_X, C_I, EAD_1 | | |||
+------------------------------------------------------------------>| | +------------------------------------------------------------------>| | |||
| message_1 | | | message_1 | | |||
Figure 7: Example of Responder supporting suite 6 but not suite 5. | Figure 7: Example of Responder supporting suite 6 but not suite 5. | |||
In the second example (Figure 8), the Responder supports cipher | In the second example (Figure 8), the Responder supports cipher | |||
suites 8 and 9 but not the more preferred (by the Initiator) cipher | suites 8 and 9 but not the more preferred (by the Initiator) cipher | |||
suites 5, 6 or 7. To illustrate the negotiation mechanics we let the | suites 5, 6 or 7. To illustrate the negotiation mechanics we let the | |||
Initiator first make a guess that the Responder supports suite 6 but | Initiator first make a guess that the Responder supports suite 6 but | |||
not suite 5. Since the Responder supports neither 5 nor 6, it | not suite 5. Since the Responder supports neither 5 nor 6, it | |||
responds with an error and SUITES_R, after which the Initiator | responds with an error and SUITES_R, after which the Initiator | |||
selects its most preferred supported suite. The order of cipher | selects its most preferred supported suite. The order of cipher | |||
suites in SUITES_R does not matter. (If the Responder had supported | suites in SUITES_R does not matter. (If the Responder had supported | |||
suite 5, it would include it in SUITES_R of the response, and it | suite 5, it would include it in SUITES_R of the response, and it | |||
would in that case have become the selected suite in the second | would in that case have become the selected suite in the second | |||
message_1.) | message_1.) | |||
Initiator Responder | Initiator Responder | |||
| METHOD_CORR, SUITES_I = [6, 5, 6], G_X, C_I, EAD_1 | | | METHOD, SUITES_I = [6, 5, 6], G_X, C_I, EAD_1 | | |||
+------------------------------------------------------------------>| | +------------------------------------------------------------------>| | |||
| message_1 | | | message_1 | | |||
| | | | | | |||
| C_I, DIAG_MSG, SUITES_R = [9, 8] | | | DIAG_MSG, SUITES_R = [9, 8] | | |||
|<------------------------------------------------------------------+ | |<------------------------------------------------------------------+ | |||
| error | | | error | | |||
| | | | | | |||
| METHOD_CORR, SUITES_I = [8, 5, 6, 7, 8], G_X, C_I, EAD_1 | | | METHOD, SUITES_I = [8, 5, 6, 7, 8], G_X, C_I, EAD_1 | | |||
+------------------------------------------------------------------>| | +------------------------------------------------------------------>| | |||
| message_1 | | | message_1 | | |||
Figure 8: Example of Responder supporting suites 8 and 9 but not | Figure 8: Example of Responder supporting suites 8 and 9 but not 5, 6 | |||
5, 6 or 7. | or 7. | |||
Note that the Initiator's list of supported cipher suites and order | Note that the Initiator's list of supported cipher suites and order | |||
of preference is fixed (see Section 5.3.1 and Section 5.3.2). | of preference is fixed (see Section 5.2.1 and Section 5.2.2). | |||
Furthermore, the Responder shall only accept message_1 if the | Furthermore, the Responder shall only accept message_1 if the | |||
selected cipher suite is the first cipher suite in SUITES_I that the | selected cipher suite is the first cipher suite in SUITES_I that the | |||
Responder supports (see Section 5.3.3). Following this procedure | Responder supports (see Section 5.2.3). Following this procedure | |||
ensures that the selected cipher suite is the most preferred (by the | ensures that the selected cipher suite is the most preferred (by the | |||
Initiator) cipher suite supported by both parties. | Initiator) cipher suite supported by both parties. | |||
If the selected cipher suite is not the first cipher suite which the | If the selected cipher suite is not the first cipher suite which the | |||
Responder supports in SUITES_I received in message_1, then Responder | Responder supports in SUITES_I received in message_1, then Responder | |||
MUST discontinue the protocol, see Section 5.3.3. If SUITES_I in | MUST discontinue the protocol, see Section 5.2.3. If SUITES_I in | |||
message_1 is manipulated then the integrity verification of message_2 | message_1 is manipulated then the integrity verification of message_2 | |||
containing the transcript hash TH_2 will fail and the Initiator will | containing the transcript hash TH_2 will fail and the Initiator will | |||
discontinue the protocol. | discontinue the protocol. | |||
7. Transferring EDHOC and Deriving an OSCORE Context | 7. Security Considerations | |||
7.1. EDHOC Message 4 | ||||
This section specifies message_4 which is OPTIONAL to support. Key | ||||
confirmation is normally provided by sending an application message | ||||
from the Responder to the Initiator protected with a key derived with | ||||
the EDHOC-Exporter, e.g., using OSCORE (see | ||||
[I-D.ietf-core-oscore-edhoc]). In deployments where no protected | ||||
application message is sent from the Responder to the Initiator, the | ||||
Responder MUST send message_4. Two examples of such deployments: | ||||
1. When EDHOC is only used for authentication and no application | ||||
data is sent. | ||||
2. When application data is only sent from the Initiator to the | ||||
Responder. | ||||
Further considerations are provided in Section 3.7. | ||||
7.1.1. Formatting of Message 4 | ||||
message_4 and data_4 SHALL be CBOR Sequences (see Appendix B.1) as | ||||
defined below | ||||
message_4 = ( | ||||
data_4, | ||||
CIPHERTEXT_4 : bstr, | ||||
) | ||||
data_4 = ( | ||||
? C_I : bstr_identifier, | ||||
) | ||||
7.1.2. Responder Processing of Message 4 | ||||
The Responder SHALL compose message_4 as follows: | ||||
* If corr (METHOD_CORR mod 4) equals 1 or 3, C_I is omitted, | ||||
otherwise C_I is not omitted. | ||||
* Compute a COSE_Encrypt0 as defined in Section 5.3 of | ||||
[I-D.ietf-cose-rfc8152bis-struct], with the EDHOC AEAD algorithm | ||||
in the selected cipher suite, and the following parameters. The | ||||
protected header SHALL be empty. | ||||
- protected = h'' | ||||
- external_aad = TH_4 | ||||
- plaintext = ( ? EAD_4 ) | ||||
where EAD_4 is protected external authorization data, see | ||||
Section 3.6. COSE constructs the input to the AEAD [RFC5116] as | ||||
follows: | ||||
- Key K = EDHOC-Exporter( "EDHOC_message_4_Key", length ) | ||||
- Nonce N = EDHOC-Exporter( "EDHOC_message_4_Nonce", length ) | ||||
- Plaintext P = ( ? EAD_4 ) | ||||
- Associated data A = [ "Encrypt0", h'', TH_4 ] | ||||
CIPHERTEXT_4 is the 'ciphertext' of the COSE_Encrypt0. | ||||
* Encode message_4 as a sequence of CBOR encoded data items as | ||||
specified in Section 7.1.1. | ||||
7.1.3. Initiator Processing of Message 4 | ||||
The Initiator SHALL process message_4 as follows: | ||||
* Decode message_4 (see Appendix B.1). | ||||
* Retrieve the protocol state using the connection identifier C_I | ||||
and/or other external information such as the CoAP Token and the | ||||
5-tuple. | ||||
* Decrypt and verify the outer COSE_Encrypt0 as defined in | ||||
Section 5.3 of [I-D.ietf-cose-rfc8152bis-struct], with the EDHOC | ||||
AEAD algorithm in the selected cipher suite, and the parameters | ||||
defined in Section 7.1.2. | ||||
* Pass EAD_4 to the security application. | ||||
If any verification step fails the Initiator MUST send an EDHOC error | ||||
message back, formatted as defined in Section 6, and the session MUST | ||||
be discontinued. | ||||
7.2. Transferring EDHOC in CoAP | ||||
It is recommended to transport EDHOC as an exchange of CoAP [RFC7252] | ||||
messages. CoAP is a reliable transport that can preserve packet | ||||
ordering and handle message duplication. CoAP can also perform | ||||
fragmentation and protect against denial of service attacks. It is | ||||
recommended to carry the EDHOC messages in Confirmable messages, | ||||
especially if fragmentation is used. | ||||
By default, the CoAP client is the Initiator and the CoAP server is | ||||
the Responder, but the roles SHOULD be chosen to protect the most | ||||
sensitive identity, see Section 8. By default, EDHOC is transferred | ||||
in POST requests and 2.04 (Changed) responses to the Uri-Path: | ||||
"/.well-known/edhoc", but an application may define its own path that | ||||
can be discovered e.g. using resource directory | ||||
[I-D.ietf-core-resource-directory]. | ||||
By default, the message flow is as follows: EDHOC message_1 is sent | ||||
in the payload of a POST request from the client to the server's | ||||
resource for EDHOC. EDHOC message_2 or the EDHOC error message is | ||||
sent from the server to the client in the payload of a 2.04 (Changed) | ||||
response. EDHOC message_3 or the EDHOC error message is sent from | ||||
the client to the server's resource in the payload of a POST request. | ||||
If needed, an EDHOC error message is sent from the server to the | ||||
client in the payload of a 2.04 (Changed) response. Alternatively, | ||||
if EDHOC message_4 is used, it is sent from the server to the client | ||||
in the payload of a 2.04 (Changed) response analogously to message_2. | ||||
An example of a successful EDHOC exchange using CoAP is shown in | ||||
Figure 9. In this case the CoAP Token enables the Initiator to | ||||
correlate message_1 and message_2 so the correlation parameter corr = | ||||
1. | ||||
Client Server | ||||
| | | ||||
+--------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path: "/.well-known/edhoc" | ||||
| | Content-Format: application/edhoc | ||||
| | Payload: EDHOC message_1 | ||||
| | | ||||
|<---------+ Header: 2.04 Changed | ||||
| 2.04 | Content-Format: application/edhoc | ||||
| | Payload: EDHOC message_2 | ||||
| | | ||||
+--------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path: "/.well-known/edhoc" | ||||
| | Content-Format: application/edhoc | ||||
| | Payload: EDHOC message_3 | ||||
| | | ||||
|<---------+ Header: 2.04 Changed | ||||
| 2.04 | | ||||
| | | ||||
Figure 9: Transferring EDHOC in CoAP when the Initiator is CoAP | ||||
Client | ||||
The exchange in Figure 9 protects the client identity against active | ||||
attackers and the server identity against passive attackers. An | ||||
alternative exchange that protects the server identity against active | ||||
attackers and the client identity against passive attackers is shown | ||||
in Figure 10. In this case the CoAP Token enables the Responder to | ||||
correlate message_2 and message_3 so the correlation parameter corr = | ||||
2. If EDHOC message_4 is used, it is transported with CoAP in the | ||||
payload of a POST request with a 2.04 (Changed) response. | ||||
Client Server | ||||
| | | ||||
+--------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path: "/.well-known/edhoc" | ||||
| | | ||||
|<---------+ Header: 2.04 Changed | ||||
| 2.04 | Content-Format: application/edhoc | ||||
| | Payload: EDHOC message_1 | ||||
| | | ||||
+--------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path: "/.well-known/edhoc" | ||||
| | Content-Format: application/edhoc | ||||
| | Payload: EDHOC message_2 | ||||
| | | ||||
|<---------+ Header: 2.04 Changed | ||||
| 2.04 | Content-Format: application/edhoc | ||||
| | Payload: EDHOC message_3 | ||||
| | | ||||
Figure 10: Transferring EDHOC in CoAP when the Initiator is CoAP | ||||
Server | ||||
To protect against denial-of-service attacks, the CoAP server MAY | ||||
respond to the first POST request with a 4.01 (Unauthorized) | ||||
containing an Echo option [I-D.ietf-core-echo-request-tag]. This | ||||
forces the initiator to demonstrate its reachability at its apparent | ||||
network address. If message fragmentation is needed, the EDHOC | ||||
messages may be fragmented using the CoAP Block-Wise Transfer | ||||
mechanism [RFC7959]. EDHOC does not restrict how error messages are | ||||
transported with CoAP, as long as the appropriate error message can | ||||
to be transported in response to a message that failed (see | ||||
Section 6). The use of EDHOC with OSCORE is specified in | ||||
[I-D.ietf-core-oscore-edhoc]. | ||||
8. Security Considerations | ||||
8.1. Security Properties | 7.1. Security Properties | |||
EDHOC inherits its security properties from the theoretical SIGMA-I | EDHOC inherits its security properties from the theoretical SIGMA-I | |||
protocol [SIGMA]. Using the terminology from [SIGMA], EDHOC provides | protocol [SIGMA]. Using the terminology from [SIGMA], EDHOC provides | |||
perfect forward secrecy, mutual authentication with aliveness, | perfect forward secrecy, mutual authentication with aliveness, | |||
consistency, and peer awareness. As described in [SIGMA], peer | consistency, and peer awareness. As described in [SIGMA], peer | |||
awareness is provided to the Responder, but not to the Initiator. | awareness is provided to the Responder, but not to the Initiator. | |||
EDHOC protects the credential identifier of the Initiator against | EDHOC protects the credential identifier of the Initiator against | |||
active attacks and the credential identifier of the Responder against | active attacks and the credential identifier of the Responder against | |||
passive attacks. The roles should be assigned to protect the most | passive attacks. The roles should be assigned to protect the most | |||
sensitive identity/identifier, typically that which is not possible | sensitive identity/identifier, typically that which is not possible | |||
to infer from routing information in the lower layers. | to infer from routing information in the lower layers. | |||
Compared to [SIGMA], EDHOC adds an explicit method type and expands | Compared to [SIGMA], EDHOC adds an explicit method type and expands | |||
the message authentication coverage to additional elements such as | the message authentication coverage to additional elements such as | |||
algorithms, external authorization data, and previous messages. This | algorithms, external authorization data, and previous messages. This | |||
protects against an attacker replaying messages or injecting messages | protects against an attacker replaying messages or injecting messages | |||
from another session. | from another session. | |||
EDHOC also adds negotiation of connection identifiers and downgrade | EDHOC also adds selection of connection identifiers and downgrade | |||
protected negotiation of cryptographic parameters, i.e. an attacker | protected negotiation of cryptographic parameters, i.e. an attacker | |||
cannot affect the negotiated parameters. A single session of EDHOC | cannot affect the negotiated parameters. A single session of EDHOC | |||
does not include negotiation of cipher suites, but it enables the | does not include negotiation of cipher suites, but it enables the | |||
Responder to verify that the selected cipher suite is the most | Responder to verify that the selected cipher suite is the most | |||
preferred cipher suite by the Initiator which is supported by both | preferred cipher suite by the Initiator which is supported by both | |||
the Initiator and the Responder. | the Initiator and the Responder. | |||
As required by [RFC7258], IETF protocols need to mitigate pervasive | As required by [RFC7258], IETF protocols need to mitigate pervasive | |||
monitoring when possible. One way to mitigate pervasive monitoring | monitoring when possible. One way to mitigate pervasive monitoring | |||
is to use a key exchange that provides perfect forward secrecy. | is to use a key exchange that provides perfect forward secrecy. | |||
skipping to change at page 45, line 5 ¶ | skipping to change at page 40, line 45 ¶ | |||
run of the protocol by presenting the private ephemeral key, and vice | run of the protocol by presenting the private ephemeral key, and vice | |||
versa. Note that storing the private ephemeral keys violates the | versa. Note that storing the private ephemeral keys violates the | |||
protocol requirements. With static Diffie-Hellman key | protocol requirements. With static Diffie-Hellman key | |||
authentication, both parties can always deny having participated in | authentication, both parties can always deny having participated in | |||
the protocol. | the protocol. | |||
Two earlier versions of EDHOC have been formally analyzed [Norrman20] | Two earlier versions of EDHOC have been formally analyzed [Norrman20] | |||
[Bruni18] and the specification has been updated based on the | [Bruni18] and the specification has been updated based on the | |||
analysis. | analysis. | |||
8.2. Cryptographic Considerations | 7.2. Cryptographic Considerations | |||
The security of the SIGMA protocol requires the MAC to be bound to | The security of the SIGMA protocol requires the MAC to be bound to | |||
the identity of the signer. Hence the message authenticating | the identity of the signer. Hence the message authenticating | |||
functionality of the authenticated encryption in EDHOC is critical: | functionality of the authenticated encryption in EDHOC is critical: | |||
authenticated encryption MUST NOT be replaced by plain encryption | authenticated encryption MUST NOT be replaced by plain encryption | |||
only, even if authentication is provided at another level or through | only, even if authentication is provided at another level or through | |||
a different mechanism. EDHOC implements SIGMA-I using a MAC-then- | a different mechanism. EDHOC implements SIGMA-I using a MAC-then- | |||
Sign approach. | Sign approach. | |||
To reduce message overhead EDHOC does not use explicit nonces and | To reduce message overhead EDHOC does not use explicit nonces and | |||
skipping to change at page 46, line 5 ¶ | skipping to change at page 41, line 41 ¶ | |||
parties can derive application keys with other labels or run EDHOC | parties can derive application keys with other labels or run EDHOC | |||
again. | again. | |||
Requirement for how to securely generate, validate, and process the | Requirement for how to securely generate, validate, and process the | |||
ephermeral public keys depend on the elliptic curve. For X25519 and | ephermeral public keys depend on the elliptic curve. For X25519 and | |||
X448, the requirements are defined in [RFC7748]. For secp256r1, | X448, the requirements are defined in [RFC7748]. For secp256r1, | |||
secp384r1, and secp521r1, the requirements are defined in Section 5 | secp384r1, and secp521r1, the requirements are defined in Section 5 | |||
of [SP-800-56A]. For secp256r1, secp384r1, and secp521r1, at least | of [SP-800-56A]. For secp256r1, secp384r1, and secp521r1, at least | |||
partial public-key validation MUST be done. | partial public-key validation MUST be done. | |||
8.3. Cipher Suites and Cryptographic Algorithms | 7.3. Cipher Suites and Cryptographic Algorithms | |||
For many constrained IoT devices it is problematic to support more | For many constrained IoT devices it is problematic to support more | |||
than one cipher suite. Existing devices can be expected to support | than one cipher suite. Existing devices can be expected to support | |||
either ECDSA or EdDSA. To enable as much interoperability as we can | either ECDSA or EdDSA. To enable as much interoperability as we can | |||
reasonably achieve, less constrained devices SHOULD implement both | reasonably achieve, less constrained devices SHOULD implement both | |||
cipher suite 0 (AES-CCM-16-64-128, SHA-256, X25519, EdDSA, AES-CCM- | cipher suite 0 (AES-CCM-16-64-128, SHA-256, X25519, EdDSA, AES-CCM- | |||
16-64-128, SHA-256) and cipher suite 2 (AES-CCM-16-64-128, SHA-256, | 16-64-128, SHA-256) and cipher suite 2 (AES-CCM-16-64-128, SHA-256, | |||
P-256, ES256, AES-CCM-16-64-128, SHA-256). Constrained endpoints | P-256, ES256, AES-CCM-16-64-128, SHA-256). Constrained endpoints | |||
SHOULD implement cipher suite 0 or cipher suite 2. Implementations | SHOULD implement cipher suite 0 or cipher suite 2. Implementations | |||
only need to implement the algorithms needed for their supported | only need to implement the algorithms needed for their supported | |||
skipping to change at page 46, line 29 ¶ | skipping to change at page 42, line 18 ¶ | |||
choice of key length used in the different algorithms needs to be | choice of key length used in the different algorithms needs to be | |||
harmonized, so that a sufficient security level is maintained for | harmonized, so that a sufficient security level is maintained for | |||
certificates, EDHOC, and the protection of application data. The | certificates, EDHOC, and the protection of application data. The | |||
Initiator and the Responder should enforce a minimum security level. | Initiator and the Responder should enforce a minimum security level. | |||
The hash algorithms SHA-1 and SHA-256/64 (256-bit Hash truncated to | The hash algorithms SHA-1 and SHA-256/64 (256-bit Hash truncated to | |||
64-bits) SHALL NOT be supported for use in EDHOC except for | 64-bits) SHALL NOT be supported for use in EDHOC except for | |||
certificate identification with x5u and c5u. Note that secp256k1 is | certificate identification with x5u and c5u. Note that secp256k1 is | |||
only defined for use with ECDSA and not for ECDH. | only defined for use with ECDSA and not for ECDH. | |||
8.4. Unprotected Data | 7.4. Unprotected Data | |||
The Initiator and the Responder must make sure that unprotected data | The Initiator and the Responder must make sure that unprotected data | |||
and metadata do not reveal any sensitive information. This also | and metadata do not reveal any sensitive information. This also | |||
applies for encrypted data sent to an unauthenticated party. In | applies for encrypted data sent to an unauthenticated party. In | |||
particular, it applies to EAD_1, ID_CRED_R, EAD_2, and error | particular, it applies to EAD_1, ID_CRED_R, EAD_2, and error | |||
messages. Using the same EAD_1 in several EDHOC sessions allows | messages. Using the same EAD_1 in several EDHOC sessions allows | |||
passive eavesdroppers to correlate the different sessions. Another | passive eavesdroppers to correlate the different sessions. Another | |||
consideration is that the list of supported cipher suites may | consideration is that the list of supported cipher suites may | |||
potentially be used to identify the application. | potentially be used to identify the application. | |||
The Initiator and the Responder must also make sure that | The Initiator and the Responder must also make sure that | |||
unauthenticated data does not trigger any harmful actions. In | unauthenticated data does not trigger any harmful actions. In | |||
particular, this applies to EAD_1 and error messages. | particular, this applies to EAD_1 and error messages. | |||
8.5. Denial-of-Service | 7.5. Denial-of-Service | |||
EDHOC itself does not provide countermeasures against Denial-of- | EDHOC itself does not provide countermeasures against Denial-of- | |||
Service attacks. By sending a number of new or replayed message_1 an | Service attacks. By sending a number of new or replayed message_1 an | |||
attacker may cause the Responder to allocate state, perform | attacker may cause the Responder to allocate state, perform | |||
cryptographic operations, and amplify messages. To mitigate such | cryptographic operations, and amplify messages. To mitigate such | |||
attacks, an implementation SHOULD rely on lower layer mechanisms such | attacks, an implementation SHOULD rely on lower layer mechanisms such | |||
as the Echo option in CoAP [I-D.ietf-core-echo-request-tag] that | as the Echo option in CoAP [I-D.ietf-core-echo-request-tag] that | |||
forces the initiator to demonstrate reachability at its apparent | forces the initiator to demonstrate reachability at its apparent | |||
network address. | network address. | |||
An attacker can also send faked message_2, message_3, message_4, or | An attacker can also send faked message_2, message_3, message_4, or | |||
error in an attempt to trick the receiving party to send an error | error in an attempt to trick the receiving party to send an error | |||
message and discontinue the session. EDHOC implementations MAY | message and discontinue the session. EDHOC implementations MAY | |||
evaluate if a received message is likely to have be forged by and | evaluate if a received message is likely to have be forged by and | |||
attacker and ignore it without sending an error message or | attacker and ignore it without sending an error message or | |||
discontinuing the session. | discontinuing the session. | |||
8.6. Implementation Considerations | 7.6. Implementation Considerations | |||
The availability of a secure random number generator is essential for | The availability of a secure random number generator is essential for | |||
the security of EDHOC. If no true random number generator is | the security of EDHOC. If no true random number generator is | |||
available, a truly random seed MUST be provided from an external | available, a truly random seed MUST be provided from an external | |||
source and used with a cryptographically secure pseudorandom number | source and used with a cryptographically secure pseudorandom number | |||
generator. As each pseudorandom number must only be used once, an | generator. As each pseudorandom number must only be used once, an | |||
implementation need to get a new truly random seed after reboot, or | implementation need to get a new truly random seed after reboot, or | |||
continuously store state in nonvolatile memory, see ([RFC8613], | continuously store state in nonvolatile memory, see ([RFC8613], | |||
Appendix B.1.1) for issues and solution approaches for writing to | Appendix B.1.1) for issues and solution approaches for writing to | |||
nonvolatile memory. Intentionally or unintentionally weak or | nonvolatile memory. Intentionally or unintentionally weak or | |||
skipping to change at page 49, line 12 ¶ | skipping to change at page 44, line 42 ¶ | |||
outside that environment. Note that non-EDHOC code inside the TEE | outside that environment. Note that non-EDHOC code inside the TEE | |||
might still be able to read EDHOC data and tamper with EDHOC code, to | might still be able to read EDHOC data and tamper with EDHOC code, to | |||
protect against such attacks EDHOC needs to be in its own zone. To | protect against such attacks EDHOC needs to be in its own zone. To | |||
provide better protection against some forms of physical attacks, | provide better protection against some forms of physical attacks, | |||
sensitive EDHOC data should be stored inside the SoC or encrypted and | sensitive EDHOC data should be stored inside the SoC or encrypted and | |||
integrity protected when sent on a data bus (e.g. between the CPU and | integrity protected when sent on a data bus (e.g. between the CPU and | |||
RAM or Flash). Secure boot can be used to increase the security of | RAM or Flash). Secure boot can be used to increase the security of | |||
code and data in the Rich Execution Environment (REE) by validating | code and data in the Rich Execution Environment (REE) by validating | |||
the REE image. | the REE image. | |||
9. IANA Considerations | 8. IANA Considerations | |||
9.1. EDHOC Exporter Label | 8.1. EDHOC Exporter Label | |||
IANA has created a new registry titled "EDHOC Exporter Label" under | IANA has created a new registry titled "EDHOC Exporter Label" under | |||
the new heading "EDHOC". The registration procedure is "Expert | the new heading "EDHOC". The registration procedure is "Expert | |||
Review". The columns of the registry are Label, Description, and | Review". The columns of the registry are Label, Description, and | |||
Reference. All columns are text strings. The initial contents of | Reference. All columns are text strings. The initial contents of | |||
the registry are: | the registry are: | |||
Label: EDHOC_message_4_Key | Label: EDHOC_message_4_Key | |||
Description: Key used to protect EDHOC message_4 | Description: Key used to protect EDHOC message_4 | |||
Reference: [[this document]] | Reference: [[this document]] | |||
Label: EDHOC_message_4_Nonce | Label: EDHOC_message_4_Nonce | |||
Description: Nonce used to protect EDHOC message_4 | Description: Nonce used to protect EDHOC message_4 | |||
Reference: [[this document]] | Reference: [[this document]] | |||
9.2. EDHOC Cipher Suites Registry | Label: OSCORE Master Secret | |||
Description: Derived OSCORE Master Secret | ||||
Reference: [[this document]] | ||||
Label: OSCORE Master Salt | ||||
Description: Derived OSCORE Master Salt | ||||
Reference: [[this document]] | ||||
8.2. EDHOC Cipher Suites Registry | ||||
IANA has created a new registry titled "EDHOC Cipher Suites" under | IANA has created a new registry titled "EDHOC Cipher Suites" under | |||
the new heading "EDHOC". The registration procedure is "Expert | the new heading "EDHOC". The registration procedure is "Expert | |||
Review". The columns of the registry are Value, Array, Description, | Review". The columns of the registry are Value, Array, Description, | |||
and Reference, where Value is an integer and the other columns are | and Reference, where Value is an integer and the other columns are | |||
text strings. The initial contents of the registry are: | text strings. The initial contents of the registry are: | |||
Value: -24 | Value: -24 | |||
Algorithms: N/A | Algorithms: N/A | |||
Desc: Reserved for Private Use | Desc: Reserved for Private Use | |||
skipping to change at page 50, line 34 ¶ | skipping to change at page 46, line 29 ¶ | |||
AES-CCM-16-64-128, SHA-256 | AES-CCM-16-64-128, SHA-256 | |||
Reference: [[this document]] | Reference: [[this document]] | |||
Value: 3 | Value: 3 | |||
Array: 30, -16, 1, -7, 10, -16 | Array: 30, -16, 1, -7, 10, -16 | |||
Desc: AES-CCM-16-128-128, SHA-256, P-256, ES256, | Desc: AES-CCM-16-128-128, SHA-256, P-256, ES256, | |||
AES-CCM-16-64-128, SHA-256 | AES-CCM-16-64-128, SHA-256 | |||
Reference: [[this document]] | Reference: [[this document]] | |||
Value: 4 | Value: 4 | |||
Array: 24, -16, 4, -8, 24, -16 | ||||
Desc: ChaCha20/Poly1305, SHA-256, X25519, EdDSA, | ||||
ChaCha20/Poly1305, SHA-256 | ||||
Reference: [[this document]] | ||||
Value: 5 | ||||
Array: 24, -16, 1, -7, 24, -16 | ||||
Desc: ChaCha20/Poly1305, SHA-256, P-256, ES256, | ||||
ChaCha20/Poly1305, SHA-256 | ||||
Reference: [[this document]] | ||||
Value: 6 | ||||
Array: 1, -16, 4, -7, 1, -16 | Array: 1, -16, 4, -7, 1, -16 | |||
Desc: A128GCM, SHA-256, X25519, ES256, | Desc: A128GCM, SHA-256, X25519, ES256, | |||
A128GCM, SHA-256 | A128GCM, SHA-256 | |||
Reference: [[this document]] | Reference: [[this document]] | |||
Value: 5 | Value: 24 | |||
Array: 3, -43, 2, -35, 3, -43 | Array: 3, -43, 2, -35, 3, -43 | |||
Desc: A256GCM, SHA-384, P-384, ES384, | Desc: A256GCM, SHA-384, P-384, ES384, | |||
A256GCM, SHA-384 | A256GCM, SHA-384 | |||
Reference: [[this document]] | Reference: [[this document]] | |||
Value: 25 | ||||
Array: 24, -45, 5, -8, 24, -45 | ||||
Desc: ChaCha20/Poly1305, SHAKE256, X448, EdDSA, | ||||
ChaCha20/Poly1305, SHAKE256 | ||||
Reference: [[this document]] | ||||
9.3. EDHOC Method Type Registry | 8.3. EDHOC Method Type Registry | |||
IANA has created a new registry entitled "EDHOC Method Type" under | IANA has created a new registry entitled "EDHOC Method Type" under | |||
the new heading "EDHOC". The registration procedure is "Expert | the new heading "EDHOC". The registration procedure is "Expert | |||
Review". The columns of the registry are Value, Description, and | Review". The columns of the registry are Value, Description, and | |||
Reference, where Value is an integer and the other columns are text | Reference, where Value is an integer and the other columns are text | |||
strings. The initial contents of the registry is shown in Figure 4. | strings. The initial contents of the registry is shown in Figure 4. | |||
9.4. EDHOC Error Codes Registry | 8.4. EDHOC Error Codes Registry | |||
IANA has created a new registry entitled "EDHOC Error Codes" under | IANA has created a new registry entitled "EDHOC Error Codes" under | |||
the new heading "EDHOC". The registration procedure is | the new heading "EDHOC". The registration procedure is | |||
"Specification Required". The columns of the registry are ERR_CODE, | "Specification Required". The columns of the registry are ERR_CODE, | |||
ERR_INFO Type and Description, where ERR_CODE is an integer, ERR_INFO | ERR_INFO Type and Description, where ERR_CODE is an integer, ERR_INFO | |||
is a CDDL defined type, and Description is a text string. The | is a CDDL defined type, and Description is a text string. The | |||
initial contents of the registry is shown in Figure 6. | initial contents of the registry is shown in Figure 6. | |||
9.5. The Well-Known URI Registry | 8.5. COSE Header Parameters Registry | |||
This document registers the following entries in the "COSE Header | ||||
Parameters" registry under the "CBOR Object Signing and Encryption | ||||
(COSE)" heading. The value of the 'cwt' header parameter is a CWT | ||||
[RFC8392] or an unprotected CWT Claims Set [I-D.ietf-rats-uccs]. | ||||
+-----------+-------+----------------+------------------------------+ | ||||
| Name | Label | Value Type | Description | | ||||
+===========+=======+================+==============================+ | ||||
| cwt | TBD1 | COSE_Messages | A CBOR Web Token (CWT) or an | | ||||
| | | / map | unprotected CWT Claims Set | | ||||
+-----------+-------+----------------+------------------------------+ | ||||
8.6. COSE Header Parameters Registry | ||||
IANA has added the COSE header parameter 'kid2' to the COSE Header | ||||
Parameters registry. The kid2 parameter may point to a COSE key | ||||
common parameter 'kid' or 'kid2'. The kid2 parameter can be used to | ||||
identify a key stored in a "raw" COSE_Key, in a CWT, or in a | ||||
certificate. The Value Reference for this item is empty and omitted | ||||
from the table below. | ||||
+------+-------+------------+----------------+-------------------+ | ||||
| Name | Label | Value Type | Description | Reference | | ||||
+------+-------+------------+----------------+-------------------+ | ||||
| kid2 | TBD | bstr / int | Key identifier | [[This document]] | | ||||
+------+-------+------------+----------------+-------------------+ | ||||
8.7. COSE Key Common Parameters Registry | ||||
IANA has added the COSE key common parameter 'kid2' to the COSE Key | ||||
Common Parameters registry. The Value Reference for this item is | ||||
empty and omitted from the table below. | ||||
+------+-------+------------+----------------+-------------------+ | ||||
| Name | Label | Value Type | Description | Reference | | ||||
+------+-------+------------+----------------+-------------------+ | ||||
| kid2 | TBD | bstr / int | Key identifi- | [[This document]] | | ||||
| | | | cation value - | | | ||||
| | | | match to kid2 | | | ||||
| | | | in message | | | ||||
+------+-------+------------+----------------+-------------------+ | ||||
8.8. The Well-Known URI Registry | ||||
IANA has added the well-known URI 'edhoc' to the Well-Known URIs | IANA has added the well-known URI 'edhoc' to the Well-Known URIs | |||
registry. | registry. | |||
* URI suffix: edhoc | o URI suffix: edhoc | |||
* Change controller: IETF | o Change controller: IETF | |||
* Specification document(s): [[this document]] | o Specification document(s): [[this document]] | |||
* Related information: None | o Related information: None | |||
9.6. Media Types Registry | 8.9. Media Types Registry | |||
IANA has added the media type 'application/edhoc' to the Media Types | IANA has added the media type 'application/edhoc' to the Media Types | |||
registry. | registry. | |||
* Type name: application | o Type name: application | |||
* Subtype name: edhoc | ||||
* Required parameters: N/A | o Subtype name: edhoc | |||
* Optional parameters: N/A | o Required parameters: N/A | |||
* Encoding considerations: binary | o Optional parameters: N/A | |||
* Security considerations: See Section 7 of this document. | o Encoding considerations: binary | |||
o Security considerations: See Section 7 of this document. | ||||
* Interoperability considerations: N/A | o Interoperability considerations: N/A | |||
* Published specification: [[this document]] (this document) | o Published specification: [[this document]] (this document) | |||
* Applications that use this media type: To be identified | o Applications that use this media type: To be identified | |||
* Fragment identifier considerations: N/A | o Fragment identifier considerations: N/A | |||
* Additional information: | o Additional information: | |||
- Magic number(s): N/A | * Magic number(s): N/A | |||
- File extension(s): N/A | * File extension(s): N/A | |||
- Macintosh file type code(s): N/A | * Macintosh file type code(s): N/A | |||
* Person & email address to contact for further information: See | o Person & email address to contact for further information: See | |||
"Authors' Addresses" section. | "Authors' Addresses" section. | |||
* Intended usage: COMMON | o Intended usage: COMMON | |||
* Restrictions on usage: N/A | o Restrictions on usage: N/A | |||
* Author: See "Authors' Addresses" section. | o Author: See "Authors' Addresses" section. | |||
* Change Controller: IESG | o Change Controller: IESG | |||
9.7. CoAP Content-Formats Registry | 8.10. CoAP Content-Formats Registry | |||
IANA has added the media type 'application/edhoc' to the CoAP | IANA has added the media type 'application/edhoc' to the CoAP | |||
Content-Formats registry. | Content-Formats registry. | |||
* Media Type: application/edhoc | o Media Type: application/edhoc | |||
* Encoding: | o Encoding: | |||
* ID: TBD42 | o ID: TBD42 | |||
* Reference: [[this document]] | o Reference: [[this document]] | |||
9.8. Expert Review Instructions | 8.11. EDHOC External Authorization Data | |||
IANA has created a new registry entitled "EDHOC External | ||||
Authorization Data" under the new heading "EDHOC". The registration | ||||
procedure is "Expert Review". The columns of the registry are Value, | ||||
Description, and Reference, where Value is an integer and the other | ||||
columns are text strings. | ||||
8.12. Expert Review Instructions | ||||
The IANA Registries established in this document is defined as | The IANA Registries established in this document is defined as | |||
"Expert Review". This section gives some general guidelines for what | "Expert Review". This section gives some general guidelines for what | |||
the experts should be looking for, but they are being designated as | the experts should be looking for, but they are being designated as | |||
experts for a reason so they should be given substantial latitude. | experts for a reason so they should be given substantial latitude. | |||
Expert reviewers should take into consideration the following points: | Expert reviewers should take into consideration the following points: | |||
* Clarity and correctness of registrations. Experts are expected to | o Clarity and correctness of registrations. Experts are expected to | |||
check the clarity of purpose and use of the requested entries. | check the clarity of purpose and use of the requested entries. | |||
Expert needs to make sure the values of algorithms are taken from | Expert needs to make sure the values of algorithms are taken from | |||
the right registry, when that's required. Expert should consider | the right registry, when that's required. Expert should consider | |||
requesting an opinion on the correctness of registered parameters | requesting an opinion on the correctness of registered parameters | |||
from relevant IETF working groups. Encodings that do not meet | from relevant IETF working groups. Encodings that do not meet | |||
these objective of clarity and completeness should not be | these objective of clarity and completeness should not be | |||
registered. | registered. | |||
* Experts should take into account the expected usage of fields when | o Experts should take into account the expected usage of fields when | |||
approving point assignment. The length of the encoded value | approving point assignment. The length of the encoded value | |||
should be weighed against how many code points of that length are | should be weighed against how many code points of that length are | |||
left, the size of device it will be used on, and the number of | left, the size of device it will be used on, and the number of | |||
code points left that encode to that size. | code points left that encode to that size. | |||
* Specifications are recommended. When specifications are not | o Specifications are recommended. When specifications are not | |||
provided, the description provided needs to have sufficient | provided, the description provided needs to have sufficient | |||
information to verify the points above. | information to verify the points above. | |||
10. References | 9. References | |||
10.1. Normative References | 9.1. Normative References | |||
[I-D.ietf-core-echo-request-tag] | ||||
Amsuess, C., Mattsson, J. P., and G. Selander, "CoAP: | ||||
Echo, Request-Tag, and Token Processing", draft-ietf-core- | ||||
echo-request-tag-12 (work in progress), February 2021. | ||||
[I-D.ietf-cose-rfc8152bis-algs] | ||||
Schaad, J., "CBOR Object Signing and Encryption (COSE): | ||||
Initial Algorithms", draft-ietf-cose-rfc8152bis-algs-12 | ||||
(work in progress), September 2020. | ||||
[I-D.ietf-cose-rfc8152bis-struct] | ||||
Schaad, J., "CBOR Object Signing and Encryption (COSE): | ||||
Structures and Process", draft-ietf-cose-rfc8152bis- | ||||
struct-15 (work in progress), February 2021. | ||||
[I-D.ietf-cose-x509] | ||||
Schaad, J., "CBOR Object Signing and Encryption (COSE): | ||||
Header parameters for carrying and referencing X.509 | ||||
certificates", draft-ietf-cose-x509-08 (work in progress), | ||||
December 2020. | ||||
[I-D.ietf-lake-reqs] | ||||
Vucinic, M., Selander, G., Mattsson, J. P., and D. Garcia- | ||||
Carrillo, "Requirements for a Lightweight AKE for OSCORE", | ||||
draft-ietf-lake-reqs-04 (work in progress), June 2020. | ||||
[I-D.ietf-rats-uccs] | ||||
Birkholz, H., O'Donoghue, J., Cam-Winget, N., and C. | ||||
Bormann, "A CBOR Tag for Unprotected CWT Claims Sets", | ||||
draft-ietf-rats-uccs-00 (work in progress), May 2021. | ||||
[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>. | |||
[RFC5116] McGrew, D., "An Interface and Algorithms for Authenticated | [RFC5116] McGrew, D., "An Interface and Algorithms for Authenticated | |||
Encryption", RFC 5116, DOI 10.17487/RFC5116, January 2008, | Encryption", RFC 5116, DOI 10.17487/RFC5116, January 2008, | |||
<https://www.rfc-editor.org/info/rfc5116>. | <https://www.rfc-editor.org/info/rfc5116>. | |||
skipping to change at page 54, line 5 ¶ | skipping to change at page 52, line 14 ¶ | |||
[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>. | |||
[RFC7748] Langley, A., Hamburg, M., and S. Turner, "Elliptic Curves | [RFC7748] Langley, A., Hamburg, M., and S. Turner, "Elliptic Curves | |||
for Security", RFC 7748, DOI 10.17487/RFC7748, January | for Security", RFC 7748, DOI 10.17487/RFC7748, January | |||
2016, <https://www.rfc-editor.org/info/rfc7748>. | 2016, <https://www.rfc-editor.org/info/rfc7748>. | |||
[RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object | ||||
Representation (CBOR)", STD 94, RFC 8949, | ||||
DOI 10.17487/RFC8949, December 2020, | ||||
<https://www.rfc-editor.org/info/rfc8949>. | ||||
[RFC7959] Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in | [RFC7959] Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in | |||
the Constrained Application Protocol (CoAP)", RFC 7959, | the Constrained Application Protocol (CoAP)", RFC 7959, | |||
DOI 10.17487/RFC7959, August 2016, | DOI 10.17487/RFC7959, August 2016, | |||
<https://www.rfc-editor.org/info/rfc7959>. | <https://www.rfc-editor.org/info/rfc7959>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[RFC8376] Farrell, S., Ed., "Low-Power Wide Area Network (LPWAN) | [RFC8376] Farrell, S., Ed., "Low-Power Wide Area Network (LPWAN) | |||
Overview", RFC 8376, DOI 10.17487/RFC8376, May 2018, | Overview", RFC 8376, DOI 10.17487/RFC8376, May 2018, | |||
<https://www.rfc-editor.org/info/rfc8376>. | <https://www.rfc-editor.org/info/rfc8376>. | |||
[RFC8392] Jones, M., Wahlstroem, E., Erdtman, S., and H. Tschofenig, | ||||
"CBOR Web Token (CWT)", RFC 8392, DOI 10.17487/RFC8392, | ||||
May 2018, <https://www.rfc-editor.org/info/rfc8392>. | ||||
[RFC8610] Birkholz, H., Vigano, C., and C. Bormann, "Concise Data | [RFC8610] Birkholz, H., Vigano, C., and C. Bormann, "Concise Data | |||
Definition Language (CDDL): A Notational Convention to | Definition Language (CDDL): A Notational Convention to | |||
Express Concise Binary Object Representation (CBOR) and | Express Concise Binary Object Representation (CBOR) and | |||
JSON Data Structures", RFC 8610, DOI 10.17487/RFC8610, | JSON Data Structures", RFC 8610, DOI 10.17487/RFC8610, | |||
June 2019, <https://www.rfc-editor.org/info/rfc8610>. | June 2019, <https://www.rfc-editor.org/info/rfc8610>. | |||
[RFC8613] Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | [RFC8613] Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | |||
"Object Security for Constrained RESTful Environments | "Object Security for Constrained RESTful Environments | |||
(OSCORE)", RFC 8613, DOI 10.17487/RFC8613, July 2019, | (OSCORE)", RFC 8613, DOI 10.17487/RFC8613, July 2019, | |||
<https://www.rfc-editor.org/info/rfc8613>. | <https://www.rfc-editor.org/info/rfc8613>. | |||
[RFC8724] Minaburo, A., Toutain, L., Gomez, C., Barthel, D., and JC. | [RFC8724] Minaburo, A., Toutain, L., Gomez, C., Barthel, D., and JC. | |||
Zúñiga, "SCHC: Generic Framework for Static Context Header | Zuniga, "SCHC: Generic Framework for Static Context Header | |||
Compression and Fragmentation", RFC 8724, | Compression and Fragmentation", RFC 8724, | |||
DOI 10.17487/RFC8724, April 2020, | DOI 10.17487/RFC8724, April 2020, | |||
<https://www.rfc-editor.org/info/rfc8724>. | <https://www.rfc-editor.org/info/rfc8724>. | |||
[RFC8742] Bormann, C., "Concise Binary Object Representation (CBOR) | [RFC8742] Bormann, C., "Concise Binary Object Representation (CBOR) | |||
Sequences", RFC 8742, DOI 10.17487/RFC8742, February 2020, | Sequences", RFC 8742, DOI 10.17487/RFC8742, February 2020, | |||
<https://www.rfc-editor.org/info/rfc8742>. | <https://www.rfc-editor.org/info/rfc8742>. | |||
[I-D.ietf-cose-rfc8152bis-struct] | [RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object | |||
Schaad, J., "CBOR Object Signing and Encryption (COSE): | Representation (CBOR)", STD 94, RFC 8949, | |||
Structures and Process", Work in Progress, Internet-Draft, | DOI 10.17487/RFC8949, December 2020, | |||
draft-ietf-cose-rfc8152bis-struct-15, 1 February 2021, | <https://www.rfc-editor.org/info/rfc8949>. | |||
<https://www.ietf.org/archive/id/draft-ietf-cose- | ||||
rfc8152bis-struct-15.txt>. | ||||
[I-D.ietf-cose-rfc8152bis-algs] | 9.2. Informative References | |||
Schaad, J., "CBOR Object Signing and Encryption (COSE): | ||||
Initial Algorithms", Work in Progress, Internet-Draft, | ||||
draft-ietf-cose-rfc8152bis-algs-12, 24 September 2020, | ||||
<https://www.ietf.org/archive/id/draft-ietf-cose- | ||||
rfc8152bis-algs-12.txt>. | ||||
[I-D.ietf-cose-x509] | [Bruni18] Bruni, A., Sahl Joergensen, T., Groenbech Petersen, T., | |||
Schaad, J., "CBOR Object Signing and Encryption (COSE): | and C. Schuermann, "Formal Verification of Ephemeral | |||
Header parameters for carrying and referencing X.509 | Diffie-Hellman Over COSE (EDHOC)", November 2018, | |||
certificates", Work in Progress, Internet-Draft, draft- | <https://www.springerprofessional.de/en/formal- | |||
ietf-cose-x509-08, 14 December 2020, | verification-of-ephemeral-diffie-hellman-over-cose- | |||
<https://www.ietf.org/internet-drafts/draft-ietf-cose- | edhoc/16284348>. | |||
x509-08.txt>. | ||||
[I-D.ietf-core-echo-request-tag] | [CborMe] Bormann, C., "CBOR Playground", May 2018, | |||
Amsüss, C., Mattsson, J. P., and G. Selander, "CoAP: Echo, | <http://cbor.me/>. | |||
Request-Tag, and Token Processing", Work in Progress, | ||||
Internet-Draft, draft-ietf-core-echo-request-tag-12, 1 | ||||
February 2021, <https://www.ietf.org/archive/id/draft- | ||||
ietf-core-echo-request-tag-12.txt>. | ||||
[I-D.ietf-lake-reqs] | [CNSA] (Placeholder), ., "Commercial National Security Algorithm | |||
Vucinic, M., Selander, G., Mattsson, J. P., and D. Garcia- | Suite", August 2015, | |||
Carrillo, "Requirements for a Lightweight AKE for OSCORE", | <https://apps.nsa.gov/iaarchive/programs/iad-initiatives/ | |||
Work in Progress, Internet-Draft, draft-ietf-lake-reqs-04, | cnsa-suite.cfm>. | |||
8 June 2020, <https://www.ietf.org/archive/id/draft-ietf- | ||||
lake-reqs-04.txt>. | ||||
10.2. Informative References | [I-D.ietf-core-oscore-edhoc] | |||
Palombini, F., Tiloca, M., Hoeglund, R., Hristozov, S., | ||||
and G. Selander, "Combining EDHOC and OSCORE", draft-ietf- | ||||
core-oscore-edhoc-00 (work in progress), April 2021. | ||||
[I-D.ietf-core-resource-directory] | ||||
Amsuess, C., Shelby, Z., Koster, M., Bormann, C., and P. | ||||
V. D. Stok, "CoRE Resource Directory", draft-ietf-core- | ||||
resource-directory-28 (work in progress), March 2021. | ||||
[I-D.ietf-cose-cbor-encoded-cert] | ||||
Raza, S., Hoeglund, J., Selander, G., Mattsson, J. P., and | ||||
M. Furuhed, "CBOR Encoded X.509 Certificates (C509 | ||||
Certificates)", draft-ietf-cose-cbor-encoded-cert-00 (work | ||||
in progress), April 2021. | ||||
[I-D.ietf-lwig-security-protocol-comparison] | ||||
Mattsson, J. P., Palombini, F., and M. Vucinic, | ||||
"Comparison of CoAP Security Protocols", draft-ietf-lwig- | ||||
security-protocol-comparison-05 (work in progress), | ||||
November 2020. | ||||
[I-D.ietf-tls-dtls13] | ||||
Rescorla, E., Tschofenig, H., and N. Modadugu, "The | ||||
Datagram Transport Layer Security (DTLS) Protocol Version | ||||
1.3", draft-ietf-tls-dtls13-43 (work in progress), April | ||||
2021. | ||||
[I-D.mattsson-cfrg-det-sigs-with-noise] | ||||
Mattsson, J. P., Thormarker, E., and S. Ruohomaa, | ||||
"Deterministic ECDSA and EdDSA Signatures with Additional | ||||
Randomness", draft-mattsson-cfrg-det-sigs-with-noise-02 | ||||
(work in progress), March 2020. | ||||
[I-D.selander-ace-ake-authz] | ||||
Selander, G., Mattsson, J. P., Vucinic, M., Richardson, | ||||
M., and A. Schellenbaum, "Lightweight Authorization for | ||||
Authenticated Key Exchange.", draft-selander-ace-ake- | ||||
authz-02 (work in progress), November 2020. | ||||
[Norrman20] | ||||
Norrman, K., Sundararajan, V., and A. Bruni, "Formal | ||||
Analysis of EDHOC Key Establishment for Constrained IoT | ||||
Devices", September 2020, | ||||
<https://arxiv.org/abs/2007.11427>. | ||||
[RFC7228] Bormann, C., Ersue, M., and A. Keranen, "Terminology for | [RFC7228] Bormann, C., Ersue, M., and A. Keranen, "Terminology for | |||
Constrained-Node Networks", RFC 7228, | Constrained-Node Networks", RFC 7228, | |||
DOI 10.17487/RFC7228, May 2014, | DOI 10.17487/RFC7228, May 2014, | |||
<https://www.rfc-editor.org/info/rfc7228>. | <https://www.rfc-editor.org/info/rfc7228>. | |||
[RFC7258] Farrell, S. and H. Tschofenig, "Pervasive Monitoring Is an | [RFC7258] Farrell, S. and H. Tschofenig, "Pervasive Monitoring Is an | |||
Attack", BCP 188, RFC 7258, DOI 10.17487/RFC7258, May | Attack", BCP 188, RFC 7258, DOI 10.17487/RFC7258, May | |||
2014, <https://www.rfc-editor.org/info/rfc7258>. | 2014, <https://www.rfc-editor.org/info/rfc7258>. | |||
skipping to change at page 56, line 10 ¶ | skipping to change at page 55, line 5 ¶ | |||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[RFC8937] Cremers, C., Garratt, L., Smyshlyaev, S., Sullivan, N., | [RFC8937] Cremers, C., Garratt, L., Smyshlyaev, S., Sullivan, N., | |||
and C. Wood, "Randomness Improvements for Security | and C. Wood, "Randomness Improvements for Security | |||
Protocols", RFC 8937, DOI 10.17487/RFC8937, October 2020, | Protocols", RFC 8937, DOI 10.17487/RFC8937, October 2020, | |||
<https://www.rfc-editor.org/info/rfc8937>. | <https://www.rfc-editor.org/info/rfc8937>. | |||
[I-D.ietf-core-resource-directory] | [SECG] "Standards for Efficient Cryptography 1 (SEC 1)", May | |||
Amsüss, C., Shelby, Z., Koster, M., Bormann, C., and P. V. | 2009, <https://www.secg.org/sec1-v2.pdf>. | |||
D. Stok, "CoRE Resource Directory", Work in Progress, | ||||
Internet-Draft, draft-ietf-core-resource-directory-28, 7 | ||||
March 2021, <https://www.ietf.org/archive/id/draft-ietf- | ||||
core-resource-directory-28.txt>. | ||||
[I-D.ietf-lwig-security-protocol-comparison] | ||||
Mattsson, J. P., Palombini, F., and M. Vucinic, | ||||
"Comparison of CoAP Security Protocols", Work in Progress, | ||||
Internet-Draft, draft-ietf-lwig-security-protocol- | ||||
comparison-05, 2 November 2020, | ||||
<https://www.ietf.org/archive/id/draft-ietf-lwig-security- | ||||
protocol-comparison-05.txt>. | ||||
[I-D.ietf-tls-dtls13] | ||||
Rescorla, E., Tschofenig, H., and N. Modadugu, "The | ||||
Datagram Transport Layer Security (DTLS) Protocol Version | ||||
1.3", Work in Progress, Internet-Draft, draft-ietf-tls- | ||||
dtls13-43, 30 April 2021, <https://www.ietf.org/internet- | ||||
drafts/draft-ietf-tls-dtls13-43.txt>. | ||||
[I-D.selander-ace-ake-authz] | ||||
Selander, G., Mattsson, J. P., Vucinic, M., Richardson, | ||||
M., and A. Schellenbaum, "Lightweight Authorization for | ||||
Authenticated Key Exchange.", Work in Progress, Internet- | ||||
Draft, draft-selander-ace-ake-authz-02, 2 November 2020, | ||||
<https://www.ietf.org/archive/id/draft-selander-ace-ake- | ||||
authz-02.txt>. | ||||
[I-D.ietf-core-oscore-edhoc] | ||||
Palombini, F., Tiloca, M., Hoeglund, R., Hristozov, S., | ||||
and G. Selander, "Combining EDHOC and OSCORE", Work in | ||||
Progress, Internet-Draft, draft-ietf-core-oscore-edhoc-00, | ||||
1 April 2021, <https://www.ietf.org/internet-drafts/draft- | ||||
ietf-core-oscore-edhoc-00.txt>. | ||||
[I-D.ietf-cose-cbor-encoded-cert] | ||||
Raza, S., Höglund, J., Selander, G., Mattsson, J. P., and | ||||
M. Furuhed, "CBOR Encoded X.509 Certificates (C509 | ||||
Certificates)", Work in Progress, Internet-Draft, draft- | ||||
ietf-cose-cbor-encoded-cert-00, 28 April 2021, | ||||
<https://www.ietf.org/archive/id/draft-ietf-cose-cbor- | ||||
encoded-cert-00.txt>. | ||||
[I-D.mattsson-cfrg-det-sigs-with-noise] | [SIGMA] Krawczyk, H., "SIGMA - The 'SIGn-and-MAc' Approach to | |||
Mattsson, J. P., Thormarker, E., and S. Ruohomaa, | Authenticated Diffie-Hellman and Its Use in the IKE- | |||
"Deterministic ECDSA and EdDSA Signatures with Additional | Protocols (Long version)", June 2003, | |||
Randomness", Work in Progress, Internet-Draft, draft- | <http://webee.technion.ac.il/~hugo/sigma-pdf.pdf>. | |||
mattsson-cfrg-det-sigs-with-noise-02, 11 March 2020, | ||||
<https://www.ietf.org/archive/id/draft-mattsson-cfrg-det- | ||||
sigs-with-noise-02.txt>. | ||||
[SP-800-56A] | [SP-800-56A] | |||
Barker, E., Chen, L., Roginsky, A., Vassilev, A., and R. | Barker, E., Chen, L., Roginsky, A., Vassilev, A., and R. | |||
Davis, "Recommendation for Pair-Wise Key-Establishment | Davis, "Recommendation for Pair-Wise Key-Establishment | |||
Schemes Using Discrete Logarithm Cryptography", | Schemes Using Discrete Logarithm Cryptography", | |||
NIST Special Publication 800-56A Revision 3, April 2018, | NIST Special Publication 800-56A Revision 3, April 2018, | |||
<https://doi.org/10.6028/NIST.SP.800-56Ar3>. | <https://doi.org/10.6028/NIST.SP.800-56Ar3>. | |||
[SECG] "Standards for Efficient Cryptography 1 (SEC 1)", May | Appendix A. Use with OSCORE and Transfer over CoAP | |||
2009, <https://www.secg.org/sec1-v2.pdf>. | ||||
[SIGMA] Krawczyk, H., "SIGMA - The 'SIGn-and-MAc' Approach to | This sppendix describes how to select EDHOC connection identifiers | |||
Authenticated Diffie-Hellman and Its Use in the IKE- | and derive an OSCORE security context when OSCORE is used with EDHOC, | |||
Protocols (Long version)", June 2003, | and how to transfer EDHOC messages over CoAP. | |||
<http://webee.technion.ac.il/~hugo/sigma-pdf.pdf>. | ||||
[CNSA] (Placeholder), ., "Commercial National Security Algorithm | A.1. Selecting EDHOC Connection Identifier | |||
Suite", August 2015, | ||||
<https://apps.nsa.gov/iaarchive/programs/iad-initiatives/ | ||||
cnsa-suite.cfm>. | ||||
[Norrman20] | This section specifies a rule for converting from EDHOC connection | |||
Norrman, K., Sundararajan, V., and A. Bruni, "Formal | identifier to OSCORE Sender/Recipient ID. (An identifier is Sender | |||
Analysis of EDHOC Key Establishment for Constrained IoT | ID or Recipient ID depending on from which endpoint is the point of | |||
Devices", September 2020, | view, see Section 3.1 of [RFC8613].) | |||
<https://arxiv.org/abs/2007.11427>. | ||||
[Bruni18] Bruni, A., Sahl Jørgensen, T., Grønbech Petersen, T., and | o If the EDHOC connection identifier is numeric, i.e. encoded as a | |||
C. Schürmann, "Formal Verification of Ephemeral Diffie- | CBOR integer on the wire, it is converted to a (naturally byte- | |||
Hellman Over COSE (EDHOC)", November 2018, | string shaped) OSCORE Sender/Recipient ID equal to its CBOR | |||
<https://www.springerprofessional.de/en/formal- | encoded form. | |||
verification-of-ephemeral-diffie-hellman-over-cose- | ||||
edhoc/16284348>. | ||||
[CborMe] Bormann, C., "CBOR Playground", May 2018, | For example, a numeric C_R equal to 10 (0x0A in CBOR encoding) is | |||
<http://cbor.me/>. | converted to a (typically client) Sender ID equal to 0x0A, while a | |||
numeric C_I equal to -12 (0x2B in CBOR encoding) is converted to a | ||||
(typically client) Sender ID equal to 0x2B. | ||||
Appendix A. Compact Representation | o If the EDHOC connection identifier is byte-valued, hence encoded | |||
as a CBOR byte string on the wire, it is converted to an OSCORE | ||||
Sender/Recipient ID equal to the byte string. | ||||
For example, a byte-string valued C_R equal to 0xFF (0x41FF in CBOR | ||||
encoding) is converted to a (typically client) Sender ID equal to | ||||
0xFF. | ||||
Two EDHOC connection identifiers are called "equivalent" if and only | ||||
if, by applying the conversion above, they both result in the same | ||||
OSCORE Sender/Recipient ID. For example, the two EDHOC connection | ||||
identifiers with CBOR encoding 0x0A (numeric) and 0x410A (byte- | ||||
valued) are equivalent since they both result in the same OSCORE | ||||
Sender/Recipient ID 0x0A. | ||||
When EDHOC is used to establish an OSCORE security context, the | ||||
connection identifiers C_I and C_R MUST NOT be equivalent. | ||||
Furthermore, in case of multiple OSCORE security contexts with | ||||
potentially different endpoints, to facilitate retrieval of the | ||||
correct OSCORE security context, an endpoint SHOULD select an EDHOC | ||||
connection identifier that when converted to OSCORE Recipient ID does | ||||
not coincide with its other Recipient IDs. | ||||
A.2. Deriving the OSCORE Security Context | ||||
This section specifies how to use EDHOC output to derive the OSCORE | ||||
security context. | ||||
After successful processing of EDHOC message_3, Client and Server | ||||
derive Security Context parameters for OSCORE as follows (see | ||||
Section 3.2 of [RFC8613]): | ||||
o The Master Secret and Master Salt are derived by using the EDHOC- | ||||
Exporter interface, see Section 4.1. | ||||
The EDHOC Exporter Labels for deriving the OSCORE Master Secret and | ||||
the OSCORE Master Salt, are "OSCORE Master Secret" and "OSCORE Master | ||||
Salt", respectively. | ||||
The context parameter is h'' (0x40), the empty CBOR byte string. | ||||
By default, key_length is the key length (in bytes) of the | ||||
application AEAD Algorithm of the selected cipher suite for the EDHOC | ||||
session. Also by default, salt_length has value 8. The Initiator | ||||
and Responder MAY agree out-of-band on a longer key_length than the | ||||
default and on a different salt_length. | ||||
Master Secret = EDHOC-Exporter( "OSCORE Master Secret", h'', key_length ) | ||||
Master Salt = EDHOC-Exporter( "OSCORE Master Salt", h'', salt_length ) | ||||
o The AEAD Algorithm is the application AEAD algorithm of the | ||||
selected cipher suite for the EDHOC session. | ||||
o The HKDF Algorithm is the one based on the application hash | ||||
algorithm of the selected cipher suite for the EDHOC session. For | ||||
example, if SHA-256 is the application hash algorithm of the | ||||
selected ciphersuite, HKDF SHA-256 is used as HKDF Algorithm in | ||||
the OSCORE Security Context. | ||||
o In case the Client is Initiator and the Server is Responder, the | ||||
Client's OSCORE Sender ID and the Server's OSCORE Sender ID are | ||||
determined from the EDHOC connection identifiers C_R and C_I for | ||||
the EDHOC session, respectively, by applying the conversion in | ||||
Appendix A.1. The reverse applies in case the Client is the | ||||
Responder and the Server is the Initiator. | ||||
Client and Server use the parameters above to establish an OSCORE | ||||
Security Context, as per Section 3.2.1 of [RFC8613]. | ||||
From then on, Client and Server retrieve the OSCORE protocol state | ||||
using the Recipient ID, and optionally other transport information | ||||
such as the 5-tuple. | ||||
A.3. Transferring EDHOC over CoAP | ||||
This section specifies one instance for how EDHOC can be transferred | ||||
as an exchange of CoAP [RFC7252] messages. CoAP is a reliable | ||||
transport that can preserve packet ordering and handle message | ||||
duplication. CoAP can also perform fragmentation and protect against | ||||
denial of service attacks. According to this specification, EDHOC | ||||
messages are carried in Confirmable messages, which is beneficial | ||||
especially if fragmentation is used. | ||||
By default, the CoAP client is the Initiator and the CoAP server is | ||||
the Responder, but the roles SHOULD be chosen to protect the most | ||||
sensitive identity, see Section 7. According to this specification, | ||||
EDHOC is transferred in POST requests and 2.04 (Changed) responses to | ||||
the Uri-Path: "/.well-known/edhoc". An application may define its | ||||
own path that can be discovered, e.g., using resource directory | ||||
[I-D.ietf-core-resource-directory]. | ||||
By default, the message flow is as follows: EDHOC message_1 is sent | ||||
in the payload of a POST request from the client to the server's | ||||
resource for EDHOC. EDHOC message_2 or the EDHOC error message is | ||||
sent from the server to the client in the payload of a 2.04 (Changed) | ||||
response. EDHOC message_3 or the EDHOC error message is sent from | ||||
the client to the server's resource in the payload of a POST request. | ||||
If needed, an EDHOC error message is sent from the server to the | ||||
client in the payload of a 2.04 (Changed) response. Alternatively, | ||||
if EDHOC message_4 is used, it is sent from the server to the client | ||||
in the payload of a 2.04 (Changed) response analogously to message_2. | ||||
In order to correlate a message received from a client to a message | ||||
previously sent by the server, messages sent by the client are | ||||
prepended with the CBOR serialization of the connection identifier | ||||
which the server has chosen. This applies independently of if the | ||||
CoAP server is Responder or Initiator. For the default case when the | ||||
server is Responder, the prepended connection identifier is C_R, and | ||||
C_I if the server is Initiator. If message_1 is sent to the server, | ||||
the CBOR simple value "null" (0xf6) is sent in its place (given that | ||||
the server has not selected C_R yet). | ||||
These identifiers are encoded in CBOR and thus self-delimiting. They | ||||
are sent in front of the actual EDHOC message, and only the part of | ||||
the body following the identifier is used for EDHOC processing. | ||||
Consequently, the application/edhoc media type does not apply to | ||||
these messages; their media type is unnamed. | ||||
An example of a successful EDHOC exchange using CoAP is shown in | ||||
Figure 9. In this case the CoAP Token enables correlation on the | ||||
Initiator side, and the prepended C_R enables correlation on the | ||||
Responder (server) side. | ||||
Client Server | ||||
| | | ||||
+--------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path: "/.well-known/edhoc" | ||||
| | Payload: null, EDHOC message_1 | ||||
| | | ||||
|<---------+ Header: 2.04 Changed | ||||
| 2.04 | Content-Format: application/edhoc | ||||
| | Payload: EDHOC message_2 | ||||
| | | ||||
+--------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path: "/.well-known/edhoc" | ||||
| | Payload: C_R, EDHOC message_3 | ||||
| | | ||||
|<---------+ Header: 2.04 Changed | ||||
| 2.04 | | ||||
| | | ||||
Figure 9: Transferring EDHOC in CoAP when the Initiator is CoAP | ||||
Client | ||||
The exchange in Figure 9 protects the client identity against active | ||||
attackers and the server identity against passive attackers. | ||||
An alternative exchange that protects the server identity against | ||||
active attackers and the client identity against passive attackers is | ||||
shown in Figure 10. In this case the CoAP Token enables the | ||||
Responder to correlate message_2 and message_3, and the prepended C_I | ||||
enables correlation on the Initiator (server) side. If EDHOC | ||||
message_4 is used, C_I is prepended, and it is transported with CoAP | ||||
in the payload of a POST request with a 2.04 (Changed) response. | ||||
Client Server | ||||
| | | ||||
+--------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path: "/.well-known/edhoc" | ||||
| | | ||||
|<---------+ Header: 2.04 Changed | ||||
| 2.04 | Content-Format: application/edhoc | ||||
| | Payload: EDHOC message_1 | ||||
| | | ||||
+--------->| Header: POST (Code=0.02) | ||||
| POST | Uri-Path: "/.well-known/edhoc" | ||||
| | Payload: C_I, EDHOC message_2 | ||||
| | | ||||
|<---------+ Header: 2.04 Changed | ||||
| 2.04 | Content-Format: application/edhoc | ||||
| | Payload: EDHOC message_3 | ||||
| | | ||||
Figure 10: Transferring EDHOC in CoAP when the Initiator is CoAP | ||||
Server | ||||
To protect against denial-of-service attacks, the CoAP server MAY | ||||
respond to the first POST request with a 4.01 (Unauthorized) | ||||
containing an Echo option [I-D.ietf-core-echo-request-tag]. This | ||||
forces the initiator to demonstrate its reachability at its apparent | ||||
network address. If message fragmentation is needed, the EDHOC | ||||
messages may be fragmented using the CoAP Block-Wise Transfer | ||||
mechanism [RFC7959]. EDHOC does not restrict how error messages are | ||||
transported with CoAP, as long as the appropriate error message can | ||||
to be transported in response to a message that failed (see | ||||
Section 6). | ||||
A.3.1. Transferring EDHOC and OSCORE over CoAP | ||||
A method for combining EDHOC and OSCORE protocols in two round-trips | ||||
is specified in [I-D.ietf-core-oscore-edhoc]. | ||||
When using EDHOC over CoAP for establishing an OSCORE Security | ||||
Context, EDHOC error messages sent as CoAP responses MUST be error | ||||
responses, i.e., they MUST specify a CoAP error response code. In | ||||
particular, it is RECOMMENDED that such error responses have response | ||||
code either 4.00 (Bad Request) in case of client error (e.g., due to | ||||
a malformed EDHOC message), or 5.00 (Internal Server Error) in case | ||||
of server error (e.g., due to failure in deriving EDHOC key | ||||
material). | ||||
Appendix B. Compact Representation | ||||
As described in Section 4.2 of [RFC6090] the x-coordinate of an | As described in Section 4.2 of [RFC6090] the x-coordinate of an | |||
elliptic curve public key is a suitable representative for the entire | elliptic curve public key is a suitable representative for the entire | |||
point whenever scalar multiplication is used as a one-way function. | point whenever scalar multiplication is used as a one-way function. | |||
One example is ECDH with compact output, where only the x-coordinate | One example is ECDH with compact output, where only the x-coordinate | |||
of the computed value is used as the shared secret. | of the computed value is used as the shared secret. | |||
This section defines a format for compact representation based on the | This section defines a format for compact representation based on the | |||
Elliptic-Curve-Point-to-Octet-String Conversion defined in | Elliptic-Curve-Point-to-Octet-String Conversion defined in | |||
Section 2.3.3 of [SECG]. Using the notation from [SECG], the output | Section 2.3.3 of [SECG]. Using the notation from [SECG], the output | |||
skipping to change at page 58, line 44 ¶ | skipping to change at page 60, line 41 ¶ | |||
format by prepending it with the single byte 0x02 (i.e. M = 0x02 || | format by prepending it with the single byte 0x02 (i.e. M = 0x02 || | |||
X). | X). | |||
Using compact representation have some security benefits. An | Using compact representation have some security benefits. An | |||
implementation does not need to check that the point is not the point | implementation does not need to check that the point is not the point | |||
at infinity (the identity element). Similarly, as not even the sign | at infinity (the identity element). Similarly, as not even the sign | |||
of the y-coordinate is encoded, compact representation trivially | of the y-coordinate is encoded, compact representation trivially | |||
avoids so called "benign malleability" attacks where an attacker | avoids so called "benign malleability" attacks where an attacker | |||
changes the sign, see [SECG]. | changes the sign, see [SECG]. | |||
Appendix B. Use of CBOR, CDDL and COSE in EDHOC | Appendix C. Use of CBOR, CDDL and COSE in EDHOC | |||
This Appendix is intended to simplify for implementors not familiar | This Appendix is intended to simplify for implementors not familiar | |||
with CBOR [RFC8949], CDDL [RFC8610], COSE | with CBOR [RFC8949], CDDL [RFC8610], COSE | |||
[I-D.ietf-cose-rfc8152bis-struct], and HKDF [RFC5869]. | [I-D.ietf-cose-rfc8152bis-struct], and HKDF [RFC5869]. | |||
B.1. CBOR and CDDL | C.1. CBOR and CDDL | |||
The Concise Binary Object Representation (CBOR) [RFC8949] is a data | The Concise Binary Object Representation (CBOR) [RFC8949] is a data | |||
format designed for small code size and small message size. CBOR | format designed for small code size and small message size. CBOR | |||
builds on the JSON data model but extends it by e.g. encoding binary | builds on the JSON data model but extends it by e.g. encoding binary | |||
data directly without base64 conversion. In addition to the binary | data directly without base64 conversion. In addition to the binary | |||
CBOR encoding, CBOR also has a diagnostic notation that is readable | CBOR encoding, CBOR also has a diagnostic notation that is readable | |||
and editable by humans. The Concise Data Definition Language (CDDL) | and editable by humans. The Concise Data Definition Language (CDDL) | |||
[RFC8610] provides a way to express structures for protocol messages | [RFC8610] provides a way to express structures for protocol messages | |||
and APIs that use CBOR. [RFC8610] also extends the diagnostic | and APIs that use CBOR. [RFC8610] also extends the diagnostic | |||
notation. | notation. | |||
skipping to change at page 59, line 46 ¶ | skipping to change at page 61, line 39 ¶ | |||
h'12cd' 0x4212cd byte string | h'12cd' 0x4212cd byte string | |||
'12cd' 0x4431326364 byte string | '12cd' 0x4431326364 byte string | |||
"12cd" 0x6431326364 text string | "12cd" 0x6431326364 text string | |||
{ 4 : h'cd' } 0xa10441cd map | { 4 : h'cd' } 0xa10441cd map | |||
<< 1, 2, null >> 0x430102f6 byte string | << 1, 2, null >> 0x430102f6 byte string | |||
[ 1, 2, null ] 0x830102f6 array | [ 1, 2, null ] 0x830102f6 array | |||
( 1, 2, null ) 0x0102f6 sequence | ( 1, 2, null ) 0x0102f6 sequence | |||
1, 2, null 0x0102f6 sequence | 1, 2, null 0x0102f6 sequence | |||
------------------------------------------------------------------ | ------------------------------------------------------------------ | |||
B.2. CDDL Definitions | C.2. CDDL Definitions | |||
This sections compiles the CDDL definitions for ease of reference. | This sections compiles the CDDL definitions for ease of reference. | |||
bstr_identifier = bstr / int | ||||
suite = int | suite = int | |||
SUITES_R : [ supported : 2* suite ] / suite | SUITES_R : [ supported : 2* suite ] / suite | |||
message_1 = ( | message_1 = ( | |||
? C_1 : null, | METHOD : int, | |||
METHOD_CORR : int, | ||||
SUITES_I : [ selected : suite, supported : 2* suite ] / suite, | SUITES_I : [ selected : suite, supported : 2* suite ] / suite, | |||
G_X : bstr, | G_X : bstr, | |||
C_I : bstr_identifier, | C_I : bstr / int, | |||
? EAD ; EAD_1 | ? EAD ; EAD_1 | |||
) | ) | |||
message_2 = ( | message_2 = ( | |||
data_2, | data_2, | |||
CIPHERTEXT_2 : bstr, | CIPHERTEXT_2 : bstr, | |||
) | ) | |||
data_2 = ( | data_2 = ( | |||
? C_I : bstr_identifier, | ||||
G_Y : bstr, | G_Y : bstr, | |||
C_R : bstr_identifier, | C_R : bstr / int, | |||
) | ) | |||
message_3 = ( | message_3 = ( | |||
data_3, | ||||
CIPHERTEXT_3 : bstr, | CIPHERTEXT_3 : bstr, | |||
) | ) | |||
data_3 = ( | ||||
? C_R : bstr_identifier, | ||||
) | ||||
message_4 = ( | message_4 = ( | |||
data_4, | ||||
CIPHERTEXT_4 : bstr, | CIPHERTEXT_4 : bstr, | |||
) | ) | |||
data_4 = ( | ||||
? C_I : bstr_identifier, | ||||
) | ||||
error = ( | error = ( | |||
? C_x : bstr_identifier, | ||||
ERR_CODE : int, | ERR_CODE : int, | |||
ERR_INFO : any | ERR_INFO : any | |||
) | ) | |||
info = [ | info = [ | |||
edhoc_aead_id : int / tstr, | edhoc_aead_id : int / tstr, | |||
transcript_hash : bstr, | transcript_hash : bstr, | |||
label : tstr, | label : tstr, | |||
length : uint | length : uint | |||
] | ] | |||
B.3. COSE | C.3. COSE | |||
CBOR Object Signing and Encryption (COSE) | CBOR Object Signing and Encryption (COSE) | |||
[I-D.ietf-cose-rfc8152bis-struct] describes how to create and process | [I-D.ietf-cose-rfc8152bis-struct] describes how to create and process | |||
signatures, message authentication codes, and encryption using CBOR. | signatures, message authentication codes, and encryption using CBOR. | |||
COSE builds on JOSE, but is adapted to allow more efficient | COSE builds on JOSE, but is adapted to allow more efficient | |||
processing in constrained devices. EDHOC makes use of COSE_Key, | processing in constrained devices. EDHOC makes use of COSE_Key, | |||
COSE_Encrypt0, and COSE_Sign1 objects. | COSE_Encrypt0, and COSE_Sign1 objects. | |||
Appendix C. Test Vectors | Appendix D. Test Vectors | |||
Note: The test vectors are not updated to version -07 of the draft. | NOTE 0. These test vectors are compatible with versions -05 and -06 | |||
More changes affecting the test vectors are anticipated for -08. | of the specification. | |||
This appendix provides detailed test vectors to ease implementation | This appendix provides detailed test vectors to ease implementation | |||
and ensure interoperability. The test vectors in this version are | and ensure interoperability. In addition to hexadecimal, all CBOR | |||
compatible with versions -05 and -06 of the specification. In | data items and sequences are given in CBOR diagnostic notation. The | |||
addition to hexadecimal, all CBOR data items and sequences are given | test vectors use the default mapping to CoAP where the Initiator acts | |||
in CBOR diagnostic notation. The test vectors use the default | as CoAP client (this means that corr = 1). | |||
mapping to CoAP where the Initiator acts as CoAP client (this means | ||||
that corr = 1). | ||||
A more extensive test vector suite covering more combinations of | A more extensive test vector suite covering more combinations of | |||
authentication method used between Initiator and Responder and | authentication method used between Initiator and Responder and | |||
related code to generate them can be found at https://github.com/ | related code to generate them can be found at https://github.com/ | |||
lake-wg/edhoc/tree/master/test-vectors-05. | lake-wg/edhoc/tree/master/test-vectors-05. | |||
NOTE 1. In the previous and current test vectors the same name is | NOTE 1. In the previous and current test vectors the same name is | |||
used for certain byte strings and their CBOR bstr encodings. For | used for certain byte strings and their CBOR bstr encodings. For | |||
example the transcript hash TH_2 is used to denote both the output of | example the transcript hash TH_2 is used to denote both the output of | |||
the hash function and the input into the key derivation function, | the hash function and the input into the key derivation function, | |||
whereas the latter is a CBOR bstr encoding of the former. Some | whereas the latter is a CBOR bstr encoding of the former. Some | |||
attempts are made to clarify that in this Appendix (e.g. using "CBOR | attempts are made to clarify that in this Appendix (e.g. using "CBOR | |||
encoded"/"CBOR unencoded"). | encoded"/"CBOR unencoded"). | |||
NOTE 2. If not clear from the context, remember that CBOR sequences | NOTE 2. If not clear from the context, remember that CBOR sequences | |||
and CBOR arrays assume CBOR encoded data items as elements. | and CBOR arrays assume CBOR encoded data items as elements. | |||
C.1. Test Vectors for EDHOC Authenticated with Signature Keys (x5t) | D.1. Test Vectors for EDHOC Authenticated with Signature Keys (x5t) | |||
EDHOC with signature authentication and X.509 certificates is used. | EDHOC with signature authentication and X.509 certificates is used. | |||
In this test vector, the hash value 'x5t' is used to identify the | In this test vector, the hash value 'x5t' is used to identify the | |||
certificate. The optional C_1 in message_1 is omitted. No external | certificate. The optional C_1 in message_1 is omitted. No external | |||
authorization data is sent in the message exchange. | authorization data is sent in the message exchange. | |||
method (Signature Authentication) | method (Signature Authentication) | |||
0 | 0 | |||
CoAP is used as transport and the Initiator acts as CoAP client: | CoAP is used as transport and the Initiator acts as CoAP client: | |||
skipping to change at page 62, line 37 ¶ | skipping to change at page 64, line 20 ¶ | |||
Supported Cipher Suites (1 byte) | Supported Cipher Suites (1 byte) | |||
00 | 00 | |||
The Initiator selected the indicated cipher suite. | The Initiator selected the indicated cipher suite. | |||
Selected Cipher Suite (int) | Selected Cipher Suite (int) | |||
0 | 0 | |||
Cipher suite 0 is supported by both the Initiator and the Responder, | Cipher suite 0 is supported by both the Initiator and the Responder, | |||
see Section 3.4. | see Section 3.6. | |||
C.1.1. Message_1 | D.1.1. Message_1 | |||
The Initiator generates its ephemeral key pair. | The Initiator generates its ephemeral key pair. | |||
X (Initiator's ephemeral private key) (32 bytes) | X (Initiator's ephemeral private key) (32 bytes) | |||
8f 78 1a 09 53 72 f8 5b 6d 9f 61 09 ae 42 26 11 73 4d 7d bf a0 06 9a 2d | 8f 78 1a 09 53 72 f8 5b 6d 9f 61 09 ae 42 26 11 73 4d 7d bf a0 06 9a 2d | |||
f2 93 5b b2 e0 53 bf 35 | f2 93 5b b2 e0 53 bf 35 | |||
G_X (Initiator's ephemeral public key, CBOR unencoded) (32 bytes) | G_X (Initiator's ephemeral public key, CBOR unencoded) (32 bytes) | |||
89 8f f7 9a 02 06 7a 16 ea 1e cc b9 0f a5 22 46 f5 aa 4d d6 ec 07 6b ba | 89 8f f7 9a 02 06 7a 16 ea 1e cc b9 0f a5 22 46 f5 aa 4d d6 ec 07 6b ba | |||
02 59 d9 04 b7 ec 8b 0c | 02 59 d9 04 b7 ec 8b 0c | |||
The Initiator chooses a connection identifier C_I: | The Initiator chooses a connection identifier C_I: | |||
Connection identifier chosen by Initiator (1 byte) | Connection identifier chosen by Initiator (1 byte) | |||
09 | 09 | |||
Note that since C_I is a byte string in the interval h'00' to h'2f', | Note that since C_I is a byte string in the interval h'00' to h'2f', | |||
it is encoded as the corresponding integer subtracted by 24 (see | it is encoded as the corresponding integer subtracted by 24. Thus | |||
bstr_identifier in Section 5.1). Thus 0x09 = 09, 9 - 24 = -15, and | 0x09 = 09, 9 - 24 = -15, and -15 in CBOR encoding is equal to 0x2e. | |||
-15 in CBOR encoding is equal to 0x2e. | ||||
C_I (1 byte) | C_I (1 byte) | |||
2e | 2e | |||
Since no external authorization data is sent: | Since no external authorization data is sent: | |||
EAD_1 (0 bytes) | EAD_1 (0 bytes) | |||
The list of supported cipher suites needs to contain the selected | The list of supported cipher suites needs to contain the selected | |||
cipher suite. The initiator truncates the list of supported cipher | cipher suite. The initiator truncates the list of supported cipher | |||
skipping to change at page 63, line 48 ¶ | skipping to change at page 65, line 30 ¶ | |||
h'898FF79A02067A16EA1ECCB90FA52246F5AA4DD6EC076BBA0259D904B7EC8B0C', | h'898FF79A02067A16EA1ECCB90FA52246F5AA4DD6EC076BBA0259D904B7EC8B0C', | |||
-15 | -15 | |||
) | ) | |||
Which as a CBOR encoded data item is: | Which as a CBOR encoded data item is: | |||
message_1 (CBOR Sequence) (37 bytes) | message_1 (CBOR Sequence) (37 bytes) | |||
01 00 58 20 89 8f f7 9a 02 06 7a 16 ea 1e cc b9 0f a5 22 46 f5 aa 4d d6 | 01 00 58 20 89 8f f7 9a 02 06 7a 16 ea 1e cc b9 0f a5 22 46 f5 aa 4d d6 | |||
ec 07 6b ba 02 59 d9 04 b7 ec 8b 0c 2e | ec 07 6b ba 02 59 d9 04 b7 ec 8b 0c 2e | |||
C.1.2. Message_2 | D.1.2. Message_2 | |||
Since METHOD_CORR mod 4 equals 1, C_I is omitted from data_2. | Since METHOD_CORR mod 4 equals 1, C_I is omitted from data_2. | |||
The Responder generates the following ephemeral key pair. | The Responder generates the following ephemeral key pair. | |||
Y (Responder's ephemeral private key) (32 bytes) | Y (Responder's ephemeral private key) (32 bytes) | |||
fd 8c d8 77 c9 ea 38 6e 6a f3 4f f7 e6 06 c4 b6 4c a8 31 c8 ba 33 13 4f | fd 8c d8 77 c9 ea 38 6e 6a f3 4f f7 e6 06 c4 b6 4c a8 31 c8 ba 33 13 4f | |||
d4 cd 71 67 ca ba ec da | d4 cd 71 67 ca ba ec da | |||
G_Y (Responder's ephemeral public key, CBOR unencoded) (32 bytes) | G_Y (Responder's ephemeral public key, CBOR unencoded) (32 bytes) | |||
skipping to change at page 65, line 4 ¶ | skipping to change at page 66, line 35 ¶ | |||
PK_R (Responder's public authentication key) (32 bytes) | PK_R (Responder's public authentication key) (32 bytes) | |||
db d9 dc 8c d0 3f b7 c3 91 35 11 46 2b b2 38 16 47 7c 6b d8 d6 6e f5 a1 | db d9 dc 8c d0 3f b7 c3 91 35 11 46 2b b2 38 16 47 7c 6b d8 d6 6e f5 a1 | |||
a0 70 ac 85 4e d7 3f d2 | a0 70 ac 85 4e d7 3f d2 | |||
Since neither the Initiator nor the Responder authenticates with a | Since neither the Initiator nor the Responder authenticates with a | |||
static Diffie-Hellman key, PRK_3e2m = PRK_2e | static Diffie-Hellman key, PRK_3e2m = PRK_2e | |||
PRK_3e2m (32 bytes) | PRK_3e2m (32 bytes) | |||
ec 62 92 a0 67 f1 37 fc 7f 59 62 9d 22 6f bf c4 e0 68 89 49 f6 62 a9 7f | ec 62 92 a0 67 f1 37 fc 7f 59 62 9d 22 6f bf c4 e0 68 89 49 f6 62 a9 7f | |||
d8 2f be b7 99 71 39 4a | d8 2f be b7 99 71 39 4a | |||
The Responder chooses a connection identifier C_R. | The Responder chooses a connection identifier C_R. | |||
Connection identifier chosen by Responder (1 byte) | Connection identifier chosen by Responder (1 byte) | |||
00 | 00 | |||
Note that since C_R is a byte string in the interval h'00' to h'2f', | Note that since C_R is a byte string in the interval h'00' to h'2f', | |||
it is encoded as the corresponding integer subtracted by 24 (see | it is encoded as the corresponding integer subtracted by 24. Thus | |||
bstr_identifier in Section 5.1). Thus 0x00 = 0, 0 - 24 = -24, and | 0x00 = 0, 0 - 24 = -24, and -24 in CBOR encoding is equal to 0x37. | |||
-24 in CBOR encoding is equal to 0x37. | ||||
C_R (1 byte) | C_R (1 byte) | |||
37 | 37 | |||
Data_2 is constructed as the CBOR Sequence of G_Y and C_R, encoded as | Data_2 is constructed as the CBOR Sequence of G_Y and C_R, encoded as | |||
CBOR byte strings. The CBOR diagnostic notation is: | CBOR byte strings. The CBOR diagnostic notation is: | |||
data_2 = | data_2 = | |||
( | ( | |||
h'71a3d599c21da18902a1aea810b2b6382ccd8d5f9bf0195281754c5ebcaf301e', | h'71a3d599c21da18902a1aea810b2b6382ccd8d5f9bf0195281754c5ebcaf301e', | |||
skipping to change at page 68, line 35 ¶ | skipping to change at page 70, line 18 ¶ | |||
From these parameters, IV_2m is computed. IV_2m is the output of | From these parameters, IV_2m is computed. IV_2m is the output of | |||
HKDF-Expand(PRK_3e2m, info, L), where L is the length of IV_2m, so 13 | HKDF-Expand(PRK_3e2m, info, L), where L is the length of IV_2m, so 13 | |||
bytes. | bytes. | |||
IV_2m (13 bytes) | IV_2m (13 bytes) | |||
c8 1e 1a 95 cc 93 b3 36 69 6e d5 02 55 | c8 1e 1a 95 cc 93 b3 36 69 6e d5 02 55 | |||
Finally, COSE_Encrypt0 is computed from the parameters above. | Finally, COSE_Encrypt0 is computed from the parameters above. | |||
* protected header = CBOR-encoded ID_CRED_R | o protected header = CBOR-encoded ID_CRED_R | |||
* external_aad = A_2m | o external_aad = A_2m | |||
* empty plaintext = P_2m | o empty plaintext = P_2m | |||
MAC_2 (CBOR unencoded) (8 bytes) | MAC_2 (CBOR unencoded) (8 bytes) | |||
fa bb a4 7e 56 71 a1 82 | fa bb a4 7e 56 71 a1 82 | |||
To compute the Signature_or_MAC_2, the key is the private | To compute the Signature_or_MAC_2, the key is the private | |||
authentication key of the Responder and the message M_2 to be signed | authentication key of the Responder and the message M_2 to be signed | |||
= [ "Signature1", << ID_CRED_R >>, << TH_2, CRED_R, ? EAD_2 >>, MAC_2 | = [ "Signature1", << ID_CRED_R >>, << TH_2, CRED_R, ? EAD_2 >>, MAC_2 | |||
]. ID_CRED_R is encoded as a CBOR byte string, the concatenation of | ]. ID_CRED_R is encoded as a CBOR byte string, the concatenation of | |||
the CBOR byte strings TH_2 and CRED_R is wrapped as a CBOR bstr, and | the CBOR byte strings TH_2 and CRED_R is wrapped as a CBOR bstr, and | |||
MAC_2 is encoded as a CBOR bstr. | MAC_2 is encoded as a CBOR bstr. | |||
skipping to change at page 69, line 41 ¶ | skipping to change at page 71, line 28 ¶ | |||
Signature_or_MAC_2 (CBOR unencoded) (64 bytes) | Signature_or_MAC_2 (CBOR unencoded) (64 bytes) | |||
1f 17 00 6a 98 48 c9 77 cb bd ca a7 57 b6 fd 46 82 c8 17 39 e1 5c 99 37 | 1f 17 00 6a 98 48 c9 77 cb bd ca a7 57 b6 fd 46 82 c8 17 39 e1 5c 99 37 | |||
c2 1c f5 e9 a0 e6 03 9f 54 fd 2a 6c 3a 11 18 f2 b9 d8 eb cd 48 23 48 b9 | c2 1c f5 e9 a0 e6 03 9f 54 fd 2a 6c 3a 11 18 f2 b9 d8 eb cd 48 23 48 b9 | |||
9c 3e d7 ed 1b d9 80 6c 93 c8 90 68 e8 36 b4 0f | 9c 3e d7 ed 1b d9 80 6c 93 c8 90 68 e8 36 b4 0f | |||
CIPHERTEXT_2 is the ciphertext resulting from XOR between plaintext | CIPHERTEXT_2 is the ciphertext resulting from XOR between plaintext | |||
and KEYSTREAM_2 which is derived from TH_2 and the pseudorandom key | and KEYSTREAM_2 which is derived from TH_2 and the pseudorandom key | |||
PRK_2e. | PRK_2e. | |||
* plaintext = CBOR Sequence of the items ID_CRED_R and | o plaintext = CBOR Sequence of the items ID_CRED_R and | |||
Signature_or_MAC_2 encoded as CBOR byte strings, in this order | Signature_or_MAC_2 encoded as CBOR byte strings, in this order | |||
(EAD_2 is empty). | (EAD_2 is empty). | |||
The plaintext is the following: | The plaintext is the following: | |||
P_2e (CBOR Sequence) (80 bytes) | P_2e (CBOR Sequence) (80 bytes) | |||
a1 18 22 82 2e 48 68 44 07 8a 53 f3 12 f5 58 40 1f 17 00 6a 98 48 c9 77 | a1 18 22 82 2e 48 68 44 07 8a 53 f3 12 f5 58 40 1f 17 00 6a 98 48 c9 77 | |||
cb bd ca a7 57 b6 fd 46 82 c8 17 39 e1 5c 99 37 c2 1c f5 e9 a0 e6 03 9f | cb bd ca a7 57 b6 fd 46 82 c8 17 39 e1 5c 99 37 c2 1c f5 e9 a0 e6 03 9f | |||
54 fd 2a 6c 3a 11 18 f2 b9 d8 eb cd 48 23 48 b9 9c 3e d7 ed 1b d9 80 6c | 54 fd 2a 6c 3a 11 18 f2 b9 d8 eb cd 48 23 48 b9 9c 3e d7 ed 1b d9 80 6c | |||
93 c8 90 68 e8 36 b4 0f | 93 c8 90 68 e8 36 b4 0f | |||
skipping to change at page 71, line 12 ¶ | skipping to change at page 72, line 47 ¶ | |||
Which as a CBOR encoded data item is: | Which as a CBOR encoded data item is: | |||
message_2 (CBOR Sequence) (117 bytes) | message_2 (CBOR Sequence) (117 bytes) | |||
58 20 71 a3 d5 99 c2 1d a1 89 02 a1 ae a8 10 b2 b6 38 2c cd 8d 5f 9b f0 | 58 20 71 a3 d5 99 c2 1d a1 89 02 a1 ae a8 10 b2 b6 38 2c cd 8d 5f 9b f0 | |||
19 52 81 75 4c 5e bc af 30 1e 37 58 50 0f f2 ac 2d 7e 87 ae 34 0e 50 bb | 19 52 81 75 4c 5e bc af 30 1e 37 58 50 0f f2 ac 2d 7e 87 ae 34 0e 50 bb | |||
de 9f 70 e8 a7 7f 86 bf 65 9f 43 b0 24 a7 3e e9 7b 6a 2b 9c 55 92 fd 83 | de 9f 70 e8 a7 7f 86 bf 65 9f 43 b0 24 a7 3e e9 7b 6a 2b 9c 55 92 fd 83 | |||
5a 15 17 8b 7c 28 af 54 74 a9 75 81 48 64 7d 3d 98 a8 73 1e 16 4c 9c 70 | 5a 15 17 8b 7c 28 af 54 74 a9 75 81 48 64 7d 3d 98 a8 73 1e 16 4c 9c 70 | |||
52 81 07 f4 0f 21 46 3b a8 11 bf 03 97 19 e7 cf fa a7 f2 f4 40 | 52 81 07 f4 0f 21 46 3b a8 11 bf 03 97 19 e7 cf fa a7 f2 f4 40 | |||
C.1.3. Message_3 | D.1.3. Message_3 | |||
Since corr equals 1, C_R is not omitted from data_3. | Since corr equals 1, C_R is not omitted from data_3. | |||
The Initiator's sign/verify key pair is the following: | The Initiator's sign/verify key pair is the following: | |||
SK_I (Initiator's private authentication key) (32 bytes) | SK_I (Initiator's private authentication key) (32 bytes) | |||
2f fc e7 a0 b2 b8 25 d3 97 d0 cb 54 f7 46 e3 da 3f 27 59 6e e0 6b 53 71 | 2f fc e7 a0 b2 b8 25 d3 97 d0 cb 54 f7 46 e3 da 3f 27 59 6e e0 6b 53 71 | |||
48 1d c0 e0 12 bc 34 d7 | 48 1d c0 e0 12 bc 34 d7 | |||
PK_I (Responder's public authentication key) (32 bytes) | PK_I (Responder's public authentication key) (32 bytes) | |||
skipping to change at page 74, line 32 ¶ | skipping to change at page 76, line 22 ¶ | |||
9c 83 9c 0e e8 36 42 50 5a 8e 1c 9f b2 | 9c 83 9c 0e e8 36 42 50 5a 8e 1c 9f b2 | |||
MAC_3 is the 'ciphertext' of the COSE_Encrypt0: | MAC_3 is the 'ciphertext' of the COSE_Encrypt0: | |||
MAC_3 (CBOR unencoded) (8 bytes) | MAC_3 (CBOR unencoded) (8 bytes) | |||
2f a1 e3 9e ae 7d 5f 8d | 2f a1 e3 9e ae 7d 5f 8d | |||
Since the method = 0, Signature_or_MAC_3 is a signature. The | Since the method = 0, Signature_or_MAC_3 is a signature. The | |||
algorithm with selected cipher suite 0 is Ed25519. | algorithm with selected cipher suite 0 is Ed25519. | |||
* The message M_3 to be signed = [ "Signature1", << ID_CRED_I >>, | o The message M_3 to be signed = [ "Signature1", << ID_CRED_I >>, | |||
<< TH_3, CRED_I >>, MAC_3 ], i.e. ID_CRED_I encoded as CBOR bstr, | << TH_3, CRED_I >>, MAC_3 ], i.e. ID_CRED_I encoded as CBOR bstr, | |||
the concatenation of the CBOR byte strings TH_3 and CRED_I wrapped | the concatenation of the CBOR byte strings TH_3 and CRED_I wrapped | |||
as a CBOR bstr, and MAC_3 encoded as a CBOR bstr. | as a CBOR bstr, and MAC_3 encoded as a CBOR bstr. | |||
* The signing key is the private authentication key of the | o The signing key is the private authentication key of the | |||
Initiator. | Initiator. | |||
M_3 = | M_3 = | |||
[ | [ | |||
"Signature1", | "Signature1", | |||
h'A11822822E48705D5845F36FC6A6', | h'A11822822E48705D5845F36FC6A6', | |||
h'5820F24D18CAFCE374D4E3736329C152AB3AEA9C7C0F650C3070B6F51E68E2AEBB6 | h'5820F24D18CAFCE374D4E3736329C152AB3AEA9C7C0F650C3070B6F51E68E2AEBB6 | |||
058655413204C3EBC3428A6CF57E24C9DEF59651770449BCE7EC6561E52433AA55E71 | 058655413204C3EBC3428A6CF57E24C9DEF59651770449BCE7EC6561E52433AA55E71 | |||
F1FA34B22A9CA4A1E12924EAE1D1766088098449CB848FFC795F88AFC49CBE8AFDD1B | F1FA34B22A9CA4A1E12924EAE1D1766088098449CB848FFC795F88AFC49CBE8AFDD1B | |||
A009F21675E8F6C77A4A2C30195601F6F0A0852978BD43D28207D44486502FF7BDD | A009F21675E8F6C77A4A2C30195601F6F0A0852978BD43D28207D44486502FF7BDD | |||
skipping to change at page 77, line 12 ¶ | skipping to change at page 79, line 4 ¶ | |||
From the parameter above, message_3 is computed, as the CBOR Sequence | From the parameter above, message_3 is computed, as the CBOR Sequence | |||
of the following CBOR encoded data items: (C_R, CIPHERTEXT_3). | of the following CBOR encoded data items: (C_R, CIPHERTEXT_3). | |||
message_3 = | message_3 = | |||
( | ( | |||
-24, | -24, | |||
h'F5F6DEBD8214051CD583C84096C4801DEBF35B15363DD16EBD8530DFDCFB34FCD2EB | h'F5F6DEBD8214051CD583C84096C4801DEBF35B15363DD16EBD8530DFDCFB34FCD2EB | |||
6CAD1DAC66A479FB38DEAAF1D30A7E6817A22AB04F3D5B1E972A0D13EA86C66B60514C | 6CAD1DAC66A479FB38DEAAF1D30A7E6817A22AB04F3D5B1E972A0D13EA86C66B60514C | |||
9657EA89C57B0401EDC5AA8BBCAB813CC5D6E7' | 9657EA89C57B0401EDC5AA8BBCAB813CC5D6E7' | |||
) | ) | |||
Which encodes to the following byte string: | Which encodes to the following byte string: | |||
message_3 (CBOR Sequence) (91 bytes) | message_3 (CBOR Sequence) (91 bytes) | |||
37 58 58 f5 f6 de bd 82 14 05 1c d5 83 c8 40 96 c4 80 1d eb f3 5b 15 36 | 37 58 58 f5 f6 de bd 82 14 05 1c d5 83 c8 40 96 c4 80 1d eb f3 5b 15 36 | |||
3d d1 6e bd 85 30 df dc fb 34 fc d2 eb 6c ad 1d ac 66 a4 79 fb 38 de aa | 3d d1 6e bd 85 30 df dc fb 34 fc d2 eb 6c ad 1d ac 66 a4 79 fb 38 de aa | |||
f1 d3 0a 7e 68 17 a2 2a b0 4f 3d 5b 1e 97 2a 0d 13 ea 86 c6 6b 60 51 4c | f1 d3 0a 7e 68 17 a2 2a b0 4f 3d 5b 1e 97 2a 0d 13 ea 86 c6 6b 60 51 4c | |||
96 57 ea 89 c5 7b 04 01 ed c5 aa 8b bc ab 81 3c c5 d6 e7 | 96 57 ea 89 c5 7b 04 01 ed c5 aa 8b bc ab 81 3c c5 d6 e7 | |||
C.1.4. OSCORE Security Context Derivation | D.1.4. OSCORE Security Context Derivation | |||
From here, the Initiator and the Responder can derive an OSCORE | From here, the Initiator and the Responder can derive an OSCORE | |||
Security Context, using the EDHOC-Exporter interface. | Security Context, using the EDHOC-Exporter interface. | |||
From TH_3 and CIPHERTEXT_3, compute the input to the transcript hash | From TH_3 and CIPHERTEXT_3, compute the input to the transcript hash | |||
TH_4 = H( TH_3, CIPHERTEXT_3 ), as a CBOR Sequence of these 2 data | TH_4 = H( TH_3, CIPHERTEXT_3 ), as a CBOR Sequence of these 2 data | |||
items. | items. | |||
Input to calculate TH_4 (CBOR Sequence) (124 bytes) | Input to calculate TH_4 (CBOR Sequence) (124 bytes) | |||
58 20 f2 4d 18 ca fc e3 74 d4 e3 73 63 29 c1 52 ab 3a ea 9c 7c 0f 65 0c | 58 20 f2 4d 18 ca fc e3 74 d4 e3 73 63 29 c1 52 ab 3a ea 9c 7c 0f 65 0c | |||
skipping to change at page 79, line 10 ¶ | skipping to change at page 81, line 4 ¶ | |||
5e c3 ee 41 7c fb ba e9 | 5e c3 ee 41 7c fb ba e9 | |||
The client's OSCORE Sender ID is C_R and the server's OSCORE Sender | The client's OSCORE Sender ID is C_R and the server's OSCORE Sender | |||
ID is C_I. | ID is C_I. | |||
Client's OSCORE Sender ID (1 byte) | Client's OSCORE Sender ID (1 byte) | |||
00 | 00 | |||
Server's OSCORE Sender ID (1 byte) | Server's OSCORE Sender ID (1 byte) | |||
09 | 09 | |||
The AEAD Algorithm and the hash algorithm are the application AEAD | The AEAD Algorithm and the hash algorithm are the application AEAD | |||
and hash algorithms in the selected cipher suite. | and hash algorithms in the selected cipher suite. | |||
OSCORE AEAD Algorithm (int) | OSCORE AEAD Algorithm (int) | |||
10 | 10 | |||
OSCORE Hash Algorithm (int) | OSCORE Hash Algorithm (int) | |||
-16 | -16 | |||
C.2. Test Vectors for EDHOC Authenticated with Static Diffie-Hellman | D.2. Test Vectors for EDHOC Authenticated with Static Diffie-Hellman | |||
Keys | Keys | |||
EDHOC with static Diffie-Hellman keys and raw public keys is used. | EDHOC with static Diffie-Hellman keys and raw public keys is used. | |||
In this test vector, a key identifier is used to identify the raw | In this test vector, a key identifier is used to identify the raw | |||
public key. The optional C_1 in message_1 is omitted. No external | public key. The optional C_1 in message_1 is omitted. No external | |||
authorization data is sent in the message exchange. | authorization data is sent in the message exchange. | |||
method (Static DH Based Authentication) | method (Static DH Based Authentication) | |||
3 | 3 | |||
skipping to change at page 80, line 4 ¶ | skipping to change at page 81, line 44 ¶ | |||
The Initiator indicates only one cipher suite in the (potentially | The Initiator indicates only one cipher suite in the (potentially | |||
truncated) list of cipher suites. | truncated) list of cipher suites. | |||
Supported Cipher Suites (1 byte) | Supported Cipher Suites (1 byte) | |||
00 | 00 | |||
The Initiator selected the indicated cipher suite. | The Initiator selected the indicated cipher suite. | |||
Selected Cipher Suite (int) | Selected Cipher Suite (int) | |||
0 | 0 | |||
Cipher suite 0 is supported by both the Initiator and the Responder, | Cipher suite 0 is supported by both the Initiator and the Responder, | |||
see Section 3.4. | see Section 3.6. | |||
C.2.1. Message_1 | D.2.1. Message_1 | |||
The Initiator generates its ephemeral key pair. | The Initiator generates its ephemeral key pair. | |||
X (Initiator's ephemeral private key) (32 bytes) | X (Initiator's ephemeral private key) (32 bytes) | |||
ae 11 a0 db 86 3c 02 27 e5 39 92 fe b8 f5 92 4c 50 d0 a7 ba 6e ea b4 ad | ae 11 a0 db 86 3c 02 27 e5 39 92 fe b8 f5 92 4c 50 d0 a7 ba 6e ea b4 ad | |||
1f f2 45 72 f4 f5 7c fa | 1f f2 45 72 f4 f5 7c fa | |||
G_X (Initiator's ephemeral public key, CBOR unencoded) (32 bytes) | G_X (Initiator's ephemeral public key, CBOR unencoded) (32 bytes) | |||
8d 3e f5 6d 1b 75 0a 43 51 d6 8a c2 50 a0 e8 83 79 0e fc 80 a5 38 a4 44 | 8d 3e f5 6d 1b 75 0a 43 51 d6 8a c2 50 a0 e8 83 79 0e fc 80 a5 38 a4 44 | |||
ee 9e 2b 57 e2 44 1a 7c | ee 9e 2b 57 e2 44 1a 7c | |||
The Initiator chooses a connection identifier C_I: | The Initiator chooses a connection identifier C_I: | |||
Connection identifier chosen by Initiator (1 byte) | Connection identifier chosen by Initiator (1 byte) | |||
16 | 16 | |||
Note that since C_I is a byte string in the interval h'00' to h'2f', | Note that since C_I is a byte string in the interval h'00' to h'2f', | |||
it is encoded as the corresponding integer - 24 (see bstr_identifier | it is encoded as the corresponding integer - 24, i.e. 0x16 = 22, 22 - | |||
in Section 5.1), i.e. 0x16 = 22, 22 - 24 = -2, and -2 in CBOR | 24 = -2, and -2 in CBOR encoding is equal to 0x21. | |||
encoding is equal to 0x21. | ||||
C_I (1 byte) | C_I (1 byte) | |||
21 | 21 | |||
Since no external authorization data is sent: | Since no external authorization data is sent: | |||
EAD_1 (0 bytes) | EAD_1 (0 bytes) | |||
Since the list of supported cipher suites needs to contain the | Since the list of supported cipher suites needs to contain the | |||
selected cipher suite, the initiator truncates the list of supported | selected cipher suite, the initiator truncates the list of supported | |||
skipping to change at page 81, line 12 ¶ | skipping to change at page 83, line 4 ¶ | |||
message_1 is constructed as the CBOR Sequence of the data items above | message_1 is constructed as the CBOR Sequence of the data items above | |||
encoded as CBOR. In CBOR diagnostic notation: | encoded as CBOR. In CBOR diagnostic notation: | |||
message_1 = | message_1 = | |||
( | ( | |||
13, | 13, | |||
0, | 0, | |||
h'8D3EF56D1B750A4351D68AC250A0E883790EFC80A538A444EE9E2B57E2441A7C', | h'8D3EF56D1B750A4351D68AC250A0E883790EFC80A538A444EE9E2B57E2441A7C', | |||
-2 | -2 | |||
) | ) | |||
Which as a CBOR encoded data item is: | Which as a CBOR encoded data item is: | |||
message_1 (CBOR Sequence) (37 bytes) | message_1 (CBOR Sequence) (37 bytes) | |||
0d 00 58 20 8d 3e f5 6d 1b 75 0a 43 51 d6 8a c2 50 a0 e8 83 79 0e fc 80 | 0d 00 58 20 8d 3e f5 6d 1b 75 0a 43 51 d6 8a c2 50 a0 e8 83 79 0e fc 80 | |||
a5 38 a4 44 ee 9e 2b 57 e2 44 1a 7c 21 | a5 38 a4 44 ee 9e 2b 57 e2 44 1a 7c 21 | |||
C.2.2. Message_2 | D.2.2. Message_2 | |||
Since METHOD_CORR mod 4 equals 1, C_I is omitted from data_2. | Since METHOD_CORR mod 4 equals 1, C_I is omitted from data_2. | |||
The Responder generates the following ephemeral key pair. | The Responder generates the following ephemeral key pair. | |||
Y (Responder's ephemeral private key) (32 bytes) | Y (Responder's ephemeral private key) (32 bytes) | |||
c6 46 cd dc 58 12 6e 18 10 5f 01 ce 35 05 6e 5e bc 35 f4 d4 cc 51 07 49 | c6 46 cd dc 58 12 6e 18 10 5f 01 ce 35 05 6e 5e bc 35 f4 d4 cc 51 07 49 | |||
a3 a5 e0 69 c1 16 16 9a | a3 a5 e0 69 c1 16 16 9a | |||
G_Y (Responder's ephemeral public key, CBOR unencoded) (32 bytes) | G_Y (Responder's ephemeral public key, CBOR unencoded) (32 bytes) | |||
skipping to change at page 82, line 14 ¶ | skipping to change at page 84, line 4 ¶ | |||
PRK_2e (32 bytes) | PRK_2e (32 bytes) | |||
93 9f cb 05 6d 2e 41 4f 1b ec 61 04 61 99 c2 c7 63 d2 7f 0c 3d 15 fa 16 | 93 9f cb 05 6d 2e 41 4f 1b ec 61 04 61 99 c2 c7 63 d2 7f 0c 3d 15 fa 16 | |||
71 fa 13 4e 0d c5 a0 4d | 71 fa 13 4e 0d c5 a0 4d | |||
The Responder's static Diffie-Hellman key pair is the following: | The Responder's static Diffie-Hellman key pair is the following: | |||
R (Responder's private authentication key) (32 bytes) | R (Responder's private authentication key) (32 bytes) | |||
bb 50 1a ac 67 b9 a9 5f 97 e0 ed ed 6b 82 a6 62 93 4f bb fc 7a d1 b7 4c | bb 50 1a ac 67 b9 a9 5f 97 e0 ed ed 6b 82 a6 62 93 4f bb fc 7a d1 b7 4c | |||
1f ca d6 6a 07 94 22 d0 | 1f ca d6 6a 07 94 22 d0 | |||
G_R (Responder's public authentication key) (32 bytes) | G_R (Responder's public authentication key) (32 bytes) | |||
a3 ff 26 35 95 be b3 77 d1 a0 ce 1d 04 da d2 d4 09 66 ac 6b cb 62 20 51 | a3 ff 26 35 95 be b3 77 d1 a0 ce 1d 04 da d2 d4 09 66 ac 6b cb 62 20 51 | |||
b8 46 59 18 4d 5d 9a 32 | b8 46 59 18 4d 5d 9a 32 | |||
Since the Responder authenticates with a static Diffie-Hellman key, | Since the Responder authenticates with a static Diffie-Hellman key, | |||
PRK_3e2m = HKDF-Extract( PRK_2e, G_RX ), where G_RX is the ECDH | PRK_3e2m = HKDF-Extract( PRK_2e, G_RX ), where G_RX is the ECDH | |||
shared secret calculated from G_R and X, or G_X and R. | shared secret calculated from G_R and X, or G_X and R. | |||
From the Responder's authentication key and the Initiator's ephemeral | From the Responder's authentication key and the Initiator's ephemeral | |||
key (see Appendix C.2.1), the ECDH shared secret G_RX is calculated. | key (see Appendix D.2.1), the ECDH shared secret G_RX is calculated. | |||
G_RX (ECDH shared secret) (32 bytes) | G_RX (ECDH shared secret) (32 bytes) | |||
21 c7 ef f4 fb 69 fa 4b 67 97 d0 58 84 31 5d 84 11 a3 fd a5 4f 6d ad a6 | 21 c7 ef f4 fb 69 fa 4b 67 97 d0 58 84 31 5d 84 11 a3 fd a5 4f 6d ad a6 | |||
1d 4f cd 85 e7 90 66 68 | 1d 4f cd 85 e7 90 66 68 | |||
PRK_3e2m (32 bytes) | PRK_3e2m (32 bytes) | |||
75 07 7c 69 1e 35 01 2d 48 bc 24 c8 4f 2b ab 89 f5 2f ac 03 fe dd 81 3e | 75 07 7c 69 1e 35 01 2d 48 bc 24 c8 4f 2b ab 89 f5 2f ac 03 fe dd 81 3e | |||
43 8c 93 b1 0b 39 93 07 | 43 8c 93 b1 0b 39 93 07 | |||
The Responder chooses a connection identifier C_R. | The Responder chooses a connection identifier C_R. | |||
Connection identifier chosen by Responder (1 byte) | Connection identifier chosen by Responder (1 byte) | |||
00 | 00 | |||
Note that since C_R is a byte string in the interval h'00' to h'2f', | Note that since C_R is a byte string in the interval h'00' to h'2f', | |||
it is encoded as the corresponding integer - 24 (see bstr_identifier | it is encoded as the corresponding integer - 24, i.e. 0x00 = 0, 0 - | |||
in Section 5.1), i.e. 0x00 = 0, 0 - 24 = -24, and -24 in CBOR | 24 = -24, and -24 in CBOR encoding is equal to 0x37. | |||
encoding is equal to 0x37. | ||||
C_R (1 byte) | C_R (1 byte) | |||
37 | 37 | |||
Data_2 is constructed as the CBOR Sequence of G_Y and C_R. | Data_2 is constructed as the CBOR Sequence of G_Y and C_R. | |||
data_2 = | data_2 = | |||
( | ( | |||
h'52FBA0BDC8D953DD86CE1AB2FD7C05A4658C7C30AFDBFC3301047069451BAF35', | h'52FBA0BDC8D953DD86CE1AB2FD7C05A4658C7C30AFDBFC3301047069451BAF35', | |||
-24 | -24 | |||
skipping to change at page 84, line 7 ¶ | skipping to change at page 85, line 36 ¶ | |||
4: h'05' | 4: h'05' | |||
} | } | |||
ID_CRED_R (4 bytes) | ID_CRED_R (4 bytes) | |||
a1 04 41 05 | a1 04 41 05 | |||
CRED_R is the following COSE_Key: | CRED_R is the following COSE_Key: | |||
{ | { | |||
1: 1, | 1: 1, | |||
-1: 4, | -1: 4, | |||
-2: h'A3FF263595BEB377D1A0CE1D04DAD2D40966AC6BCB622051B84659184D5D9A32, | -2: h'A3FF263595BEB377D1A0CE1D04DAD2D40966AC6BCB622051B84659184D5D9A32, | |||
"subject name": "" | "subject name": "" | |||
} | } | |||
Which encodes to the following byte string: | Which encodes to the following byte string: | |||
CRED_R (54 bytes) | CRED_R (54 bytes) | |||
a4 01 01 20 04 21 58 20 a3 ff 26 35 95 be b3 77 d1 a0 ce 1d 04 da d2 d4 | a4 01 01 20 04 21 58 20 a3 ff 26 35 95 be b3 77 d1 a0 ce 1d 04 da d2 d4 | |||
09 66 ac 6b cb 62 20 51 b8 46 59 18 4d 5d 9a 32 6c 73 75 62 6a 65 63 74 | 09 66 ac 6b cb 62 20 51 b8 46 59 18 4d 5d 9a 32 6c 73 75 62 6a 65 63 74 | |||
20 6e 61 6d 65 60 | 20 6e 61 6d 65 60 | |||
skipping to change at page 85, line 51 ¶ | skipping to change at page 87, line 29 ¶ | |||
From these parameters, IV_2m is computed. IV_2m is the output of | From these parameters, IV_2m is computed. IV_2m is the output of | |||
HKDF-Expand(PRK_3e2m, info, L), where L is the length of IV_2m, so 13 | HKDF-Expand(PRK_3e2m, info, L), where L is the length of IV_2m, so 13 | |||
bytes. | bytes. | |||
IV_2m (13 bytes) | IV_2m (13 bytes) | |||
e9 b8 e4 b1 bd 02 f4 9a 82 0d d3 53 4f | e9 b8 e4 b1 bd 02 f4 9a 82 0d d3 53 4f | |||
Finally, COSE_Encrypt0 is computed from the parameters above. | Finally, COSE_Encrypt0 is computed from the parameters above. | |||
* protected header = CBOR-encoded ID_CRED_R | o protected header = CBOR-encoded ID_CRED_R | |||
* external_aad = A_2m | ||||
* empty plaintext = P_2m | o external_aad = A_2m | |||
o empty plaintext = P_2m | ||||
MAC_2 is the 'ciphertext' of the COSE_Encrypt0 with empty plaintext. | MAC_2 is the 'ciphertext' of the COSE_Encrypt0 with empty plaintext. | |||
In case of cipher suite 0 the AEAD is AES-CCM truncated to 8 bytes: | In case of cipher suite 0 the AEAD is AES-CCM truncated to 8 bytes: | |||
MAC_2 (CBOR unencoded) (8 bytes) | MAC_2 (CBOR unencoded) (8 bytes) | |||
42 e7 99 78 43 1e 6b 8f | 42 e7 99 78 43 1e 6b 8f | |||
Since method = 2, Signature_or_MAC_2 is MAC_2: | Since method = 2, Signature_or_MAC_2 is MAC_2: | |||
Signature_or_MAC_2 (CBOR unencoded) (8 bytes) | Signature_or_MAC_2 (CBOR unencoded) (8 bytes) | |||
skipping to change at page 86, line 29 ¶ | skipping to change at page 88, line 8 ¶ | |||
CIPHERTEXT_2 is the ciphertext resulting from XOR between plaintext | CIPHERTEXT_2 is the ciphertext resulting from XOR between plaintext | |||
and KEYSTREAM_2 which is derived from TH_2 and the pseudorandom key | and KEYSTREAM_2 which is derived from TH_2 and the pseudorandom key | |||
PRK_2e. | PRK_2e. | |||
The plaintext is the CBOR Sequence of the items ID_CRED_R and the | The plaintext is the CBOR Sequence of the items ID_CRED_R and the | |||
CBOR encoded Signature_or_MAC_2, in this order (EAD_2 is empty). | CBOR encoded Signature_or_MAC_2, in this order (EAD_2 is empty). | |||
Note that since ID_CRED_R contains a single 'kid' parameter, i.e., | Note that since ID_CRED_R contains a single 'kid' parameter, i.e., | |||
ID_CRED_R = { 4 : kid_R }, only the byte string kid_R is conveyed in | ID_CRED_R = { 4 : kid_R }, only the byte string kid_R is conveyed in | |||
the plaintext encoded as a bstr_identifier. kid_R is encoded as the | the plaintext encoded as a bstr_identifier. kid_R is encoded as the | |||
corresponding integer - 24 (see bstr_identifier in Section 5.1), i.e. | corresponding integer - 24, i.e. 0x05 = 5, 5 - 24 = -19, and -19 in | |||
0x05 = 5, 5 - 24 = -19, and -19 in CBOR encoding is equal to 0x32. | CBOR encoding is equal to 0x32. | |||
The plaintext is the following: | The plaintext is the following: | |||
P_2e (CBOR Sequence) (10 bytes) | P_2e (CBOR Sequence) (10 bytes) | |||
32 48 42 e7 99 78 43 1e 6b 8f | 32 48 42 e7 99 78 43 1e 6b 8f | |||
KEYSTREAM_2 = HKDF-Expand( PRK_2e, info, length ), where length is | KEYSTREAM_2 = HKDF-Expand( PRK_2e, info, length ), where length is | |||
the length of the plaintext, so 10. | the length of the plaintext, so 10. | |||
info for KEYSTREAM_2 = | info for KEYSTREAM_2 = | |||
skipping to change at page 87, line 29 ¶ | skipping to change at page 89, line 4 ¶ | |||
a3 f1 bd 5d 02 8d 19 cf 3c 99 | a3 f1 bd 5d 02 8d 19 cf 3c 99 | |||
message_2 is the CBOR Sequence of data_2 and CIPHERTEXT_2, in this | message_2 is the CBOR Sequence of data_2 and CIPHERTEXT_2, in this | |||
order: | order: | |||
message_2 = | message_2 = | |||
( | ( | |||
data_2, | data_2, | |||
h'A3F1BD5D028D19CF3C99' | h'A3F1BD5D028D19CF3C99' | |||
) | ) | |||
Which as a CBOR encoded data item is: | Which as a CBOR encoded data item is: | |||
message_2 (CBOR Sequence) (46 bytes) | message_2 (CBOR Sequence) (46 bytes) | |||
58 20 52 fb a0 bd c8 d9 53 dd 86 ce 1a b2 fd 7c 05 a4 65 8c 7c 30 af db | 58 20 52 fb a0 bd c8 d9 53 dd 86 ce 1a b2 fd 7c 05 a4 65 8c 7c 30 af db | |||
fc 33 01 04 70 69 45 1b af 35 37 4a a3 f1 bd 5d 02 8d 19 cf 3c 99 | fc 33 01 04 70 69 45 1b af 35 37 4a a3 f1 bd 5d 02 8d 19 cf 3c 99 | |||
C.2.3. Message_3 | D.2.3. Message_3 | |||
Since corr equals 1, C_R is not omitted from data_3. | Since corr equals 1, C_R is not omitted from data_3. | |||
The Initiator's static Diffie-Hellman key pair is the following: | The Initiator's static Diffie-Hellman key pair is the following: | |||
I (Initiator's private authentication key) (32 bytes) | I (Initiator's private authentication key) (32 bytes) | |||
2b be a6 55 c2 33 71 c3 29 cf bd 3b 1f 02 c6 c0 62 03 38 37 b8 b5 90 99 | 2b be a6 55 c2 33 71 c3 29 cf bd 3b 1f 02 c6 c0 62 03 38 37 b8 b5 90 99 | |||
a4 43 6f 66 60 81 b0 8e | a4 43 6f 66 60 81 b0 8e | |||
G_I (Initiator's public authentication key, CBOR unencoded) (32 bytes) | G_I (Initiator's public authentication key, CBOR unencoded) (32 bytes) | |||
2c 44 0c c1 21 f8 d7 f2 4c 3b 0e 41 ae da fe 9c aa 4f 4e 7a bb 83 5e c3 | 2c 44 0c c1 21 f8 d7 f2 4c 3b 0e 41 ae da fe 9c aa 4f 4e 7a bb 83 5e c3 | |||
0f 1d e8 8a db 96 ff 71 | 0f 1d e8 8a db 96 ff 71 | |||
HKDF SHA-256 is the HKDF used (as defined by cipher suite 0). | HKDF SHA-256 is the HKDF used (as defined by cipher suite 0). | |||
From the Initiator's authentication key and the Responder's ephemeral | From the Initiator's authentication key and the Responder's ephemeral | |||
key (see Appendix C.2.2), the ECDH shared secret G_IY is calculated. | key (see Appendix D.2.2), the ECDH shared secret G_IY is calculated. | |||
G_IY (ECDH shared secret) (32 bytes) | G_IY (ECDH shared secret) (32 bytes) | |||
cb ff 8c d3 4a 81 df ec 4c b6 5d 9a 57 2e bd 09 64 45 0c 78 56 3d a4 98 | cb ff 8c d3 4a 81 df ec 4c b6 5d 9a 57 2e bd 09 64 45 0c 78 56 3d a4 98 | |||
1d 80 d3 6c 8b 1a 75 2a | 1d 80 d3 6c 8b 1a 75 2a | |||
PRK_4x3m = HMAC-SHA-256 (PRK_3e2m, G_IY). | PRK_4x3m = HMAC-SHA-256 (PRK_3e2m, G_IY). | |||
PRK_4x3m (32 bytes) | PRK_4x3m (32 bytes) | |||
02 56 2f 1f 01 78 5c 0a a5 f5 94 64 0c 49 cb f6 9f 72 2e 9e 6c 57 83 7d | 02 56 2f 1f 01 78 5c 0a a5 f5 94 64 0c 49 cb f6 9f 72 2e 9e 6c 57 83 7d | |||
8e 15 79 ec 45 fe 64 7a | 8e 15 79 ec 45 fe 64 7a | |||
skipping to change at page 89, line 4 ¶ | skipping to change at page 90, line 25 ¶ | |||
And its credential is: | And its credential is: | |||
ID_CRED_I = | ID_CRED_I = | |||
{ | { | |||
4: h'23' | 4: h'23' | |||
} | } | |||
ID_CRED_I (4 bytes) | ID_CRED_I (4 bytes) | |||
a1 04 41 23 | a1 04 41 23 | |||
CRED_I is the following COSE_Key: | CRED_I is the following COSE_Key: | |||
{ | { | |||
1: 1, | 1:1, | |||
-1: 4, | -1:4, | |||
-2: h'2C440CC121F8D7F24C3B0E41AEDAFE9CAA4F4E7ABB835EC30F1DE88ADB96FF71', | -2:h'2C440CC121F8D7F24C3B0E41AEDAFE9CAA4F4E7ABB835EC30F1DE88ADB96FF71', | |||
"subject name": "" | "subject name":"" | |||
} | } | |||
Which encodes to the following byte string: | Which encodes to the following byte string: | |||
CRED_I (54 bytes) | CRED_I (54 bytes) | |||
a4 01 01 20 04 21 58 20 2c 44 0c c1 21 f8 d7 f2 4c 3b 0e 41 ae da fe 9c | a4 01 01 20 04 21 58 20 2c 44 0c c1 21 f8 d7 f2 4c 3b 0e 41 ae da fe 9c | |||
aa 4f 4e 7a bb 83 5e c3 0f 1d e8 8a db 96 ff 71 6c 73 75 62 6a 65 63 74 | aa 4f 4e 7a bb 83 5e c3 0f 1d e8 8a db 96 ff 71 6c 73 75 62 6a 65 63 74 | |||
20 6e 61 6d 65 60 | 20 6e 61 6d 65 60 | |||
Since no external authorization data is exchanged: | Since no external authorization data is exchanged: | |||
skipping to change at page 91, line 11 ¶ | skipping to change at page 92, line 28 ¶ | |||
ee 59 8e a6 61 17 dc c3 | ee 59 8e a6 61 17 dc c3 | |||
Finally, the outer COSE_Encrypt0 is computed. | Finally, the outer COSE_Encrypt0 is computed. | |||
The plaintext is the CBOR Sequence of the items ID_CRED_I and the | The plaintext is the CBOR Sequence of the items ID_CRED_I and the | |||
CBOR encoded Signature_or_MAC_3, in this order (EAD_3 is empty). | CBOR encoded Signature_or_MAC_3, in this order (EAD_3 is empty). | |||
Note that since ID_CRED_I contains a single 'kid' parameter, i.e., | Note that since ID_CRED_I contains a single 'kid' parameter, i.e., | |||
ID_CRED_I = { 4 : kid_I }, only the byte string kid_I is conveyed in | ID_CRED_I = { 4 : kid_I }, only the byte string kid_I is conveyed in | |||
the plaintext encoded as a bstr_identifier. kid_I is encoded as the | the plaintext encoded as a bstr_identifier. kid_I is encoded as the | |||
corresponding integer - 24 (see bstr_identifier in Section 5.1), i.e. | corresponding integer - 24, i.e. 0x23 = 35, 35 - 24 = 11, and 11 in | |||
0x23 = 35, 35 - 24 = 11, and 11 in CBOR encoding is equal to 0x0b. | CBOR encoding is equal to 0x0b. | |||
P_3ae (CBOR Sequence) (10 bytes) | P_3ae (CBOR Sequence) (10 bytes) | |||
0b 48 ee 59 8e a6 61 17 dc c3 | 0b 48 ee 59 8e a6 61 17 dc c3 | |||
The Associated data A is the following: Associated data A = [ | The Associated data A is the following: Associated data A = [ | |||
"Encrypt0", h'', TH_3 ] | "Encrypt0", h'', TH_3 ] | |||
A_3ae (CBOR-encoded) (45 bytes) | A_3ae (CBOR-encoded) (45 bytes) | |||
83 68 45 6e 63 72 79 70 74 30 40 58 20 b6 cd 80 4f c4 b9 d7 ca c5 02 ab | 83 68 45 6e 63 72 79 70 74 30 40 58 20 b6 cd 80 4f c4 b9 d7 ca c5 02 ab | |||
d7 7c da 74 e4 1c b0 11 82 d7 cb 8b 84 db 03 ff a5 83 a3 5f cb | d7 7c da 74 e4 1c b0 11 82 d7 cb 8b 84 db 03 ff a5 83 a3 5f cb | |||
skipping to change at page 92, line 46 ¶ | skipping to change at page 94, line 16 ¶ | |||
( | ( | |||
-24, | -24, | |||
h'D5535F3147E85F1CFACD9E78ABF9E0A81BBF' | h'D5535F3147E85F1CFACD9E78ABF9E0A81BBF' | |||
) | ) | |||
Which encodes to the following byte string: | Which encodes to the following byte string: | |||
message_3 (CBOR Sequence) (20 bytes) | message_3 (CBOR Sequence) (20 bytes) | |||
37 52 d5 53 5f 31 47 e8 5f 1c fa cd 9e 78 ab f9 e0 a8 1b bf | 37 52 d5 53 5f 31 47 e8 5f 1c fa cd 9e 78 ab f9 e0 a8 1b bf | |||
C.2.4. OSCORE Security Context Derivation | D.2.4. OSCORE Security Context Derivation | |||
From here, the Initiator and the Responder can derive an OSCORE | From here, the Initiator and the Responder can derive an OSCORE | |||
Security Context, using the EDHOC-Exporter interface. | Security Context, using the EDHOC-Exporter interface. | |||
From TH_3 and CIPHERTEXT_3, compute the input to the transcript hash | From TH_3 and CIPHERTEXT_3, compute the input to the transcript hash | |||
TH_4 = H( TH_3, CIPHERTEXT_3 ), as a CBOR Sequence of these 2 data | TH_4 = H( TH_3, CIPHERTEXT_3 ), as a CBOR Sequence of these 2 data | |||
items. | items. | |||
Input to calculate TH_4 (CBOR Sequence) (53 bytes) | Input to calculate TH_4 (CBOR Sequence) (53 bytes) | |||
58 20 b6 cd 80 4f c4 b9 d7 ca c5 02 ab d7 7c da 74 e4 1c b0 11 82 d7 cb | 58 20 b6 cd 80 4f c4 b9 d7 ca c5 02 ab d7 7c da 74 e4 1c b0 11 82 d7 cb | |||
skipping to change at page 94, line 36 ¶ | skipping to change at page 96, line 4 ¶ | |||
c2 24 34 9d 9b 34 ca 8c | c2 24 34 9d 9b 34 ca 8c | |||
The client's OSCORE Sender ID is C_R and the server's OSCORE Sender | The client's OSCORE Sender ID is C_R and the server's OSCORE Sender | |||
ID is C_I. | ID is C_I. | |||
Client's OSCORE Sender ID (1 byte) | Client's OSCORE Sender ID (1 byte) | |||
00 | 00 | |||
Server's OSCORE Sender ID (1 byte) | Server's OSCORE Sender ID (1 byte) | |||
16 | 16 | |||
The AEAD Algorithm and the hash algorithm are the application AEAD | The AEAD Algorithm and the hash algorithm are the application AEAD | |||
and hash algorithms in the selected cipher suite. | and hash algorithms in the selected cipher suite. | |||
OSCORE AEAD Algorithm (int) | OSCORE AEAD Algorithm (int) | |||
10 | 10 | |||
OSCORE Hash Algorithm (int) | OSCORE Hash Algorithm (int) | |||
-16 | -16 | |||
Appendix D. Applicability Template | Appendix E. Applicability Template | |||
This appendix contains an example of an applicability statement, see | This appendix contains an example of an applicability statement, see | |||
Section 3.7. | Section 3.9. | |||
For use of EDHOC in the XX protocol, the following assumptions are | For use of EDHOC in the XX protocol, the following assumptions are | |||
made on the parameters: | made on the parameters: | |||
* METHOD_CORR = 5 | o METHOD = 1 (I uses signature key, R uses static DH key.) | |||
- method = 1 (I uses signature key, R uses static DH key.) | ||||
- corr = 1 (CoAP Token or other transport data enables | ||||
correlation between message_1 and message_2.) | ||||
* EDHOC requests are expected by the server at /app1-edh, no | o EDHOC requests are expected by the server at /app1-edh, no | |||
Content-Format needed. | Content-Format needed. | |||
* C_1 = "null" is present to identify message_1 | o CRED_I is an 802.1AR IDevID encoded as a C509 Certificate of type | |||
* CRED_I is an 802.1AR IDevID encoded as a C509 Certificate of type | ||||
0 [I-D.ietf-cose-cbor-encoded-cert]. | 0 [I-D.ietf-cose-cbor-encoded-cert]. | |||
- R acquires CRED_I out-of-band, indicated in EAD_1 | * R acquires CRED_I out-of-band, indicated in EAD_1 | |||
- ID_CRED_I = {4: h''} is a kid with value empty byte string | * ID_CRED_I = {4: h''} is a kid with value empty byte string | |||
* CRED_R is a COSE_Key of type OKP as specified in Section 3.3.4. | o CRED_R is a COSE_Key of type OKP as specified in Section 3.5.4. | |||
- The CBOR map has parameters 1 (kty), -1 (crv), and -2 | * The CBOR map has parameters 1 (kty), -1 (crv), and -2 | |||
(x-coordinate). | (x-coordinate). | |||
* ID_CRED_R = CRED_R | o ID_CRED_R = CRED_R | |||
* No use of message_4: the application sends protected messages from | o No use of message_4: the application sends protected messages from | |||
R to I. | R to I. | |||
* External authorization data is defined and processed as specified | o External authorization data is defined and processed as specified | |||
in [I-D.selander-ace-ake-authz]. | in [I-D.selander-ace-ake-authz]. | |||
Appendix E. EDHOC Message Deduplication | Appendix F. EDHOC Message Deduplication | |||
EDHOC by default assumes that message duplication is handled by the | EDHOC by default assumes that message duplication is handled by the | |||
transport, in this section exemplified with CoAP. | transport, in this section exemplified with CoAP. | |||
Deduplication of CoAP messages is described in Section 4.5 of | Deduplication of CoAP messages is described in Section 4.5 of | |||
[RFC7252]. This handles the case when the same Confirmable (CON) | [RFC7252]. This handles the case when the same Confirmable (CON) | |||
message is received multiple times due to missing acknowledgement on | message is received multiple times due to missing acknowledgement on | |||
CoAP messaging layer. The recommended processing in [RFC7252] is | CoAP messaging layer. The recommended processing in [RFC7252] is | |||
that the duplicate message is acknowledged (ACK), but the received | that the duplicate message is acknowledged (ACK), but the received | |||
message is only processed once by the CoAP stack. | message is only processed once by the CoAP stack. | |||
Message deduplication is resource demanding and therefore not | Message deduplication is resource demanding and therefore not | |||
supported in all CoAP implementations. Since EDHOC is targeting | supported in all CoAP implementations. Since EDHOC is targeting | |||
constrained environments, it is desirable that EDHOC can optionally | constrained environments, it is desirable that EDHOC can optionally | |||
support transport layers which does not handle message duplication. | support transport layers which does not handle message duplication. | |||
Special care is needed to avoid issues with duplicate messages, see | Special care is needed to avoid issues with duplicate messages, see | |||
Section 5.2. | Section 5.1. | |||
The guiding principle here is similar to the deduplication processing | The guiding principle here is similar to the deduplication processing | |||
on CoAP messaging layer: a received duplicate EDHOC message SHALL NOT | on CoAP messaging layer: a received duplicate EDHOC message SHALL NOT | |||
result in a response consisting of another instance of the next EDHOC | result in a response consisting of another instance of the next EDHOC | |||
message. The result MAY be that a duplicate EDHOC response is sent, | message. The result MAY be that a duplicate EDHOC response is sent, | |||
provided it is still relevant with respect the current protocol | provided it is still relevant with respect the current protocol | |||
state. In any case, the received message MUST NOT be processed more | state. In any case, the received message MUST NOT be processed more | |||
than once in the same EDHOC session. This is called "EDHOC message | than once in the same EDHOC session. This is called "EDHOC message | |||
deduplication". | deduplication". | |||
An EDHOC implementation MAY store the previously sent EDHOC message | An EDHOC implementation MAY store the previously sent EDHOC message | |||
to be able to resend it. An EDHOC implementation MAY keep the | to be able to resend it. An EDHOC implementation MAY keep the | |||
protocol state to be able to recreate the previously sent EDHOC | protocol state to be able to recreate the previously sent EDHOC | |||
message and resend it. The previous message or protocol state MUST | message and resend it. The previous message or protocol state MUST | |||
NOT be kept longer than what is required for retransmission, for | NOT be kept longer than what is required for retransmission, for | |||
example, in the case of CoAP transport, no longer than the | example, in the case of CoAP transport, no longer than the | |||
EXCHANGE_LIFETIME (see Section 4.8.2 of [RFC7252]). | EXCHANGE_LIFETIME (see Section 4.8.2 of [RFC7252]). | |||
Note that the requirements in Section 5.2 still apply because | Note that the requirements in Section 5.1 still apply because | |||
duplicate messages are not processed by the EDHOC state machine: | duplicate messages are not processed by the EDHOC state machine: | |||
* EDHOC messages SHALL be processed according to the current | o EDHOC messages SHALL be processed according to the current | |||
protocol state. | protocol state. | |||
* Different instances of the same message MUST NOT be processed in | o Different instances of the same message MUST NOT be processed in | |||
one session. | one session. | |||
Appendix F. Change Log | Appendix G. Transports Not Natively Providing Correlation | |||
Protocols that do not natively provide full correlation between a | ||||
series of messages can send the C_I and C_R identifiers along as | ||||
needed. | ||||
The transport over CoAP (Appendix A.3) can serve as a blueprint for | ||||
other server-client protocols: The client prepends the C_x which the | ||||
server selected (or, for message 1, a sentinel null value which is | ||||
not a valid C_x) to any request message it sends. The server does | ||||
not send any such indicator, as responses are matched to request by | ||||
the client-server protocol design. | ||||
Protocols that do not provide any correlation at all can prescribe | ||||
prepending of the peer's chosen C_x to all messages. | ||||
Appendix H. Change Log | ||||
Main changes: | Main changes: | |||
* From -06 to -07: | o From -07 to -08: | |||
- Changed transcript hash definition for TH_2 and TH_3 | * Prepended C_x moved from the EDHOC protocol itself to the | |||
transport mapping | ||||
- Removed "EDHOC signature algorithm curve" from cipher suite | * METHOD_CORR renamed to METHOD, corr removed | |||
- New IANA registry "EDHOC Exporter Label" | * Removed bstr_identifier and use bstr / int instead; C_x can now | |||
be int without any implied bstr semantics | ||||
- New application defined parameter "context" in EDHOC-Exporter | * Defined COSE header parameter 'kid2' with value type bstr / int | |||
- Changed normative language for failure from MUST to SHOULD send | for use with ID_CRED_x | |||
* Updated message sizes | ||||
* New cipher suites with AES-GCM and ChaCha20 / Poly1305 | ||||
* Changed from one- to two-byte identifier of CNSA compliant | ||||
suite | ||||
* Separate sections on transport and connection id with further | ||||
sub-structure | ||||
* Moved back key derivation for OSCORE from draft-ietf-core- | ||||
oscore-edhoc | ||||
* OSCORE and CoAP specific processing moved to new appendix | ||||
* Message 4 section moved to message processing section | ||||
o From -06 to -07: | ||||
* Changed transcript hash definition for TH_2 and TH_3 | ||||
* Removed "EDHOC signature algorithm curve" from cipher suite | ||||
* New IANA registry "EDHOC Exporter Label" | ||||
* New application defined parameter "context" in EDHOC-Exporter | ||||
* Changed normative language for failure from MUST to SHOULD send | ||||
error | error | |||
- Made error codes non-negative and 0 for success | * Made error codes non-negative and 0 for success | |||
- Added detail on success error code | * Added detail on success error code | |||
- Aligned terminology "protocol instance" -> "session" | * Aligned terminology "protocol instance" -> "session" | |||
- New appendix on compact EC point representation | * New appendix on compact EC point representation | |||
- Added detail on use of ephemeral public keys | * Added detail on use of ephemeral public keys | |||
- Moved key derivation for OSCORE to draft-ietf-core-oscore-edhoc | * Moved key derivation for OSCORE to draft-ietf-core-oscore-edhoc | |||
- Additional security considerations | * Additional security considerations | |||
- Renamed "Auxililary Data" as "External Authorization Data" | * Renamed "Auxililary Data" as "External Authorization Data" | |||
- Added encrypted EAD_4 to message_4 | * Added encrypted EAD_4 to message_4 | |||
* From -05 to -06: | o From -05 to -06: | |||
- New section 5.2 "Message Processing Outline" | * New section 5.2 "Message Processing Outline" | |||
- Optional inital byte C_1 = null in message_1 | * Optional inital byte C_1 = null in message_1 | |||
- New format of error messages, table of error codes, IANA | * New format of error messages, table of error codes, IANA | |||
registry | registry | |||
- Change of recommendation transport of error in CoAP | * Change of recommendation transport of error in CoAP | |||
- Merge of content in 3.7 and appendix C into new section 3.7 | * Merge of content in 3.7 and appendix C into new section 3.7 | |||
"Applicability Statement" | "Applicability Statement" | |||
- Requiring use of deterministic CBOR | * Requiring use of deterministic CBOR | |||
- New section on message deduplication | ||||
- New appendix containin all CDDL definitions | * New section on message deduplication | |||
- New appendix with change log | * New appendix containin all CDDL definitions | |||
- Removed section "Other Documents Referencing EDHOC" | * New appendix with change log | |||
- Clarifications based on review comments | * Removed section "Other Documents Referencing EDHOC" | |||
* Clarifications based on review comments | ||||
* From -04 to -05: | o From -04 to -05: | |||
- EDHOC-Rekey-FS -> EDHOC-KeyUpdate | * EDHOC-Rekey-FS -> EDHOC-KeyUpdate | |||
- Clarification of cipher suite negotiation | * Clarification of cipher suite negotiation | |||
- Updated security considerations | * Updated security considerations | |||
- Updated test vectors | * Updated test vectors | |||
- Updated applicability statement template | * Updated applicability statement template | |||
* From -03 to -04: | o From -03 to -04: | |||
- Restructure of section 1 | * Restructure of section 1 | |||
- Added references to C509 Certificates | * Added references to C509 Certificates | |||
- Change in CIPHERTEXT_2 -> plaintext XOR KEYSTREAM_2 (test | * Change in CIPHERTEXT_2 -> plaintext XOR KEYSTREAM_2 (test | |||
vector not updated) | vector not updated) | |||
- "K_2e", "IV_2e" -> KEYSTREAM_2 | * "K_2e", "IV_2e" -> KEYSTREAM_2 | |||
- Specified optional message 4 | * Specified optional message 4 | |||
- EDHOC-Exporter-FS -> EDHOC-Rekey-FS | * EDHOC-Exporter-FS -> EDHOC-Rekey-FS | |||
- Less constrained devices SHOULD implement both suite 0 and 2 | * Less constrained devices SHOULD implement both suite 0 and 2 | |||
- Clarification of error message | * Clarification of error message | |||
- Added exporter interface test vector | * Added exporter interface test vector | |||
* From -02 to -03: | o From -02 to -03: | |||
- Rearrangements of section 3 and beginning of section 4 | * Rearrangements of section 3 and beginning of section 4 | |||
- Key derivation new section 4 | * Key derivation new section 4 | |||
- Cipher suites 4 and 5 added | * Cipher suites 4 and 5 added | |||
- EDHOC-EXPORTER-FS - generate a new PRK_4x3m from an old one | * EDHOC-EXPORTER-FS - generate a new PRK_4x3m from an old one | |||
- Change in CIPHERTEXT_2 -> COSE_Encrypt0 without tag (no change | * Change in CIPHERTEXT_2 -> COSE_Encrypt0 without tag (no change | |||
to test vector) | to test vector) | |||
- Clarification of error message | * Clarification of error message | |||
- New appendix C applicability statement | * New appendix C applicability statement | |||
* From -01 to -02: | o From -01 to -02: | |||
- New section 1.2 Use of EDHOC | * New section 1.2 Use of EDHOC | |||
- Clarification of identities | * Clarification of identities | |||
- New section 4.3 clarifying bstr_identifier | * New section 4.3 clarifying bstr_identifier | |||
- Updated security considerations | * Updated security considerations | |||
- Updated text on cipher suite negotiation and key confirmation | * Updated text on cipher suite negotiation and key confirmation | |||
- Test vector for static DH | * Test vector for static DH | |||
* From -00 to -01: | o From -00 to -01: | |||
- Removed PSK method | * Removed PSK method | |||
- Removed references to certificate by value | * Removed references to certificate by value | |||
Acknowledgments | Acknowledgments | |||
The authors want to thank Alessandro Bruni, Karthikeyan Bhargavan, | The authors want to thank Christian Amsuess, Alessandro Bruni, | |||
Timothy Claeys, Martin Disch, Theis Groenbech Petersen, Dan Harkins, | Karthikeyan Bhargavan, Timothy Claeys, Martin Disch, Theis Groenbech | |||
Klaus Hartke, Russ Housley, Stefan Hristozov, Alexandros Krontiris, | Petersen, Dan Harkins, Klaus Hartke, Russ Housley, Stefan Hristozov, | |||
Ilari Liusvaara, Karl Norrman, Salvador Perez, Eric Rescorla, Michael | Alexandros Krontiris, Ilari Liusvaara, Karl Norrman, Salvador Perez, | |||
Richardson, Thorvald Sahl Joergensen, Jim Schaad, Carsten Schuermann, | Eric Rescorla, Michael Richardson, Thorvald Sahl Joergensen, Jim | |||
Ludwig Seitz, Stanislav Smyshlyaev, Valery Smyslov, Peter van der | Schaad, Carsten Schuermann, Ludwig Seitz, Stanislav Smyshlyaev, | |||
Stok, Rene Struik, Vaishnavi Sundararajan, Erik Thormarker, Marco | Valery Smyslov, Peter van der Stok, Rene Struik, Vaishnavi | |||
Tiloca, Michel Veillette, and Malisa Vucinic for reviewing and | Sundararajan, Erik Thormarker, Marco Tiloca, Michel Veillette, and | |||
commenting on intermediate versions of the draft. We are especially | Malisa Vucinic for reviewing and commenting on intermediate versions | |||
indebted to Jim Schaad for his continuous reviewing and | of the draft. We are especially indebted to Jim Schaad for his | |||
implementation of different versions of the draft. | continuous reviewing and implementation of different versions of the | |||
draft. | ||||
Work on this document has in part been supported by the H2020 project | Work on this document has in part been supported by the H2020 project | |||
SIFIS-Home (grant agreement 952652). | SIFIS-Home (grant agreement 952652). | |||
Authors' Addresses | Authors' Addresses | |||
Göran Selander | Goeran Selander | |||
Ericsson AB | Ericsson AB | |||
Email: goran.selander@ericsson.com | Email: goran.selander@ericsson.com | |||
John Preuss Mattsson | ||||
John Preuß Mattsson | ||||
Ericsson AB | Ericsson AB | |||
Email: john.mattsson@ericsson.com | Email: john.mattsson@ericsson.com | |||
Francesca Palombini | Francesca Palombini | |||
Ericsson AB | Ericsson AB | |||
Email: francesca.palombini@ericsson.com | Email: francesca.palombini@ericsson.com | |||
End of changes. 456 change blocks. | ||||
1027 lines changed or deleted | 1193 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/ |