Internet-Draft | Join Proxy | January 2025 |
Richardson, et al. | Expires 27 July 2025 | [Page] |
This document extends the constrained Bootstrapping Remote Secure Key Infrastructures (cBRSKI) onboarding protocol by adding a new network function, the constrained Join Proxy. This function can be implemented by a constrained node [RFC7228]. The goal of the Join Proxy is to help new constrained nodes ("Pledges") securely onboard into a new IP network using the cBRSKI protocol. It acts as a circuit proxy for User Datagram Protocol (UDP) packets that carry the onboarding messages. The solution is extendible to support other UDP-based onboarding protocols as well. The Join Proxy functionality is designed for use in constrained networks [RFC7228], including IPv6 over Low-Power Wireless Personal Area Networks (6LoWPAN) [RFC4944] based mesh networks in which the onboarding authority server ("Registrar") may be multiple IP hops away from a Pledge. Despite this distance, the Pledge only needs to use link-local UDP communication to complete cBRSKI onboarding. Two modes of Join Proxy operation are defined, stateless and stateful, to allow implementers to make different trade-offs regarding resource usage, implementation complexity and security.¶
This note is to be removed before publishing as an RFC.¶
Status information for this document may be found at https://datatracker.ietf.org/doc/draft-ietf-anima-constrained-join-proxy/.¶
Discussion of this document takes place on the anima Working Group mailing list (mailto:anima@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/anima/. Subscribe at https://www.ietf.org/mailman/listinfo/anima/.¶
Source for this draft and an issue tracker can be found at https://github.com/anima-wg/constrained-join-proxy.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 27 July 2025.¶
Copyright (c) 2025 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
The Bootstrapping Remote Secure Key Infrastructure (BRSKI) protocol described in [RFC8995] provides a solution for a secure zero-touch (automated) bootstrap of new, unconfigured devices. In the context of BRSKI, new devices, called "Pledges", are equipped with a factory-installed Initial Device Identifier (IDevID) [ieee802-1AR], and are enrolled into a network. BRSKI makes use of Enrollment over Secure Transport (EST) [RFC7030] with [RFC8366bis] signed vouchers to securely enroll devices. A Registrar provides the trust anchor of the network domain to which a Pledge enrolls.¶
[cBRSKI] defines a version of BRSKI that is suitable for constrained nodes ([RFC7228]) and for operation on constrained networks ([RFC7228]) including Low-Power and Lossy Networks (LLN) [RFC7102]. It uses Constrained Application Protocol (CoAP) [RFC7252] messages secured by Datagram Transport Layer Security (DTLS) [RFC9147] to implement the BRSKI functions defined by [RFC8995].¶
In this document, cBRSKI is extended such that a cBRSKI Pledge can connect to a Registrar via a constrained Join Proxy. In particular, this solution is intended to support IPv6 over Low-Power Wireless Personal Area Networks (6LoWPAN) [RFC4944] mesh networks. 6TiSCH networks are not in scope of this document since these use the CoJP [RFC9031] proxy mechanism.¶
The Join Proxy as specified in this document is one of the Join Proxy options referred to in Section 2.5.2 of [RFC8995] as future work.¶
However, in IP networks that require node authentication, such as those using 6LoWPAN [RFC4944], data to and from the Pledge will not be routable over the IP network before it is properly authenticated to the network. A new Pledge can initially only use a link-local IPv6 address to communicate with a mesh neighbor [RFC6775] until it receives the necessary network configuration parameters.¶
Before it can receive these parameters, the Pledge needs to be authenticated and authorized to onboard the
network. This is done in cBRSKI through an end-to-end encrypted DTLS session with a domain Registrar.¶
When this Registrar is not a direct (link-local) neighbor of the Pledge but several hops away, the Pledge
needs to discover a link-local neighbor that is operating as a constrained Join Proxy, which helps
forward the DTLS messages of the session between Pledge and Registrar.¶
Because the Join Proxy is a regular network node that has already been onboarded onto the network, it can send IP packets to the Registrar which are then routed over one or more hops over the mesh network -- and potentially over other IP networks too, before reaching the Registrar. Likewise, the Registrar sends its response IP packets which are routed back to the Join Proxy over the mesh network.¶
Once a Pledge has enrolled onto the network in this manner, it can optionally be configured itself as a new constrained Join Proxy. In this role it can help other Pledges perform the cBRSKI onboarding process.¶
Two modes of operation for a constrained Join Proxy are specified:¶
A stateful Join Proxy that locally stores UDP connection state per Pledge.¶
A stateless Join Proxy that does not locally store UDP connection state, but stores it in the header of a message that is exchanged between the Join Proxy and the Registrar.¶
Similar to the difference between storing and non-storing Modes of Operations (MOP) in RPL [RFC6550], the stateful and stateless modes differ in the way that they store the state required to forward return UDP packets from the Registrar back to the Pledge.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
The following terms are defined in [RFC8366bis] and [RFC8995], and are used identically in this document: artifact, Circuit Proxy, Join Proxy, domain, imprint, Registrar, Pledge, and Voucher.¶
The term "installation" refers to all devices in the network and their interconnections, including Registrar, enrolled nodes (with and without constrained Join Proxy functionality) and Pledges (not yet enrolled).¶
(Installation) IP addresses are assumed to be routable over the whole installation network, except for link-local IP addresses.¶
The term "Join Proxy" is used in this document with the same definition as in [RFC8995]. However, in this document it refers specifically to a Join Proxy that can support Pledges to onboard using a UDP-based protocol, such as the cBRSKI protocol [cBRSKI]. This protocol operates over an end-to-end secured DTLS session between a Pledge and a cBRSKI Registrar.¶
The acronym "JPY" is used to refer to a new protocol and JPY message format defined by this document. The message can be seen as a "Join Proxy Yoke": connecting two data items and letting these travel together over a network.¶
Because UDP does not have the notion of a connection, the term "UDP connection" in this document refers to a pseudo-connection, whose establishment on the Join Proxy is triggered by receipt of a first UDP packet from a new Pledge source.¶
The term "endpoint" is used as defined in [RFC7252].¶
The terms "6LoWPAN Router" (6LR), "6LoWPAN Border Router" (6LBR) and "6LoWPAN link" are used as defined in [RFC6775].¶
Details of the IP address and port notation used in the Join Proxy specification are provided in Section 4.2.¶
As depicted in Figure 1, the Pledge (P), in a network such as a 6LoWPAN [RFC4944] mesh network
can be more than one hop away from the Registrar (R) and it is not yet authenticated to the network.
Also, the Pledge does not possess any key material to encrypt or decrypt link-layer data transmissions.¶
In this situation, the Pledge can only communicate one-hop to its neighbors, such as the constrained Join Proxy (J), using link-local IPv6 addresses and using no link-layer encryption. However, the Pledge needs to communicate with end-to-end security with a Registrar to authenticate and obtain its domain identity/credentials. In the case of cBRSKI, the domain identity is an X.509 certificate. Domain credentials may include key material for network access.¶
So one problem is that there is no IP routability between the Pledge and the Registrar, via intermediate nodes such as 6LoWPAN Routers (6LRs), despite the need for an end-to-end secured session between both.¶
Furthermore, the Pledge is not be able to discover the IP address of the Registrar because it is not yet allowed onto the network.¶
To overcome these problems, the constrained Join Proxy is introduced. This is specific functionality that all, or a specific subset of, authenticated nodes in an IP network can implement. When the Join Proxy functionality is enabled in a node, it can help a neighboring Pledge securely onboard the network.¶
The Join Proxy performs relaying of UDP packets from the Pledge to the intended Registrar, and relaying of the subsequent return packets. An authenticated Join Proxy can discover the routable IP address of the Registrar, as specified in this document. Future methods of Registrar discovery can also be easily added.¶
The Join Proxy acts as a packet-by-packet proxy for UDP packets between Pledge and Registrar.
The cBRSKI protocol between Pledge and Registrar [cBRSKI] which this Join Proxy supports
uses UDP messages with DTLS-encrypted CoAP payloads, but the Join Proxy as described here is unaware
of these payloads.
The Join Proxy solution can therefore be easily extended to work for other UDP-based protocols,
as long as these protocols are agnostic to (or can be made to work with) the change of the IP and UDP headers
performed by the Join Proxy.¶
In summary, the following steps are typically taken for the onboarding process of a Pledge:¶
Join Proxies in the network learn the IP address and UDP port of the Registrar.¶
A new Pledge arrives: it discovers one or more Join Proxies and selects one.¶
The Pledge sends a link-local UDP message to the selected Join Proxy.¶
The Join Proxy relays the message to the Registrar (and port) discovered in step 1.¶
The Registrar sends a response UDP message back to the Join Proxy.¶
The Join Proxy relays the message back to the Pledge.¶
Step 3 to 6 repeat as needed, for multiple messages, to complete the onboarding protocol.¶
The Pledge uses its obtained domain identity/credentials to join the domain network.¶
To reach the Registrar in step 4, the Join Proxy needs to be either configured with a Registrar address or needs to dynamically discover a Registrar as detailed in Section 5.1. This configuration/discovery is specified here as step 1. Alternatively, in case of automated discovery it can also happen on-demand in step 4, at the moment that the Join Proxy has data to send to the Registrar. For step 1, it is out of scope how a Join Proxy selects a Registrar when it discovers two or more. That is the subject of future work.¶
The Join Proxy has been specifically designed to set up an entire 6LoWPAN mesh network using cBRSKI onboarding. This section outlines how this process works and highlights the role that the Join Proxy plays in forming the mesh network.¶
Typically, the first node to be set up is a 6LoWPAN Border Router (6LBR) which will form the new mesh network and decide on the network's configuration. The 6LBR may be configured using for example one of the below methods. Note that multiple methods may be used within the scope of a single installation.¶
Manual administrative configuration¶
Use non-constrained BRSKI [RFC8995] to automatically onboard over its high-speed network interface when it gets powered on.¶
Use cBRSKI [cBRSKI] to automatically onboard over its high-speed network interface when it gets powered on.¶
Once the 6LBR is enabled, it requires an active Registrar reachable via IP communication to onboard any Pledges.
Once cBRSKI onboarding is enabled (either administratively, or automatically) on the 6BLR, it can support
the onboarding of 6LoWPAN-enabled Pledges, via its 6LoWPAN network interface.
This 6LBR may host the cBRSKI Registrar itself, but the Registrar may also be hosted
elsewhere on the installation network.¶
At the time the Registrar and the 6LBR are enabled, there may be zero Pledges, or there may be already one or more installed and powered Pledges waiting - periodically attempting to discover a Join Proxy over their 6LoWPAN network interface.¶
A Registrar hosted on the 6LBR will, per [cBRSKI], make itself discoverable as a Join Proxy so that Pledges can use it for cBRSKI onboarding over a 6LoWPAN link (one hop). Note that only some of Pledges waiting to onboard may be direct neighbors of the Registrar/6LBR. Other Pledges would need their traffic to be relayed by Join Proxies across one or more enrolled mesh devices (6LR, see Figure 1) in order to reach the Registrar/6LBR. For this purpose, all or a subset of the enrolled Pledges start to act as Join Proxies themselves. Which subset is selected, and when the Join Proxy function is enabled by a node, is out of scope of this document.¶
The desired end state of the installation includes a network with a Registrar and all Pledges successfully enrolled in the network domain and connected to one of the 6LoWPAN mesh networks that are part of the installation. New Pledges may also be added by future network maintenance work on the installation.¶
Pledges employ link-local communication until they are enrolled, at which point they stop being a "Pledge". A Pledge will periodically try to discover a Join Proxy using for example link-local discovery requests, as defined in [cBRSKI]. Pledges that are neighbors of the Registrar will discover the Registrar itself (which is posing as a Join Proxy) and will be enrolled first, using cBRSKI. The Pledges that are not a neighbor of the Registrar will at first fail to find a Join Proxy. Later on, they will eventually discover a Join Proxy so that they can be enrolled with cBRSKI too. While this continues, more and more Join Proxies with a larger hop distance to the Registrar will emerge. The mesh network auto-configures in this way, such that at the end of the onboarding process, all Pledges are enrolled into the network domain and connected to the mesh network.¶
In order to accommodate automatic configuration of the Join Proxy, it MUST discover the location and capabilities of the Registrar, in case this information is not configured already.¶
In BRSKI [RFC8995] the GeneRic Autonomic Signaling Protocol (GRASP) [RFC8990] protocol is supported for discovery of a BRSKI Registrar in an Autonomic Control Plane (ACP). However, this document does not target the ACP context of use. Therefore, the definition of how to use GRASP for discovering a cBRSKI Registrar is left to future work such as [I-D.ietf-anima-brski-discovery].¶
Although multiple discovery methods can be supported in principle by a single Join Proxy, this document only defines one default method for a Join Proxy to discover a Registrar: using CoAP resource discovery queries [RFC6690] [RFC7252].¶
The CoAP discovery query to use depends on the intended mode of operation of the Join Proxy, stateless or stateful. A stateless Join Proxy needs to discover a UDP endpoint (address and port) that can accept JPY messages. On the other hand, a stateful Join Proxy needs to discover a single CoAPS endpoint that offers the full set of cBRSKI Registrar resources.¶
The stateless Join Proxy can discover the JPY protocol endpoint of the Registrar by sending a multicast CoAP GET discovery query to the "/.well-known/core" resource including a resource type (rt) query parameter "brski.rjp". The latter CoAP resource type is defined in Section 8.1.¶
Upon success, the return payload will contain the port of the Registrar on which the JPY protocol handler is hosted. This exchange is shown below:¶
REQ: GET coap://[ff05::fd]/.well-known/core?rt=brski.rjp RES: 2.05 Content Content-Format: 40 Payload: <coaps+jpy://[ipv6_address]:port>;rt=brski.rjp¶
In this case, the multicast CoAP request is sent to the site-local "All CoAP Nodes" multicast IPv6 address
ff05::fd
.
In some deployments, a smaller scope than site-local is more appropriate to reduce the network load due to this
CoAP discovery traffic.
For example, in a 6LoWPAN mesh network where a JPY protocol endpoint is always hosted on a 6LoWPAN Border Router (6LBR),
the realm-local scope "All CoAP Nodes" address ff03::fd
can be used.¶
The reason that the IPv6 address (field ipv6_address
) is always included in the link-format result is that
in the [RFC6690] link format, and per Section 3.2 of [RFC3986], the authority component cannot include only a port
number but has to include also the IP address.¶
The returned port is expected to process the encapsulated JPY messages described in Section 4.5.
The scheme is coaps+jpy
, described in Section 8.2, and not regular coaps
because the JPY messages effectively
form a new protocol that encapsulates CoAPS.¶
The stateful Join Proxy can discover the Registrar's cBRSKI resource set by sending a multicast CoAP GET
discovery query to the "/.well-known/core" resource including a resource type (rt) query parameter "brski".
The latter CoAP resource type is defined in [cBRSKI].¶
Upon success, the return payload will contain the URI path and port of the Registrar on which the cBRSKI resources are hosted. This exchange is shown below:¶
REQ: GET coap://[ff05::fd]/.well-known/core?rt=brski RES: 2.05 Content Content-Format: 40 Payload: <coaps://[ipv6_address]:port/uri_path>;rt=brski¶
The port
field and its preceding colon are optionally included: if elided, the default CoAPS port 5684 is implied.
The uri_path
field may be a single CoAP URI path resource label, or it may be a hierarchy of resources.
For efficiency, it is RECOMMENDED for the Registrar to configure the URI path as short as possible, for example b
.¶
Note that the Join Proxy does not use the returned uri_path
information, while it uses the ipv6_address
and port
information for its relaying operations.¶
A Registrar with address 2001:db8:0:abcd::52
, with the JPY protocol hosted on port 7634,
and the CoAPS resources hosted on default port 5684 could for example reply to a multicast CoAP query of a stateful
Join Proxy as follows:¶
REQ: GET coap://[ff05::fd]/.well-known/core?rt=brski RES: 2.05 Content Content-Format: 40 Payload: <coaps://[2001:db8:0:abcd::52]/b>;rt=brski¶
The same Registrar could for example reply to a multicast CoAP query of a stateless Join Proxy as follows:¶
REQ: GET coap://[ff05::fd]/.well-known/core?rt=brski.rjp RES: 2.05 Content Content-Format: 40 Payload: <coaps+jpy://[2001:db8:0:abcd::52]:7634>;rt=brski.rjp¶
In these examples, the Join Proxy in a specific mode of operation (stateful or stateless) only queries for those
cBRSKI services that it minimally needs to perform the Join Proxy function in that mode.
For this reason, wildcard queries (such as rt=brski*
) are not sent.¶
Regardless of whether the Join Proxy operates in stateful or stateless mode, it is discovered by the Pledge identically. Section 10 of [cBRSKI] defines the details of the CoAP discovery request sent by the Pledge.¶
A Join Proxy implementation by default MUST support this discovery method. If there is another method configured, by some means outside of the scope of this document, the default method MAY be deactivated.¶
The join-port of the Join Proxy is discovered by sending a multicast GET request to "/.well-known/core" including a resource type (rt) parameter with the value "brski.jp". This value is defined in Section 8.1. Upon success, the return payload will contain the join-port.¶
The example below shows the discovery of the join-port (field join_port
) of the Join Proxy:¶
REQ: GET coap://[ff02::fd]/.well-known/core?rt=brski.jp RES: 2.05 Content Content-Format: 40 Payload: <coaps://[IP_address]:join_port>;rt=brski.jp¶
Note that the join_port
field and preceding colon MAY be absent in the discovery response: this indicates that
the join-port is the default CoAPS port 5684.¶
In the returned CoRE link format document, discoverable port numbers are usually returned for the Join Proxy resource in the <URI-Reference> of the link (see Section 5.1 of [RFC6690] for details).¶
For a Pledge using a Join Proxy, all the security considerations and requirements in Section 4.1 of [RFC8995] apply. While doing discovery of Join Proxies, the Pledge can be deceived by malicious Join Proxy announcements.¶
The subsequent communication of a Pledge with a Registrar that flows via the Join Proxy is end-to-end protected by DTLS.¶
A malicious Join Proxy has a number of relay/routing options for messages sent by a Pledge:¶
It relays messages to a malicious Registrar. This is the same case as the presence of a "malicious Registrar" discussed in [RFC8995].¶
It does not relay messages, or does not return the responses from the Registrar to the Pledge. This is equivalent to the case of a non-responding Registrar discussed in [RFC8995].¶
It uses the returned responses of the Registrar for itself. This is very unlikely due to the DTLS security.¶
It uses the request from the Pledge to take the Pledge certificate and impersonate the Pledge. This is very unlikely because that requires it to acquire the private key of the Pledge.¶
A malicious Pledge may also craft and send messages to a Join Proxy:¶
It can construct an invalid DTLS or UDP message and send it to the open join-port of the Join Proxy. A Join Proxy will accept the message and relay to the Registrar without checking the payload. The Registrar will now parse the invalid message as DTLS protocol payload. Due to the security properties of DTLS, it is highly unlikely that this malicious payload will lead to node acceptance or to Registrar malfunctioning. The Registrar of course MUST be prepared to receive invalid and/or non-DTLS payloads in this way. If the Pledge uses large UDP payloads, the attacker is able to misuse network resources. This way, a DoS attack could be performed by using multiple malicious Pledges, or using a single device posing as multiple Pledges.¶
For a malicious node that is a neighbor of a Join Proxy, or is a router on the path to the Registrar:¶
It may sniff the messages routed by the Join Proxy. It is very unlikely that the malicious node can decrypt the DTLS payload. The malicious node may be able to read the inner data structure in the Header field, if that is not encrypted. This does expose some information about the Pledge attempting to join, but this can be mitigated by the Pledge using a new (random) link-local address for each onboarding attempt.¶
A malicious node has a number of options to craft a JPY message and send it to a stateless Join Proxy:¶
It can construct an invalid JPY message. In that case, a Join Proxy might accept the message and send the Content field data to a Pledge as a UDP message. Such a message could disrupt an ongoing DTLS session. It could also allow the attacker to access an unsecured UDP port that a Pledge may have exposed. For this reason, a Pledge MUST NOT accept messages on other UDP ports than its port used for onboarding while an onboarding attempt is ongoing.¶
It should be noted here that the JPY message CBOR array and the Header field are not DTLS protected. When the communication between stateless Join Proxy and Registrar passes over an unsecure network, an attacker can change the CBOR array, and change the Header field if no encryption is used there. These concerns are also expressed in [RFC8974]. It is also pointed out that the encryption by the source is a local matter. Similar to [RFC8974], the use of AES-CCM [RFC3610] with a 64-bit tag is recommended, combined with a sequence number and a replay window.¶
In some installations, layer 2 (link layer) security is provided between all node pairs of a mesh network. In such an environment, in case all mesh nodes are trusted, and the Registrar is also located on the mesh network, and on-mesh attackers are not considered, then encryption of the Header field as specified in this document is not necessary because the layer 2 security already protects it.¶
This specification registers two new Resource Type (rt=) Link Target Attributes in the "Resource Type (rt=) Link Target Attribute Values" registry under the "Constrained RESTful Environments (CoRE) Parameters" registry group, per the [RFC6690] procedure.¶
Attribute Value: brski.jp Description: Constrained Join Proxy for cBRSKI onboarding protocol. Reference: [This RFC] Attribute Value: brski.rjp Description: cBRSKI Registrar Join Proxy endpoint that supports the JPY protocol. Reference: [This RFC]¶
This specification registers a new URI scheme per [RFC7595] under the IANA "Uniform Resource Identifier (URI) Schemes" registry.¶
Scheme name: coaps+jpy Status: permanent Applications/protocols that use this scheme name: cBRSKI, constrained Join Proxy Contact: ANIMA WG Change controller: IESG References: [This RFC]¶
The scheme specification is provided below.¶
Scheme syntax: identical to the "coaps" scheme defined in [RFC7252].¶
Scheme semantics: identical to the "coaps" scheme, except that the JPY message encapsulation mechanism described in Section 4.5 of [This RFC] is used to transport each CoAPS UDP datagram.¶
Encoding considerations: identical to the "coaps" scheme.¶
Interoperability considerations: identical to the "coaps" scheme.¶
Security considerations: all of the security considerations of the "coaps" scheme apply. Users of this scheme should be aware that as part of the intended use, a UDP message that was formed using the "coaps" scheme is modified by a Join Proxy as defined by [This RFC] into a UDP message conforming to the "coaps+jpy" scheme without the Join Proxy being able to parse/decode which CoAPS URI was originally used by the sender. Depending on the CoAP Options used in the original CoAPS message, this operation may modify elements of the original CoAPS URI (as will be reconstructed by the receiving coaps+jpy server) in a way that is unknown to the Join Proxy.¶
This specification registers two service names under the IANA "Service Name and Transport Protocol Port Number" registry.¶
Service Name: brski-jp Transport Protocol(s): udp Assignee: IESG <iesg@ietf.org> Contact: IESG <iesg@ietf.org> Description: Bootstrapping Remote Secure Key Infrastructure constrained Join Proxy Reference: [This RFC] Service Name: brski-rjp Transport Protocol(s): udp Assignee: IESG <iesg@ietf.org> Contact: IESG <iesg@ietf.org> Description: Bootstrapping Remote Secure Key Infrastructure Registrar join-port used by stateless constrained Join Proxy Reference: [This RFC]¶
[I-D.richardson-anima-state-for-joinrouter] outlined the various options for building a constrained Join Proxy.¶
Many thanks for the comments by Bill Atwood, Carsten Bormann, Brian Carpenter, Spencer Dawkins, Esko Dijk, Toerless Eckert, Russ Housley, Ines Robles, Rich Salz, Jürgen Schönwälder, Mališa Vučinić, and Rob Wilton.¶
This document is very much inspired by text published earlier in [I-D.kumar-dice-dtls-relay]. Sandeep Kumar, Sye loong Keoh, and Oscar Garcia-Morchon are the co-authors of this document. Their draft text has served as a basis for this document.¶
-15 to -16¶
* Security considerations text reviewed and expanded with more attack types. * Define CoAP discovery as default, remove GRASP/6TiSCH (#68). * Abstract updated to describe higher-level concepts (#47). * Applied Spencer's TSVART review comment 2022-05-16 in an improved manner. * Applied Russ' review comments from IOTDIR review 2023-08-09. * Rewrite Section 4.1 based on Russ' review (#48). * Applied Toerless' review comments from WGLC (#63). * Applied review comments of Bill Atwood of 2024-05-21. * Clarify 'context payload' terminology (#49). * Use shorter and consistent term for Join Proxy (#58). * Appendix A corrected to use latest JPY message format. * Author added. * Update reference RFC8366 to RFC8366bis. * Many editorial updates.¶
-13 to -15¶
* Various editorial updates and minor changes.¶
-12 to -13¶
* jpy message encrypted and no longer standardized¶
-11 to -12¶
* many typos fixed and text re-organized * core of GRASP and CoAP discovery moved to constrained-voucher document, only stateless extensions remain¶
-10 to -11¶
* Join Proxy and Registrar discovery merged * GRASP discovery updated * ARTART review * TSVART review¶
-09 to -10¶
* OPSDIR review * IANA review * SECDIR review * GENART review¶
-07 to -09¶
* typos¶
-06 to -07¶
* AD review changes¶
-05 to -06¶
* RT value change to brski.jp and brski.rjp * new registry values for IANA * improved handling of jpy header array¶
-04 to -05¶
* Join Proxy and join-port consistent spelling * some nits removed * restructured discovery * section * rephrased parts of security section¶
-03 to -04¶
* mail address and reference¶
-02 to -03¶
* Terminology updated * Several clarifications on discovery and routability * DTLS payload introduced¶
-01 to -02¶
* Discovery of Join Proxy and Registrar ports¶
-00 to -01¶
* Registrar used throughout instead of EST server * Emphasized Join Proxy port for Join Proxy and Registrar * updated discovery accordingly * updated stateless Join Proxy JPY header * JPY header described with CDDL * Example simplified and corrected¶
-00 to -00¶
* copied from vanderstok-anima-constrained-join-proxy-05¶
This appendix shows an example of a JPY message, sent by a stateless Join Proxy to a Registrar, and an example of the return JPY message sent by the Registrar. The DTLS payload itself, carried in the Content (C) field of the JPY message, is not shown in detail but abbreviated.¶
First, assume that a Pledge creates a CoAP request to a Join Proxy that it has just discovered and selected for performing [cBRSKI] onboarding.¶
This request may be a Pledge Voucher Request (PVR) as follows:¶
POST coaps://[fe80::1234:5678]:45965/.well-known/brski/rv Content-Format: 836 Payload: <bytes of the COSE-signed PVR>¶
Because a DTLS session is not yet established at this point, the first step for the client is to send the DTLS Client Hello message to the Join Proxy's join-port 45965. When the Join Proxy receives this UDP packet, it creates a JPY message with the following UDP payload:¶
82 # array(2) 50 # bytes(16) D01914BCC376A88FFECC50CA6017B0C1 # 59 01AB # bytes(427) 16FEFD0000000000000000019E ... <further bytes of DTLS 1.2 Client Hello>¶
The same JPY message written in CBOR diagnostic notation [RFC8949] is:¶
[ h'd01914bcc376a88ffecc50ca6017b0c1' , h'16fefd0000000000000000019e' ... '3d45' ]¶
Above, the ellipsis ("...") notation in a CBOR diagnostic byte string denotes a further sequence of bytes that is not shown for brevity.¶
The first CBOR byte string wraps the 16 bytes of encrypted state information of the Header (H) field. The second CBOR byte string wraps the 427 bytes of the received DTLS message.¶
After the Registrar has processed the received JPY message, it sends a DTLS 1.2 Hello Verify Request in response to the received Client Hello message. This Hello Verify Request is wrapped in a new JPY message that it sends back to the Join Proxy:¶
82 # array(2) 50 # bytes(16) D01914BCC376A88FFECC50CA6017B0C1 # 58 3C # bytes(60) 16FEFD0000000000000000002F ... <further bytes of DTLS 1.2 Hello Verify Request>¶
The same JPY message in CBOR diagnostic notation is:¶
[ h'd01914bcc376a88ffecc50ca6017b0c1' , h'16fefd0000000000000000002f' ... '66c1' ]¶