| rfc9148.original | rfc9148.txt | |||
|---|---|---|---|---|
| ACE P. van der Stok | Internet Engineering Task Force (IETF) P. van der Stok | |||
| Internet-Draft Consultant | Request for Comments: 9148 Consultant | |||
| Intended status: Standards Track P. Kampanakis | Category: Standards Track P. Kampanakis | |||
| Expires: July 9, 2020 Cisco Systems | ISSN: 2070-1721 Cisco Systems | |||
| M. Richardson | M. Richardson | |||
| SSW | SSW | |||
| S. Raza | S. Raza | |||
| RISE SICS | RISE Research Institutes of Sweden | |||
| January 6, 2020 | March 2022 | |||
| EST over secure CoAP (EST-coaps) | EST-coaps: Enrollment over Secure Transport with the Secure Constrained | |||
| draft-ietf-ace-coap-est-18 | Application Protocol | |||
| Abstract | Abstract | |||
| Enrollment over Secure Transport (EST) is used as a certificate | Enrollment over Secure Transport (EST) is used as a certificate | |||
| provisioning protocol over HTTPS. Low-resource devices often use the | provisioning protocol over HTTPS. Low-resource devices often use the | |||
| lightweight Constrained Application Protocol (CoAP) for message | lightweight Constrained Application Protocol (CoAP) for message | |||
| exchanges. This document defines how to transport EST payloads over | exchanges. This document defines how to transport EST payloads over | |||
| secure CoAP (EST-coaps), which allows constrained devices to use | secure CoAP (EST-coaps), which allows constrained devices to use | |||
| existing EST functionality for provisioning certificates. | existing EST functionality for provisioning certificates. | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
| and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
| time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
| material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on July 9, 2020. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| https://www.rfc-editor.org/info/rfc9148. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2022 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Revised BSD License text as described in Section 4.e of the | |||
| the Trust Legal Provisions and are provided without warranty as | Trust Legal Provisions and are provided without warranty as described | |||
| described in the Simplified BSD License. | in the Revised BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Change Log . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
| 2. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 7 | 2. Terminology | |||
| 3. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 3. DTLS and Conformance to RFC 7925 Profiles | |||
| 4. DTLS and conformance to RFC7925 profiles . . . . . . . . . . 7 | 4. Protocol Design | |||
| 5. Protocol Design . . . . . . . . . . . . . . . . . . . . . . . 10 | 4.1. Discovery and URIs | |||
| 5.1. Discovery and URIs . . . . . . . . . . . . . . . . . . . 10 | 4.2. Mandatory/Optional EST Functions | |||
| 5.2. Mandatory/optional EST Functions . . . . . . . . . . . . 13 | 4.3. Payload Formats | |||
| 5.3. Payload formats . . . . . . . . . . . . . . . . . . . . . 13 | 4.4. Message Bindings | |||
| 5.4. Message Bindings . . . . . . . . . . . . . . . . . . . . 15 | 4.5. CoAP Response Codes | |||
| 5.5. CoAP response codes . . . . . . . . . . . . . . . . . . . 15 | 4.6. Message Fragmentation | |||
| 5.6. Message fragmentation . . . . . . . . . . . . . . . . . . 16 | 4.7. Delayed Responses | |||
| 5.7. Delayed Responses . . . . . . . . . . . . . . . . . . . . 17 | 4.8. Server-Side Key Generation | |||
| 5.8. Server-side Key Generation . . . . . . . . . . . . . . . 19 | 5. HTTPS-CoAPS Registrar | |||
| 6. HTTPS-CoAPS Registrar . . . . . . . . . . . . . . . . . . . . 21 | 6. Parameters | |||
| 7. Parameters . . . . . . . . . . . . . . . . . . . . . . . . . 23 | 7. Deployment Limitations | |||
| 8. Deployment limitations . . . . . . . . . . . . . . . . . . . 23 | 8. IANA Considerations | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 24 | 8.1. Content-Formats Registry | |||
| 9.1. Content-Format Registry . . . . . . . . . . . . . . . . . 24 | 8.2. Resource Type Registry | |||
| 9.2. Resource Type registry . . . . . . . . . . . . . . . . . 24 | 8.3. Well-Known URIs Registry | |||
| 9.3. Well-Known URIs Registry . . . . . . . . . . . . . . . . 25 | 9. Security Considerations | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 25 | 9.1. EST Server Considerations | |||
| 10.1. EST server considerations . . . . . . . . . . . . . . . 25 | 9.2. HTTPS-CoAPS Registrar Considerations | |||
| 10.2. HTTPS-CoAPS Registrar considerations . . . . . . . . . . 27 | 10. References | |||
| 11. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 28 | 10.1. Normative References | |||
| 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 28 | 10.2. Informative References | |||
| 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 28 | Appendix A. EST Messages to EST-coaps | |||
| 13.1. Normative References . . . . . . . . . . . . . . . . . . 28 | A.1. cacerts | |||
| 13.2. Informative References . . . . . . . . . . . . . . . . . 30 | A.2. enroll / reenroll | |||
| Appendix A. EST messages to EST-coaps . . . . . . . . . . . . . 32 | A.3. serverkeygen | |||
| A.1. cacerts . . . . . . . . . . . . . . . . . . . . . . . . . 33 | A.4. csrattrs | |||
| A.2. enroll / reenroll . . . . . . . . . . . . . . . . . . . . 35 | Appendix B. EST-coaps Block Message Examples | |||
| A.3. serverkeygen . . . . . . . . . . . . . . . . . . . . . . 37 | B.1. cacerts | |||
| A.4. csrattrs . . . . . . . . . . . . . . . . . . . . . . . . 39 | B.2. enroll / reenroll | |||
| Appendix B. EST-coaps Block message examples . . . . . . . . . . 40 | Appendix C. Message Content Breakdown | |||
| B.1. cacerts . . . . . . . . . . . . . . . . . . . . . . . . . 40 | C.1. cacerts | |||
| B.2. enroll / reenroll . . . . . . . . . . . . . . . . . . . . 44 | C.2. enroll / reenroll | |||
| Appendix C. Message content breakdown . . . . . . . . . . . . . 45 | C.3. serverkeygen | |||
| C.1. cacerts . . . . . . . . . . . . . . . . . . . . . . . . . 45 | Acknowledgements | |||
| C.2. enroll / reenroll . . . . . . . . . . . . . . . . . . . . 46 | Contributors | |||
| C.3. serverkeygen . . . . . . . . . . . . . . . . . . . . . . 48 | Authors' Addresses | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 50 | ||||
| 1. Change Log | ||||
| EDNOTE: Remove this section before publication | ||||
| -18 | ||||
| IESG Reviews fixes. | ||||
| Removed spurious lines introduced in v-17 due to xml2rfc v3. | ||||
| -17 | ||||
| v16 remnants by Ben K. | ||||
| Typos. | ||||
| -16 | ||||
| Updates to address Yaron S.'s Secdir review. | ||||
| Updates to address David S.'s Gen-ART review. | ||||
| -15 | ||||
| Updates to addressed Ben's AD follow up feedback. | ||||
| -14 | ||||
| Updates to complete Ben's AD review feedback and discussions. | ||||
| -13 | ||||
| Updates based on AD's review and discussions | ||||
| Examples redone without password | ||||
| -12 | ||||
| Updated section 5 based on Esko's comments and nits identified. | ||||
| Nits and some clarifications for Esko's new review from 5/21/2019. | ||||
| Nits and some clarifications for Esko's new review from 5/28/2019. | ||||
| -11 | ||||
| Updated Server-side keygen to simplify motivation and added | ||||
| paragraphs in Security considerations to point out that random | ||||
| numbers are still needed (feedback from Hannes). | ||||
| -10 | ||||
| Addressed WGLC comments | ||||
| More consistent request format in the examples. | ||||
| Explained root resource difference when there is resource | ||||
| discovery | ||||
| Clarified when the client is supposed to do discovery | ||||
| Fixed nits and minor Option length inaccurracies in the examples. | ||||
| -09 | ||||
| WGLC comments taken into account | ||||
| consensus about discovery of content-format | ||||
| added additional path for content-format selection | ||||
| merged DTLS sections | ||||
| -08 | ||||
| added application/pkix-cert Content-Format TBD287. | ||||
| discovery text clarified | ||||
| Removed text on ct negotiation in connection to multipart-core | ||||
| removed text that duplicates or contradicts RFC7252 (thanks Klaus) | ||||
| Stated that well-known/est is compulsory | ||||
| Use of response codes clarified. | ||||
| removed bugs: Max-Age and Content-Format Options in Request | ||||
| Accept Option explained for est/skg and added in enroll example | ||||
| Added second URI /skc for server-side key gen and a simple cert | ||||
| (not PKCS#7) | ||||
| Persistence of DTLS connection clarified. | ||||
| Minor text fixes. | ||||
| -07: | ||||
| redone examples from scratch with openssl | ||||
| Updated authors. | ||||
| Added CoAP RST as a MAY for an equivalent to an HTTP 204 message. | ||||
| Added serialization example of the /skg CBOR response. | ||||
| Added text regarding expired IDevIDs and persistent DTLS | ||||
| connection that will start using the Explicit TA Database in the | ||||
| new DTLS connection. | ||||
| Nits and fixes | ||||
| Removed CBOR envelop for binary data | ||||
| Replaced TBD8 with 62. | ||||
| Added RFC8174 reference and text. | ||||
| Clarified MTI for server-side key generation and Content-Formats. | ||||
| Defined the /skg MTI (PKCS#8) and the cases where CMS encryption | ||||
| will be used. | ||||
| Moved Fragmentation section up because it was referenced in | ||||
| sections above it. | ||||
| -06: | ||||
| clarified discovery section, by specifying that no discovery may | ||||
| be needed for /.well-known/est URI. | ||||
| added resource type values for IANA | ||||
| added list of compulsory to implement and optional functions. | ||||
| Fixed issues pointed out by the idnits tool. | ||||
| Updated CoAP response codes section with more mappings between EST | ||||
| HTTP codes and EST-coaps CoAP codes. | ||||
| Minor updates to the MTI EST Functions section. | ||||
| Moved Change Log section higher. | ||||
| -05: | ||||
| repaired again | ||||
| TBD8 = 62 removed from C-F registration, to be done in CT draft. | ||||
| -04: | ||||
| Updated Delayed response section to reflect short and long delay | ||||
| options. | ||||
| -03: | ||||
| Removed observe and simplified long waits | ||||
| Repaired Content-Format specification | ||||
| -02: | ||||
| Added parameter discussion in section 8 | ||||
| Concluded Content-Format specification using multipart-ct draft | ||||
| examples updated | ||||
| -01: | ||||
| Editorials done. | ||||
| Redefinition of proxy to Registrar in Section 6. Explained better | ||||
| the role of https-coaps Registrar, instead of "proxy" | ||||
| Provide "observe" Option examples | ||||
| extended block message example. | ||||
| inserted new server key generation text in Section 5.8 and | ||||
| motivated server key generation. | ||||
| Broke down details for DTLS 1.3 | ||||
| New Media-Type uses CBOR array for multiple Content-Format | ||||
| payloads | ||||
| provided new Content-Format tables | ||||
| new media format for IANA | ||||
| -00 | ||||
| copied from vanderstok-ace-coap-04 | ||||
| 2. Introduction | 1. Introduction | |||
| "Classical" Enrollment over Secure Transport (EST) [RFC7030] is used | "Classical" Enrollment over Secure Transport (EST) [RFC7030] is used | |||
| for authenticated/authorized endpoint certificate enrollment (and | for authenticated/authorized endpoint certificate enrollment (and | |||
| optionally key provisioning) through a Certificate Authority (CA) or | optionally key provisioning) through a Certification Authority (CA) | |||
| Registration Authority (RA). EST transports messages over HTTPS. | or Registration Authority (RA). EST transports messages over HTTPS. | |||
| This document defines a new transport for EST based on the | This document defines a new transport for EST based on the | |||
| Constrained Application Protocol (CoAP) since some Internet of Things | Constrained Application Protocol (CoAP) since some Internet of Things | |||
| (IoT) devices use CoAP instead of HTTP. Therefore, this | (IoT) devices use CoAP instead of HTTP. Therefore, this | |||
| specification utilizes DTLS [RFC6347] and CoAP [RFC7252] instead of | specification utilizes DTLS [RFC6347] and CoAP [RFC7252] instead of | |||
| TLS [RFC8446] and HTTP [RFC7230]. | TLS [RFC8446] and HTTP [RFC7230]. | |||
| EST responses can be relatively large and for this reason this | EST responses can be relatively large, and for this reason, this | |||
| specification also uses CoAP Block-Wise Transfer [RFC7959] to offer a | specification also uses CoAP Block-Wise Transfer [RFC7959] to offer a | |||
| fragmentation mechanism of EST messages at the CoAP layer. | fragmentation mechanism of EST messages at the CoAP layer. | |||
| This document also profiles the use of EST to only support | This document also profiles the use of EST to support certificate- | |||
| certificate-based client authentication. HTTP Basic or Digest | based client authentication only. Neither HTTP Basic nor Digest | |||
| authentication (as described in Section 3.2.3 of [RFC7030]) are not | authentication (as described in Section 3.2.3 of [RFC7030]) is | |||
| supported. | supported. | |||
| 3. Terminology | 2. Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| Many of the concepts in this document are taken from [RFC7030]. | Many of the concepts in this document are taken from [RFC7030]. | |||
| Consequently, much text is directly traceable to [RFC7030]. | Consequently, much text is directly traceable to [RFC7030]. | |||
| 4. DTLS and conformance to RFC7925 profiles | 3. DTLS and Conformance to RFC 7925 Profiles | |||
| This section describes how EST-coaps conforms to the profiles of low- | This section describes how EST-coaps conforms to the profiles of low- | |||
| resource devices described in [RFC7925]. EST-coaps can transport | resource devices described in [RFC7925]. EST-coaps can transport | |||
| certificates and private keys. Certificates are responses to | certificates and private keys. Certificates are responses to | |||
| (re-)enrollment requests or requests for a trusted certificate list. | (re-)enrollment requests or requests for a trusted certificate list. | |||
| Private keys can be transported as responses to a server-side key | Private keys can be transported as responses to a server-side key | |||
| generation request as described in Section 4.4 of [RFC7030] (and | generation request as described in Section 4.4 of [RFC7030] (and | |||
| subsections) and discussed in Section 5.8 of this document. | subsections) and discussed in Section 4.8 of this document. | |||
| EST-coaps depends on a secure transport mechanism that secures the | EST-coaps depends on a secure transport mechanism that secures the | |||
| exchanged CoAP messages. DTLS is one such secure protocol. No other | exchanged CoAP messages. DTLS is one such secure protocol. No other | |||
| changes are necessary regarding the secure transport of EST messages. | changes are necessary regarding the secure transport of EST messages. | |||
| +------------------------------------------------+ | +------------------------------------------------+ | |||
| | EST request/response messages | | | EST request/response messages | | |||
| +------------------------------------------------+ | +------------------------------------------------+ | |||
| | CoAP for message transfer and signaling | | | CoAP for message transfer and signaling | | |||
| +------------------------------------------------+ | +------------------------------------------------+ | |||
| | Secure Transport | | | Secure Transport | | |||
| +------------------------------------------------+ | +------------------------------------------------+ | |||
| Figure 1: EST-coaps protocol layers | Figure 1: EST-coaps Protocol Layers | |||
| In accordance with sections 3.3 and 4.4 of [RFC7925], the mandatory | In accordance with Sections 3.3 and 4.4 of [RFC7925], the mandatory | |||
| cipher suite for DTLS in EST-coaps is | cipher suite for DTLS in EST-coaps is | |||
| TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 [RFC7251]. Curve secp256r1 MUST | TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 [RFC7251]. Curve secp256r1 MUST | |||
| be supported [RFC8422]; this curve is equivalent to the NIST P-256 | be supported [RFC8422]; this curve is equivalent to the NIST P-256 | |||
| curve. After the publication of [RFC7748], support for Curve25519 | curve. After the publication of [RFC7748], support for Curve25519 | |||
| will likely be required in the future by (D)TLS Profiles for the | will likely be required in the future by (D)TLS profiles for the | |||
| Internet of Things [RFC7925]. | Internet of Things [RFC7925]. | |||
| DTLS 1.2 implementations must use the Supported Elliptic Curves and | DTLS 1.2 implementations must use the Supported Elliptic Curves and | |||
| Supported Point Formats Extensions in [RFC8422]. Uncompressed point | Supported Point Formats Extensions in [RFC8422]. Uncompressed point | |||
| format must also be supported. DTLS 1.3 [I-D.ietf-tls-dtls13] | format must also be supported. DTLS 1.3 [RFC9147] implementations | |||
| implementations differ from DTLS 1.2 because they do not support | differ from DTLS 1.2 because they do not support point format | |||
| point format negotiation in favor of a single point format for each | negotiation in favor of a single point format for each curve. Thus, | |||
| curve. Thus, support for DTLS 1.3 does not mandate point format | support for DTLS 1.3 does not mandate point format extensions and | |||
| extensions and negotiation. In addition, in DTLS 1.3 the Supported | negotiation. In addition, in DTLS 1.3, the Supported Elliptic Curves | |||
| Elliptic Curves extension has been renamed to Supported Groups. | extension has been renamed to Supported Groups. | |||
| CoAP was designed to avoid IP fragmentation. DTLS is used to secure | CoAP was designed to avoid IP fragmentation. DTLS is used to secure | |||
| CoAP messages. However, fragmentation is still possible at the DTLS | CoAP messages. However, fragmentation is still possible at the DTLS | |||
| layer during the DTLS handshake when using ECC ciphersuites. If | layer during the DTLS handshake even when using Elliptic Curve | |||
| fragmentation is necessary, "DTLS provides a mechanism for | Cryptography (ECC) cipher suites. If fragmentation is necessary, | |||
| fragmenting a handshake message over several records, each of which | "DTLS provides a mechanism for fragmenting a handshake message over a | |||
| can be transmitted separately, thus avoiding IP fragmentation" | number of records, each of which can be transmitted separately, thus | |||
| [RFC6347]. | avoiding IP fragmentation" [RFC6347]. | |||
| The authentication of the EST-coaps server by the EST-coaps client is | The authentication of the EST-coaps server by the EST-coaps client is | |||
| based on certificate authentication in the DTLS handshake. The EST- | based on certificate authentication in the DTLS handshake. The EST- | |||
| coaps client MUST be configured with at least an Implicit TA database | coaps client MUST be configured with at least an Implicit Trust | |||
| which will enable the authentication of the server the first time | Anchor database, which will enable the authentication of the server | |||
| before updating its trust anchor (Explicit TA) [RFC7030]. | the first time before updating its trust anchor (Explicit TA) | |||
| [RFC7030]. | ||||
| The authentication of the EST-coaps client MUST be with a client | The authentication of the EST-coaps client MUST be with a client | |||
| certificate in the DTLS handshake. This can either be | certificate in the DTLS handshake. This can either be: | |||
| o a previously issued client certificate (e.g., an existing | ||||
| * A previously issued client certificate (e.g., an existing | ||||
| certificate issued by the EST CA); this could be a common case for | certificate issued by the EST CA); this could be a common case for | |||
| simple re-enrollment of clients. | simple re-enrollment of clients. | |||
| o a previously installed certificate (e.g., manufacturer IDevID | * A previously installed certificate (e.g., manufacturer IDevID | |||
| [ieee802.1ar] or a certificate issued by some other party). | [IEEE802.1AR] or a certificate issued by some other party). | |||
| IDevID's are expected to have a very long life, as long as the | IDevID's are expected to have a very long life, as long as the | |||
| device, but under some conditions could expire. In that case, the | device, but under some conditions could expire. In that case, the | |||
| server MAY authenticate a client certificate against its trust | server MAY authenticate a client certificate against its trust | |||
| store although the certificate is expired (Section 10). | store though the certificate is expired (Section 9). | |||
| EST-coaps supports the certificate types and Trust Anchors (TA) that | EST-coaps supports the certificate types and TAs that are specified | |||
| are specified for EST in Section 3 of [RFC7030]. | for EST in Section 3 of [RFC7030]. | |||
| As described in Section 2.1 of [RFC5272] proof-of-identity refers to | As described in Section 2.1 of [RFC5272], proof-of-identity refers to | |||
| a value that can be used to prove that an end-entity or client is in | a value that can be used to prove that an end entity or client is in | |||
| the possession of and can use the private key corresponding to the | the possession of and can use the private key corresponding to the | |||
| certified public key. Additionally, channel-binding information can | certified public key. Additionally, channel-binding information can | |||
| link proof-of-identity with an established connection. Connection- | link proof-of-identity with an established connection. Connection- | |||
| based proof-of-possession is OPTIONAL for EST-coaps clients and | based proof-of-possession is OPTIONAL for EST-coaps clients and | |||
| servers. When proof-of-possession is desired, a set of actions are | servers. When proof-of-possession is desired, a set of actions are | |||
| required regarding the use of tls-unique, described in Section 3.5 in | required regarding the use of tls-unique, described in Section 3.5 of | |||
| [RFC7030]. The tls-unique information consists of the contents of | [RFC7030]. The tls-unique information consists of the contents of | |||
| the first "Finished" message in the (D)TLS handshake between server | the first Finished message in the (D)TLS handshake between server and | |||
| and client [RFC5929]. The client adds the "Finished" message as a | client [RFC5929]. The client adds the Finished message as a | |||
| ChallengePassword in the attributes section of the PKCS#10 Request | challengePassword in the attributes section of the PKCS #10 | |||
| [RFC5967] to prove that the client is indeed in control of the | CertificationRequest [RFC5967] to prove that the client is indeed in | |||
| private key at the time of the (D)TLS session establishment. | control of the private key at the time of the (D)TLS session | |||
| establishment. In the case of handshake message fragmentation, if | ||||
| proof-of-possession is desired, the Finished message added as the | ||||
| challengePassword in the Certificate Signing Request (CSR) is | ||||
| calculated as specified by (D)TLS. We summarize it here for | ||||
| convenience. For DTLS 1.2, in the event of handshake message | ||||
| fragmentation, the hash of the handshake messages used in the Message | ||||
| Authentication Code (MAC) calculation of the Finished message must be | ||||
| computed on each reassembled message, as if each message had not been | ||||
| fragmented (Section 4.2.6 of [RFC6347]). The Finished message is | ||||
| calculated as shown in Section 7.4.9 of [RFC5246]. | ||||
| In the case of handshake message fragmentation, if proof-of- | For (D)TLS 1.3, Appendix C.5 of [RFC8446] describes the lack of | |||
| possession is desired, the Finished message added as the | channel bindings similar to tls-unique. [TLS13-CHANNEL-BINDINGS] can | |||
| ChallengePassword in the CSR is calculated as specified by the DTLS | be used instead to derive a 32-byte tls-exporter binding from the | |||
| standards. We summarize it here for convenience. For DTLS 1.2, in | (D)TLS 1.3 master secret by using a PRF negotiated in the (D)TLS 1.3 | |||
| the event of handshake message fragmentation, the Hash of the | handshake, "EXPORTER-Channel-Binding" with no terminating NUL as the | |||
| handshake messages used in the MAC calculation of the Finished | label, the ClientHello.random and ServerHello.random, and a zero- | |||
| message must be computed on each reassembled message, as if each | length context string. When proof-of-possession is desired, the | |||
| message had not been fragmented (Section 4.2.6 of [RFC6347]). The | client adds the tls-exporter value as a challengePassword in the | |||
| Finished message is calculated as shown in Section 7.4.9 of | attributes section of the PKCS #10 CertificationRequest [RFC5967] to | |||
| [RFC5246]. Similarly, for DTLS 1.3, the Finished message must be | prove that the client is indeed in control of the private key at the | |||
| computed as if each handshake message had been sent as a single | time of the (D)TLS session establishment. | |||
| fragment (Section 5.8 of [I-D.ietf-tls-dtls13]) following the | ||||
| algorithm described in 4.4.4 of [RFC8446]. | ||||
| In a constrained CoAP environment, endpoints can't always afford to | In a constrained CoAP environment, endpoints can't always afford to | |||
| establish a DTLS connection for every EST transaction. An EST-coaps | establish a DTLS connection for every EST transaction. An EST-coaps | |||
| DTLS connection MAY remain open for sequential EST transactions, | DTLS connection MAY remain open for sequential EST transactions, | |||
| which was not the case with [RFC7030]. For example, if a /crts | which was not the case with [RFC7030]. For example, if a /crts | |||
| request is followed by a /sen request, both can use the same | request is followed by a /sen request, both can use the same | |||
| authenticated DTLS connection. However, when a /crts request is | authenticated DTLS connection. However, when a /crts request is | |||
| included in the set of sequential EST transactions, some additional | included in the set of sequential EST transactions, some additional | |||
| security considerations apply regarding the use of the Implicit and | security considerations apply regarding the use of the Implicit and | |||
| Explicit TA database as explained in Section 10.1. | Explicit TA database as explained in Section 9.1. | |||
| Given that after a successful enrollment, it is more likely that a | Given that after a successful enrollment, it is more likely that a | |||
| new EST transaction will not take place for a significant amount of | new EST transaction will not take place for a significant amount of | |||
| time, the DTLS connections SHOULD only be kept alive for EST messages | time, the DTLS connections SHOULD only be kept alive for EST messages | |||
| that are relatively close to each other. These could include a /sen | that are relatively close to each other. These could include a /sen | |||
| immediatelly following a /crts when a device is getting bootstrapped. | immediately following a /crts when a device is getting bootstrapped. | |||
| In some cases, like NAT rebinding, keeping the state of a connection | In some cases, like NAT rebinding, keeping the state of a connection | |||
| is not possible when devices sleep for extended periods of time. In | is not possible when devices sleep for extended periods of time. In | |||
| such occasions, [I-D.ietf-tls-dtls-connection-id] negotiates a | such occasions, [RFC9146] negotiates a connection ID that can | |||
| connection ID that can eliminate the need for new handshake and its | eliminate the need for a new handshake and its additional cost; or, | |||
| additional cost; or DTLS session resumption provides a less costly | DTLS session resumption provides a less costly alternative than | |||
| alternative than re-doing a full DTLS handshake. | redoing a full DTLS handshake. | |||
| 5. Protocol Design | 4. Protocol Design | |||
| EST-coaps uses CoAP to transfer EST messages, aided by Block-Wise | EST-coaps uses CoAP to transfer EST messages, aided by Block-Wise | |||
| Transfer [RFC7959] to avoid IP fragmentation. The use of Blocks for | Transfer [RFC7959], to avoid IP fragmentation. The use of blocks for | |||
| the transfer of larger EST messages is specified in Section 5.6. | the transfer of larger EST messages is specified in Section 4.6. | |||
| Figure 1 shows the layered EST-coaps architecture. | Figure 1 shows the layered EST-coaps architecture. | |||
| The EST-coaps protocol design follows closely the EST design. The | The EST-coaps protocol design follows closely the EST design. The | |||
| supported message types in EST-coaps are: | supported message types in EST-coaps are: | |||
| o CA certificate retrieval needed to receive the complete set of CA | * CA certificate retrieval needed to receive the complete set of CA | |||
| certificates. | certificates. | |||
| o Simple enroll and re-enroll for a CA to sign client identity | * Simple enroll and re-enroll for a CA to sign client identity | |||
| public key. | public keys. | |||
| o Certificate Signing Request (CSR) attribute messages that informs | * Certificate Signing Request (CSR) attribute messages that informs | |||
| the client of the fields to include in a CSR. | the client of the fields to include in a CSR. | |||
| o Server-side key generation messages to provide a client identity | * Server-side key generation messages to provide a client identity | |||
| private key when the client chooses so. | private key when the client chooses so. | |||
| While [RFC7030] permits a number of the EST functions to be used | While [RFC7030] permits a number of the EST functions to be used | |||
| without authentication, this specification requires that the client | without authentication, this specification requires that the client | |||
| MUST be authenticated for all functions. | MUST be authenticated for all functions. | |||
| 5.1. Discovery and URIs | 4.1. Discovery and URIs | |||
| EST-coaps is targeted for low-resource networks with small packets. | EST-coaps is targeted for low-resource networks with small packets. | |||
| Two types of installations are possible: (1) rigid ones, where the | Two types of installations are possible: (1) a rigid one, where the | |||
| address and the supported functions of the EST server(s) are known, | address and the supported functions of the EST server(s) are known, | |||
| and (2) a flexible one, where the EST server and its supported | and (2) a flexible one, where the EST server and its supported | |||
| functions need to be discovered. | functions need to be discovered. | |||
| For both types of installations, saving header space is important and | For both types of installations, saving header space is important and | |||
| short EST-coaps URIs are specified in this document. These URIs are | short EST-coaps URIs are specified in this document. These URIs are | |||
| shorter than the ones in [RFC7030]. Two example EST-coaps resource | shorter than the ones in [RFC7030]. Two example EST-coaps resource | |||
| path names are: | path names are: | |||
| coaps://example.com:<port>/.well-known/est/<short-est> | coaps://example.com:<port>/.well-known/est/<short-est> | |||
| skipping to change at page 11, line 27 ¶ | skipping to change at line 315 ¶ | |||
| to the appropriate certificate profile. Implementers should consider | to the appropriate certificate profile. Implementers should consider | |||
| using short labels to minimize transmission overhead. | using short labels to minimize transmission overhead. | |||
| The EST-coaps server URIs, obtained through discovery of the EST- | The EST-coaps server URIs, obtained through discovery of the EST- | |||
| coaps resource(s) as shown below, are of the form: | coaps resource(s) as shown below, are of the form: | |||
| coaps://example.com:<port>/<root-resource>/<short-est> | coaps://example.com:<port>/<root-resource>/<short-est> | |||
| coaps://example.com:<port>/<root-resource>/ArbitraryLabel/<short-est> | coaps://example.com:<port>/<root-resource>/ArbitraryLabel/<short-est> | |||
| Figure 5 in Section 3.2.2 of [RFC7030] enumerates the operations and | Figure 5 in Section 3.2.2 of [RFC7030] enumerates the operations and | |||
| corresponding paths which are supported by EST. Table 1 provides the | corresponding paths that are supported by EST. Table 1 provides the | |||
| mapping from the EST URI path to the shorter EST-coaps URI path. | mapping from the EST URI path to the shorter EST-coaps URI path. | |||
| +-------------------+-------------------------------+ | +=================+==============================+ | |||
| | EST | EST-coaps | | | EST | EST-coaps | | |||
| +-------------------+-------------------------------+ | +=================+==============================+ | |||
| | /cacerts | /crts | | | /cacerts | /crts | | |||
| | /simpleenroll | /sen | | +-----------------+------------------------------+ | |||
| | /simplereenroll | /sren | | | /simpleenroll | /sen | | |||
| | /serverkeygen | /skg (PKCS#7) | | +-----------------+------------------------------+ | |||
| | /serverkeygen | /skc (application/pkix-cert) | | | /simplereenroll | /sren | | |||
| | /csrattrs | /att | | +-----------------+------------------------------+ | |||
| +-------------------+-------------------------------+ | | /serverkeygen | /skg (PKCS #7) | | |||
| +-----------------+------------------------------+ | ||||
| | /serverkeygen | /skc (application/pkix-cert) | | ||||
| +-----------------+------------------------------+ | ||||
| | /csrattrs | /att | | ||||
| +-----------------+------------------------------+ | ||||
| Table 1: Short EST-coaps URI path | Table 1: Short EST-coaps URI Path | |||
| The /skg message is the EST /serverkeygen equivalent where the client | The /skg message is the EST /serverkeygen equivalent where the client | |||
| requests a certificate in PKCS#7 format and a private key. If the | requests a certificate in PKCS #7 format and a private key. If the | |||
| client prefers a single application/pkix-cert certificate instead of | client prefers a single application/pkix-cert certificate instead of | |||
| PKCS#7, it will make an /skc request. In both cases (i.e., /skg, | PKCS #7, it will make an /skc request. In both cases (i.e., /skg, | |||
| /skc) a private key MUST be returned. | /skc), a private key MUST be returned. | |||
| Clients and servers MUST support the short resource EST-coaps URIs. | Clients and servers MUST support the short resource EST-coaps URIs. | |||
| In the context of CoAP, the presence and location of (path to) the | In the context of CoAP, the presence and location of (path to) the | |||
| EST resources are discovered by sending a GET request to "/.well- | EST resources are discovered by sending a GET request to "/.well- | |||
| known/core" including a resource type (RT) parameter with the value | known/core" including a resource type (RT) parameter with the value | |||
| "ace.est*" [RFC6690]. The example below shows the discovery over | "ace.est*" [RFC6690]. The example below shows the discovery over | |||
| CoAPS of the presence and location of EST-coaps resources. Linefeeds | CoAPS of the presence and location of EST-coaps resources. Linefeeds | |||
| are included only for readability. | are included only for readability. | |||
| REQ: GET /.well-known/core?rt=ace.est* | REQ: GET /.well-known/core?rt=ace.est* | |||
| RES: 2.05 Content | RES: 2.05 Content | |||
| </est/crts>;rt="ace.est.crts";ct="281 TBD287", | </est/crts>;rt="ace.est.crts";ct="281 287", | |||
| </est/sen>;rt="ace.est.sen";ct="281 TBD287", | </est/sen>;rt="ace.est.sen";ct="281 287", | |||
| </est/sren>;rt="ace.est.sren";ct="281 TBD287", | </est/sren>;rt="ace.est.sren";ct="281 287", | |||
| </est/att>;rt="ace.est.att";ct=285, | </est/att>;rt="ace.est.att";ct=285, | |||
| </est/skg>;rt="ace.est.skg";ct=62, | </est/skg>;rt="ace.est.skg";ct=62, | |||
| </est/skc>;rt="ace.est.skc";ct=62 | </est/skc>;rt="ace.est.skc";ct=62 | |||
| The first three lines, describing ace.est.crts, ace.est.sen, and | The first three lines, describing ace.est.crts, ace.est.sen, and | |||
| ace.est.sren, of the discovery response above MUST be returned if the | ace.est.sren, of the discovery response above MUST be returned if the | |||
| server supports resource discovery. The last three lines are only | server supports resource discovery. The last three lines are only | |||
| included if the corresponding EST functions are implemented (see | included if the corresponding EST functions are implemented (see | |||
| Table 2). The Content-Formats in the response allow the client to | Table 2). The Content-Formats in the response allow the client to | |||
| request one that is supported by the server. These are the values | request one that is supported by the server. These are the values | |||
| that would be sent in the client request with an Accept option. | that would be sent in the client request with an Accept Option. | |||
| Discoverable port numbers can be returned in the response payload. | Discoverable port numbers can be returned in the response payload. | |||
| An example response payload for non-default CoAPS server port 61617 | An example response payload for non-default CoAPS server port 61617 | |||
| follows below. Linefeeds are included only for readability. | follows below. Linefeeds are included only for readability. | |||
| REQ: GET /.well-known/core?rt=ace.est* | REQ: GET /.well-known/core?rt=ace.est* | |||
| RES: 2.05 Content | RES: 2.05 Content | |||
| <coaps://[2001:db8:3::123]:61617/est/crts>;rt="ace.est.crts"; | <coaps://[2001:db8:3::123]:61617/est/crts>;rt="ace.est.crts"; | |||
| ct="281 TBD287", | ct="281 287", | |||
| <coaps://[2001:db8:3::123]:61617/est/sen>;rt="ace.est.sen"; | <coaps://[2001:db8:3::123]:61617/est/sen>;rt="ace.est.sen"; | |||
| ct="281 TBD287", | ct="281 287", | |||
| <coaps://[2001:db8:3::123]:61617/est/sren>;rt="ace.est.sren"; | <coaps://[2001:db8:3::123]:61617/est/sren>;rt="ace.est.sren"; | |||
| ct="281 TBD287", | ct="281 287", | |||
| <coaps://[2001:db8:3::123]:61617/est/att>;rt="ace.est.att"; | <coaps://[2001:db8:3::123]:61617/est/att>;rt="ace.est.att"; | |||
| ct=285, | ct=285, | |||
| <coaps://[2001:db8:3::123]:61617/est/skg>;rt="ace.est.skg"; | <coaps://[2001:db8:3::123]:61617/est/skg>;rt="ace.est.skg"; | |||
| ct=62, | ct=62, | |||
| <coaps://[2001:db8:3::123]:61617/est/skc>;rt="ace.est.skc"; | <coaps://[2001:db8:3::123]:61617/est/skc>;rt="ace.est.skc"; | |||
| ct=62 | ct=62 | |||
| The server MUST support the default /.well-known/est root resource. | The server MUST support the default /.well-known/est root resource. | |||
| The server SHOULD support resource discovery when it supports non- | The server SHOULD support resource discovery when it supports non- | |||
| default URIs (like /est or /est/ArbitraryLabel) or ports. The client | default URIs (like /est or /est/ArbitraryLabel) or ports. The client | |||
| SHOULD use resource discovery when it is unaware of the available | SHOULD use resource discovery when it is unaware of the available | |||
| EST-coaps resources. | EST-coaps resources. | |||
| Throughout this document the example root resource of /est is used. | Throughout this document, the example root resource of /est is used. | |||
| 5.2. Mandatory/optional EST Functions | 4.2. Mandatory/Optional EST Functions | |||
| This specification contains a set of required-to-implement functions, | This specification contains a set of required-to-implement functions, | |||
| optional functions, and not specified functions. The unspecified | optional functions, and not-specified functions. The unspecified | |||
| functions are deemed too expensive for low-resource devices in | functions are deemed too expensive for low-resource devices in | |||
| payload and calculation times. | payload and calculation times. | |||
| Table 2 specifies the mandatory-to-implement or optional | Table 2 specifies the mandatory-to-implement or optional | |||
| implementation of the EST-coaps functions. Discovery of the | implementation of the EST-coaps functions. Discovery of the | |||
| existence of optional functions is described in Section 5.1. | existence of optional functions is described in Section 4.1. | |||
| +-------------------+--------------------------+ | +=================+==========================+ | |||
| | EST Functions | EST-coaps implementation | | | EST Functions | EST-coaps Implementation | | |||
| +-------------------+--------------------------+ | +=================+==========================+ | |||
| | /cacerts | MUST | | | /cacerts | MUST | | |||
| | /simpleenroll | MUST | | +-----------------+--------------------------+ | |||
| | /simplereenroll | MUST | | | /simpleenroll | MUST | | |||
| | /fullcmc | Not specified | | +-----------------+--------------------------+ | |||
| | /serverkeygen | OPTIONAL | | | /simplereenroll | MUST | | |||
| | /csrattrs | OPTIONAL | | +-----------------+--------------------------+ | |||
| +-------------------+--------------------------+ | | /fullcmc | Not specified | | |||
| +-----------------+--------------------------+ | ||||
| | /serverkeygen | OPTIONAL | | ||||
| +-----------------+--------------------------+ | ||||
| | /csrattrs | OPTIONAL | | ||||
| +-----------------+--------------------------+ | ||||
| Table 2: List of EST-coaps functions | Table 2: List of EST-coaps Functions | |||
| 5.3. Payload formats | 4.3. Payload Formats | |||
| EST-coaps is designed for low-resource devices and hence does not | EST-coaps is designed for low-resource devices; hence, it does not | |||
| need to send Base64-encoded data. Simple binary is more efficient | need to send Base64-encoded data. Simple binary is more efficient | |||
| (30% smaller payload for DER-encoded ASN.1) and well supported by | (30% smaller payload for DER-encoded ASN.1) and well supported by | |||
| CoAP. Thus, the payload for a given Media-Type follows the ASN.1 | CoAP. Thus, the payload for a given media type follows the ASN.1 | |||
| structure of the Media-Type and is transported in binary format. | structure of the media type and is transported in binary format. | |||
| The Content-Format (HTTP Content-Type equivalent) of the CoAP message | The Content-Format (HTTP Content-Type equivalent) of the CoAP message | |||
| determines which EST message is transported in the CoAP payload. The | determines which EST message is transported in the CoAP payload. The | |||
| Media-Types specified in the HTTP Content-Type header field | media types specified in the HTTP Content-Type header field | |||
| (Section 3.2.2 of [RFC7030]) are specified by the Content-Format | (Section 3.2.4 of [RFC7030]) are specified by the Content-Format | |||
| Option (12) of CoAP. The combination of URI-Path and Content-Format | Option (12) of CoAP. The combination of URI-Path and Content-Format | |||
| in EST-coaps MUST map to an allowed combination of URI and Media-Type | in EST-coaps MUST map to an allowed combination of URI and media type | |||
| in EST. The required Content-Formats for these requests and response | in EST. The required Content-Formats for these requests and response | |||
| messages are defined in Section 9.1. The CoAP response codes are | messages are defined in Section 8.1. The CoAP response codes are | |||
| defined in Section 5.5. | defined in Section 4.5. | |||
| Content-Format TBD287 can be used in place of 281 to carry a single | Content-Format 287 can be used in place of 281 to carry a single | |||
| certificate instead of a PKCS#7 container in a /crts, /sen, /sren or | certificate instead of a PKCS #7 container in a /crts, /sen, /sren, | |||
| /skg response. Content-Format 281 MUST be supported by EST-coaps | or /skg response. Content-Format 281 MUST be supported by EST-coaps | |||
| servers. Servers MAY also support Content-Format TBD287. It is up | servers. Servers MAY also support Content-Format 287. It is up to | |||
| to the client to support only Content-Format 281, TBD287 or both. | the client to support only Content-Format 281, 287 or both. The | |||
| The client will use a COAP Accept Option in the request to express | client will use a CoAP Accept Option in the request to express the | |||
| the preferred response Content-Format. If an Accept Option is not | preferred response Content-Format. If an Accept Option is not | |||
| included in the request, the client is not expressing any preference | included in the request, the client is not expressing any preference | |||
| and the server SHOULD choose format 281. | and the server SHOULD choose format 281. | |||
| Content-Format 286 is used in /sen, /sren and /skg requests and 285 | Content-Format 286 is used in /sen, /sren, and /skg requests and 285 | |||
| in /att responses. | in /att responses. | |||
| A representation with Content-Format identifier 62 contains a | A representation with Content-Format identifier 62 contains a | |||
| collection of representations along with their respective Content- | collection of representations along with their respective Content- | |||
| Format. The Content-Format identifies the Media-Type application/ | Format. The Content-Format identifies the media type application/ | |||
| multipart-core specified in [I-D.ietf-core-multipart-ct]. For | multipart-core specified in [RFC8710]. For example, a collection, | |||
| example, a collection, containing two representations in response to | containing two representations in response to an EST-coaps server- | |||
| a EST-coaps server-side key generation /skg request, could include a | side key generation /skg request, could include a private key in PKCS | |||
| private key in PKCS#8 [RFC5958] with Content-Format identifier 284 | #8 [RFC5958] with Content-Format identifier 284 (0x011C) and a single | |||
| (0x011C) and a single certificate in a PKCS#7 container with Content- | certificate in a PKCS #7 container with Content-Format identifier 281 | |||
| Format identifier 281 (0x0119). Such a collection would look like | (0x0119). Such a collection would look like | |||
| [284,h'0123456789abcdef', 281,h'fedcba9876543210'] in diagnostic CBOR | [284,h'0123456789abcdef', 281,h'fedcba9876543210'] in diagnostic | |||
| notation. The serialization of such CBOR content would be | Concise Binary Object Representation (CBOR) notation. The | |||
| serialization of such CBOR content would be: | ||||
| 84 # array(4) | 84 # array(4) | |||
| 19 011C # unsigned(284) | 19 011C # unsigned(284) | |||
| 48 # bytes(8) | 48 # bytes(8) | |||
| 0123456789ABCDEF # "\x01#Eg\x89\xAB\xCD\xEF" | 0123456789ABCDEF # "\x01#Eg\x89\xAB\xCD\xEF" | |||
| 19 0119 # unsigned(281) | 19 0119 # unsigned(281) | |||
| 48 # bytes(8) | 48 # bytes(8) | |||
| FEDCBA9876543210 # "\xFE\xDC\xBA\x98vT2\x10" | FEDCBA9876543210 # "\xFE\xDC\xBA\x98vT2\x10" | |||
| Multipart /skg response serialization | Figure 2: Multipart /skg Response Serialization | |||
| When the client makes an /skc request the certificate returned with | When the client makes an /skc request, the certificate returned with | |||
| the private key is a single X.509 certificate (not a PKCS#7 | the private key is a single X.509 certificate (not a PKCS #7 | |||
| container) with Content-Format identifier TBD287 (0x011F) instead of | container) with Content-Format identifier 287 (0x011F) instead of | |||
| 281. In cases where the private key is encrypted with CMS (as | 281. In cases where the private key is encrypted with Cryptographic | |||
| explained in Section 5.8) the Content-Format identifier is 280 | Message Syntax (CMS) (as explained in Section 4.8), the Content- | |||
| (0x0118) instead of 284. The content format used in the response is | Format identifier is 280 (0x0118) instead of 284. The Content-Format | |||
| summarized in Table 3. | used in the response is summarized in Table 3. | |||
| +----------+-----------------+-----------------+ | +==========+==================+==================+ | |||
| | Function | Response part 1 | Response part 2 | | | Function | Response, Part 1 | Response, Part 2 | | |||
| +----------+-----------------+-----------------+ | +==========+==================+==================+ | |||
| | /skg | 284 | 281 | | | /skg | 284 | 281 | | |||
| | /skc | 280 | TBD287 | | +----------+------------------+------------------+ | |||
| +----------+-----------------+-----------------+ | | /skc | 280 | 287 | | |||
| +----------+------------------+------------------+ | ||||
| Table 3: response content formats for skg and skc | Table 3: Response Content-Formats for /skg and | |||
| /skc | ||||
| The key and certificate representations are DER-encoded ASN.1, in its | The key and certificate representations are DER-encoded ASN.1, in its | |||
| native binary form. An example is shown in Appendix A.3. | binary form. An example is shown in Appendix A.3. | |||
| 5.4. Message Bindings | 4.4. Message Bindings | |||
| The general EST-coaps message characteristics are: | The general EST-coaps message characteristics are: | |||
| o EST-coaps servers sometimes need to provide delayed responses | * EST-coaps servers sometimes need to provide delayed responses, | |||
| which are preceded by an immediately returned empty ACK or an ACK | which are preceded by an immediately returned empty ACK or an ACK | |||
| containing response code 5.03 as explained in Section 5.7. Thus, | containing response code 5.03 as explained in Section 4.7. Thus, | |||
| it is RECOMMENDED for implementers to send EST-coaps requests in | it is RECOMMENDED for implementers to send EST-coaps requests in | |||
| confirmable CON CoAP messages. | Confirmable (CON) CoAP messages. | |||
| o The CoAP Options used are Uri-Host, Uri-Path, Uri-Port, Content- | * The CoAP Options used are Uri-Host, Uri-Path, Uri-Port, Content- | |||
| Format, Block1, Block2, and Accept. These CoAP Options are used | Format, Block1, Block2, and Accept. These CoAP Options are used | |||
| to communicate the HTTP fields specified in the EST REST messages. | to communicate the HTTP fields specified in the EST REST messages. | |||
| The Uri-host and Uri-Port Options can be omitted from the COAP | The Uri-host and Uri-Port Options can be omitted from the CoAP | |||
| message sent on the wire. When omitted, they are logically | message sent on the wire. When omitted, they are logically | |||
| assumed to be the transport protocol destination address and port | assumed to be the transport protocol destination address and port, | |||
| respectively. Explicit Uri-Host and Uri-Port Options are | respectively. Explicit Uri-Host and Uri-Port Options are | |||
| typically used when an endpoint hosts multiple virtual servers and | typically used when an endpoint hosts multiple virtual servers and | |||
| uses the Options to route the requests accordingly. Other COAP | uses the Options to route the requests accordingly. Other CoAP | |||
| Options should be handled in accordance with [RFC7252]. | Options should be handled in accordance with [RFC7252]. | |||
| o EST URLs are HTTPS based (https://), in CoAP these are assumed to | * EST URLs are HTTPS based (https://); in CoAP, these are assumed to | |||
| be translated to CoAPS (coaps://) | be translated to CoAPS (coaps://). | |||
| Table 1 provides the mapping from the EST URI path to the EST-coaps | Table 1 provides the mapping from the EST URI path to the EST-coaps | |||
| URI path. Appendix A includes some practical examples of EST | URI path. Appendix A includes some practical examples of EST | |||
| messages translated to CoAP. | messages translated to CoAP. | |||
| 5.5. CoAP response codes | 4.5. CoAP Response Codes | |||
| Section 5.9 of [RFC7252] and Section 7 of [RFC8075] specify the | Section 5.9 of [RFC7252] and Section 7 of [RFC8075] specify the | |||
| mapping of HTTP response codes to CoAP response codes. The success | mapping of HTTP response codes to CoAP response codes. The success | |||
| code in response to an EST-coaps GET request (/crts, /att), is 2.05. | code in response to an EST-coaps GET request (/crts, /att) is 2.05. | |||
| Similarly, 2.04 is used in successful response to EST-coaps POST | Similarly, 2.04 is used in successful response to EST-coaps POST | |||
| requests (/sen, /sren, /skg, /skc). | requests (/sen, /sren, /skg, /skc). | |||
| EST makes use of HTTP 204 or 404 responses when a resource is not | EST makes use of HTTP 204 or 404 responses when a resource is not | |||
| available for the client. In EST-coaps 2.04 is used in response to a | available for the client. In EST-coaps, 2.04 is used in response to | |||
| POST (/sen, /sren, /skg, /skc). 4.04 is used when the resource is not | a POST (/sen, /sren, /skg, /skc). 4.04 is used when the resource is | |||
| available for the client. | not available for the client. | |||
| HTTP response code 202 with a Retry-After header field in [RFC7030] | HTTP response code 202 with a Retry-After header field in [RFC7030] | |||
| has no equivalent in CoAP. HTTP 202 with Retry-After is used in EST | has no equivalent in CoAP. HTTP 202 with Retry-After is used in EST | |||
| for delayed server responses. Section 5.7 specifies how EST-coaps | for delayed server responses. Section 4.7 specifies how EST-coaps | |||
| handles delayed messages with 5.03 responses with a Max-Age Option. | handles delayed messages with 5.03 responses with a Max-Age Option. | |||
| Additionally, EST's HTTP 400, 401, 403, 404 and 503 status codes have | Additionally, EST's HTTP 400, 401, 403, 404, and 503 status codes | |||
| their equivalent CoAP 4.00, 4.01, 4.03, 4.04 and 5.03 response codes | have their equivalent CoAP 4.00, 4.01, 4.03, 4.04, and 5.03 response | |||
| in EST-coaps. Table 4 summarizes the EST-coaps response codes. | codes in EST-coaps. Table 4 summarizes the EST-coaps response codes. | |||
| +-----------------+-----------------+-------------------------------+ | +=============+=========================+==========================+ | |||
| | operation | EST-coaps | Description | | | Operation | EST-coaps Response Code | Description | | |||
| | | response code | | | +=============+=========================+==========================+ | |||
| +-----------------+-----------------+-------------------------------+ | | /crts, /att | 2.05 | Success. Certs included | | |||
| | /crts, /att | 2.05 | Success. Certs included in | | | | | in the response payload. | | |||
| | | | the response payload. | | +-------------+-------------------------+--------------------------+ | |||
| | | 4.xx / 5.xx | Failure. | | | | 4.xx / 5.xx | Failure. | | |||
| | /sen, /skg, | 2.04 | Success. Cert included in the | | +-------------+-------------------------+--------------------------+ | |||
| | /sren, /skc | | response payload. | | | /sen, /skg, | 2.04 | Success. Cert included | | |||
| | | 5.03 | Retry in Max-Age Option time. | | | /sren, /skc | | in the response payload. | | |||
| | | 4.xx / 5.xx | Failure. | | +-------------+-------------------------+--------------------------+ | |||
| +-----------------+-----------------+-------------------------------+ | | | 5.03 | Retry in Max-Age Option | | |||
| | | | time. | | ||||
| +-------------+-------------------------+--------------------------+ | ||||
| | | 4.xx / 5.xx | Failure. | | ||||
| +-------------+-------------------------+--------------------------+ | ||||
| Table 4: EST-coaps response codes | Table 4: EST-coaps Response Codes | |||
| 5.6. Message fragmentation | 4.6. Message Fragmentation | |||
| DTLS defines fragmentation only for the handshake and not for secure | DTLS defines fragmentation only for the handshake and not for secure | |||
| data exchange (DTLS records). [RFC6347] states that to avoid using | data exchange (DTLS records). [RFC6347] states that to avoid using | |||
| IP fragmentation, which involves error-prone datagram reconstitution, | IP fragmentation, which involves error-prone datagram reconstitution, | |||
| invokers of the DTLS record layer should size DTLS records so that | invokers of the DTLS record layer should size DTLS records so that | |||
| they fit within any Path MTU estimates obtained from the record | they fit within any Path MTU estimates obtained from the record | |||
| layer. In addition, invokers residing on a 6LoWPAN over IEEE | layer. In addition, invokers residing on 6LoWPAN (IPv6 over Low- | |||
| 802.15.4 [ieee802.15.4] network are recommended to size CoAP messages | Power Wireless Personal Area Networks) over IEEE 802.15.4 networks | |||
| such that each DTLS record will fit within one or two IEEE 802.15.4 | [IEEE802.15.4] are recommended to size CoAP messages such that each | |||
| frames. | DTLS record will fit within one or two IEEE 802.15.4 frames. | |||
| That is not always possible in EST-coaps. Even though ECC | That is not always possible in EST-coaps. Even though ECC | |||
| certificates are small in size, they can vary greatly based on | certificates are small in size, they can vary greatly based on | |||
| signature algorithms, key sizes, and Object Identifier (OID) fields | signature algorithms, key sizes, and Object Identifier (OID) fields | |||
| used. For 256-bit curves, common ECDSA cert sizes are 500-1000 bytes | used. For 256-bit curves, common Elliptic Curve Digital Signature | |||
| which could fluctuate further based on the algorithms, OIDs, Subject | Algorithm (ECDSA) cert sizes are 500-1000 bytes, which could | |||
| Alternative Names (SAN) and cert fields. For 384-bit curves, ECDSA | fluctuate further based on the algorithms, OIDs, Subject Alternative | |||
| Names (SANs), and cert fields. For 384-bit curves, ECDSA | ||||
| certificates increase in size and can sometimes reach 1.5KB. | certificates increase in size and can sometimes reach 1.5KB. | |||
| Additionally, there are times when the EST cacerts response from the | Additionally, there are times when the EST cacerts response from the | |||
| server can include multiple certificates that amount to large | server can include multiple certificates that amount to large | |||
| payloads. Section 4.6 of CoAP [RFC7252] describes the possible | payloads. Section 4.6 of [RFC7252] (CoAP) describes the possible | |||
| payload sizes: "if nothing is known about the size of the headers, | payload sizes: "if nothing is known about the size of the headers, | |||
| good upper bounds are 1152 bytes for the message size and 1024 bytes | good upper bounds are 1152 bytes for the message size and 1024 bytes | |||
| for the payload size". Section 4.6 of [RFC7252] also suggests that | for the payload size". Section 4.6 of [RFC7252] also suggests that | |||
| IPv4 implementations may want to limit themselves to more | IPv4 implementations may want to limit themselves to more | |||
| conservative IPv4 datagram sizes such as 576 bytes. Even with ECC, | conservative IPv4 datagram sizes such as 576 bytes. Even with ECC, | |||
| EST-coaps messages can still exceed MTU sizes on the Internet or | EST-coaps messages can still exceed MTU sizes on the Internet or | |||
| 6LoWPAN [RFC4919] (Section 2 of [RFC7959]). EST-coaps needs to be | 6LoWPAN [RFC4919] (Section 2 of [RFC7959]). EST-coaps needs to be | |||
| able to fragment messages into multiple DTLS datagrams. | able to fragment messages into multiple DTLS datagrams. | |||
| To perform fragmentation in CoAP, [RFC7959] specifies the Block1 | To perform fragmentation in CoAP, [RFC7959] specifies the Block1 | |||
| Option for fragmentation of the request payload and the Block2 Option | Option for fragmentation of the request payload and the Block2 Option | |||
| for fragmentation of the return payload of a CoAP flow. As explained | for fragmentation of the return payload of a CoAP flow. As explained | |||
| in Section 1 of [RFC7959], block-wise transfers should be used in | in Section 1 of [RFC7959], block-wise transfers should be used in | |||
| Confirmable CoAP messages to avoid the exacerbation of lost blocks. | Confirmable CoAP messages to avoid the exacerbation of lost blocks. | |||
| EST-coaps servers MUST implement Block1 and Block2. EST-coaps | EST-coaps servers MUST implement Block1 and Block2. EST-coaps | |||
| clients MUST implement Block2. EST-coaps clients MUST implement | clients MUST implement Block2. EST-coaps clients MUST implement | |||
| Block1 only if they are expecting to send EST-coaps requests with a | Block1 only if they are expecting to send EST-coaps requests with a | |||
| packet size that exceeds the Path MTU. | packet size that exceeds the path MTU. | |||
| [RFC7959] also defines Size1 and Size2 Options to provide size | [RFC7959] also defines Size1 and Size2 Options to provide size | |||
| information about the resource representation in a request and | information about the resource representation in a request and | |||
| response. EST-client and server MAY support Size1 and Size2 Options. | response. The EST-coaps client and server MAY support Size1 and | |||
| Size2 Options. | ||||
| Examples of fragmented EST-coaps messages are shown in Appendix B. | Examples of fragmented EST-coaps messages are shown in Appendix B. | |||
| 5.7. Delayed Responses | 4.7. Delayed Responses | |||
| Server responses can sometimes be delayed. According to | Server responses can sometimes be delayed. According to | |||
| Section 5.2.2 of [RFC7252], a slow server can acknowledge the request | Section 5.2.2 of [RFC7252], a slow server can acknowledge the request | |||
| and respond later with the requested resource representation. In | and respond later with the requested resource representation. In | |||
| particular, a slow server can respond to an EST-coaps enrollment | particular, a slow server can respond to an EST-coaps enrollment | |||
| request with an empty ACK with code 0.00, before sending the | request with an empty ACK with code 0.00 before sending the | |||
| certificate to the client after a short delay. If the certificate | certificate to the client after a short delay. If the certificate | |||
| response is large, the server will need more than one Block2 block to | response is large, the server will need more than one Block2 block to | |||
| transfer it. | transfer it. | |||
| This situation is shown in Figure 2. The client sends an enrollment | This situation is shown in Figure 3. The client sends an enrollment | |||
| request that uses N1+1 Block1 blocks. The server uses an empty 0.00 | request that uses N1+1 Block1 blocks. The server uses an empty 0.00 | |||
| ACK to announce the delayed response which is provided later with | ACK to announce the delayed response, which is provided later with | |||
| 2.04 messages containing N2+1 Block2 Options. The first 2.04 is a | 2.04 messages containing N2+1 Block2 Options. The first 2.04 is a | |||
| confirmable message that is acknowledged by the client. Onwards, the | Confirmable message that is acknowledged by the client. Onwards, the | |||
| client acknowledges all subsequent Block2 blocks. The notation of | client acknowledges all subsequent Block2 blocks. The notation of | |||
| Figure 2 is explained in Appendix B.1. | Figure 3 is explained in Appendix B.1. | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(1:0/1/256) {CSR (frag# 1)} --> | POST [2001:db8::2:1]:61616/est/sen (CON)(1:0/1/256) | |||
| <-- (ACK) (1:0/1/256) (2.31 Continue) | {CSR (frag# 1)} --> | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(1:1/1/256) {CSR (frag# 2)} --> | <-- (ACK) (1:0/1/256) (2.31 Continue) | |||
| <-- (ACK) (1:1/1/256) (2.31 Continue) | POST [2001:db8::2:1]:61616/est/sen (CON)(1:1/1/256) | |||
| . | {CSR (frag# 2)} --> | |||
| . | <-- (ACK) (1:1/1/256) (2.31 Continue) | |||
| . | . | |||
| POST [2001:db8::2:1]:61616/est/sen(CON)(1:N1/0/256){CSR (frag# N1+1)}--> | . | |||
| <-- (0.00 empty ACK) | . | |||
| | | POST [2001:db8::2:1]:61616/est/sen(CON)(1:N1/0/256) | |||
| ... Short delay before the certificate is ready ... | {CSR (frag# N1+1)}--> | |||
| | | <-- (0.00 empty ACK) | |||
| <-- (CON) (1:N1/0/256)(2:0/1/256)(2.04 Changed) {Cert resp (frag# 1)} | | | |||
| (ACK) --> | ... Short delay before the certificate is ready ... | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(2:1/0/256) --> | | | |||
| <-- (ACK) (2:1/1/256) (2.04 Changed) {Cert resp (frag# 2)} | <-- (CON) (1:N1/0/256)(2:0/1/256)(2.04 Changed) | |||
| . | {Cert resp (frag# 1)} | |||
| . | (ACK) --> | |||
| . | POST [2001:db8::2:1]:61616/est/sen (CON)(2:1/0/256) --> | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(2:N2/0/256) --> | <-- (ACK) (2:1/1/256) (2.04 Changed) {Cert resp (frag# 2)} | |||
| <-- (ACK) (2:N2/0/256) (2.04 Changed) {Cert resp (frag# N2+1)} | . | |||
| . | ||||
| . | ||||
| POST [2001:db8::2:1]:61616/est/sen (CON)(2:N2/0/256) --> | ||||
| <-- (ACK) (2:N2/0/256) (2.04 Changed) {Cert resp (frag# N2+1)} | ||||
| Figure 2: EST-COAP enrollment with short wait | Figure 3: EST-coaps Enrollment with Short Wait | |||
| If the server is very slow (for example, manual intervention is | If the server is very slow (for example, manual intervention is | |||
| required which would take minutes), it SHOULD respond with an ACK | required, which would take minutes), it SHOULD respond with an ACK | |||
| containing response code 5.03 (Service unavailable) and a Max-Age | containing response code 5.03 (Service unavailable) and a Max-Age | |||
| Option to indicate the time the client SHOULD wait before sending | Option to indicate the time the client SHOULD wait before sending | |||
| another request to obtain the content. After a delay of Max-Age, the | another request to obtain the content. After a delay of Max-Age, the | |||
| client SHOULD resend the identical CSR to the server. As long as the | client SHOULD resend the identical CSR to the server. As long as the | |||
| server continues to respond with response code 5.03 (Service | server continues to respond with response code 5.03 (Service | |||
| Unavailable) with a Max-Age Option, the client will continue to delay | Unavailable) with a Max-Age Option, the client will continue to delay | |||
| for Max-Age and then resend the enrollment request until the server | for Max-Age and then resend the enrollment request until the server | |||
| responds with the certificate or the client abandons the request for | responds with the certificate or the client abandons the request due | |||
| policy or other reasons. | to policy or other reasons. | |||
| To demonstrate this scenario, Figure 3 shows a client sending an | To demonstrate this scenario, Figure 4 shows a client sending an | |||
| enrollment request that uses N1+1 Block1 blocks to send the CSR to | enrollment request that uses N1+1 Block1 blocks to send the CSR to | |||
| the server. The server needs N2+1 Block2 blocks to respond, but also | the server. The server needs N2+1 Block2 blocks to respond but also | |||
| needs to take a long delay (minutes) to provide the response. | needs to take a long delay (minutes) to provide the response. | |||
| Consequently, the server uses a 5.03 ACK response with a Max-Age | Consequently, the server uses a 5.03 ACK response with a Max-Age | |||
| Option. The client waits for a period of Max-Age as many times as it | Option. The client waits for a period of Max-Age as many times as it | |||
| receives the same 5.03 response and retransmits the enrollment | receives the same 5.03 response and retransmits the enrollment | |||
| request until it receives a certificate in a fragmented 2.04 | request until it receives a certificate in a fragmented 2.04 | |||
| response. | response. | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(1:0/1/256) {CSR (frag# 1)} --> | POST [2001:db8::2:1]:61616/est/sen (CON)(1:0/1/256) | |||
| <-- (ACK) (1:0/1/256) (2.31 Continue) | {CSR (frag# 1)} --> | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(1:1/1/256) {CSR (frag# 2)} --> | <-- (ACK) (1:0/1/256) (2.31 Continue) | |||
| <-- (ACK) (1:1/1/256) (2.31 Continue) | POST [2001:db8::2:1]:61616/est/sen (CON)(1:1/1/256) | |||
| . | {CSR (frag# 2)} --> | |||
| . | <-- (ACK) (1:1/1/256) (2.31 Continue) | |||
| . | . | |||
| POST [2001:db8::2:1]:61616/est/sen(CON)(1:N1/0/256){CSR (frag# N1+1)}--> | . | |||
| <-- (ACK) (1:N1/0/256) (5.03 Service Unavailable) (Max-Age) | . | |||
| | | POST [2001:db8::2:1]:61616/est/sen(CON)(1:N1/0/256) | |||
| | | {CSR (frag# N1+1)}--> | |||
| ... Client tries again after Max-Age with identical payload ... | <-- (ACK) (1:N1/0/256) (5.03 Service Unavailable) (Max-Age) | |||
| | | | | |||
| | | | | |||
| POST [2001:db8::2:1]:61616/est/sen(CON)(1:0/1/256){CSR (frag# 1)}--> | ... Client tries again after Max-Age with identical payload ... | |||
| <-- (ACK) (1:0/1/256) (2.31 Continue) | | | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(1:1/1/256) {CSR (frag# 2)} --> | | | |||
| <-- (ACK) (1:1/1/256) (2.31 Continue) | POST [2001:db8::2:1]:61616/est/sen(CON)(1:0/1/256) | |||
| . | {CSR (frag# 1)}--> | |||
| . | <-- (ACK) (1:0/1/256) (2.31 Continue) | |||
| . | POST [2001:db8::2:1]:61616/est/sen (CON)(1:1/1/256) | |||
| POST [2001:db8::2:1]:61616/est/sen(CON)(1:N1/0/256){CSR (frag# N1+1)}--> | {CSR (frag# 2)} --> | |||
| | | <-- (ACK) (1:1/1/256) (2.31 Continue) | |||
| ... Immediate response when certificate is ready ... | . | |||
| | | . | |||
| <-- (ACK) (1:N1/0/256) (2:0/1/256) (2.04 Changed){Cert resp (frag# 1)} | . | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(2:1/0/256) --> | POST [2001:db8::2:1]:61616/est/sen(CON)(1:N1/0/256) | |||
| <-- (ACK) (2:1/1/256) (2.04 Changed) {Cert resp (frag# 2)} | {CSR (frag# N1+1)}--> | |||
| . | | | |||
| . | ... Immediate response when certificate is ready ... | |||
| . | | | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(2:N2/0/256) --> | <-- (ACK) (1:N1/0/256) (2:0/1/256) (2.04 Changed) | |||
| <-- (ACK) (2:N2/0/256) (2.04 Changed) {Cert resp (frag# N2+1)} | {Cert resp (frag# 1)} | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(2:1/0/256) --> | ||||
| <-- (ACK) (2:1/1/256) (2.04 Changed) {Cert resp (frag# 2)} | ||||
| . | ||||
| . | ||||
| . | ||||
| POST [2001:db8::2:1]:61616/est/sen (CON)(2:N2/0/256) --> | ||||
| <-- (ACK) (2:N2/0/256) (2.04 Changed) {Cert resp (frag# N2+1)} | ||||
| Figure 3: EST-COAP enrollment with long wait | Figure 4: EST-coaps Enrollment with Long Wait | |||
| 5.8. Server-side Key Generation | 4.8. Server-Side Key Generation | |||
| Private keys can be generated on the server to support scenarios | Private keys can be generated on the server to support scenarios | |||
| where serer-side key generation is needed. Such scenarios include | where server-side key generation is needed. Such scenarios include | |||
| those where it is considered more secure to generate the long-lived, | those where it is considered more secure to generate the long-lived, | |||
| random private key that identifies the client at the server, or where | random private key that identifies the client at the server, or where | |||
| the resources spent to generate a random private key at the client | the resources spent to generate a random private key at the client | |||
| are considered scarce, or where the security policy requires that the | are considered scarce, or where the security policy requires that the | |||
| certificate public and corresponding private keys are centrally | certificate public and corresponding private keys are centrally | |||
| generated and controlled. As always, it is necessary to use proper | generated and controlled. As always, it is necessary to use proper | |||
| random numbers in various protocols such as (D)TLS (Section 10.1). | random numbers in various protocols such as (D)TLS (Section 9.1). | |||
| When requesting server-side key generation, the client asks for the | When requesting server-side key generation, the client asks for the | |||
| server or proxy to generate the private key and the certificate, | server or proxy to generate the private key and the certificate, | |||
| which are transferred back to the client in the server-side key | which are transferred back to the client in the server-side key | |||
| generation response. In all respects, the server treats the CSR as | generation response. In all respects, the server treats the CSR as | |||
| it would treat any enroll or re-enroll CSR; the only distinction here | it would treat any enroll or re-enroll CSR; the only distinction here | |||
| is that the server MUST ignore the public key values and signature in | is that the server MUST ignore the public key values and signature in | |||
| the CSR. These are included in the request only to allow re-use of | the CSR. These are included in the request only to allow reuse of | |||
| existing codebases for generating and parsing such requests. | existing codebases for generating and parsing such requests. | |||
| The client /skg request is for a certificate in a PKCS#7 container | The client /skg request is for a certificate in a PKCS #7 container | |||
| and private key in two application/multipart-core elements. | and private key in two application/multipart-core elements. | |||
| Respectively, an /skc request is for a single application/pkix-cert | Respectively, an /skc request is for a single application/pkix-cert | |||
| certificate and a private key. The private key Content-Format | certificate and a private key. The private key Content-Format | |||
| requested by the client is indicated in the PKCS#10 CSR request. If | requested by the client is indicated in the PKCS #10 CSR request. If | |||
| the request contains SMIMECapabilities and DecryptKeyIdentifier or | the request contains SMIMECapabilities and DecryptKeyIdentifier or | |||
| AsymmetricDecryptKeyIdentifier the client is expecting Content-Format | AsymmetricDecryptKeyIdentifier, the client is expecting Content- | |||
| 280 for the private key. Then this private key is encrypted | Format 280 for the private key. Then, this private key is encrypted | |||
| symmetrically or asymmetrically as per [RFC7030]. The symmetric key | symmetrically or asymmetrically per [RFC7030]. The symmetric key or | |||
| or the asymmetric keypair establishment method is out of scope of | the asymmetric keypair establishment method is out of scope of this | |||
| this specification. A /skg or /skc request with a CSR without | specification. An /skg or /skc request with a CSR without | |||
| SMIMECapabilities expects an application/multipart-core with an | SMIMECapabilities expects an application/multipart-core with an | |||
| unencrypted PKCS#8 private key with Content-Format 284. | unencrypted PKCS #8 private key with Content-Format 284. | |||
| The EST-coaps server-side key generation response is returned with | The EST-coaps server-side key generation response is returned with | |||
| Content-Format application/multipart-core | Content-Format application/multipart-core [RFC8710] containing a CBOR | |||
| [I-D.ietf-core-multipart-ct] containing a CBOR array with four items | array with four items (Section 4.3). The two representations (each | |||
| (Section 5.3). The two representations (each consisting of two CBOR | consisting of two CBOR array items) do not have to be in a particular | |||
| array items) do not have to be in a particular order since each | order since each representation is preceded by its Content-Format ID. | |||
| representation is preceded by its Content-Format ID. Depending on | Depending on the request, the private key can be in unprotected PKCS | |||
| the request, the private key can be in unprotected PKCS#8 [RFC5958] | #8 format [RFC5958] (Content-Format 284) or protected inside of CMS | |||
| format (Content-Format 284) or protected inside of CMS SignedData | SignedData (Content-Format 280). The SignedData, placed in the | |||
| (Content-Format 280). The SignedData, placed in the outermost | outermost container, is signed by the party that generated the | |||
| container, is signed by the party that generated the private key, | private key, which may be the EST server or the EST CA. SignedData | |||
| which may be the EST server or the EST CA. SignedData placed within | placed within the Enveloped Data does not need additional signing as | |||
| the Enveloped Data does not need additional signing as explained in | explained in Section 4.4.2 of [RFC7030]. In summary, the | |||
| Section 4.4.2 of [RFC7030]. In summary, the symmetrically encrypted | symmetrically encrypted key is included in the encryptedKey attribute | |||
| key is included in the encryptedKey attribute in a KEKRecipientInfo | in a KEKRecipientInfo structure. In the case where the asymmetric | |||
| structure. In the case where the asymmetric encryption key is | encryption key is suitable for transport key operations, the | |||
| suitable for transport key operations the generated private key is | generated private key is encrypted with a symmetric key. The | |||
| encrypted with a symmetric key. The symmetric key itself is | symmetric key itself is encrypted by the client-defined (in the CSR) | |||
| encrypted by the client-defined (in the CSR) asymmetric public key | asymmetric public key and is carried in an encryptedKey attribute in | |||
| and is carried in an encryptedKey attribute in a | a KeyTransRecipientInfo structure. Finally, if the asymmetric | |||
| KeyTransRecipientInfo structure. Finally, if the asymmetric | ||||
| encryption key is suitable for key agreement, the generated private | encryption key is suitable for key agreement, the generated private | |||
| key is encrypted with a symmetric key. The symmetric key itself is | key is encrypted with a symmetric key. The symmetric key itself is | |||
| encrypted by the client defined (in the CSR) asymmetric public key | encrypted by the client defined (in the CSR) asymmetric public key | |||
| and is carried in an recipientEncryptedKeys attribute in a | and is carried in a recipientEncryptedKeys attribute in a | |||
| KeyAgreeRecipientInfo. | KeyAgreeRecipientInfo. | |||
| [RFC7030] recommends the use of additional encryption of the returned | [RFC7030] recommends the use of additional encryption of the returned | |||
| private key. For the context of this specification, clients and | private key. For the context of this specification, clients and | |||
| servers that choose to support server-side key generation MUST | servers that choose to support server-side key generation MUST | |||
| support unprotected (PKCS#8) private keys (Content-Format 284). | support unprotected (PKCS #8) private keys (Content-Format 284). | |||
| Symmetric or asymmetric encryption of the private key (CMS | Symmetric or asymmetric encryption of the private key (CMS | |||
| EnvelopedData, Content-Format 280) SHOULD be supported for | EnvelopedData, Content-Format 280) SHOULD be supported for | |||
| deployments where end-to-end encryption is needed between the client | deployments where end-to-end encryption is needed between the client | |||
| and a server. Such cases could include architectures where an entity | and a server. Such cases could include architectures where an entity | |||
| between the client and the CA terminates the DTLS connection | between the client and the CA terminates the DTLS connection | |||
| (Registrar in Figure 4). Although [RFC7030] strongly recommends that | (Registrar in Figure 5). Though [RFC7030] strongly recommends that | |||
| clients request the use of CMS encryption on top of the TLS channel's | clients request the use of CMS encryption on top of the TLS channel's | |||
| protection, this document does not make such a recommendation; CMS | protection, this document does not make such a recommendation; CMS | |||
| encryption can still be used when mandated by the use-case. | encryption can still be used when mandated by the use case. | |||
| 6. HTTPS-CoAPS Registrar | 5. HTTPS-CoAPS Registrar | |||
| In real-world deployments, the EST server will not always reside | In real-world deployments, the EST server will not always reside | |||
| within the CoAP boundary. The EST server can exist outside the | within the CoAP boundary. The EST server can exist outside the | |||
| constrained network in which case it will support TLS/HTTP instead of | constrained network, in which case it will support TLS/HTTP instead | |||
| CoAPS. In such environments EST-coaps is used by the client within | of CoAPS. In such environments, EST-coaps is used by the client | |||
| the CoAP boundary and TLS is used to transport the EST messages | within the CoAP boundary and TLS is used to transport the EST | |||
| outside the CoAP boundary. A Registrar at the edge is required to | messages outside the CoAP boundary. A Registrar at the edge is | |||
| operate between the CoAP environment and the external HTTP network as | required to operate between the CoAP environment and the external | |||
| shown in Figure 4. | HTTP network as shown in Figure 5. | |||
| Constrained Network | Constrained Network | |||
| .------. .----------------------------. | .------. .----------------------------. | |||
| | CA | |.--------------------------.| | | CA | |.--------------------------.| | |||
| '------' || || | '------' || || | |||
| | || || | | || || | |||
| .------. HTTP .-----------------. CoAPS .-----------. || | .------. HTTP .------------------. CoAPS .-----------. || | |||
| | EST |<------->|EST-coaps-to-HTTPS|<------->| EST Client| || | | EST |<------->|EST-coaps-to-HTTPS|<------->| EST Client| || | |||
| |Server|over TLS | Registrar | '-----------' || | |Server|over TLS | Registrar | '-----------' || | |||
| '------' '-----------------' || | '------' '------------------' || | |||
| || || | || || | |||
| |'--------------------------'| | |'--------------------------'| | |||
| '----------------------------' | '----------------------------' | |||
| Figure 4: EST-coaps-to-HTTPS Registrar at the CoAP boundary. | Figure 5: EST-coaps-to-HTTPS Registrar at the CoAP Boundary | |||
| The EST-coaps-to-HTTPS Registrar MUST terminate EST-coaps downstream | The EST-coaps-to-HTTPS Registrar MUST terminate EST-coaps downstream | |||
| and initiate EST connections over TLS upstream. The Registrar MUST | and initiate EST connections over TLS upstream. The Registrar MUST | |||
| authenticate and optionally authorize the client requests while it | authenticate and optionally authorize the client requests while it | |||
| MUST be authenticated by the EST server or CA. The trust | MUST be authenticated by the EST server or CA. The trust | |||
| relationship between the Registrar and the EST server SHOULD be pre- | relationship between the Registrar and the EST server SHOULD be pre- | |||
| established for the Registrar to proxy these connections on behalf of | established for the Registrar to proxy these connections on behalf of | |||
| various clients. | various clients. | |||
| When enforcing Proof-of-Possession (PoP) linking, the DTLS tls-unique | When enforcing Proof-of-Possession (POP) linking, the tls-unique or | |||
| value of the (D)TLS session is used to prove that the private key | tls-exporter value of the session for DTLS 1.2 and DTLS 1.3, | |||
| corresponding to the public key is in the possession of the client | respectively, is used to prove that the private key corresponding to | |||
| and was used to establish the connection as explained in Section 4. | the public key is in the possession of the client and was used to | |||
| The PoP linking information is lost between the EST-coaps client and | establish the connection as explained in Section 3. The POP linking | |||
| the EST server when a Registrar is present. The EST server becomes | information is lost between the EST-coaps client and the EST server | |||
| aware of the presence of a Registrar from its TLS client certificate | when a Registrar is present. The EST server becomes aware of the | |||
| that includes id-kp-cmcRA [RFC6402] extended key usage extension | presence of a Registrar from its TLS client certificate that includes | |||
| (EKU). As explained in Section 3.7 of [RFC7030], the "EST server | the id-kp-cmcRA extended key usage (EKU) extension [RFC6402]. As | |||
| SHOULD apply an authorization policy consistent with a Registrar | explained in Section 3.7 of [RFC7030], the "EST server SHOULD apply | |||
| client. For example, it could be configured to accept PoP linking | authorization policy consistent with an RA client ... the EST server | |||
| information that does not match the current TLS session because the | could be configured to accept POP linking information that does not | |||
| authenticated EST client Registrar has verified this information when | match the current TLS session because the authenticated EST client RA | |||
| acting as an EST server". | has verified this information when acting as an EST server". | |||
| Table 1 contains the URI mappings between EST-coaps and EST that the | Table 1 contains the URI mappings between EST-coaps and EST that the | |||
| Registrar MUST adhere to. Section 5.5 of this specification and | Registrar MUST adhere to. Section 4.5 of this specification and | |||
| Section 7 of [RFC8075] define the mappings between EST-coaps and HTTP | Section 7 of [RFC8075] define the mappings between EST-coaps and HTTP | |||
| response codes, that determine how the Registrar MUST translate CoAP | response codes that determine how the Registrar MUST translate CoAP | |||
| response codes from/to HTTP status codes. The mapping from CoAP | response codes from/to HTTP status codes. The mapping from CoAP | |||
| Content-Format to HTTP Content-Type is defined in Section 9.1. | Content-Format to HTTP Content-Type is defined in Section 8.1. | |||
| Additionally, a conversion from CBOR major type 2 to Base64 encoding | Additionally, a conversion from CBOR major type 2 to Base64 encoding | |||
| MUST take place at the Registrar. If CMS end-to-end encryption is | MUST take place at the Registrar. If CMS end-to-end encryption is | |||
| employed for the private key, the encrypted CMS EnvelopedData blob | employed for the private key, the encrypted CMS EnvelopedData blob | |||
| MUST be converted at the Registrar to binary CBOR type 2 downstream | MUST be converted at the Registrar to binary CBOR type 2 downstream | |||
| to the client. This is a format conversion that does not require | to the client. This is a format conversion that does not require | |||
| decryption of the CMS EnvelopedData. | decryption of the CMS EnvelopedData. | |||
| A deviation from the mappings in Table 1 could take place if clients | A deviation from the mappings in Table 1 could take place if clients | |||
| that leverage server-side key generation preferred for the enrolled | that leverage server-side key generation preferred for the enrolled | |||
| keys to be generated by the Registrar in the case the CA does not | keys to be generated by the Registrar in the case the CA does not | |||
| support server-side key generation. Such a Registrar is responsible | support server-side key generation. Such a Registrar is responsible | |||
| for generating a new CSR signed by a new key which will be returned | for generating a new CSR signed by a new key that will be returned to | |||
| to the client along with the certificate from the CA. In these | the client along with the certificate from the CA. In these cases, | |||
| cases, the Registrar MUST use random number generation with proper | the Registrar MUST use random number generation with proper entropy. | |||
| entropy. | ||||
| Due to fragmentation of large messages into blocks, an EST-coaps-to- | Due to fragmentation of large messages into blocks, an EST-coaps-to- | |||
| HTTP Registrar MUST reassemble the BLOCKs before translating the | HTTP Registrar MUST reassemble the blocks before translating the | |||
| binary content to Base64, and consecutively relay the message | binary content to Base64 and consecutively relay the message | |||
| upstream. | upstream. | |||
| The EST-coaps-to-HTTP Registrar MUST support resource discovery | The EST-coaps-to-HTTP Registrar MUST support resource discovery | |||
| according to the rules in Section 5.1. | according to the rules in Section 4.1. | |||
| 7. Parameters | 6. Parameters | |||
| This section addresses transmission parameters described in sections | This section addresses transmission parameters described in Sections | |||
| 4.7 and 4.8 of [RFC7252]. EST does not impose any unique values on | 4.7 and 4.8 of [RFC7252]. EST does not impose any unique values on | |||
| the CoAP parameters in [RFC7252], but the setting of the CoAP | the CoAP parameters in [RFC7252], but the setting of the CoAP | |||
| parameter values may have consequence for the setting of the EST | parameter values may have consequence for the setting of the EST | |||
| parameter values. | parameter values. | |||
| Implementations should follow the default CoAP configuration | Implementations should follow the default CoAP configuration | |||
| parameters [RFC7252]. However, depending on the implementation | parameters [RFC7252]. However, depending on the implementation | |||
| scenario, retransmissions and timeouts can also occur on other | scenario, retransmissions and timeouts can also occur on other | |||
| networking layers, governed by other configuration parameters. When | networking layers, governed by other configuration parameters. When | |||
| a change in a server parameter has taken place, the parameter values | a change in a server parameter has taken place, the parameter values | |||
| in the communicating endpoints MUST be adjusted as necessary. | in the communicating endpoints MUST be adjusted as necessary. | |||
| Examples of how parameters could be adjusted include higher layer | Examples of how parameters could be adjusted include higher-layer | |||
| congestion protocols, provisioning agents and configurations included | congestion protocols, provisioning agents, and configurations | |||
| in firmware updates. | included in firmware updates. | |||
| Some further comments about some specific parameters, mainly from | Some further comments about some specific parameters, mainly from | |||
| Table 2 in [RFC7252]: | Table 2 in [RFC7252], include the following: | |||
| o NSTART: A parameter that controls the number of simultaneous | NSTART: A parameter that controls the number of simultaneous | |||
| outstanding interactions that a client maintains to a given | outstanding interactions that a client maintains to a given | |||
| server. An EST-coaps client is expected to control at most one | server. An EST-coaps client is expected to control at most one | |||
| interaction with a given server, which is the default NSTART value | interaction with a given server, which is the default NSTART value | |||
| defined in [RFC7252]. | defined in [RFC7252]. | |||
| o DEFAULT_LEISURE: This setting is only relevant in multicast | DEFAULT_LEISURE: A setting that is only relevant in multicast | |||
| scenarios, outside the scope of EST-coaps. | scenarios and is outside the scope of EST-coaps. | |||
| o PROBING_RATE: A parameter which specifies the rate of re-sending | PROBING_RATE: A parameter that specifies the rate of resending Non- | |||
| non-confirmable messages. In the rare situations that non- | confirmable messages. In the rare situations that Non-confirmable | |||
| confirmable messages are used, the default PROBING_RATE value | messages are used, the default PROBING_RATE value defined in | |||
| defined in [RFC7252] applies. | [RFC7252] applies. | |||
| Finally, the Table 3 parameters in [RFC7252] are mainly derived from | Finally, the Table 3 parameters in [RFC7252] are mainly derived from | |||
| Table 2. Directly changing parameters on one table would affect | Table 2. Directly changing parameters on one table would affect | |||
| parameters on the other. | parameters on the other. | |||
| 8. Deployment limitations | 7. Deployment Limitations | |||
| Although EST-coaps paves the way for the utilization of EST by | Although EST-coaps paves the way for the utilization of EST by | |||
| constrained devices in constrained networks, some classes of devices | constrained devices in constrained networks, some classes of devices | |||
| [RFC7228] will not have enough resources to handle the payloads that | [RFC7228] will not have enough resources to handle the payloads that | |||
| come with EST-coaps. The specification of EST-coaps is intended to | come with EST-coaps. The specification of EST-coaps is intended to | |||
| ensure that EST works for networks of constrained devices that choose | ensure that EST works for networks of constrained devices that choose | |||
| to limit their communications stack to DTLS/CoAP. It is up to the | to limit their communications stack to DTLS/CoAP. It is up to the | |||
| network designer to decide which devices execute the EST protocol and | network designer to decide which devices execute the EST protocol and | |||
| which do not. | which do not. | |||
| 9. IANA Considerations | 8. IANA Considerations | |||
| 9.1. Content-Format Registry | 8.1. Content-Formats Registry | |||
| Additions to the sub-registry "CoAP Content-Formats", within the | IANA has registered the following Content-Formats given in Table 5 in | |||
| "CoRE Parameters" registry [COREparams] are specified in Table 5. | the "CoAP Content-Formats" subregistry within the "CoRE Parameters" | |||
| These have been registered provisionally in the IETF Review or IESG | registry [CORE-PARAMS]. These have been registered in the IETF | |||
| Approval range (256-9999). | Review or IESG Approval range (256-9999). | |||
| +------------------------------+-------+----------------------------+ | +=================================+=====+====================+ | |||
| | HTTP Content-Type | ID | Reference | | | Media Type | ID | Reference | | |||
| +------------------------------+-------+----------------------------+ | +=================================+=====+====================+ | |||
| | application/pkcs7-mime; | 280 | [RFC7030] [I-D.ietf-lamps- | | | application/pkcs7-mime; smime- | 280 | [RFC7030] | | |||
| | smime-type=server-generated- | | rfc5751-bis] [ThisRFC] | | | type=server-generated-key | | [RFC8551] RFC 9148 | | |||
| | key | | | | +---------------------------------+-----+--------------------+ | |||
| | application/pkcs7-mime; | 281 | [I-D.ietf-lamps-rfc5751-bi | | | application/pkcs7-mime; smime- | 281 | [RFC8551] RFC 9148 | | |||
| | smime-type=certs-only | | s] [ThisRFC] | | | type=certs-only | | | | |||
| | application/pkcs8 | 284 | [RFC5958] [I-D.ietf-lamps- | | +---------------------------------+-----+--------------------+ | |||
| | | | rfc5751-bis] [ThisRFC] | | | application/pkcs8 | 284 | [RFC5958] | | |||
| | application/csrattrs | 285 | [RFC7030] | | | | | [RFC8551] RFC 9148 | | |||
| | application/pkcs10 | 286 | [RFC5967] [I-D.ietf-lamps- | | +---------------------------------+-----+--------------------+ | |||
| | | | rfc5751-bis] [ThisRFC] | | | application/csrattrs | 285 | [RFC7030] RFC 9148 | | |||
| | application/pkix-cert | TBD28 | [RFC2585] [ThisRFC] | | +---------------------------------+-----+--------------------+ | |||
| | | 7 | | | | application/pkcs10 | 286 | [RFC5967] | | |||
| +------------------------------+-------+----------------------------+ | | | | [RFC8551] RFC 9148 | | |||
| +---------------------------------+-----+--------------------+ | ||||
| | application/pkix-cert | 287 | [RFC2585] RFC 9148 | | ||||
| +---------------------------------+-----+--------------------+ | ||||
| Table 5: New CoAP Content-Formats | Table 5: New CoAP Content-Formats | |||
| It is suggested that 287 is allocated to TBD287. | 8.2. Resource Type Registry | |||
| 9.2. Resource Type registry | IANA has registered the following Resource Type (rt=) Link Target | |||
| Attributes given in Table 6 in the "Resource Type (rt=) Link Target | ||||
| Attribute Values" subregistry under the "Constrained RESTful | ||||
| Environments (CoRE) Parameters" registry. | ||||
| This memo registers new Resource Type (rt=) Link Target Attributes in | +==============+===================================+===========+ | |||
| the "Resource Type (rt=) Link Target Attribute Values" subregistry | | Value | Description | Reference | | |||
| under the "Constrained RESTful Environments (CoRE) Parameters" | +==============+===================================+===========+ | |||
| registry. | | ace.est.crts | This resource depicts the support | RFC 9148 | | |||
| | | of EST GET cacerts. | | | ||||
| +--------------+-----------------------------------+-----------+ | ||||
| | ace.est.sen | This resource depicts the support | RFC 9148 | | ||||
| | | of EST simple enroll. | | | ||||
| +--------------+-----------------------------------+-----------+ | ||||
| | ace.est.sren | This resource depicts the support | RFC 9148 | | ||||
| | | of EST simple reenroll. | | | ||||
| +--------------+-----------------------------------+-----------+ | ||||
| | ace.est.att | This resource depicts the support | RFC 9148 | | ||||
| | | of EST GET CSR attributes. | | | ||||
| +--------------+-----------------------------------+-----------+ | ||||
| | ace.est.skg | This resource depicts the support | RFC 9148 | | ||||
| | | of EST server-side key generation | | | ||||
| | | with the returned certificate in | | | ||||
| | | a PKCS #7 container. | | | ||||
| +--------------+-----------------------------------+-----------+ | ||||
| | ace.est.skc | This resource depicts the support | RFC 9148 | | ||||
| | | of EST server-side key generation | | | ||||
| | | with the returned certificate in | | | ||||
| | | application/pkix-cert format. | | | ||||
| +--------------+-----------------------------------+-----------+ | ||||
| o rt="ace.est.crts". This resource depicts the support of EST get | Table 6: New Resource Type (rt=) Link Target Attributes | |||
| cacerts. | ||||
| o rt="ace.est.sen". This resource depicts the support of EST simple | 8.3. Well-Known URIs Registry | |||
| enroll. | ||||
| o rt="ace.est.sren". This resource depicts the support of EST | IANA has added an additional reference to the est URI in the "Well- | |||
| simple reenroll. | Known URIs" registry: | |||
| o rt="ace.est.att". This resource depicts the support of EST get | URI Suffix: est | |||
| CSR attributes. | ||||
| o rt="ace.est.skg". This resource depicts the support of EST | Change Controller: IETF | |||
| server-side key generation with the returned certificate in a | ||||
| PKCS#7 container. | ||||
| o rt="ace.est.skc". This resource depicts the support of EST | References: [RFC7030] RFC 9148 | |||
| server-side key generation with the returned certificate in | ||||
| application/pkix-cert format. | ||||
| 9.3. Well-Known URIs Registry | Status: permanent | |||
| A new additional reference is requested for the est URI in the Well- | Related Information: | |||
| Known URIs registry: | ||||
| +------+--------+---------+---------+----------+---------+----------+ | Date Registered: 2013-08-16 | |||
| | URI | Change | Referen | Status | Related | Date Re | Date | | ||||
| | Suff | Contro | ces | | Informat | gistere | Modified | | ||||
| | ix | ller | | | ion | d | | | ||||
| +------+--------+---------+---------+----------+---------+----------+ | ||||
| | est | IETF | [RFC703 | permane | | 2013-08 | [THIS | | ||||
| | | | 0] | nt | | -16 | RFC's pu | | ||||
| | | | [THIS | | | | blicatio | | ||||
| | | | RFC] | | | | n date] | | ||||
| +------+--------+---------+---------+----------+---------+----------+ | ||||
| 10. Security Considerations | Date Modified: 2020-04-29 | |||
| 10.1. EST server considerations | 9. Security Considerations | |||
| The security considerations of Section 6 of [RFC7030] are only | 9.1. EST Server Considerations | |||
| The security considerations in Section 6 of [RFC7030] are only | ||||
| partially valid for the purposes of this document. As HTTP Basic | partially valid for the purposes of this document. As HTTP Basic | |||
| Authentication is not supported, the considerations expressed for | Authentication is not supported, the considerations expressed for | |||
| using passwords do not apply. The other portions of the security | using passwords do not apply. The other portions of the security | |||
| considerations of [RFC7030] continue to apply. | considerations in [RFC7030] continue to apply. | |||
| Modern security protocols require random numbers to be available | Modern security protocols require random numbers to be available | |||
| during the protocol run, for example for nonces and ephemeral (EC) | during the protocol run, for example, for nonces and ephemeral (EC) | |||
| Diffie-Hellman key generation. This capability to generate random | Diffie-Hellman key generation. This capability to generate random | |||
| numbers is also needed when the constrained device generates the | numbers is also needed when the constrained device generates the | |||
| private key (that corresponds to the public key enrolled in the CSR). | private key (that corresponds to the public key enrolled in the CSR). | |||
| When server-side key generation is used, the constrained device | When server-side key generation is used, the constrained device | |||
| depends on the server to generate the private key randomly, but it | depends on the server to generate the private key randomly, but it | |||
| still needs locally generated random numbers for use in security | still needs locally generated random numbers for use in security | |||
| protocols, as explained in Section 12 of [RFC7925]. Additionally, | protocols, as explained in Section 12 of [RFC7925]. Additionally, | |||
| the transport of keys generated at the server is inherently risky. | the transport of keys generated at the server is inherently risky. | |||
| For those deploying server-side key generation, analysis SHOULD be | For those deploying server-side key generation, analysis SHOULD be | |||
| done to establish whether server-side key generation increases or | done to establish whether server-side key generation increases or | |||
| decreases the probability of digital identity theft. | decreases the probability of digital identity theft. | |||
| It is important to note that, as pointed out in [PsQs], sources | It is important to note that, as pointed out in [PsQs], sources | |||
| contributing to the randomness pool used to generate random numbers | contributing to the randomness pool used to generate random numbers | |||
| on laptops or desktop PCs, such as mouse movement, timing of | on laptops or desktop PCs, such as mouse movement, timing of | |||
| keystrokes, or air turbulence on the movement of hard drive heads, | keystrokes, or air turbulence on the movement of hard drive heads, | |||
| are not available on many constrained devices. Other sources have to | are not available on many constrained devices. Other sources have to | |||
| be used or dedicated hardware has to be added. Selecting hardware | be used or dedicated hardware has to be added. Selecting hardware | |||
| for an IoT device that is capable of producing high-quality random | for an IoT device that is capable of producing high-quality random | |||
| numbers is therefore important [RSAfact]. | numbers is therefore important [RSA-FACT]. | |||
| As discussed in Section 6 of [RFC7030], it is "RECOMMENDED that the | As discussed in Section 6 of [RFC7030], it is | |||
| Implicit Trust Anchor database used for EST server authentication is | ||||
| carefully managed to reduce the chance of a third-party CA with poor | ||||
| certification practices jeopardizing authentication. Disabling the | ||||
| Implicit Trust Anchor database after successfuly receiving the | ||||
| Distribution of CA certificates response (Section 4.1.3) limits any | ||||
| risk to the first TLS exchange". Alternatively, in a case where a | ||||
| /sen request immediately follows a /crts, a client MAY choose to keep | ||||
| the connection authenticated by the Implicit TA open for efficiency | ||||
| reasons (Section 4). A client that interleaves EST-coaps /crts | ||||
| request with other requests in the same DTLS connection SHOULD | ||||
| revalidate the server certificate chain against the updated Explicit | ||||
| TA from the /crts response before proceeding with the subsequent | ||||
| requests. If the server certificate chain does not authenticate | ||||
| against the database, the client SHOULD close the connection without | ||||
| completing the rest of the requests. The updated Explicit TA MUST | ||||
| continue to be used in new DTLS connections. | ||||
| In cases where the IDevID used to authenticate the client is expired | | RECOMMENDED that the Implicit Trust Anchor database used for EST | |||
| the server MAY still authenticate the client because IDevIDs are | | server authentication be carefully managed to reduce the chance of | |||
| expected to live as long as the device itself (Section 4). In such | | a third-party CA with poor certification practices from being | |||
| occasions, checking the certificate revocation status or authorizing | | trusted. Disabling the Implicit Trust Anchor database after | |||
| the client using another method is important for the server to raise | | successfully receiving the Distribution of CA certificates | |||
| its confidence that the client can be trusted. | | response ([RFC7030], Section 6) limits any vulnerability to the | |||
| | first TLS exchange. | ||||
| Alternatively, in a case where a /sen request immediately follows a | ||||
| /crts, a client MAY choose to keep the connection authenticated by | ||||
| the Implicit TA open for efficiency reasons (Section 3). A client | ||||
| that interleaves EST-coaps /crts request with other requests in the | ||||
| same DTLS connection SHOULD revalidate the server certificate chain | ||||
| against the updated Explicit TA from the /crts response before | ||||
| proceeding with the subsequent requests. If the server certificate | ||||
| chain does not authenticate against the database, the client SHOULD | ||||
| close the connection without completing the rest of the requests. | ||||
| The updated Explicit TA MUST continue to be used in new DTLS | ||||
| connections. | ||||
| In cases where the Initial Device Identifier (IDevID) used to | ||||
| authenticate the client is expired, the server MAY still authenticate | ||||
| the client because IDevIDs are expected to live as long as the device | ||||
| itself (Section 3). In such occasions, checking the certificate | ||||
| revocation status or authorizing the client using another method is | ||||
| important for the server to raise its confidence that the client can | ||||
| be trusted. | ||||
| In accordance with [RFC7030], TLS cipher suites that include | In accordance with [RFC7030], TLS cipher suites that include | |||
| "_EXPORT_" and "_DES_" in their names MUST NOT be used. More | "_EXPORT_" and "_DES_" in their names MUST NOT be used. More | |||
| recommendations for secure use of TLS and DTLS are included in | recommendations for secure use of TLS and DTLS are included in | |||
| [BCP195]. | [BCP195]. | |||
| As described in CMC, Section 6.7 of [RFC5272], "For keys that can be | As described in Certificate Management over CMS (CMC), Section 6.7 of | |||
| used as signature keys, signing the certification request with the | [RFC5272], "For keys that can be used as signature keys, signing the | |||
| private key serves as a PoP on that key pair". The inclusion of tls- | certification request with the private key serves as a POP on that | |||
| unique in the certificate request links the proof-of-possession to | key pair". In (D)TLS 1.2, the inclusion of tls-unique in the | |||
| the TLS proof-of-identity. This implies but does not prove that only | certificate request links the proof-of-possession to the (D)TLS | |||
| the authenticated client currently has access to the private key. | proof-of-identity. This implies but does not prove that only the | |||
| authenticated client currently has access to the private key. | ||||
| What's more, CMC PoP linking uses tls-unique as it is defined in | What's more, CMC POP linking uses tls-unique as it is defined in | |||
| [RFC5929]. The 3SHAKE attack [tripleshake] poses a risk by allowing | [RFC5929]. The 3SHAKE attack [TRIPLESHAKE] poses a risk by allowing | |||
| a man-in-the-middle to leverage session resumption and renegotiation | an on-path active attacker to leverage session resumption and | |||
| to inject himself between a client and server even when channel | renegotiation to inject itself between a client and server even when | |||
| binding is in use. Implementers should use the Extended Master | channel binding is in use. Implementers should use the Extended | |||
| Secret Extension in DTLS [RFC7627] to prevent such attacks. In the | Master Secret Extension in DTLS [RFC7627] to prevent such attacks. | |||
| context of this specification, an attacker could invalidate the | In the context of this specification, an attacker could invalidate | |||
| purpose of the PoP linking ChallengePassword in the client request by | the purpose of the POP linking challengePassword in the client | |||
| resuming an EST-coaps connection. Even though the practical risk of | request by resuming an EST-coaps connection. Even though the | |||
| such an attack to EST-coaps is not devastating, we would rather use a | practical risk of such an attack to EST-coaps is not devastating, we | |||
| more secure channel binding mechanism. Such a mechanism could | would rather use a more secure channel-binding mechanism. In this | |||
| include an updated tls-unique value generation like the tls-unique- | specification, we still depend on the tls-unique mechanism defined in | |||
| prf defined in [I-D.josefsson-sasl-tls-cb] by using a TLS exporter | [RFC5929] for DTLS 1.2 because a 3SHAKE attack does not expose | |||
| [RFC5705] in TLS 1.2 or TLS 1.3's updated exporter (Section 7.5 of | messages exchanged with EST-coaps. But for DTLS 1.3, | |||
| [RFC8446]) value in place of the tls-unique value in the CSR. Such | [TLS13-CHANNEL-BINDINGS] is used instead to derive a 32-byte tls- | |||
| mechanism has not been standardized yet. Adopting a channel binding | exporter binding in place of the tls-unique value in the CSR. That | |||
| value generated from an exporter would break backwards compatibility | would alleviate the risks from the 3SHAKE attack [TRIPLESHAKE]. | |||
| for an RA that proxies through to a classic EST server. Thus, in | ||||
| this specification we still depend on the tls-unique mechanism | ||||
| defined in [RFC5929], especially since a 3SHAKE attack does not | ||||
| expose messages exchanged with EST-coaps. | ||||
| Interpreters of ASN.1 structures should be aware of the use of | Interpreters of ASN.1 structures should be aware of the use of | |||
| invalid ASN.1 length fields and should take appropriate measures to | invalid ASN.1 length fields and should take appropriate measures to | |||
| guard against buffer overflows, stack overruns in particular, and | guard against buffer overflows, stack overruns in particular, and | |||
| malicious content in general. | malicious content in general. | |||
| 10.2. HTTPS-CoAPS Registrar considerations | 9.2. HTTPS-CoAPS Registrar Considerations | |||
| The Registrar proposed in Section 6 must be deployed with care, and | The Registrar proposed in Section 5 must be deployed with care and | |||
| only when direct client-server connections are not possible. When | only when direct client-server connections are not possible. When | |||
| PoP linking is used the Registrar terminating the DTLS connection | POP linking is used, the Registrar terminating the DTLS connection | |||
| establishes a new TLS connection with the upstream CA. Thus, it is | establishes a new TLS connection with the upstream CA. Thus, it is | |||
| impossible for PoP linking to be enforced end-to-end for the EST | impossible for POP linking to be enforced end to end for the EST | |||
| transaction. The EST server could be configured to accept PoP | transaction. The EST server could be configured to accept POP | |||
| linking information that does not match the current TLS session | linking information that does not match the current TLS session | |||
| because the authenticated EST Registrar is assumed to have verified | because the authenticated EST Registrar is assumed to have verified | |||
| PoP linking downstream to the client. | POP linking downstream to the client. | |||
| The introduction of an EST-coaps-to-HTTP Registrar assumes the client | The introduction of an EST-coaps-to-HTTP Registrar assumes the client | |||
| can authenticate the Registrar using its implicit or explicit TA | can authenticate the Registrar using its implicit or explicit TA | |||
| database. It also assumes the Registrar has a trust relationship | database. It also assumes the Registrar has a trust relationship | |||
| with the upstream EST server in order to act on behalf of the | with the upstream EST server in order to act on behalf of the | |||
| clients. When a client uses the Implicit TA database for certificate | clients. When a client uses the Implicit TA database for certificate | |||
| validation, it SHOULD confirm if the server is acting as an RA by the | validation, it SHOULD confirm if the server is acting as an RA by the | |||
| presence of the id-kp-cmcRA EKU [RFC6402] in the server certificate. | presence of the id-kp-cmcRA EKU [RFC6402] in the server certificate. | |||
| In a server-side key generation case, if no end-to-end encryption is | In a server-side key generation case, if no end-to-end encryption is | |||
| used, the Registrar may be able see the private key as it acts as a | used, the Registrar may be able see the private key as it acts as a | |||
| man-in-the-middle. Thus, the client puts its trust on the Registrar | man in the middle. Thus, the client puts its trust on the Registrar | |||
| not exposing the private key. | not exposing the private key. | |||
| Clients that leverage server-side key generation without end-to-end | Clients that leverage server-side key generation without end-to-end | |||
| encryption of the private key (Section 5.8) have no knowledge if the | encryption of the private key (Section 4.8) have no knowledge as to | |||
| Registrar will be generating the private key and enrolling the | whether the Registrar will be generating the private key and | |||
| certificates with the CA or if the CA will be responsible for | enrolling the certificates with the CA or if the CA will be | |||
| generating the key. In such cases, the existence of a Registrar | responsible for generating the key. In such cases, the existence of | |||
| requires the client to put its trust on the registrar when it is | a Registrar requires the client to put its trust on the Registrar | |||
| generating the private key. | when it is generating the private key. | |||
| 11. Contributors | ||||
| Martin Furuhed contributed to the EST-coaps specification by | ||||
| providing feedback based on the Nexus EST over CoAPS server | ||||
| implementation that started in 2015. Sandeep Kumar kick-started this | ||||
| specification and was instrumental in drawing attention to the | ||||
| importance of the subject. | ||||
| 12. Acknowledgements | ||||
| The authors are very grateful to Klaus Hartke for his detailed | ||||
| explanations on the use of Block with DTLS and his support for the | ||||
| Content-Format specification. The authors would like to thank Esko | ||||
| Dijk and Michael Verschoor for the valuable discussions that helped | ||||
| in shaping the solution. They would also like to thank Peter | ||||
| Panburana for his feedback on technical details of the solution. | ||||
| Constructive comments were received from Benjamin Kaduk, Eliot Lear, | ||||
| Jim Schaad, Hannes Tschofenig, Julien Vermillard, John Manuel, Oliver | ||||
| Pfaff, Pete Beal and Carsten Bormann. | ||||
| Interop tests were done by Oliver Pfaff, Thomas Werner, Oskar | ||||
| Camezind, Bjorn Elmers and Joel Hoglund. | ||||
| Robert Moskowitz provided code to create the examples. | ||||
| 13. References | ||||
| 13.1. Normative References | ||||
| [I-D.ietf-core-multipart-ct] | ||||
| Fossati, T., Hartke, K., and C. Bormann, "Multipart | ||||
| Content-Format for CoAP", draft-ietf-core-multipart-ct-04 | ||||
| (work in progress), August 2019. | ||||
| [I-D.ietf-lamps-rfc5751-bis] | 10. References | |||
| Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | ||||
| Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 | ||||
| Message Specification", draft-ietf-lamps-rfc5751-bis-12 | ||||
| (work in progress), September 2018. | ||||
| [I-D.ietf-tls-dtls13] | 10.1. Normative References | |||
| Rescorla, E., Tschofenig, H., and N. Modadugu, "The | ||||
| Datagram Transport Layer Security (DTLS) Protocol Version | ||||
| 1.3", draft-ietf-tls-dtls13-34 (work in progress), | ||||
| November 2019. | ||||
| [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>. | |||
| [RFC2585] Housley, R. and P. Hoffman, "Internet X.509 Public Key | [RFC2585] Housley, R. and P. Hoffman, "Internet X.509 Public Key | |||
| Infrastructure Operational Protocols: FTP and HTTP", | Infrastructure Operational Protocols: FTP and HTTP", | |||
| RFC 2585, DOI 10.17487/RFC2585, May 1999, | RFC 2585, DOI 10.17487/RFC2585, May 1999, | |||
| <https://www.rfc-editor.org/info/rfc2585>. | <https://www.rfc-editor.org/info/rfc2585>. | |||
| skipping to change at page 30, line 41 ¶ | skipping to change at line 1227 ¶ | |||
| [RFC8422] Nir, Y., Josefsson, S., and M. Pegourie-Gonnard, "Elliptic | [RFC8422] Nir, Y., Josefsson, S., and M. Pegourie-Gonnard, "Elliptic | |||
| Curve Cryptography (ECC) Cipher Suites for Transport Layer | Curve Cryptography (ECC) Cipher Suites for Transport Layer | |||
| Security (TLS) Versions 1.2 and Earlier", RFC 8422, | Security (TLS) Versions 1.2 and Earlier", RFC 8422, | |||
| DOI 10.17487/RFC8422, August 2018, | DOI 10.17487/RFC8422, August 2018, | |||
| <https://www.rfc-editor.org/info/rfc8422>. | <https://www.rfc-editor.org/info/rfc8422>. | |||
| [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>. | |||
| 13.2. Informative References | [RFC8551] Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | |||
| Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 | ||||
| Message Specification", RFC 8551, DOI 10.17487/RFC8551, | ||||
| April 2019, <https://www.rfc-editor.org/info/rfc8551>. | ||||
| [RFC8710] Fossati, T., Hartke, K., and C. Bormann, "Multipart | ||||
| Content-Format for the Constrained Application Protocol | ||||
| (CoAP)", RFC 8710, DOI 10.17487/RFC8710, February 2020, | ||||
| <https://www.rfc-editor.org/info/rfc8710>. | ||||
| [RFC9147] Rescorla, E., Tschofenig, H., and N. Modadugu, "The | ||||
| Datagram Transport Layer Security (DTLS) Protocol Version | ||||
| 1.3", RFC 9147, DOI 10.17487/RFC9147, August 2021, | ||||
| <https://www.rfc-editor.org/info/rfc9147>. | ||||
| 10.2. Informative References | ||||
| [BCP195] Sheffer, Y., Holz, R., and P. Saint-Andre, | [BCP195] Sheffer, Y., Holz, R., and P. Saint-Andre, | |||
| "Recommendations for Secure Use of Transport Layer | "Recommendations for Secure Use of Transport Layer | |||
| Security (TLS) and Datagram Transport Layer Security | Security (TLS) and Datagram Transport Layer Security | |||
| (DTLS)", BCP 195, RFC 7525, May 2015, | (DTLS)", BCP 195, RFC 7525, May 2015. | |||
| <https://www.rfc-editor.org/info/bcp195>. | ||||
| [COREparams] | ||||
| "Constrained RESTful Environments (CoRE) Parameters", | ||||
| <https://www.iana.org/assignments/core-parameters/core- | ||||
| parameters.xhtml>. | ||||
| [I-D.ietf-tls-dtls-connection-id] | <https://www.rfc-editor.org/info/bcp195> | |||
| Rescorla, E., Tschofenig, H., and T. Fossati, "Connection | ||||
| Identifiers for DTLS 1.2", draft-ietf-tls-dtls-connection- | ||||
| id-07 (work in progress), October 2019. | ||||
| [I-D.josefsson-sasl-tls-cb] | [CORE-PARAMS] | |||
| Josefsson, S., "Channel Bindings for TLS based on the | IANA, "Constrained RESTful Environments (CoRE) | |||
| PRF", draft-josefsson-sasl-tls-cb-03 (work in progress), | Parameters", | |||
| March 2015. | <https://www.iana.org/assignments/core-parameters/>. | |||
| [I-D.moskowitz-ecdsa-pki] | [IEEE802.15.4] | |||
| Moskowitz, R., Birkholz, H., Xia, L., and M. Richardson, | IEEE, "IEEE 802.15.4-2020 - IEEE Standard for Low-Rate | |||
| "Guide for building an ECC pki", draft-moskowitz-ecdsa- | Wireless Networks", May 2020. | |||
| pki-07 (work in progress), August 2019. | ||||
| [ieee802.15.4] | [IEEE802.1AR] | |||
| "IEEE Standard 802.15.4-2006", 2006. | IEEE, "IEEE Standard for Local and metropolitan area | |||
| networks - Secure Device Identity", December 2009. | ||||
| [ieee802.1ar] | [PKI-GUIDE] | |||
| "IEEE 802.1AR Secure Device Identifier", December 2009. | Moskowitz, R., Birkholz, H., Xia, L., and M. Richardson, | |||
| "Guide for building an ECC pki", Work in Progress, | ||||
| Internet-Draft, draft-moskowitz-ecdsa-pki-10, 31 January | ||||
| 2021, <https://datatracker.ietf.org/doc/html/draft- | ||||
| moskowitz-ecdsa-pki-10>. | ||||
| [PsQs] "Mining Your Ps and Qs: Detection of Widespread Weak Keys | [PsQs] Heninger, N., Durumeric, Z., Wustrow, E., and J. Alex | |||
| in Network Devices", USENIX Security Symposium 2012 ISBN | Halderman, "Mining Your Ps and Qs: Detection of Widespread | |||
| 978-931971-95-9, August 2012. | Weak Keys in Network Devices", USENIX Security Symposium | |||
| 2012, ISBN 978-931971-95-9, August 2012. | ||||
| [RFC4919] Kushalnagar, N., Montenegro, G., and C. Schumacher, "IPv6 | [RFC4919] Kushalnagar, N., Montenegro, G., and C. Schumacher, "IPv6 | |||
| over Low-Power Wireless Personal Area Networks (6LoWPANs): | over Low-Power Wireless Personal Area Networks (6LoWPANs): | |||
| Overview, Assumptions, Problem Statement, and Goals", | Overview, Assumptions, Problem Statement, and Goals", | |||
| RFC 4919, DOI 10.17487/RFC4919, August 2007, | RFC 4919, DOI 10.17487/RFC4919, August 2007, | |||
| <https://www.rfc-editor.org/info/rfc4919>. | <https://www.rfc-editor.org/info/rfc4919>. | |||
| [RFC5272] Schaad, J. and M. Myers, "Certificate Management over CMS | [RFC5272] Schaad, J. and M. Myers, "Certificate Management over CMS | |||
| (CMC)", RFC 5272, DOI 10.17487/RFC5272, June 2008, | (CMC)", RFC 5272, DOI 10.17487/RFC5272, June 2008, | |||
| <https://www.rfc-editor.org/info/rfc5272>. | <https://www.rfc-editor.org/info/rfc5272>. | |||
| [RFC5705] Rescorla, E., "Keying Material Exporters for Transport | ||||
| Layer Security (TLS)", RFC 5705, DOI 10.17487/RFC5705, | ||||
| March 2010, <https://www.rfc-editor.org/info/rfc5705>. | ||||
| [RFC5929] Altman, J., Williams, N., and L. Zhu, "Channel Bindings | [RFC5929] Altman, J., Williams, N., and L. Zhu, "Channel Bindings | |||
| for TLS", RFC 5929, DOI 10.17487/RFC5929, July 2010, | for TLS", RFC 5929, DOI 10.17487/RFC5929, July 2010, | |||
| <https://www.rfc-editor.org/info/rfc5929>. | <https://www.rfc-editor.org/info/rfc5929>. | |||
| [RFC6402] Schaad, J., "Certificate Management over CMS (CMC) | [RFC6402] Schaad, J., "Certificate Management over CMS (CMC) | |||
| Updates", RFC 6402, DOI 10.17487/RFC6402, November 2011, | Updates", RFC 6402, DOI 10.17487/RFC6402, November 2011, | |||
| <https://www.rfc-editor.org/info/rfc6402>. | <https://www.rfc-editor.org/info/rfc6402>. | |||
| [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, | |||
| skipping to change at page 32, line 34 ¶ | skipping to change at line 1323 ¶ | |||
| [RFC7627] Bhargavan, K., Ed., Delignat-Lavaud, A., Pironti, A., | [RFC7627] Bhargavan, K., Ed., Delignat-Lavaud, A., Pironti, A., | |||
| Langley, A., and M. Ray, "Transport Layer Security (TLS) | Langley, A., and M. Ray, "Transport Layer Security (TLS) | |||
| Session Hash and Extended Master Secret Extension", | Session Hash and Extended Master Secret Extension", | |||
| RFC 7627, DOI 10.17487/RFC7627, September 2015, | RFC 7627, DOI 10.17487/RFC7627, September 2015, | |||
| <https://www.rfc-editor.org/info/rfc7627>. | <https://www.rfc-editor.org/info/rfc7627>. | |||
| [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>. | |||
| [RSAfact] "Factoring RSA keys from certified smart cards: | [RFC9146] Rescorla, E., Ed., Tschofenig, H., Ed., Fossati, T., and | |||
| Coppersmith in the wild", Advances in Cryptology | A. Kraus, "Connection Identifiers for DTLS 1.2", RFC 9146, | |||
| - ASIACRYPT 2013, August 2013. | DOI 10.17487/RFC9146, August 2021, | |||
| <https://www.rfc-editor.org/info/rfc9146>. | ||||
| [tripleshake] | [RSA-FACT] Bernstein, D., Chang, Y., Cheng, C., Chou, L., Heninger, | |||
| "Triple Handshakes and Cookie Cutters: Breaking and Fixing | N., Lange, T., and N. Someren, "Factoring RSA keys from | |||
| Authentication over TLS", IEEE Security and Privacy ISBN | certified smart cards: Coppersmith in the wild", Advances | |||
| 978-1-4799-4686-0, May 2014. | in Cryptology - ASIACRYPT 2013, August 2013. | |||
| Appendix A. EST messages to EST-coaps | [TLS13-CHANNEL-BINDINGS] | |||
| Whited, S., "Channel Bindings for TLS 1.3", Work in | ||||
| Progress, Internet-Draft, draft-ietf-kitten-tls-channel- | ||||
| bindings-for-tls13-15, 4 March 2022, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-kitten- | ||||
| tls-channel-bindings-for-tls13-15>. | ||||
| [TRIPLESHAKE] | ||||
| Bhargavan, B., Delignat-Lavaud, A., Fournet, C., Pironti, | ||||
| A., and P. Strub, "Triple Handshakes and Cookie Cutters: | ||||
| Breaking and Fixing Authentication over TLS", | ||||
| ISBN 978-1-4799-4686-0, DOI 10.1109/SP.2014.14, May 2014, | ||||
| <https://doi.org/10.1109/SP.2014.14>. | ||||
| Appendix A. EST Messages to EST-coaps | ||||
| This section shows similar examples to the ones presented in | This section shows similar examples to the ones presented in | |||
| Appendix A of [RFC7030]. The payloads in the examples are the hex | Appendix A of [RFC7030]. The payloads in the examples are the hex- | |||
| encoded binary, generated with 'xxd -p', of the PKI certificates | encoded binary, generated with 'xxd -p', of the PKI certificates | |||
| created following [I-D.moskowitz-ecdsa-pki]. Hex is used for | created following [PKI-GUIDE]. Hex is used for visualization | |||
| visualization purposes because a binary representation cannot be | purposes because a binary representation cannot be rendered well in | |||
| rendered well in text. The hexadecimal representations would not be | text. The hexadecimal representations would not be transported in | |||
| transported in hex, but in binary. The payloads are shown | hex, but in binary. The payloads are shown unencrypted. In | |||
| unencrypted. In practice the message content would be transferred | practice, the message content would be transferred over an encrypted | |||
| over an encrypted DTLS channel. | DTLS channel. | |||
| The certificate responses included in the examples contain Content- | The certificate responses included in the examples contain Content- | |||
| Format 281 (application/pkcs7). If the client had requested Content- | Format 281 (application/pkcs7). If the client had requested Content- | |||
| Format TBD287 (application/pkix-cert) by querying /est/skc, the | Format 287 (application/pkix-cert), the server would respond with a | |||
| server would respond with a single DER binary certificate in the | single DER binary certificate. That certificate would be in a | |||
| multipart-core container. | multipart-core container specifically in the case of a response to a | |||
| /est/skc query. | ||||
| These examples assume a short resource path of "/est". Even though | These examples assume a short resource path of "/est". Even though | |||
| omitted from the examples for brevity, before making the EST-coaps | omitted from the examples for brevity, before making the EST-coaps | |||
| requests, a client would learn about the server supported EST-coaps | requests, a client would learn about the server supported EST-coaps | |||
| resources with a GET request for /.well-known/core?rt=ace.est* as | resources with a GET request for /.well-known/core?rt=ace.est* as | |||
| explained in Section 5.1. | explained in Section 4.1. | |||
| The corresponding CoAP headers are only shown in Appendix A.1. | The corresponding CoAP headers are only shown in Appendix A.1. | |||
| Creating CoAP headers is assumed to be generally understood. | Creating CoAP headers is assumed to be generally understood. | |||
| The message content breakdown is presented in Appendix C. | The message content is presented in plain text in Appendix C. | |||
| A.1. cacerts | A.1. cacerts | |||
| In EST-coaps, a cacerts message can be: | In EST-coaps, a cacerts message can be the following: | |||
| GET example.com:9085/est/crts | GET example.com:9085/est/crts | |||
| (Accept: 281) | (Accept: 281) | |||
| The corresponding CoAP header fields are shown below. The use of | The corresponding CoAP header fields are shown below. The use of | |||
| block and DTLS are worked out in Appendix B. | block and DTLS are shown in Appendix B. | |||
| Ver = 1 | Ver = 1 | |||
| T = 0 (CON) | T = 0 (CON) | |||
| Code = 0x01 (0.01 is GET) | Code = 0x01 (0.01 is GET) | |||
| Token = 0x9a (client generated) | Token = 0x9a (client generated) | |||
| Options | Options | |||
| Option (Uri-Host) | Option (Uri-Host) | |||
| Option Delta = 0x3 (option# 3) | Option Delta = 0x3 (option# 3) | |||
| Option Length = 0xB | Option Length = 0xB | |||
| Option Value = "example.com" | Option Value = "example.com" | |||
| skipping to change at page 34, line 34 ¶ | skipping to change at line 1416 ¶ | |||
| Option Length = 0x4 | Option Length = 0x4 | |||
| Option Value = "crts" | Option Value = "crts" | |||
| Option (Accept) | Option (Accept) | |||
| Option Delta = 0x6 (option# 11+6=17) | Option Delta = 0x6 (option# 11+6=17) | |||
| Option Length = 0x2 | Option Length = 0x2 | |||
| Option Value = 281 | Option Value = 281 | |||
| Payload = [Empty] | Payload = [Empty] | |||
| As specified in Section 5.10.1 of [RFC7252], the Uri-Host and Uri- | As specified in Section 5.10.1 of [RFC7252], the Uri-Host and Uri- | |||
| Port Options can be omitted if they coincide with the transport | Port Options can be omitted if they coincide with the transport | |||
| protocol destination address and port respectively. | protocol destination address and port, respectively. | |||
| A 2.05 Content response with a cert in EST-coaps will then be | A 2.05 Content response with a cert in EST-coaps will then be the | |||
| following: | ||||
| 2.05 Content (Content-Format: 281) | 2.05 Content (Content-Format: 281) | |||
| {payload with certificate in binary format} | {payload with certificate in binary format} | |||
| with CoAP fields | With the following CoAP fields: | |||
| Ver = 1 | Ver = 1 | |||
| T = 2 (ACK) | T = 2 (ACK) | |||
| Code = 0x45 (2.05 Content) | Code = 0x45 (2.05 Content) | |||
| Token = 0x9a (copied from request by server) | Token = 0x9a (copied from request by server) | |||
| Options | Options | |||
| Option (Content-Format) | Option (Content-Format) | |||
| Option Delta = 0xC (option# 12) | Option Delta = 0xC (option# 12) | |||
| Option Length = 0x2 | Option Length = 0x2 | |||
| Option Value = 281 | Option Value = 281 | |||
| skipping to change at page 35, line 42 ¶ | skipping to change at line 1464 ¶ | |||
| 595fcc8e37f8e4354497011be90e56794bd91ad951ab45a3818430818130 | 595fcc8e37f8e4354497011be90e56794bd91ad951ab45a3818430818130 | |||
| 1d0603551d0e041604141df1208944d77b5f1d9dcb51ee244a523f3ef5de | 1d0603551d0e041604141df1208944d77b5f1d9dcb51ee244a523f3ef5de | |||
| 301f0603551d230418301680141df1208944d77b5f1d9dcb51ee244a523f | 301f0603551d230418301680141df1208944d77b5f1d9dcb51ee244a523f | |||
| 3ef5de300f0603551d130101ff040530030101ff300e0603551d0f0101ff | 3ef5de300f0603551d130101ff040530030101ff300e0603551d0f0101ff | |||
| 040403020106301e0603551d110417301581136365727469667940657861 | 040403020106301e0603551d110417301581136365727469667940657861 | |||
| 6d706c652e636f6d300a06082a8648ce3d040302034800304502202b891d | 6d706c652e636f6d300a06082a8648ce3d040302034800304502202b891d | |||
| d411d07a6d6f621947635ba4c43165296b3f633726f02e51ecf464bd4002 | d411d07a6d6f621947635ba4c43165296b3f633726f02e51ecf464bd4002 | |||
| 2100b4be8a80d08675f041fbc719acf3b39dedc85dc92b3035868cb2daa8 | 2100b4be8a80d08675f041fbc719acf3b39dedc85dc92b3035868cb2daa8 | |||
| f05db196a1003100 | f05db196a1003100 | |||
| The breakdown of the payload is shown in Appendix C.1. | The payload is shown in plain text in Appendix C.1. | |||
| A.2. enroll / reenroll | A.2. enroll / reenroll | |||
| During the (re-)enroll exchange the EST-coaps client uses a CSR | During the (re-)enroll exchange, the EST-coaps client uses a CSR | |||
| (Content-Format 286) request in the POST request payload. The Accept | (Content-Format 286) request in the POST request payload. The Accept | |||
| option tells the server that the client is expecting Content-Format | Option tells the server that the client is expecting Content-Format | |||
| 281 (PKCS#7) in the response. As shown in Appendix C.2, the CSR | 281 (PKCS #7) in the response. As shown in Appendix C.2, the CSR | |||
| contains a ChallengePassword which is used for PoP linking | contains a challengePassword, which is used for POP linking | |||
| (Section 4). | (Section 3). | |||
| POST [2001:db8::2:321]:61616/est/sen | POST [2001:db8::2:321]:61616/est/sen | |||
| (Token: 0x45) | (Token: 0x45) | |||
| (Accept: 281) | (Accept: 281) | |||
| (Content-Format: 286) | (Content-Format: 286) | |||
| [ The hexadecimal representation below would NOT be transported | [ The hexadecimal representation below would NOT be transported | |||
| in hex, but in binary. Hex is used because a binary representation | in hex, but in binary. Hex is used because a binary representation | |||
| cannot be rendered well in text. ] | cannot be rendered well in text. ] | |||
| skipping to change at page 37, line 35 ¶ | skipping to change at line 1532 ¶ | |||
| ff958d75419d81a6a245dffae790be95cf75f602f9152618f816a2b23b56 | ff958d75419d81a6a245dffae790be95cf75f602f9152618f816a2b23b56 | |||
| 38e59fd9a3818a30818730090603551d1304023000301d0603551d0e0416 | 38e59fd9a3818a30818730090603551d1304023000301d0603551d0e0416 | |||
| 041496600d8716bf7fd0e752d0ac760777ad665d02a0301f0603551d2304 | 041496600d8716bf7fd0e752d0ac760777ad665d02a0301f0603551d2304 | |||
| 183016801468d16551f951bfc82a431d0d9f08bc2d205b1160300e060355 | 183016801468d16551f951bfc82a431d0d9f08bc2d205b1160300e060355 | |||
| 1d0f0101ff0404030205a0302a0603551d1104233021a01f06082b060105 | 1d0f0101ff0404030205a0302a0603551d1104233021a01f06082b060105 | |||
| 05070804a013301106092b06010401b43b0a01040401020304300a06082a | 05070804a013301106092b06010401b43b0a01040401020304300a06082a | |||
| 8648ce3d0403020349003046022100c0d81996d2507d693f3c48eaa5ee94 | 8648ce3d0403020349003046022100c0d81996d2507d693f3c48eaa5ee94 | |||
| 91bda6db214099d98117c63b361374cd86022100a774989f4c321a5cf25d | 91bda6db214099d98117c63b361374cd86022100a774989f4c321a5cf25d | |||
| 832a4d336a08ad67df20f1506421188a0ade6d349236a1003100 | 832a4d336a08ad67df20f1506421188a0ade6d349236a1003100 | |||
| The breakdown of the request and response is shown in Appendix C.2. | The request and response is shown in plain text in Appendix C.2. | |||
| A.3. serverkeygen | A.3. serverkeygen | |||
| In a serverkeygen exchange the CoAP POST request looks like | In a serverkeygen exchange, the CoAP POST request looks like the | |||
| following: | ||||
| POST 192.0.2.1:8085/est/skg | POST 192.0.2.1:8085/est/skg | |||
| (Token: 0xa5) | (Token: 0xa5) | |||
| (Accept: 62) | (Accept: 62) | |||
| (Content-Format: 286) | (Content-Format: 286) | |||
| [ The hexadecimal representation below would NOT be transported | [ The hexadecimal representation below would NOT be transported | |||
| in hex, but in binary. Hex is used because a binary representation | in hex, but in binary. Hex is used because a binary representation | |||
| cannot be rendered well in text. ] | cannot be rendered well in text. ] | |||
| 3081d03078020100301631143012060355040a0c0b736b67206578616d70 | 3081d03078020100301631143012060355040a0c0b736b67206578616d70 | |||
| 6c653059301306072a8648ce3d020106082a8648ce3d03010703420004c8 | 6c653059301306072a8648ce3d020106082a8648ce3d03010703420004c8 | |||
| b421f11c25e47e3ac57123bf2d9fdc494f028bc351cc80c03f150bf50cff | b421f11c25e47e3ac57123bf2d9fdc494f028bc351cc80c03f150bf50cff | |||
| 958d75419d81a6a245dffae790be95cf75f602f9152618f816a2b23b5638 | 958d75419d81a6a245dffae790be95cf75f602f9152618f816a2b23b5638 | |||
| e59fd9a000300a06082a8648ce3d040302034800304502207c553981b1fe | e59fd9a000300a06082a8648ce3d040302034800304502207c553981b1fe | |||
| 349249d8a3f50a0346336b7dfaa099cf74e1ec7a37a0a760485902210084 | 349249d8a3f50a0346336b7dfaa099cf74e1ec7a37a0a760485902210084 | |||
| 79295398774b2ff8e7e82abb0c17eaef344a5088fa69fd63ee611850c34b | 79295398774b2ff8e7e82abb0c17eaef344a5088fa69fd63ee611850c34b | |||
| 0a | 0a | |||
| The response would follow [I-D.ietf-core-multipart-ct] and could look | The response would follow [RFC8710] and could look like the | |||
| like | following: | |||
| 2.04 Changed | 2.04 Changed | |||
| (Token: 0xa5) | (Token: 0xa5) | |||
| (Content-Format: 62) | (Content-Format: 62) | |||
| [ The hexadecimal representations below would NOT be transported | [ The hexadecimal representations below would NOT be transported | |||
| in hex, but in binary. Hex is used because a binary representation | in hex, but in binary. Hex is used because a binary representation | |||
| cannot be rendered well in text. ] | cannot be rendered well in text. ] | |||
| 84 # array(4) | 84 # array(4) | |||
| 19 011C # unsigned(284) | 19 011C # unsigned(284) | |||
| skipping to change at page 39, line 40 ¶ | skipping to change at line 1596 ¶ | |||
| 2618f816a2b23b5638e59fd9a37b307930090603551d1304023000302c06 | 2618f816a2b23b5638e59fd9a37b307930090603551d1304023000302c06 | |||
| 096086480186f842010d041f161d4f70656e53534c2047656e6572617465 | 096086480186f842010d041f161d4f70656e53534c2047656e6572617465 | |||
| 64204365727469666963617465301d0603551d0e0416041496600d8716bf | 64204365727469666963617465301d0603551d0e0416041496600d8716bf | |||
| 7fd0e752d0ac760777ad665d02a0301f0603551d2304183016801496600d | 7fd0e752d0ac760777ad665d02a0301f0603551d2304183016801496600d | |||
| 8716bf7fd0e752d0ac760777ad665d02a0300a06082a8648ce3d04030203 | 8716bf7fd0e752d0ac760777ad665d02a0300a06082a8648ce3d04030203 | |||
| 48003045022100e95bfa25a08976652246f2d96143da39fce0dc4c9b26b9 | 48003045022100e95bfa25a08976652246f2d96143da39fce0dc4c9b26b9 | |||
| cce1f24164cc2b12b602201351fd8eea65764e3459d324e4345ff5b2a915 | cce1f24164cc2b12b602201351fd8eea65764e3459d324e4345ff5b2a915 | |||
| 38c04976111796b3698bf6379ca1003100 | 38c04976111796b3698bf6379ca1003100 | |||
| The private key in the response above is without CMS EnvelopedData | The private key in the response above is without CMS EnvelopedData | |||
| and has no additional encryption beyond DTLS (Section 5.8). | and has no additional encryption beyond DTLS (Section 4.8). | |||
| The breakdown of the request and response is shown in Appendix C.3 | The request and response is shown in plain text in Appendix C.3. | |||
| A.4. csrattrs | A.4. csrattrs | |||
| Below is a csrattrs exchange | The following is a csrattrs exchange: | |||
| REQ: | REQ: | |||
| GET example.com:61616/est/att | GET example.com:61616/est/att | |||
| RES: | RES: | |||
| 2.05 Content | 2.05 Content | |||
| (Content-Format: 285) | (Content-Format: 285) | |||
| [ The hexadecimal representation below would NOT be transported | [ The hexadecimal representation below would NOT be transported | |||
| in hex, but in binary. Hex is used because a binary representation | in hex, but in binary. Hex is used because a binary representation | |||
| cannot be rendered well in text. ] | cannot be rendered well in text. ] | |||
| 307c06072b06010101011630220603883701311b131950617273652053455 | 307c06072b06010101011630220603883701311b131950617273652053455 | |||
| 420617320322e3939392e31206461746106092a864886f70d010907302c06 | 420617320322e3939392e31206461746106092a864886f70d010907302c06 | |||
| 0388370231250603883703060388370413195061727365205345542061732 | 0388370231250603883703060388370413195061727365205345542061732 | |||
| 0322e3939392e32206461746106092b240303020801010b06096086480165 | 0322e3939392e32206461746106092b240303020801010b06096086480165 | |||
| 03040202 | 03040202 | |||
| A 2.05 Content response should contain attributes which are relevant | A 2.05 Content response should contain attributes that are relevant | |||
| for the authenticated client. This example is copied from | for the authenticated client. This example is copied from | |||
| Section A.2 in [RFC7030], where the base64 representation is replaced | Appendix A.2 of [RFC7030], where the base64 representation is | |||
| with a hexadecimal representation of the equivalent binary format. | replaced with a hexadecimal representation of the equivalent binary | |||
| The EST-coaps server returns attributes that the client can ignore if | format. The EST-coaps server returns attributes that the client can | |||
| they are unknown to him. | ignore if they are unknown to the client. | |||
| Appendix B. EST-coaps Block message examples | Appendix B. EST-coaps Block Message Examples | |||
| Two examples are presented in this section: | Two examples are presented in this section: | |||
| 1. a cacerts exchange shows the use of Block2 and the block headers | 1. A cacerts exchange shows the use of Block2 and the block headers. | |||
| 2. an enroll exchange shows the Block1 and Block2 size negotiation | 2. An enroll exchange shows the Block1 and Block2 size negotiation | |||
| for request and response payloads. | for request and response payloads. | |||
| The payloads are shown unencrypted. In practice the message contents | The payloads are shown unencrypted. In practice, the message | |||
| would be binary formatted and transferred over an encrypted DTLS | contents would be binary formatted and transferred over an encrypted | |||
| tunnel. The corresponding CoAP headers are only shown in | DTLS tunnel. The corresponding CoAP headers are only shown in | |||
| Appendix B.1. Creating CoAP headers is assumed to be generally | Appendix B.1. Creating CoAP headers is assumed to be generally | |||
| known. | known. | |||
| B.1. cacerts | B.1. cacerts | |||
| This section provides a detailed example of the messages using DTLS | This section provides a detailed example of the messages using DTLS | |||
| and BLOCK option Block2. The example block length is taken as 64 | and CoAP Option Block2. The example block length is taken as 64, | |||
| which gives an SZX value of 2. | which gives an SZX value of 2. | |||
| The following is an example of a cacerts exchange over DTLS. The | The following is an example of a cacerts exchange over DTLS. The | |||
| content length of the cacerts response in appendix A.1 of [RFC7030] | content length of the cacerts response in Appendix A.1 of [RFC7030] | |||
| contains 639 bytes in binary in this example. The CoAP message adds | contains 639 bytes in binary in this example. The CoAP message adds | |||
| around 10 bytes in this exmple, the DTLS record around 29 bytes. To | around 10 bytes in this example, and the DTLS record around 29 bytes. | |||
| avoid IP fragmentation, the CoAP Block Option is used and an MTU of | To avoid IP fragmentation, the CoAP Block Option is used and an MTU | |||
| 127 is assumed to stay within one IEEE 802.15.4 packet. To stay | of 127 is assumed to stay within one IEEE 802.15.4 packet. To stay | |||
| below the MTU of 127, the payload is split in 9 packets with a | below the MTU of 127, the payload is split in 9 packets with a | |||
| payload of 64 bytes each, followed by a last tenth packet of 63 | payload of 64 bytes each, followed by a last tenth packet of 63 | |||
| bytes. The client sends an IPv6 packet containing a UDP datagram | bytes. The client sends an IPv6 packet containing a UDP datagram | |||
| with DTLS record protection that encapsulates a CoAP request 10 times | with DTLS record protection that encapsulates a CoAP request 10 times | |||
| (one fragment of the request per block). The server returns an IPv6 | (one fragment of the request per block). The server returns an IPv6 | |||
| packet containing a UDP datagram with the DTLS record that | packet containing a UDP datagram with the DTLS record that | |||
| encapsulates the CoAP response. The CoAP request-response exchange | encapsulates the CoAP response. The CoAP request-response exchange | |||
| with block option is shown below. Block Option is shown in a | with block option is shown below. Block Option is shown in a | |||
| decomposed way (block-option:NUM/M/size) indicating the kind of Block | decomposed way (block-option:NUM/M/size) indicating the kind of Block | |||
| Option (2 in this case) followed by a colon, and then the block | Option (2 in this case) followed by a colon, and then the block | |||
| number (NUM), the more bit (M = 0 in Block2 response means it is last | number (NUM), the more bit (M = 0 in Block2 response means it is last | |||
| block), and block size with exponent (2**(SZX+4)) separated by | block), and block size with exponent (2^(SZX+4)) separated by | |||
| slashes. The Length 64 is used with SZX=2. The CoAP Request is sent | slashes. The Length 64 is used with SZX=2. The CoAP Request is sent | |||
| confirmable (CON) and the Content-Format of the response, even though | Confirmable (CON), and the Content-Format of the response, even | |||
| not shown, is 281 (application/pkcs7-mime; smime-type=certs-only). | though not shown, is 281 (application/pkcs7-mime; smime-type=certs- | |||
| The transfer of the 10 blocks with partially filled block NUM=9 is | only). The transfer of the 10 blocks with partially filled block | |||
| shown below | NUM=9 is shown below. | |||
| GET example.com:9085/est/crts (2:0/0/64) --> | GET example.com:9085/est/crts (2:0/0/64) --> | |||
| <-- (2:0/1/64) 2.05 Content | <-- (2:0/1/64) 2.05 Content | |||
| GET example.com:9085/est/crts (2:1/0/64) --> | GET example.com:9085/est/crts (2:1/0/64) --> | |||
| <-- (2:1/1/64) 2.05 Content | <-- (2:1/1/64) 2.05 Content | |||
| | | | | |||
| | | | | |||
| | | | | |||
| GET example.com:9085/est/crts (2:9/0/64) --> | GET example.com:9085/est/crts (2:9/0/64) --> | |||
| <-- (2:9/0/64) 2.05 Content | <-- (2:9/0/64) 2.05 Content | |||
| The header of the GET request looks like | The header of the GET request looks like the following: | |||
| Ver = 1 | Ver = 1 | |||
| T = 0 (CON) | T = 0 (CON) | |||
| Code = 0x01 (0.1 GET) | Code = 0x01 (0.1 GET) | |||
| Token = 0x9a (client generated) | Token = 0x9a (client generated) | |||
| Options | Options | |||
| Option (Uri-Host) | Option (Uri-Host) | |||
| Option Delta = 0x3 (option# 3) | Option Delta = 0x3 (option# 3) | |||
| Option Length = 0xB | Option Length = 0xB | |||
| Option Value = "example.com" | Option Value = "example.com" | |||
| Option (Uri-Port) | Option (Uri-Port) | |||
| skipping to change at page 42, line 32 ¶ | skipping to change at line 1713 ¶ | |||
| Option Delta = 0x0 (option# 11+0=11) | Option Delta = 0x0 (option# 11+0=11) | |||
| Option Length = 0x4 | Option Length = 0x4 | |||
| Option Value = "crts" | Option Value = "crts" | |||
| Option (Accept) | Option (Accept) | |||
| Option Delta = 0x6 (option# 11+6=17) | Option Delta = 0x6 (option# 11+6=17) | |||
| Option Length = 0x2 | Option Length = 0x2 | |||
| Option Value = 281 | Option Value = 281 | |||
| Payload = [Empty] | Payload = [Empty] | |||
| The Uri-Host and Uri-Port Options can be omitted if they coincide | The Uri-Host and Uri-Port Options can be omitted if they coincide | |||
| with the transport protocol destination address and port | with the transport protocol destination address and port, | |||
| respectively. Explicit Uri-Host and Uri-Port Options are typically | respectively. Explicit Uri-Host and Uri-Port Options are typically | |||
| used when an endpoint hosts multiple virtual servers and uses the | used when an endpoint hosts multiple virtual servers and uses the | |||
| Options to route the requests accordingly. | Options to route the requests accordingly. | |||
| For further detailing the CoAP headers, the first two and the last | To provide further details on the CoAP headers, the first two and the | |||
| blocks are written out below. The header of the first Block2 | last blocks are written out below. The header of the first Block2 | |||
| response looks like | response looks like the following: | |||
| Ver = 1 | Ver = 1 | |||
| T = 2 (ACK) | T = 2 (ACK) | |||
| Code = 0x45 (2.05 Content) | Code = 0x45 (2.05 Content) | |||
| Token = 0x9a (copied from request by server) | Token = 0x9a (copied from request by server) | |||
| Options | Options | |||
| Option | Option | |||
| Option Delta = 0xC (option# 12 Content-Format) | Option Delta = 0xC (option# 12 Content-Format) | |||
| Option Length = 0x2 | Option Length = 0x2 | |||
| Option Value = 281 | Option Value = 281 | |||
| Option | Option | |||
| skipping to change at page 43, line 27 ¶ | skipping to change at line 1745 ¶ | |||
| [ The hexadecimal representation below would NOT be transported | [ The hexadecimal representation below would NOT be transported | |||
| in hex, but in binary. Hex is used because a binary representation | in hex, but in binary. Hex is used because a binary representation | |||
| cannot be rendered well in text. ] | cannot be rendered well in text. ] | |||
| Payload = | Payload = | |||
| 3082027b06092a864886f70d010702a082026c308202680201013100300b | 3082027b06092a864886f70d010702a082026c308202680201013100300b | |||
| 06092a864886f70d010701a082024e3082024a308201f0a0030201020209 | 06092a864886f70d010701a082024e3082024a308201f0a0030201020209 | |||
| 009189bc | 009189bc | |||
| The second Block2: | The header of the second Block2 response looks like the following: | |||
| Ver = 1 | Ver = 1 | |||
| T = 2 (means ACK) | T = 2 (means ACK) | |||
| Code = 0x45 (2.05 Content) | Code = 0x45 (2.05 Content) | |||
| Token = 0x9a (copied from request by server) | Token = 0x9a (copied from request by server) | |||
| Options | Options | |||
| Option | Option | |||
| Option Delta = 0xC (option# 12 Content-Format) | Option Delta = 0xC (option# 12 Content-Format) | |||
| Option Length = 0x2 | Option Length = 0x2 | |||
| Option Value = 281 | Option Value = 281 | |||
| skipping to change at page 44, line 4 ¶ | skipping to change at line 1769 ¶ | |||
| Option Value = 0x1A (block#=1, M=1, SZX=2) | Option Value = 0x1A (block#=1, M=1, SZX=2) | |||
| [ The hexadecimal representation below would NOT be transported | [ The hexadecimal representation below would NOT be transported | |||
| in hex, but in binary. Hex is used because a binary representation | in hex, but in binary. Hex is used because a binary representation | |||
| cannot be rendered well in text. ] | cannot be rendered well in text. ] | |||
| Payload = | Payload = | |||
| df9c99244b300a06082a8648ce3d0403023067310b300906035504061302 | df9c99244b300a06082a8648ce3d0403023067310b300906035504061302 | |||
| 5553310b300906035504080c024341310b300906035504070c024c413114 | 5553310b300906035504080c024341310b300906035504070c024c413114 | |||
| 30120603 | 30120603 | |||
| The 10th and final Block2: | ||||
| The header of the tenth and final Block2 response looks like the | ||||
| following: | ||||
| Ver = 1 | Ver = 1 | |||
| T = 2 (means ACK) | T = 2 (means ACK) | |||
| Code = 0x45 (2.05 Content) | Code = 0x45 (2.05 Content) | |||
| Token = 0x9a (copied from request by server) | Token = 0x9a (copied from request by server) | |||
| Options | Options | |||
| Option | Option | |||
| Option Delta = 0xC (option# 12 Content-Format) | Option Delta = 0xC (option# 12 Content-Format) | |||
| Option Length = 0x2 | Option Length = 0x2 | |||
| Option Value = 281 | Option Value = 281 | |||
| skipping to change at page 44, line 33 ¶ | skipping to change at line 1800 ¶ | |||
| Payload = | Payload = | |||
| 2ec0b4af52d46f3b7ecc9687ddf267bcec368f7b7f1353272f022047a28a | 2ec0b4af52d46f3b7ecc9687ddf267bcec368f7b7f1353272f022047a28a | |||
| e5c7306163b3c3834bab3c103f743070594c089aaa0ac870cd13b902caa1 | e5c7306163b3c3834bab3c103f743070594c089aaa0ac870cd13b902caa1 | |||
| 003100 | 003100 | |||
| B.2. enroll / reenroll | B.2. enroll / reenroll | |||
| In this example, the requested Block2 size of 256 bytes, required by | In this example, the requested Block2 size of 256 bytes, required by | |||
| the client, is transferred to the server in the very first request | the client, is transferred to the server in the very first request | |||
| message. The block size 256=(2**(SZX+4)) which gives SZX=4. The | message. The block size of 256 is equal to (2^(SZX+4)), which gives | |||
| notation for block numbering is the same as in Appendix B.1. The | SZX=4. The notation for block numbering is the same as in | |||
| header fields and the payload are omitted for brevity. | Appendix B.1. The header fields and the payload are omitted for | |||
| brevity. | ||||
| POST [2001:db8::2:1]:61616/est/sen (CON)(1:0/1/256) {CSR (frag# 1)} --> | POST [2001:db8::2:1]:61616/est/sen (CON)(1:0/1/256) | |||
| {CSR (frag# 1)} --> | ||||
| <-- (ACK) (1:0/1/256) (2.31 Continue) | <-- (ACK) (1:0/1/256) (2.31 Continue) | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(1:1/1/256) {CSR (frag# 2)} --> | POST [2001:db8::2:1]:61616/est/sen (CON)(1:1/1/256) | |||
| <-- (ACK) (1:1/1/256) (2.31 Continue) | {CSR (frag# 2)} --> | |||
| . | <-- (ACK) (1:1/1/256) (2.31 Continue) | |||
| . | . | |||
| . | . | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(1:N1/0/256){CSR(frag# N1+1)}--> | . | |||
| | | POST [2001:db8::2:1]:61616/est/sen (CON)(1:N1/0/256) | |||
| ...........Immediate response ......... | {CSR(frag# N1+1)}--> | |||
| | | | | |||
| <-- (ACK) (1:N1/0/256)(2:0/1/256)(2.04 Changed){Cert resp (frag# 1)} | ...........Immediate response ......... | |||
| POST [2001:db8::2:1]:61616/est/sen (CON)(2:1/0/256) --> | | | |||
| <-- (ACK) (2:1/1/256)(2.04 Changed) {Cert resp (frag# 2)} | <-- (ACK) (1:N1/0/256)(2:0/1/256)(2.04 Changed) | |||
| . | {Cert resp (frag# 1)} | |||
| . | POST [2001:db8::2:1]:61616/est/sen (CON)(2:1/0/256) --> | |||
| . | <-- (ACK) (2:1/1/256)(2.04 Changed) | |||
| POST [2001:db8::2:321]:61616/est/sen (CON)(2:N2/0/256) --> | {Cert resp (frag# 2)} | |||
| <-- (ACK) (2:N2/0/256) (2.04 Changed) {Cert resp (frag# N2+1)} | . | |||
| . | ||||
| . | ||||
| POST [2001:db8::2:321]:61616/est/sen (CON)(2:N2/0/256) --> | ||||
| <-- (ACK) (2:N2/0/256) (2.04 Changed) | ||||
| {Cert resp (frag# N2+1)} | ||||
| Figure 5: EST-COAP enrollment with multiple blocks | Figure 6: EST-coaps Enrollment with Multiple Blocks | |||
| N1+1 blocks have been transferred from client to the server and N2+1 | N1+1 blocks have been transferred from client to server, and N2+1 | |||
| blocks have been transferred from server to client. | blocks have been transferred from server to client. | |||
| Appendix C. Message content breakdown | Appendix C. Message Content Breakdown | |||
| This appendix presents the breakdown of the hexadecimal dumps of the | This appendix presents the hexadecimal dumps of the binary payloads | |||
| binary payloads shown in Appendix A. | in plain text shown in Appendix A. | |||
| C.1. cacerts | C.1. cacerts | |||
| The breakdown of cacerts response containing one root CA certificate | The cacerts response containing one root CA certificate is presented | |||
| is | in plain text in the following: | |||
| Certificate: | Certificate: | |||
| Data: | Data: | |||
| Version: 3 (0x2) | Version: 3 (0x2) | |||
| Serial Number: 831953162763987486 (0xb8bb0fe604f6a1e) | Serial Number: 831953162763987486 (0xb8bb0fe604f6a1e) | |||
| Signature Algorithm: ecdsa-with-SHA256 | Signature Algorithm: ecdsa-with-SHA256 | |||
| Issuer: C=US, ST=CA, L=LA, O=Example Inc, | Issuer: C=US, ST=CA, L=LA, O=Example Inc, | |||
| OU=certification, CN=Root CA | OU=certification, CN=Root CA | |||
| Validity | Validity | |||
| Not Before: Jan 31 11:27:03 2019 GMT | Not Before: Jan 31 11:27:03 2019 GMT | |||
| Not After : Jan 26 11:27:03 2039 GMT | Not After : Jan 26 11:27:03 2039 GMT | |||
| skipping to change at page 46, line 48 ¶ | skipping to change at line 1891 ¶ | |||
| X509v3 Subject Alternative Name: | X509v3 Subject Alternative Name: | |||
| email:certify@example.com | email:certify@example.com | |||
| Signature Algorithm: ecdsa-with-SHA256 | Signature Algorithm: ecdsa-with-SHA256 | |||
| 30:45:02:20:2b:89:1d:d4:11:d0:7a:6d:6f:62:19:47:63:5b: | 30:45:02:20:2b:89:1d:d4:11:d0:7a:6d:6f:62:19:47:63:5b: | |||
| a4:c4:31:65:29:6b:3f:63:37:26:f0:2e:51:ec:f4:64:bd:40: | a4:c4:31:65:29:6b:3f:63:37:26:f0:2e:51:ec:f4:64:bd:40: | |||
| 02:21:00:b4:be:8a:80:d0:86:75:f0:41:fb:c7:19:ac:f3:b3: | 02:21:00:b4:be:8a:80:d0:86:75:f0:41:fb:c7:19:ac:f3:b3: | |||
| 9d:ed:c8:5d:c9:2b:30:35:86:8c:b2:da:a8:f0:5d:b1:96 | 9d:ed:c8:5d:c9:2b:30:35:86:8c:b2:da:a8:f0:5d:b1:96 | |||
| C.2. enroll / reenroll | C.2. enroll / reenroll | |||
| The breakdown of the enrollment request is | The enrollment request is presented in plain text in the following: | |||
| Certificate Request: | Certificate Request: | |||
| Data: | Data: | |||
| Version: 0 (0x0) | Version: 0 (0x0) | |||
| Subject: C=US, ST=CA, L=LA, O=example Inc, | Subject: C=US, ST=CA, L=LA, O=example Inc, | |||
| OU=IoT/serialNumber=Wt1234 | OU=IoT/serialNumber=Wt1234 | |||
| Subject Public Key Info: | Subject Public Key Info: | |||
| Public Key Algorithm: id-ecPublicKey | Public Key Algorithm: id-ecPublicKey | |||
| Public-Key: (256 bit) | Public-Key: (256 bit) | |||
| pub: | pub: | |||
| 04:c8:b4:21:f1:1c:25:e4:7e:3a:c5:71:23:bf:2d: | 04:c8:b4:21:f1:1c:25:e4:7e:3a:c5:71:23:bf:2d: | |||
| 9f:dc:49:4f:02:8b:c3:51:cc:80:c0:3f:15:0b:f5: | 9f:dc:49:4f:02:8b:c3:51:cc:80:c0:3f:15:0b:f5: | |||
| 0c:ff:95:8d:75:41:9d:81:a6:a2:45:df:fa:e7:90: | 0c:ff:95:8d:75:41:9d:81:a6:a2:45:df:fa:e7:90: | |||
| be:95:cf:75:f6:02:f9:15:26:18:f8:16:a2:b2:3b: | be:95:cf:75:f6:02:f9:15:26:18:f8:16:a2:b2:3b: | |||
| 56:38:e5:9f:d9 | 56:38:e5:9f:d9 | |||
| ASN1 OID: prime256v1 | ASN1 OID: prime256v1 | |||
| NIST CURVE: P-256 | NIST CURVE: P-256 | |||
| Attributes: | Attributes: | |||
| challengePassword: <256-bit PoP linking value> | challengePassword: <256-bit POP linking value> | |||
| Requested Extensions: | Requested Extensions: | |||
| X509v3 Subject Alternative Name: | X509v3 Subject Alternative Name: | |||
| othername:<unsupported> | othername:<unsupported> | |||
| Signature Algorithm: ecdsa-with-SHA256 | Signature Algorithm: ecdsa-with-SHA256 | |||
| 30:45:02:21:00:92:56:3a:54:64:63:bd:9e:cf:f1:70:d0:fd: | 30:45:02:21:00:92:56:3a:54:64:63:bd:9e:cf:f1:70:d0:fd: | |||
| 1f:2e:f0:d3:d0:12:16:0e:5e:e9:0c:ff:ed:ab:ec:9b:9a:38: | 1f:2e:f0:d3:d0:12:16:0e:5e:e9:0c:ff:ed:ab:ec:9b:9a:38: | |||
| 92:02:20:17:9f:10:a3:43:61:09:05:1a:ba:d1:75:90:a0:9b: | 92:02:20:17:9f:10:a3:43:61:09:05:1a:ba:d1:75:90:a0:9b: | |||
| c8:7c:4d:ce:54:53:a6:fc:11:35:a1:e8:4e:ed:75:43:77 | c8:7c:4d:ce:54:53:a6:fc:11:35:a1:e8:4e:ed:75:43:77 | |||
| The CSR contains a ChallengePassword which is used for PoP linking | The CSR contains a challengePassword, which is used for POP linking | |||
| (Section 4). The CSR also contains an id-on-hardwareModuleName | (Section 3). The CSR also contains an id-on-hardwareModuleName | |||
| hardware identifier to customize the returned certificate to the | hardware identifier to customize the returned certificate to the | |||
| requesting device (See [RFC7299] and [I-D.moskowitz-ecdsa-pki]). | requesting device (See [RFC7299] and [PKI-GUIDE]). | |||
| The issued certificate presented in plain text in the following: | ||||
| The breakdown of the issued certificate is | ||||
| Certificate: | Certificate: | |||
| Data: | Data: | |||
| Version: 3 (0x2) | Version: 3 (0x2) | |||
| Serial Number: 9112578475118446130 (0x7e7661d7b54e4632) | Serial Number: 9112578475118446130 (0x7e7661d7b54e4632) | |||
| Signature Algorithm: ecdsa-with-SHA256 | Signature Algorithm: ecdsa-with-SHA256 | |||
| Issuer: C=US, ST=CA, O=Example Inc, | Issuer: C=US, ST=CA, O=Example Inc, | |||
| OU=certification, CN=802.1AR CA | OU=certification, CN=802.1AR CA | |||
| Validity | Validity | |||
| Not Before: Jan 31 11:29:16 2019 GMT | Not Before: Jan 31 11:29:16 2019 GMT | |||
| Not After : Dec 31 23:59:59 9999 GMT | Not After : Dec 31 23:59:59 9999 GMT | |||
| skipping to change at page 48, line 48 ¶ | skipping to change at line 1971 ¶ | |||
| X509v3 Subject Alternative Name: | X509v3 Subject Alternative Name: | |||
| othername:<unsupported> | othername:<unsupported> | |||
| Signature Algorithm: ecdsa-with-SHA256 | Signature Algorithm: ecdsa-with-SHA256 | |||
| 30:46:02:21:00:c0:d8:19:96:d2:50:7d:69:3f:3c:48:ea:a5: | 30:46:02:21:00:c0:d8:19:96:d2:50:7d:69:3f:3c:48:ea:a5: | |||
| ee:94:91:bd:a6:db:21:40:99:d9:81:17:c6:3b:36:13:74:cd: | ee:94:91:bd:a6:db:21:40:99:d9:81:17:c6:3b:36:13:74:cd: | |||
| 86:02:21:00:a7:74:98:9f:4c:32:1a:5c:f2:5d:83:2a:4d:33: | 86:02:21:00:a7:74:98:9f:4c:32:1a:5c:f2:5d:83:2a:4d:33: | |||
| 6a:08:ad:67:df:20:f1:50:64:21:18:8a:0a:de:6d:34:92:36 | 6a:08:ad:67:df:20:f1:50:64:21:18:8a:0a:de:6d:34:92:36 | |||
| C.3. serverkeygen | C.3. serverkeygen | |||
| The following is the breakdown of the server-side key generation | The following is the server-side key generation request presented in | |||
| request. | plain text: | |||
| Certificate Request: | Certificate Request: | |||
| Data: | Data: | |||
| Version: 0 (0x0) | Version: 0 (0x0) | |||
| Subject: O=skg example | Subject: O=skg example | |||
| Subject Public Key Info: | Subject Public Key Info: | |||
| Public Key Algorithm: id-ecPublicKey | Public Key Algorithm: id-ecPublicKey | |||
| Public-Key: (256 bit) | Public-Key: (256 bit) | |||
| pub: | pub: | |||
| 04:c8:b4:21:f1:1c:25:e4:7e:3a:c5:71:23:bf:2d: | 04:c8:b4:21:f1:1c:25:e4:7e:3a:c5:71:23:bf:2d: | |||
| skipping to change at page 49, line 28 ¶ | skipping to change at line 1997 ¶ | |||
| ASN1 OID: prime256v1 | ASN1 OID: prime256v1 | |||
| NIST CURVE: P-256 | NIST CURVE: P-256 | |||
| Attributes: | Attributes: | |||
| a0:00 | a0:00 | |||
| Signature Algorithm: ecdsa-with-SHA256 | Signature Algorithm: ecdsa-with-SHA256 | |||
| 30:45:02:20:7c:55:39:81:b1:fe:34:92:49:d8:a3:f5:0a:03: | 30:45:02:20:7c:55:39:81:b1:fe:34:92:49:d8:a3:f5:0a:03: | |||
| 46:33:6b:7d:fa:a0:99:cf:74:e1:ec:7a:37:a0:a7:60:48:59: | 46:33:6b:7d:fa:a0:99:cf:74:e1:ec:7a:37:a0:a7:60:48:59: | |||
| 02:21:00:84:79:29:53:98:77:4b:2f:f8:e7:e8:2a:bb:0c:17: | 02:21:00:84:79:29:53:98:77:4b:2f:f8:e7:e8:2a:bb:0c:17: | |||
| ea:ef:34:4a:50:88:fa:69:fd:63:ee:61:18:50:c3:4b:0a | ea:ef:34:4a:50:88:fa:69:fd:63:ee:61:18:50:c3:4b:0a | |||
| Following is the breakdown of the private key content of the server- | The following is the private key content of the server-side key | |||
| side key generation response. | generation response presented in plain text: | |||
| Private-Key: (256 bit) | Private-Key: (256 bit) | |||
| priv: | priv: | |||
| 61:33:6a:86:ac:6e:7a:f4:a9:6f:63:28:30:ad:4e: | 61:33:6a:86:ac:6e:7a:f4:a9:6f:63:28:30:ad:4e: | |||
| 6a:a0:83:76:79:20:60:94:d7:67:9a:01:ca:8c:6f: | 6a:a0:83:76:79:20:60:94:d7:67:9a:01:ca:8c:6f: | |||
| 0c:37 | 0c:37 | |||
| pub: | pub: | |||
| 04:c8:b4:21:f1:1c:25:e4:7e:3a:c5:71:23:bf:2d: | 04:c8:b4:21:f1:1c:25:e4:7e:3a:c5:71:23:bf:2d: | |||
| 9f:dc:49:4f:02:8b:c3:51:cc:80:c0:3f:15:0b:f5: | 9f:dc:49:4f:02:8b:c3:51:cc:80:c0:3f:15:0b:f5: | |||
| 0c:ff:95:8d:75:41:9d:81:a6:a2:45:df:fa:e7:90: | 0c:ff:95:8d:75:41:9d:81:a6:a2:45:df:fa:e7:90: | |||
| be:95:cf:75:f6:02:f9:15:26:18:f8:16:a2:b2:3b: | be:95:cf:75:f6:02:f9:15:26:18:f8:16:a2:b2:3b: | |||
| 56:38:e5:9f:d9 | 56:38:e5:9f:d9 | |||
| ASN1 OID: prime256v1 | ASN1 OID: prime256v1 | |||
| NIST CURVE: P-256 | NIST CURVE: P-256 | |||
| The following is the breakdown of the certificate in the server-side | The following is the certificate in the server-side key generation | |||
| key generation response payload. | response payload presented in plain text: | |||
| Certificate: | Certificate: | |||
| Data: | Data: | |||
| Version: 3 (0x2) | Version: 3 (0x2) | |||
| Serial Number: | Serial Number: | |||
| b3:31:3e:8f:3f:c9:53:8e | b3:31:3e:8f:3f:c9:53:8e | |||
| Signature Algorithm: ecdsa-with-SHA256 | Signature Algorithm: ecdsa-with-SHA256 | |||
| Issuer: O=skg example | Issuer: O=skg example | |||
| Validity | Validity | |||
| Not Before: Sep 4 07:44:03 2019 GMT | Not Before: Sep 4 07:44:03 2019 GMT | |||
| skipping to change at page 50, line 44 ¶ | skipping to change at line 2056 ¶ | |||
| X509v3 Authority Key Identifier: | X509v3 Authority Key Identifier: | |||
| keyid: | keyid: | |||
| 96:60:0D:87:16:BF:7F:D0:E7:52:D0:AC:76:07:77:AD:66:5D:02:A0 | 96:60:0D:87:16:BF:7F:D0:E7:52:D0:AC:76:07:77:AD:66:5D:02:A0 | |||
| Signature Algorithm: ecdsa-with-SHA256 | Signature Algorithm: ecdsa-with-SHA256 | |||
| 30:45:02:21:00:e9:5b:fa:25:a0:89:76:65:22:46:f2:d9:61: | 30:45:02:21:00:e9:5b:fa:25:a0:89:76:65:22:46:f2:d9:61: | |||
| 43:da:39:fc:e0:dc:4c:9b:26:b9:cc:e1:f2:41:64:cc:2b:12: | 43:da:39:fc:e0:dc:4c:9b:26:b9:cc:e1:f2:41:64:cc:2b:12: | |||
| b6:02:20:13:51:fd:8e:ea:65:76:4e:34:59:d3:24:e4:34:5f: | b6:02:20:13:51:fd:8e:ea:65:76:4e:34:59:d3:24:e4:34:5f: | |||
| f5:b2:a9:15:38:c0:49:76:11:17:96:b3:69:8b:f6:37:9c | f5:b2:a9:15:38:c0:49:76:11:17:96:b3:69:8b:f6:37:9c | |||
| Acknowledgements | ||||
| The authors are very grateful to Klaus Hartke for his detailed | ||||
| explanations on the use of Block with DTLS and his support for the | ||||
| Content-Format specification. The authors would like to thank Esko | ||||
| Dijk and Michael Verschoor for the valuable discussions that helped | ||||
| in shaping the solution. They would also like to thank Peter | ||||
| Panburana for his feedback on technical details of the solution. | ||||
| Constructive comments were received from Benjamin Kaduk, Eliot Lear, | ||||
| Jim Schaad, Hannes Tschofenig, Julien Vermillard, John Manuel, Oliver | ||||
| Pfaff, Pete Beal, and Carsten Bormann. | ||||
| Interop tests were done by Oliver Pfaff, Thomas Werner, Oskar | ||||
| Camezind, Bjorn Elmers, and Joel Hoglund. | ||||
| Robert Moskowitz provided code to create the examples. | ||||
| Contributors | ||||
| Martin Furuhed contributed to the EST-coaps specification by | ||||
| providing feedback based on the Nexus EST-over-CoAPS server | ||||
| implementation that started in 2015. Sandeep Kumar kick-started this | ||||
| specification and was instrumental in drawing attention to the | ||||
| importance of the subject. | ||||
| Authors' Addresses | Authors' Addresses | |||
| Peter van der Stok | Peter van der Stok | |||
| Consultant | Consultant | |||
| Email: stokcons@bbhmail.nl | ||||
| Email: consultancy@vanderstok.org | ||||
| Panos Kampanakis | Panos Kampanakis | |||
| Cisco Systems | Cisco Systems | |||
| Email: pkampana@cisco.com | Email: pkampana@cisco.com | |||
| Michael C. Richardson | Michael C. Richardson | |||
| Sandelman Software Works | Sandelman Software Works | |||
| Email: mcr+ietf@sandelman.ca | Email: mcr+ietf@sandelman.ca | |||
| URI: http://www.sandelman.ca/ | URI: https://www.sandelman.ca/ | |||
| Shahid Raza | Shahid Raza | |||
| RISE SICS | RISE Research Institutes of Sweden | |||
| Isafjordsgatan 22 | Isafjordsgatan 22 | |||
| Kista, Stockholm 16440 | SE-16440 Kista, Stockholm | |||
| SE | Sweden | |||
| Email: shahid.raza@ri.se | ||||
| Email: shahid@sics.se | ||||
| End of changes. 249 change blocks. | ||||
| 934 lines changed or deleted | 811 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/ | ||||