diff --git a/draft-ietf-anima-constrained-join-proxy.md b/draft-ietf-anima-constrained-join-proxy.md index c184e54..8bc9351 100644 --- a/draft-ietf-anima-constrained-join-proxy.md +++ b/draft-ietf-anima-constrained-join-proxy.md @@ -3,7 +3,7 @@ v: 3 title: Constrained Join Proxy for Bootstrapping Protocols abbrev: Join Proxy -docname: draft-ietf-anima-constrained-join-proxy-12 +docname: draft-ietf-anima-constrained-join-proxy-13 # stand_alone: true @@ -35,6 +35,7 @@ venue: github: anima-wg/constrained-join-proxy normative: + RFC768: RFC6347: RFC8366: RFC8995: @@ -76,14 +77,18 @@ informative: --- abstract This document extends the work of Bootstrapping Remote Secure Key -Infrastructures (BRSKI) by replacing the Circuit-proxy between -Pledge and Registrar by a stateless/stateful constrained Join -Proxy. The constrained Join Proxy is a mesh neighbor of the +Infrastructures (BRSKI) by replacing the (stateful) TLS Circuit proxy between +Pledge and Registrar with a stateless or stateful Circuit proxy using CoAP +which is called the constrained Join Proxy. The constrained Join Proxy is a mesh neighbor of the Pledge and can relay a DTLS session originating from a Pledge with only link-local addresses to a Registrar which is not a mesh neighbor of the Pledge. -This document defines a protocol to securely assign a Pledge to a domain, represented by a Registrar, using an intermediary node between Pledge and Registrar. This intermediary node is known as a "constrained Join Proxy". An enrolled Pledge can act as a constrained Join Proxy. +Like the BRSKI Circuit proxy, this constrained Join Proxy eliminates the need of +Pledges to have routeable IP addresses before enrolment by utilizing link-local +addresses. Use of the constrained Join Proxy also eliminates the need of the Pledge +to authenticate to the network or perform network-wide Registrar discover before enrolment. + --- middle # Introduction @@ -92,7 +97,13 @@ The Bootstrapping Remote Secure Key Infrastructure (BRSKI) protocol described in 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) (see {{ieee802-1AR}}), and are enrolled into a network. BRSKI makes use of Enrollment over Secure Transport (EST) {{RFC7030}} -with {{RFC8366}} vouchers to securely enroll devices. A Registrar provides the security anchor of the network to which a Pledge enrolls. In this document, BRSKI is extended such that a Pledge connects to "Registrars" via a constrained Join Proxy. In particular, the underlying IP network is assumed to be a mesh network as described in {{RFC4944}}, although other IP-over-foo networks are not excluded. An example network is shown in {{fig-net}}. +with {{RFC8366}} vouchers to securely enroll devices. A Registrar provides the security anchor of the network to which a Pledge enrolls. + +In this document, BRSKI is extended such that a Pledge connects to "Registrars" via a constrained Join Proxy. +In particular, this solution is intended to support mesh networks as described in {{RFC4944}}. + +The constrained Join Proxy as specified in this document is one of the Join Proxy +options referred to in {{RFC8995}} section 2.5.2 as future work. A complete specification of the terminology is pointed at in {{Terminology}}. @@ -103,33 +114,34 @@ CoAP can be run with the Datagram Transport Layer Security (DTLS) {{RFC6347}} as This is known as the "coaps" scheme. A constrained version of EST, using Coap and DTLS, is described in {{RFC9148}}. -The {{I-D.ietf-anima-constrained-voucher}} extends {{RFC9148}} with BRSKI artifacts such as voucher, request voucher, and the protocol extensions for constrained Pledges. +The {{I-D.ietf-anima-constrained-voucher}} extends {{RFC9148}} with BRSKI artifacts such as voucher, request voucher, and the protocol extensions for constrained Pledges that use CoAP. -DTLS is a client-server protocol relying on the underlying IP layer to perform the routing between the DTLS Client and the DTLS Server. -However, the Pledge will not be IP routable over the mesh network +However, in networks that require authentication, such as those using {{RFC4944}}, +the Pledge will not be IP routable over the mesh network until it is authenticated to the mesh network. A new Pledge can only initially use a link-local IPv6 address to communicate with a mesh neighbor [RFC6775] until it receives the necessary network configuration parameters. The Pledge receives these configuration parameters from the Registrar. When the Registrar is not a direct neighbor of the Registrar but several hops away, the Pledge -discovers a neighbor constrained Join Proxy, which transmits the DTLS -protected request coming from the Pledge -to the Registrar. The constrained Join Proxy must be enrolled +discovers a neighbor that is operating the constrained Join Proxy, which +forwards DTLS protected messages between Pledge and Registrar. +The constrained Join Proxy must be enrolled previously such that the message from constrained Join Proxy to Registrar can be routed over one or more hops. -During enrollment, a DTLS connection is required between Pledge and Registrar. - An enrolled Pledge can act as constrained Join Proxy between other Pledges and the enrolling Registrar. -This document specifies a new form of constrained Join Proxy and protocol to act as intermediary between Pledge and Registrar to relay DTLS messages between Pledge and Registrar. Two modes of the constrained Join Proxy are specified: +Two modes of the constrained Join Proxy are specified: - 1 A stateful Join Proxy that locally stores IP addresses + 1 A stateful Join Proxy that locally stores UDP connection state: + IP addresses (link-local with interface and non-link-local and UDP port-numbers. during the connection. 2 A stateless Join Proxy where the connection state - is stored in the messages. + is replaced by a new proxy header in the + UDP messages between constrained Join Proxy and Registrar. + This document is very much inspired by text published earlier in {{I-D.kumar-dice-dtls-relay}}. {{I-D.richardson-anima-state-for-joinrouter}} outlined the various options for building a constrained Join Proxy. @@ -151,31 +163,35 @@ Registrar/Coordinator (JRC), Pledge, and Voucher. In this document, the term "Registrar" is used throughout instead of "Join Registrar/Coordinator (JRC)". -The term "installation network" refers to all devices in the installation and the network connections between them. The term "installation IP_address" refers to an address out of the set of addresses which are routable over the whole installation network. +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. + +(Installation) IP addresses are assumed to be routeable over the whole installation network except for link-local IP addresses. The "Constrained Join Proxy" enables a pledge that is multiple hops away from the Registrar, to securely execute the BRSKI protocol {{RFC8995}} over a secure channel. The term "join Proxy" is used interchangeably with the term "constrained Join Proxy" throughout this document. +The {{RFC8995}} Circuit Proxy is referred to as a TCP circuit Join Proxy. + # Requirements Language {#reqlang} {::boilerplate bcp14} # constrained Join Proxy functionality -As depicted in the {{fig-net}}, the Pledge (P), in a Low-Power and Lossy Network (LLN) mesh +As depicted in the {{fig-net}}, the Pledge (P), in a network such as a Low-Power and Lossy Network (LLN) mesh {{RFC7102}} can be more than one hop away from the Registrar (R) and not yet authenticated into the network. In this situation, the Pledge can only communicate one-hop to its nearest neighbor, the constrained Join Proxy (J) using their link-local IPv6 addresses. However, the Pledge needs to communicate with end-to-end security with a Registrar to authenticate and get the relevant system/network parameters. -If the Pledge, knowing the IP-address of the Registrar, initiates a DTLS connection to the Registrar, then the packets are dropped at the constrained Join Proxy since the Pledge is not yet admitted to the network or there is no IP routability to Pledge for any returned messages from the Registrar. +If the Pledge, knowing the IP-address of the Registrar, initiates a DTLS connection to the Registrar, then the packets are dropped at the constrained Join Proxy since the Pledge is not yet admitted to the network or there is no IP routability to the Pledge for any returned messages from the Registrar. ~~~~ aasvg multi-hop mesh - .---. - | R +---. +----+ +---+ +--+ + .---. IPv6 + | R +---. +----+ +---+ subnet +--+ | | \ |6LR +----+ J |........|P | - '---' `--+ | | | clear | | + '---' `--+ | | | clear | | +----+ +---+ +--+ Registrar Join Proxy Pledge @@ -183,16 +199,31 @@ If the Pledge, knowing the IP-address of the Registrar, initiates a DTLS connect ~~~~ {: #fig-net title='multi-hop enrollment.' align="left"} -Without routing the Pledge cannot establish a secure connection to the Registrar over multiple hops in the network. +Without a routeable IPv6 address, the Pledge (P) cannot exchange IPv6/UDP/DTLS traffic +with the Registrar (R), over multiple hops in the network. -Furthermore, the Pledge cannot discover the IP address of the Registrar over multiple hops to initiate a DTLS connection and perform authentication. +Furthermore, the Pledge may not be able to discover the IP address of the Registrar over multiple hops to initiate a DTLS connection and perform authentication. To overcome the problems with non-routability of DTLS packets and/or discovery of the destination address of the Registrar, the constrained Join Proxy is introduced. -This constrained Join Proxy functionality is configured into all authenticated devices in the network which may act as a constrained Join Proxy for Pledges. +This constrained Join Proxy functionality is also (auto) configured into all authenticated devices in the network which may act as a constrained Join Proxy for Pledges. The constrained Join Proxy allows for routing of the packets from the Pledge using IP routing to the intended Registrar. An authenticated constrained Join Proxy can discover the routable IP address of the Registrar over multiple hops. The following {{jr-spec}} specifies the two constrained Join Proxy modes. A comparison is presented in {{jr-comp}}. -When a mesh network is set up, it consists of a Registrar and a set of connected pledges. No constrained Join Proxies are present. The wanted end-state is a network with a Registrar and a set of enrolled devices. Some of these enrolled devices can act as constrained Join Proxies. Pledges can only employ link-local communication until they are enrolled. A Pledge will regularly try to discover a constrained Join Proxy or a Registrar with link-local discovery requests. The Pledges which are neighbors of the Registrar will discover the Registrar and be enrolled following the BRSKI protocol. An enrolled device can act as constrained Join Proxy. The Pledges which are not a neighbor of the Registrar will eventually discover a constrained Join Proxy and follow the BRSKI protocol to be enrolled. While this goes on, more and more constrained Join Proxies with a larger hop distance to the Registrar will emerge. The network should be configured such that at the end of the enrollment process, all pledges have discovered a neighboring constrained Join Proxy or the Registrar, and all Pledges are enrolled. +When a mesh network is set up, it consists of a Registrar and a set of connected pledges. No constrained Join Proxies are present. Only some of these pledges may be neighbors of the Registrar. Others would need for their traffic to be routed across one or more enrolled devices to reach the Registrar. + +The desired state of the installation is a network with a Registrar and all Pledges becoming enrolled devices. Some of these enrolled devices can act as constrained Join Proxies. Pledges can only employ link-local communication until they are enrolled. A Pledge will regularly try to discover a constrained Join Proxy or a Registrar with link-local discovery requests. The Pledges which are neighbors of the Registrar will discover the Registrar and be enrolled following the constrained BRSKI protocol. An enrolled device can act as constrained Join Proxy. The Pledges which are not a neighbor of the Registrar will eventually discover a constrained Join Proxy and follow the constrained BRSKI protocol to be enrolled. While this goes on, more and more constrained Join Proxies with a larger hop distance to the Registrar will emerge. The network should be configured such that at the end of the enrollment process, all pledges have discovered a neighboring constrained Join Proxy or the Registrar, and all Pledges are enrolled. + +The constrained Join Proxy is as a packet-by-packet proxy for UDP packets between Pledge and +Registrar. The constrained BRSKI protocol between Pledge and Registrar described in +{{I-D.ietf-anima-constrained-voucher}} which this Join Proxy supports +uses UDP messages with DTLS payload, but the Join Proxy as described here is unaware +of this payload. It can therefore potentially also work for other UDP based protocols +as long as they are agnostic to (or can be made to work with) the change of IP header +by the constrained Join Proxy. + +In both Stateless and Stateful mode, the Join Proxy needs to be configured with +or dynamically discover a Registrar to perform its service. This specification does not +discuss how a constrained Join Proxy selects a Registrar when it discovers 2 or more. # constrained Join Proxy specification {#jr-spec} @@ -201,144 +232,217 @@ A Join Proxy can operate in two modes: * Stateful mode * Stateless mode +The advantages and disadvantages of the two modes are presented in {{jr-comp}}. + A Join Proxy MUST implement both. A Registrar MUST implement the stateful mode and SHOULD implement the Stateless mode. -A mechanism to switch between modes is out of scope of this document. It is recommended that a Join Proxy uses only one of these modes at any given moment during an installation lifetime. +For a Join Proxy to be operational, the node on which it is running has to be +able to talk to a Registrar (exchange UDP messages with it). This can happen +fully automatically by the Join Proxy node first enrolling itself as a Pledge, +and then learning the IP address, the UDP port and the mode(s) (Stateful and/or Stateless) +of the Registrar, through a discovery mechanism such as those described in Section 6. +Other methods, such as provisioning the Join Proxy are out of scope of this document +but equally feasible. -The advantages and disadvantages of the two modes are presented in {{jr-comp}}. +Once the Join Proxy is operational, its mode is determined by the mode of the Registrar. +If the Registrar offers both Stateful and Stateless mode, the Join Proxy MUST use +the stateless mode. -## Stateful Join Proxy +Independent of the mode of the Join Proxy, the Pledge first discovers (see Section 6) +and selects the most appropriate Join Proxy. From the discovery, the Pledge learns the +Join Proxies link-local scope IP address and UDP (join) port. This discovery can also be +based upon {{RFC8995}} section 4.1. If the discovery method does not support discovery +of the join-port, then the Pledge assumes the default CoAP over DTLS UDP port (5683). -In stateful mode, the Join Proxy forwards the DTLS messages to the Registrar. +## Stateful Join Proxy {#stateful} -Assume that the Pledge does not know the IP address of the Registrar it needs to contact. -The Join Proxy has been enrolled via the Registrar and learns the IP address and port of the Registrar, by using a discovery mechanism such as described in {{jr-disc}}. The Pledge first discovers (see {{jr-disc}}) and selects the most appropriate Join Proxy. -(Discovery can also be based upon {{RFC8995}} section 4.1). -The Pledge initiates its request as if the Join Proxy is the intended Registrar. The Join Proxy receives the message at a discoverable join-port. -The Join Proxy constructs an IP packet by copying the DTLS payload from the message received from the Pledge, and provides source and destination addresses to forward the message to the intended Registrar. -The Join Proxy stores the 4-tuple array of the messages received from the Registrar and copies it back to the header of the message returned to the Pledge. +In stateful mode, the Join Proxy acts as a UDP "circuit" proxy that does not +change the UDP payload (data octets according to {{RFC768}}) but only rewrites +the IP and UDP headers of each packet it receives from Pledge and Registrar. -In {{fig-statefull2}} the various steps of the message flow are shown, with 5684 being the standard coaps port. The columns "SRc_IP:port" and "Dst_IP:port" show the IP address and port values for the source and destination of the message. +The stateful join proxy operates as a 'pseudo' UDP circuit proxy creating +and utilizing connection mapping state to rewrite the IP address and UDP port number +packet header fields of UDP packets that it forwards between Pledge and Registrar. +{{fig-mapping-state}} explains this mapping state. ~~~~ -+------------+------------+-------------+--------------------------+ -| Pledge | Join Proxy | Registrar | Message | -| (P) | (J) | (R) | Src_IP:port | Dst_IP:port| -+------------+------------+-------------+-------------+------------+ -| --ClientHello--> | IP_P:p_P | IP_Jl:p_Jl | -| --ClientHello--> | IP_Jr:p_Jr| IP_R:5684 | -| | | | -| <--ServerHello-- | IP_R:5684 | IP_Jr:p_Jr | -| : | | | -| <--ServerHello-- : | IP_Jl:p_Jl| IP_P:p_P | -| : : | | | -| [DTLS messages] | : | : | -| : : | : | : | -| --Finished--> : | IP_P:p_P | IP_Jl:p_Jl | -| --Finished--> | IP_Jr:p_Jr| IP_R:5684 | -| | | | -| <--Finished-- | IP_R:5684 | IP_Jr:p_Jr | -| <--Finished-- | IP_Jl:p_Jl| IP_P:p_P | -| : : | : | : | -+---------------------------------------+-------------+------------+ -IP_P:p_P = Link-local IP address and port of Pledge (DTLS Client) -IP_R:5684 = Routable IP address and coaps port of Registrar -IP_Jl:p_Jl = Link-local IP address and join-port of Join Proxy -IP_Jr:p_Jr = Routable IP address and client port of Join Proxy +UDP flow mapping state: + +(IP_p%IF:p_P, IP_Jl%IF:p_Jl) <=> (IP_jr:p_Jr, IP_R:p_r) + + (Src, Dst) Pledge -> Proxy/map -> (Src, Dst) Registrar + (Dst, Src) Pledge <- map/Proxy <- (Dst, Src) Registrar + +IP_P%IF:p_P = Link-local IP address, interface and UDP port of Pledge +IP_Jl%IF:p_Jl = Link-local IP address, interface and UDP port of + Join Proxy on the interface connecting to the Pledge +IP_Jr:p_Jr = Routable IP address and per IP_P%IF:p_P 'client' + UDP port of Join Proxy +IP_R:p_r = Routable IP address and UDP port of Registrar ~~~~ -{: #fig-statefull2 title='constrained stateful joining message flow with Registrar address known to Join Proxy.' align="left"} +{: #fig-mapping-state title='UDP flow mapping state for stateful proxy operations' align="left"} -## Stateless Join Proxy {#jpy-encapsulation-protocol} +Because UDP does not have the notion of a connection, this document +calls this a 'pseudo' connection, whose establishment is solely +triggered by receipt of a packet from a pledge with an +IP_p%IF:p_P source for which no mapping state exists, and that is +termined by a connection expiry timer E. -The JPY Encapsulation Protocol allows the stateless Join Proxy to minimize memory requirements on a constrained Join Proxy device. -The use of a stateless operation requires no memory in the Join Proxy device because it stores the state in a special encapsulation in the packet. This may also reduce the CPU impact as the device does not need to search through a state table. +{{fig-state-machinery}} describes the stateful join proxy state machinery. -If an untrusted Pledge that can only use link-local addressing wants to contact a trusted Registrar, and the Registrar is more than one hop away, it sends its DTLS messages to the Join Proxy. +~~~~ ++--------------+-----------------+----------------+ +| Pledge (P) | Join Proxy (J) | Registrar (R) | ++--------------+-----------------+----------------+ +|A) Connection setup: | +| (P) UDP packet -> (J) | +| (IP_p%IF:p_P, IP_Jl%IF:p_Jl) | +| && no mapping state found | +| | +| 1) allocate unused p_Jr (*1) / | +| open (IP_p%IF:p_P) socket | +| 2) establish mapping state | +| 3) start connection expiry timer E | +| 4) rewrite packet header to | +| (IP_jr:p_Jr, IP_R:p_r) | +| 5) forward packet | +| (J) >- UDP packet -> (R) | ++-------------------------------------------------+ +|B) Forward packet Pledge to Registrar: | +| (P) >- UDP packet -> (J) | +| (IP_p%IF:p_P, IP_Jl%IF:p_Jl): | +| && mapping state for packet found | +| | +| 1) rewrite packet header to | +| (IP_jr:p_Jr, IP_R:p_r) | +| 2) forward packet | +| (J) >- UDP packet -> (R) | +| 3) reset connection expiry timer E | ++-------------------------------------------------+ +|C) Forward packet Registrar to Pledge: | +| (J) <- UDP packet -< (R) | +| (IP_jr:p_Jr, IP_R:p_r) | +| && mapping state for packet found | +| | +| 1) rewrite packet header to | +| (IP_p%IF:p_P, IP_Jl%IF:p_Jl) | +| 2) forward packet | +| (P) <- UDP packet -< (J) | +| 3) reset connection expiry timer E | ++-------------------------------------------------+ +|D) Expire connection: | +| Connection exiry timer E expires: | +| | +| 1) unallocate p_Jr (*1) / | +| close (IP_p%IF:p_P) socket | +| 2) release mapping state | ++-------------------------------------------------+ +~~~~ +{: #fig-state-machinery title='stateful proxy state machinery' align="left"} + +(*1) The stateful proxy requires a unique IP_jr:p_Jr for +every unique IP_p%IF:p_P to be able to correctly map +packets received from the Registrar in step C). The state machinery +assumes that this is achieved by allocating a unique p_Jr for +every unique IP_p%IF:p_P, but proxies could equally use per +IP_p%IF:p_P IP_jr. + +Unless discovery of Registrar information communicates +another value to use with it, E MUST be 30 seconds. + +When a proxy receives an ICMP error message from the Registrar or +Plege, for which mapping state exist, the proxy SHOULD map the +ICMP message as it would map a UDP message in B) or C) and forward +the ICMP message to the Registrar / Pledge. Processing of ICMP +messages SHOULD NOT reset the connection expiry timer. + +To protect itself and the Registrar against malfunctioning Pledges +and or denial of service attacks, the join proxy SHOULD limit the number of simultaneous +mapping states for each IP_p%IF to 2 and the number of simultaneous mapping +states per interface to 10. When mapping state can not be built, the proxy +SHOULD return an ICMP error (1), +"Destination Port Unreachable" message with code (1), "Communication with destination + administratively prohibited". -When a Pledge attempts a DTLS connection to the Join Proxy, it uses its link-local IP address as its IP source address. -This message is transmitted one-hop to a neighboring (Join Proxy) node. -Under normal circumstances, this message would be dropped at the neighbor node since the Pledge is not yet IP routable or is not yet authenticated to send messages through the network. -However, if the neighbor device has the Join Proxy functionality enabled; it routes the DTLS message to its Registrar of choice. +## Stateless Join Proxy {#jpy-encapsulation-protocol} -The Join Proxy transforms the DTLS message to a JPY message which includes the DTLS data as payload, and sends the JPY message to the join-port of the Registrar. +Stateless join proxy operation eliminates the need and complexity to +maintain per UDP connection mapping state on the proxy and the state machinery to build, maintain and +remove this mapping state. It also removes the need to protect this mapping staate +against DoS attacks and may also reduce memory and CPU requirements on the proxy. -The JPY message payload consists of two parts: +Stateless join proxy operations works by introducing a new JPY message payload for messages between Proxy and Registrar, which consists of two parts: - * Header (H) field: consisting of the source link-local address and port of the Pledge (P), and - * Contents (C) field: containing the original DTLS payload. + * Header (H) field: the link-local IP address, interface and UDP (source) port of the Pledge (P). + * Contents (C) field: the original UDP payload (data octets according to RFC768). -On receiving the JPY message, the Registrar (or proxy) retrieves the two parts. +When the join proxy receives a UDP message from a Pledge, it encodes the Pledges +link-local IP address, interface and UDP (source) port of the packet into the Header field +and the UDP payload into the Content field and sends the packet to the Registrar from +a fixed source UDP port. When the Registrar sends packets for the Pledge, +it MUST return the Header field unchanged, so that the join proxy can decode the +Header to reconstruct the Pledges link-local IP address, interace and UDP (destination) port +for the return packet. {{fig-mapping-stateless}} shows this per-packet mapping on the join proxy +using the same terminology as introduced for the stateful proxy in {{fig-mapping-state}}. -The Registrar transiently stores the Header field information. -The Registrar uses the Contents field to execute the Registrar functionality. -However, when the Registrar replies, it also extends its DTLS message with the header field in a JPY message and sends it back to the Join Proxy. -The Registrar SHOULD NOT assume that it can decode the Header Field, it should simply repeat it when responding. -The Header contains the original source link-local address and port of the Pledge from the transient state stored earlier and the Contents field contains the DTLS payload. +~~~~ +(IP_p%IF:p_P, IP_Jl%IF:p_Jl) <=> (IP_jr:p_Jr, IP_R:p_r, H) + + (Src, Dst) Pledge -> Proxy/map -> (Src, Dst, H) Registrar + (Dst, Src) Pledge <- map/Proxy <- (Dst, Src, H) Registrar + +IP_P%IF:p_P = Link-local IP address, interface and UDP port of Pledge +IP_Jl%IF:p_Jl = Link-local IP address, interface and UDP port of + Join Proxy on the interface connecting to the Pledge +IP_Jr:p_Jr = Routable IP address and single 'client' + UDP port of the Join Proxy +IP_R:p_r = Routable IP address and UDP port of Registrar +H = encode(IP_P%IF:p_P) - JPY Header Field +~~~~ +{: #fig-mapping-stateless title='UDP per-packet mapping for stateless proxy operations' align="left"} -On receiving the JPY message, the Join Proxy retrieves the two parts. -It uses the Header field to route the DTLS message containing the DTLS payload retrieved from the Contents field to the Pledge. -In this scenario, both the Registrar and the Join Proxy use discoverable join-ports, for the Join Proxy this may be a default CoAP port. +When the Registrar receives such a JPY message, it MUST treat the Header +H as a single additional opaque identifier for all packets of a UDP connection +from a Plege: Whereas in the stateful proxy case, all packets with the same +(IP_jr:p_Jr, IP_R:p_r) belong to a single Pledges UDP connection and hence +DTLS/CoAP connection, only the packets with the same (IP_jr:p_Jr, IP_R:p_r, H) +belong to a single Plegdes UDP connection / DTLS/CoAP connection. The +JPY Content field payload is the UDP payload of the packet for that UDP +connection. Packets with different H belong to different Pledges UDP connections. -The {{fig-stateless}} depicts the message flow diagram: +In the stateless join proxy mode, both the Registrar and the Join Proxy use discoverable UDP join-ports. For the Join Proxy this may be a default CoAP port. -~~~~ -+--------------+------------+---------------+-----------------------+ -| Pledge | Join Proxy | Registrar | Message | -| (P) | (J) | (R) |Src_IP:port|Dst_IP:port| -+--------------+------------+---------------+-----------+-----------+ -| --ClientHello--> | IP_P:p_P |IP_Jl:p_Jl | -| --JPY[H(IP_P:p_P),--> | IP_Jr:p_Jr|IP_R:p_Ra | -| C(ClientHello)] | | | -| <--JPY[H(IP_P:p_P),-- | IP_R:p_Ra |IP_Jr:p_Jr | -| C(ServerHello)] | | | -| <--ServerHello-- | IP_Jl:p_Jl|IP_P:p_P | -| : | | | -| [ DTLS messages ] | : | : | -| : | : | : | -| --Finished--> | IP_P:p_P |IP_Jr:p_Jr | -| --JPY[H(IP_P:p_P),--> | IP_Jl:p_Jl|IP_R:p_Ra | -| C(Finished)] | | | -| <--JPY[H(IP_P:p_P),-- | IP_R:p_Ra |IP_Jr:p_Jr | -| C(Finished)] | | | -| <--Finished-- | IP_Jl:p_Jl|IP_P:p_P | -| : | : | : | -+-------------------------------------------+-----------+-----------+ -IP_P:p_P = Link-local IP address and port of the Pledge -IP_R:p_Ra = Routable IP address and join-port of Registrar -IP_Jl:p_Jl = Link-local IP address and join-port of Join Proxy -IP_Jr:p_Jr = Routable IP address and port of Join Proxy - -JPY[H(),C()] = Join Proxy message with header H and content C +Because there is only per-packet mapping of the IP / UDP and JPY header of +received UDP packets according to {{fig-mapping-stateless}}, the stateless +mode has no equivalent to {{fig-state-machinery}}. Therefore there is also +no need for any of the requirements against this mapping state (as in +{{stateful}}) for the stateless operation of the join proxy. -~~~~ -{: #fig-stateless title='constrained stateless joining message flow.' align="left"} +Unlike the stateful operation, ICMP error messages from the Registrar can not be +mapped to the Pledge, because the ICMP error messages do not carry enough +bytes of the original packets payload to include the JPY Header. -## Stateless Message structure {#stateless-jpy} +## JPY Message structure {#stateless-jpy} The JPY message is constructed as a payload directly above UDP. -There is no CoAP or DTLS layer as both are within the relayed payload. -Header and Contents fields together are consist of one CBOR {{RFC8949}} array of 2 elements, explained in CDDL {{RFC8610}}: +The JPY message is a CBOR {{RFC8949}} array of 2 elements, specified via CDDL {{RFC8610}} in {{fig-cddl}}: - 1. The context payload. This is a CBOR byte string. It SHOULD be between 8 and 32 bytes in size. - 2. Content field: containing the DTLS payload as a CBOR byte string. - -~~~ - JPY_message = +~~~~ + jpy_message = [ - pledge_context_message : bstr, - content : bstr + jpy_header : bstr, + jpy_content : bstr ] -~~~ +~~~~ {: #fig-cddl title='CDDL representation of JPY message' align="left"} -The Join Proxy cannot decrypt the DTLS payload and has no knowledge of the transported media type. -The contents are DTLS encrypted. + 1. The JPY header field. This is a CBOR byte string. It SHOULD be between 8 and 32 bytes in size. + 2. The JPY Content field: Contains the UDP payload as a CBOR byte string. -The context payload is to be reflected by the Registrar when sending reply packets to the Join Proxy. -The context payload is not standardized. +The jpy\_header is not standardized. It is to be used by the Join Proxy to record which pledge the traffic came from. The Join Proxy SHOULD encrypt this context with a symmetric key known only to the Join Proxy. @@ -348,11 +452,11 @@ The considerations of {{Section 5.2 of RFC8974}} apply. This is intended to be identical to the mechanism described in {{Section 7.1 of RFC9031}}. However, since the CoAP layer is inside of the DTLS layer (which is between the Pledge and the Registrar), it is not possible for the Join Proxy to act as a CoAP proxy. -A typical context parameter might be constructed with the following CDDL grammar: +A typical jpy\_header might be constructed with the following CDDL grammar: (This is illustrative only: the contents are not subject to standardization) ~~~~ - pledge_context_message = [ + jpy_header = [ family: uint .bits 1, ifindex: uint .bits 8, srcport: uint .bits 16, @@ -362,10 +466,10 @@ A typical context parameter might be constructed with the following CDDL grammar This results in a total of 96 bits, or 12 bytes. The structure stores the srcport, the originating IPv6 Link-Local address, the IPv4/IPv6 family (as a single bit) and an ifindex to provide the link-local scope. -This fits nicely into a single AES128 CBC block for instance, resulting in a 16 byte context message. -The Join Proxy MUST maintain the same context block for all communications from the same pledge. +This fits nicely into a single AES128 CBC block for instance, resulting in a 16 byte jpy_header. +The Join Proxy MUST maintain the same jpy\_header for all communications from the same pledge UDP source port. This implies that any encryption key either does not change during the communication, or that when it does, it is acceptable to break any onboarding connections which have not yet completed. -If using a context parameter like defined above, it should be easy for the Join Proxy to meet this requirement without maintaining any local state about the pledge. +If using a jpy\_header like defined above, it should be easy for the Join Proxy to meet this requirement without maintaining any local state about the pledge. Note: when IPv6 is used only the lower 64-bits of the origin IP need to be recorded, because they are all IPv6 Link-Local addresses, so the upper 64-bits are just "fe80::". For IPv4, a Link-Local IPv4 address {{?RFC3927}} would be used, and it would fit into 64-bits. On media where the IID is not 64-bits, a different arrangement will be necessary. @@ -379,13 +483,13 @@ A Join Proxy with multiple CPUs (unlikely in a constrained system, but possible On reception of a JPY message by the Registrar, the Registrar MUST verify that the number of array elements is 2 or more. The pledge_content field must be provided as input to a DTLS library {{RFC9147}}, which along with the 5-tuple of the UDP connection provides enough context for the Registrar to pick an appropriate context. Note that the socket will need to be used for multiple DTLS flows, which is atypical for how DTLS usually uses sockets. -The pledge\_context\_message can be used to select an appropriate DTLS context, as DTLS headers do not contain any kind of of per session context. -The pledge\_context\_message needs to be linked to the DTLS context, and when DTLS records need to be sent, then the pledge\_context\_message needs to be prepended to the data that is sent. +The jpy\_header can be used to select an appropriate DTLS context, as DTLS headers do not contain any kind of of per session context. +The jpy\_header needs to be linked to the DTLS context, and when DTLS records need to be sent, then the jpy\_header needs to be prepended to the data that is sent. Examples are shown in {{examples}}. At the CoAP level, within the Constrained BRSKI and the EST-COAP {{RFC9148}} level, the block option {{RFC7959}} is often used. -The Registrar and the Pledge MUST select a block size that would allow the addition of the JPY\_message header without violating MTU sizes. +The Registrar and the Pledge MUST select a block size that would allow the addition of the jpy\_message header without violating MTU sizes. # Discovery {#jr-disc} diff --git a/draft-ietf-anima-constrained-join-proxy.txt b/draft-ietf-anima-constrained-join-proxy.txt new file mode 100644 index 0000000..48962ff --- /dev/null +++ b/draft-ietf-anima-constrained-join-proxy.txt @@ -0,0 +1,1568 @@ + + + + +anima Working Group M. Richardson +Internet-Draft Sandelman Software Works +Intended status: Standards Track P. van der Stok +Expires: 27 March 2023 vanderstok consultancy + P. Kampanakis + Cisco Systems + 23 September 2022 + + + Constrained Join Proxy for Bootstrapping Protocols + draft-ietf-anima-constrained-join-proxy-13 + +Abstract + + This document extends the work of Bootstrapping Remote Secure Key + Infrastructures (BRSKI) by replacing the (stateful) TLS Circuit proxy + between Pledge and Registrar with a stateless or stateful Circuit + proxy using CoAP which is called the constrained Join Proxy. The + constrained Join Proxy is a mesh neighbor of the Pledge and can relay + a DTLS session originating from a Pledge with only link-local + addresses to a Registrar which is not a mesh neighbor of the Pledge. + + Like the BRSKI Circuit proxy, this constrained Join Proxy eliminates + the need of Pledges to have routeable IP addresses before enrolment + by utilizing link-local addresses. Use of the constrained Join Proxy + also eliminates the need of the Pledge to authenticate to the network + or perform network-wide Registrar discover before enrolment. + +About This Document + + 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/. + + Source for this draft and an issue tracker can be found at + https://github.com/anima-wg/constrained-join-proxy. + +Status of This Memo + + This Internet-Draft is submitted in full conformance with the + provisions of BCP 78 and BCP 79. + + + + +Richardson, et al. Expires 27 March 2023 [Page 1] + +Internet-Draft Join Proxy September 2022 + + + 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 March 2023. + +Copyright Notice + + Copyright (c) 2022 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents (https://trustee.ietf.org/ + license-info) in effect on the date of publication of this document. + Please review these documents carefully, as they describe your rights + and restrictions with respect to this document. Code Components + extracted from this document must include Revised BSD License text as + described in Section 4.e of the Trust Legal Provisions and are + provided without warranty as described in the Revised BSD License. + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 + 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 5 + 3. Requirements Language . . . . . . . . . . . . . . . . . . . . 5 + 4. constrained Join Proxy functionality . . . . . . . . . . . . 6 + 5. constrained Join Proxy specification . . . . . . . . . . . . 7 + 5.1. Stateful Join Proxy . . . . . . . . . . . . . . . . . . . 8 + 5.2. Stateless Join Proxy . . . . . . . . . . . . . . . . . . 11 + 5.3. JPY Message structure . . . . . . . . . . . . . . . . . . 12 + 5.3.1. Processing by Registrar . . . . . . . . . . . . . . . 14 + 6. Discovery . . . . . . . . . . . . . . . . . . . . . . . . . . 14 + 6.1. Discovery operations by Join-Proxy . . . . . . . . . . . 15 + 6.1.1. CoAP discovery . . . . . . . . . . . . . . . . . . . 15 + 6.1.2. GRASP discovery . . . . . . . . . . . . . . . . . . . 16 + 6.2. Pledge discovers Join-Proxy . . . . . . . . . . . . . . . 17 + 6.2.1. CoAP discovery . . . . . . . . . . . . . . . . . . . 17 + 6.2.2. GRASP discovery . . . . . . . . . . . . . . . . . . . 17 + 6.2.3. 6tisch discovery . . . . . . . . . . . . . . . . . . 18 + 7. Comparison of stateless and stateful modes . . . . . . . . . 18 + 8. Security Considerations . . . . . . . . . . . . . . . . . . . 19 + 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 + + + +Richardson, et al. Expires 27 March 2023 [Page 2] + +Internet-Draft Join Proxy September 2022 + + + 9.1. Resource Type Attributes registry . . . . . . . . . . . . 21 + 9.2. CoAPS+JPY Scheme Registration . . . . . . . . . . . . . . 21 + 9.3. service name and port number registry . . . . . . . . . . 21 + 10. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 22 + 11. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 22 + 12. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 22 + 12.1. 13 to 12 . . . . . . . . . . . . . . . . . . . . . . . . 22 + 12.2. 12 to 11 . . . . . . . . . . . . . . . . . . . . . . . . 22 + 12.3. 11 to 10 . . . . . . . . . . . . . . . . . . . . . . . . 22 + 12.4. 10 to 09 . . . . . . . . . . . . . . . . . . . . . . . . 23 + 12.5. 09 to 07 . . . . . . . . . . . . . . . . . . . . . . . . 23 + 12.6. 06 to 07 . . . . . . . . . . . . . . . . . . . . . . . . 23 + 12.7. 05 to 06 . . . . . . . . . . . . . . . . . . . . . . . . 23 + 12.8. 04 to 05 . . . . . . . . . . . . . . . . . . . . . . . . 23 + 12.9. 03 to 04 . . . . . . . . . . . . . . . . . . . . . . . . 23 + 12.10. 02 to 03 . . . . . . . . . . . . . . . . . . . . . . . . 23 + 12.11. 01 to 02 . . . . . . . . . . . . . . . . . . . . . . . . 23 + 12.12. 00 to 01 . . . . . . . . . . . . . . . . . . . . . . . . 23 + 12.13. 00 to 00 . . . . . . . . . . . . . . . . . . . . . . . . 24 + 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 24 + 13.1. Normative References . . . . . . . . . . . . . . . . . . 24 + 13.2. Informative References . . . . . . . . . . . . . . . . . 25 + Appendix A. Stateless Proxy payload examples . . . . . . . . . . 27 + Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 28 + +1. Introduction + + 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) (see [ieee802-1AR]), and + are enrolled into a network. BRSKI makes use of Enrollment over + Secure Transport (EST) [RFC7030] with [RFC8366] vouchers to securely + enroll devices. A Registrar provides the security anchor of the + network to which a Pledge enrolls. + + In this document, BRSKI is extended such that a Pledge connects to + "Registrars" via a constrained Join Proxy. In particular, this + solution is intended to support mesh networks as described in + [RFC4944]. + + The constrained Join Proxy as specified in this document is one of + the Join Proxy options referred to in [RFC8995] section 2.5.2 as + future work. + + A complete specification of the terminology is pointed at in + Section 2. + + + +Richardson, et al. Expires 27 March 2023 [Page 3] + +Internet-Draft Join Proxy September 2022 + + + The specified solutions in [RFC8995] and [RFC7030] are based on POST + or GET requests to the EST resources (/cacerts, /simpleenroll, + /simplereenroll, /serverkeygen, and /csrattrs), and the brski + resources (/requestvoucher, /voucher_status, and /enrollstatus). + These requests use https and may be too large in terms of code space + or bandwidth required for constrained devices. Constrained devices + which may be part of constrained networks [RFC7228], typically + implement the IPv6 over Low-Power Wireless personal Area Networks + (6LoWPAN) [RFC4944] and Constrained Application Protocol (CoAP) + [RFC7252]. + + CoAP can be run with the Datagram Transport Layer Security (DTLS) + [RFC6347] as a security protocol for authenticity and confidentiality + of the messages. This is known as the "coaps" scheme. A constrained + version of EST, using Coap and DTLS, is described in [RFC9148]. + + The [I-D.ietf-anima-constrained-voucher] extends [RFC9148] with BRSKI + artifacts such as voucher, request voucher, and the protocol + extensions for constrained Pledges that use CoAP. + + However, in networks that require authentication, such as those using + [RFC4944], the Pledge will not be IP routable over the mesh network + until it is authenticated to the mesh network. A new Pledge can only + initially use a link-local IPv6 address to communicate with a mesh + neighbor [RFC6775] until it receives the necessary network + configuration parameters. The Pledge receives these configuration + parameters from the Registrar. When the Registrar is not a direct + neighbor of the Registrar but several hops away, the Pledge discovers + a neighbor that is operating the constrained Join Proxy, which + forwards DTLS protected messages between Pledge and Registrar. The + constrained Join Proxy must be enrolled previously such that the + message from constrained Join Proxy to Registrar can be routed over + one or more hops. + + An enrolled Pledge can act as constrained Join Proxy between other + Pledges and the enrolling Registrar. + + Two modes of the constrained Join Proxy are specified: + +1 A stateful Join Proxy that locally stores UDP connection state: + IP addresses (link-local with interface and non-link-local and UDP port-numbers. + during the connection. +2 A stateless Join Proxy where the connection state + is replaced by a new proxy header in the + UDP messages between constrained Join Proxy and Registrar. + + + + + + +Richardson, et al. Expires 27 March 2023 [Page 4] + +Internet-Draft Join Proxy September 2022 + + + This document is very much inspired by text published earlier in + [I-D.kumar-dice-dtls-relay]. + [I-D.richardson-anima-state-for-joinrouter] outlined the various + options for building a constrained Join Proxy. [RFC8995] adopted + only the Circuit Proxy method (1), leaving the other methods as + future work. + + 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 the + return packet to the pledge. In the stateful method, the return + forward state is stored in the join proxy. In the stateless method, + the return forward state is stored in the network. + +2. Terminology + + The following terms are defined in [RFC8366], and are used + identically as in that document: artifact, imprint, domain, Join + Registrar/Coordinator (JRC), Pledge, and Voucher. + + In this document, the term "Registrar" is used throughout instead of + "Join Registrar/Coordinator (JRC)". + + 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. + + (Installation) IP addresses are assumed to be routeable over the + whole installation network except for link-local IP addresses. + + The "Constrained Join Proxy" enables a pledge that is multiple hops + away from the Registrar, to securely execute the BRSKI protocol + [RFC8995] over a secure channel. + + The term "join Proxy" is used interchangeably with the term + "constrained Join Proxy" throughout this document. + + The [RFC8995] Circuit Proxy is referred to as a TCP circuit Join + Proxy. + +3. Requirements Language + + 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. + + + + +Richardson, et al. Expires 27 March 2023 [Page 5] + +Internet-Draft Join Proxy September 2022 + + +4. constrained Join Proxy functionality + + As depicted in the Figure 1, the Pledge (P), in a network such as a + Low-Power and Lossy Network (LLN) mesh [RFC7102] can be more than one + hop away from the Registrar (R) and not yet authenticated into the + network. + + In this situation, the Pledge can only communicate one-hop to its + nearest neighbor, the constrained Join Proxy (J) using their link- + local IPv6 addresses. However, the Pledge needs to communicate with + end-to-end security with a Registrar to authenticate and get the + relevant system/network parameters. If the Pledge, knowing the IP- + address of the Registrar, initiates a DTLS connection to the + Registrar, then the packets are dropped at the constrained Join Proxy + since the Pledge is not yet admitted to the network or there is no IP + routability to the Pledge for any returned messages from the + Registrar. + + multi-hop mesh + .---. IPv6 + | R +---. +----+ +---+ subnet +--+ + | | \ |6LR +----+ J |........|P | + '---' `--+ | | | clear | | + +----+ +---+ +--+ + Registrar Join Proxy Pledge + + Figure 1: multi-hop enrollment. + + Without a routeable IPv6 address, the Pledge (P) cannot exchange + IPv6/UDP/DTLS traffic with the Registrar (R), over multiple hops in + the network. + + Furthermore, the Pledge may not be able to discover the IP address of + the Registrar over multiple hops to initiate a DTLS connection and + perform authentication. + + To overcome the problems with non-routability of DTLS packets and/or + discovery of the destination address of the Registrar, the + constrained Join Proxy is introduced. This constrained Join Proxy + functionality is also (auto) configured into all authenticated + devices in the network which may act as a constrained Join Proxy for + Pledges. The constrained Join Proxy allows for routing of the + packets from the Pledge using IP routing to the intended Registrar. + An authenticated constrained Join Proxy can discover the routable IP + address of the Registrar over multiple hops. The following Section 5 + specifies the two constrained Join Proxy modes. A comparison is + presented in Section 7. + + + + +Richardson, et al. Expires 27 March 2023 [Page 6] + +Internet-Draft Join Proxy September 2022 + + + When a mesh network is set up, it consists of a Registrar and a set + of connected pledges. No constrained Join Proxies are present. Only + some of these pledges may be neighbors of the Registrar. Others + would need for their traffic to be routed across one or more enrolled + devices to reach the Registrar. + + The desired state of the installation is a network with a Registrar + and all Pledges becoming enrolled devices. Some of these enrolled + devices can act as constrained Join Proxies. Pledges can only employ + link-local communication until they are enrolled. A Pledge will + regularly try to discover a constrained Join Proxy or a Registrar + with link-local discovery requests. The Pledges which are neighbors + of the Registrar will discover the Registrar and be enrolled + following the constrained BRSKI protocol. An enrolled device can act + as constrained Join Proxy. The Pledges which are not a neighbor of + the Registrar will eventually discover a constrained Join Proxy and + follow the constrained BRSKI protocol to be enrolled. While this + goes on, more and more constrained Join Proxies with a larger hop + distance to the Registrar will emerge. The network should be + configured such that at the end of the enrollment process, all + pledges have discovered a neighboring constrained Join Proxy or the + Registrar, and all Pledges are enrolled. + + The constrained Join Proxy is as a packet-by-packet proxy for UDP + packets between Pledge and Registrar. The constrained BRSKI protocol + between Pledge and Registrar described in + [I-D.ietf-anima-constrained-voucher] which this Join Proxy supports + uses UDP messages with DTLS payload, but the Join Proxy as described + here is unaware of this payload. It can therefore potentially also + work for other UDP based protocols as long as they are agnostic to + (or can be made to work with) the change of IP header by the + constrained Join Proxy. + + In both Stateless and Stateful mode, the Join Proxy needs to be + configured with or dynamically discover a Registrar to perform its + service. This specification does not discuss how a constrained Join + Proxy selects a Registrar when it discovers 2 or more. + +5. constrained Join Proxy specification + + A Join Proxy can operate in two modes: + + * Stateful mode + + * Stateless mode + + The advantages and disadvantages of the two modes are presented in + Section 7. + + + +Richardson, et al. Expires 27 March 2023 [Page 7] + +Internet-Draft Join Proxy September 2022 + + + A Join Proxy MUST implement both. A Registrar MUST implement the + stateful mode and SHOULD implement the Stateless mode. + + For a Join Proxy to be operational, the node on which it is running + has to be able to talk to a Registrar (exchange UDP messages with + it). This can happen fully automatically by the Join Proxy node + first enrolling itself as a Pledge, and then learning the IP address, + the UDP port and the mode(s) (Stateful and/or Stateless) of the + Registrar, through a discovery mechanism such as those described in + Section 6. + Other methods, such as provisioning the Join Proxy are out of scope + of this document but equally feasible. + + Once the Join Proxy is operational, its mode is determined by the + mode of the Registrar. If the Registrar offers both Stateful and + Stateless mode, the Join Proxy MUST use the stateless mode. + + Independent of the mode of the Join Proxy, the Pledge first discovers + (see Section 6) and selects the most appropriate Join Proxy. From + the discovery, the Pledge learns the Join Proxies link-local scope IP + address and UDP (join) port. This discovery can also be based upon + [RFC8995] section 4.1. If the discovery method does not support + discovery of the join-port, then the Pledge assumes the default CoAP + over DTLS UDP port (5683). + +5.1. Stateful Join Proxy + + In stateful mode, the Join Proxy acts as a UDP "circuit" proxy that + does not change the UDP payload (data octets according to [RFC768]) + but only rewrites the IP and UDP headers of each packet it receives + from Pledge and Registrar. + + The stateful join proxy operates as a 'pseudo' UDP circuit proxy + creating and utilizing connection mapping state to rewrite the IP + address and UDP port number packet header fields of UDP packets that + it forwards between Pledge and Registrar. Figure 2 explains this + mapping state. + + + + + + + + + + + + + + +Richardson, et al. Expires 27 March 2023 [Page 8] + +Internet-Draft Join Proxy September 2022 + + + UDP flow mapping state: + + (IP_p%IF:p_P, IP_Jl%IF:p_Jl) <=> (IP_jr:p_Jr, IP_R:p_r) + + (Src, Dst) Pledge -> Proxy/map -> (Src, Dst) Registrar + (Dst, Src) Pledge <- map/Proxy <- (Dst, Src) Registrar + + IP_P%IF:p_P = Link-local IP address, interface and UDP port of Pledge + IP_Jl%IF:p_Jl = Link-local IP address, interface and UDP port of + Join Proxy on the interface connecting to the Pledge + IP_Jr:p_Jr = Routable IP address and per IP_P%IF:p_P 'client' + UDP port of Join Proxy + IP_R:p_r = Routable IP address and UDP port of Registrar + + Figure 2: UDP flow mapping state for stateful proxy operations + + Because UDP does not have the notion of a connection, this document + calls this a 'pseudo' connection, whose establishment is solely + triggered by receipt of a packet from a pledge with an IP_p%IF:p_P + source for which no mapping state exists, and that is termined by a + connection expiry timer E. + + Figure 3 describes the stateful join proxy state machinery. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Richardson, et al. Expires 27 March 2023 [Page 9] + +Internet-Draft Join Proxy September 2022 + + + +--------------+-----------------+----------------+ + | Pledge (P) | Join Proxy (J) | Registrar (R) | + +--------------+-----------------+----------------+ + |A) Connection setup: | + | (P) UDP packet -> (J) | + | (IP_p%IF:p_P, IP_Jl%IF:p_Jl) | + | && no mapping state found | + | | + | 1) allocate unused p_Jr (*1) / | + | open (IP_p%IF:p_P) socket | + | 2) establish mapping state | + | 3) start connection expiry timer E | + | 4) rewrite packet header to | + | (IP_jr:p_Jr, IP_R:p_r) | + | 5) forward packet | + | (J) >- UDP packet -> (R) | + +-------------------------------------------------+ + |B) Forward packet Pledge to Registrar: | + | (P) >- UDP packet -> (J) | + | (IP_p%IF:p_P, IP_Jl%IF:p_Jl): | + | && mapping state for packet found | + | | + | 1) rewrite packet header to | + | (IP_jr:p_Jr, IP_R:p_r) | + | 2) forward packet | + | (J) >- UDP packet -> (R) | + | 3) reset connection expiry timer E | + +-------------------------------------------------+ + |C) Forward packet Registrar to Pledge: | + | (J) <- UDP packet -< (R) | + | (IP_jr:p_Jr, IP_R:p_r) | + | && mapping state for packet found | + | | + | 1) rewrite packet header to | + | (IP_p%IF:p_P, IP_Jl%IF:p_Jl) | + | 2) forward packet | + | (P) <- UDP packet -< (J) | + | 3) reset connection expiry timer E | + +-------------------------------------------------+ + |D) Expire connection: | + | Connection exiry timer E expires: | + | | + | 1) unallocate p_Jr (*1) / | + | close (IP_p%IF:p_P) socket | + | 2) release mapping state | + +-------------------------------------------------+ + + Figure 3: stateful proxy state machinery + + + +Richardson, et al. Expires 27 March 2023 [Page 10] + +Internet-Draft Join Proxy September 2022 + + + (*1) The stateful proxy requires a unique IP_jr:p_Jr for every unique + IP_p%IF:p_P to be able to correctly map packets received from the + Registrar in step C). The state machinery assumes that this is + achieved by allocating a unique p_Jr for every unique IP_p%IF:p_P, + but proxies could equally use per IP_p%IF:p_P IP_jr. + + Unless discovery of Registrar information communicates another value + to use with it, E MUST be 30 seconds. + + When a proxy receives an ICMP error message from the Registrar or + Plege, for which mapping state exist, the proxy SHOULD map the ICMP + message as it would map a UDP message in B) or C) and forward the + ICMP message to the Registrar / Pledge. Processing of ICMP messages + SHOULD NOT reset the connection expiry timer. + + To protect itself and the Registrar against malfunctioning Pledges + and or denial of service attacks, the join proxy SHOULD limit the + number of simultaneous mapping states for each IP_p%IF to 2 and the + number of simultaneous mapping states per interface to 10. When + mapping state can not be built, the proxy SHOULD return an ICMP error + (1), "Destination Port Unreachable" message with code (1), + "Communication with destination administratively prohibited". + +5.2. Stateless Join Proxy + + Stateless join proxy operation eliminates the need and complexity to + maintain per UDP connection mapping state on the proxy and the state + machinery to build, maintain and remove this mapping state. It also + removes the need to protect this mapping staate against DoS attacks + and may also reduce memory and CPU requirements on the proxy. + + Stateless join proxy operations works by introducing a new JPY + message payload for messages between Proxy and Registrar, which + consists of two parts: + + * Header (H) field: the link-local IP address, interface and UDP + (source) port of the Pledge (P). + + * Contents (C) field: the original UDP payload (data octets + according to RFC768). + + When the join proxy receives a UDP message from a Pledge, it encodes + the Pledges link-local IP address, interface and UDP (source) port of + the packet into the Header field and the UDP payload into the Content + field and sends the packet to the Registrar from a fixed source UDP + port. When the Registrar sends packets for the Pledge, it MUST + return the Header field unchanged, so that the join proxy can decode + the Header to reconstruct the Pledges link-local IP address, interace + + + +Richardson, et al. Expires 27 March 2023 [Page 11] + +Internet-Draft Join Proxy September 2022 + + + and UDP (destination) port for the return packet. Figure 4 shows + this per-packet mapping on the join proxy using the same terminology + as introduced for the stateful proxy in Figure 2. + + (IP_p%IF:p_P, IP_Jl%IF:p_Jl) <=> (IP_jr:p_Jr, IP_R:p_r, H) + + (Src, Dst) Pledge -> Proxy/map -> (Src, Dst, H) Registrar + (Dst, Src) Pledge <- map/Proxy <- (Dst, Src, H) Registrar + + IP_P%IF:p_P = Link-local IP address, interface and UDP port of Pledge + IP_Jl%IF:p_Jl = Link-local IP address, interface and UDP port of + Join Proxy on the interface connecting to the Pledge + IP_Jr:p_Jr = Routable IP address and single 'client' + UDP port of the Join Proxy + IP_R:p_r = Routable IP address and UDP port of Registrar + H = encode(IP_P%IF:p_P) - JPY Header Field + + Figure 4: UDP per-packet mapping for stateless proxy operations + + When the Registrar receives such a JPY message, it MUST treat the + Header H as a single additional opaque identifier for all packets of + a UDP connection from a Plege: Whereas in the stateful proxy case, + all packets with the same (IP_jr:p_Jr, IP_R:p_r) belong to a single + Pledges UDP connection and hence DTLS/CoAP connection, only the + packets with the same (IP_jr:p_Jr, IP_R:p_r, H) belong to a single + Plegdes UDP connection / DTLS/CoAP connection. The JPY Content field + payload is the UDP payload of the packet for that UDP connection. + Packets with different H belong to different Pledges UDP connections. + + In the stateless join proxy mode, both the Registrar and the Join + Proxy use discoverable UDP join-ports. For the Join Proxy this may + be a default CoAP port. + + Because there is only per-packet mapping of the IP / UDP and JPY + header of received UDP packets according to Figure 4, the stateless + mode has no equivalent to Figure 3. Therefore there is also no need + for any of the requirements against this mapping state (as in + Section 5.1) for the stateless operation of the join proxy. + + Unlike the stateful operation, ICMP error messages from the Registrar + can not be mapped to the Pledge, because the ICMP error messages do + not carry enough bytes of the original packets payload to include the + JPY Header. + +5.3. JPY Message structure + + The JPY message is constructed as a payload directly above UDP. + + + + +Richardson, et al. Expires 27 March 2023 [Page 12] + +Internet-Draft Join Proxy September 2022 + + + The JPY message is a CBOR [RFC8949] array of 2 elements, specified + via CDDL [RFC8610] in Figure 5: + + jpy_message = + [ + jpy_header : bstr, + jpy_content : bstr + ] + + Figure 5: CDDL representation of JPY message + + 1. The JPY header field. This is a CBOR byte string. It SHOULD be + between 8 and 32 bytes in size. + + 2. The JPY Content field: Contains the UDP payload as a CBOR byte + string. + + The jpy_header is not standardized. It is to be used by the Join + Proxy to record which pledge the traffic came from. + + The Join Proxy SHOULD encrypt this context with a symmetric key known + only to the Join Proxy. This key need not persist on a long term + basis, and MAY be changed periodically. The considerations of + Section 5.2 of [RFC8974] apply. + + This is intended to be identical to the mechanism described in + Section 7.1 of [RFC9031]. However, since the CoAP layer is inside of + the DTLS layer (which is between the Pledge and the Registrar), it is + not possible for the Join Proxy to act as a CoAP proxy. + + A typical jpy_header might be constructed with the following CDDL + grammar: (This is illustrative only: the contents are not subject to + standardization) + + jpy_header = [ + family: uint .bits 1, + ifindex: uint .bits 8, + srcport: uint .bits 16, + iid: bstr .bits 64, + ] + + This results in a total of 96 bits, or 12 bytes. The structure + stores the srcport, the originating IPv6 Link-Local address, the + IPv4/IPv6 family (as a single bit) and an ifindex to provide the + link-local scope. This fits nicely into a single AES128 CBC block + for instance, resulting in a 16 byte jpy_header. The Join Proxy MUST + maintain the same jpy_header for all communications from the same + pledge UDP source port. This implies that any encryption key either + + + +Richardson, et al. Expires 27 March 2023 [Page 13] + +Internet-Draft Join Proxy September 2022 + + + does not change during the communication, or that when it does, it is + acceptable to break any onboarding connections which have not yet + completed. If using a jpy_header like defined above, it should be + easy for the Join Proxy to meet this requirement without maintaining + any local state about the pledge. + + Note: when IPv6 is used only the lower 64-bits of the origin IP need + to be recorded, because they are all IPv6 Link-Local addresses, so + the upper 64-bits are just "fe80::". For IPv4, a Link-Local IPv4 + address [RFC3927] would be used, and it would fit into 64-bits. On + media where the IID is not 64-bits, a different arrangement will be + necessary. + + For the JPY messages relayed to the Registrar, the Join Proxy SHOULD + use the same UDP source port for the JPY messages related to all + pledges. A Join Proxy MAY change the UDP source port, but doing so + creates more local state. A Join Proxy with multiple CPUs (unlikely + in a constrained system, but possible in the future) could, for + instance, use different source port numbers to demultiplex + connections across CPUs. + +5.3.1. Processing by Registrar + + On reception of a JPY message by the Registrar, the Registrar MUST + verify that the number of array elements is 2 or more. The + pledge_content field must be provided as input to a DTLS library + [RFC9147], which along with the 5-tuple of the UDP connection + provides enough context for the Registrar to pick an appropriate + context. Note that the socket will need to be used for multiple DTLS + flows, which is atypical for how DTLS usually uses sockets. The + jpy_header can be used to select an appropriate DTLS context, as DTLS + headers do not contain any kind of of per session context. The + jpy_header needs to be linked to the DTLS context, and when DTLS + records need to be sent, then the jpy_header needs to be prepended to + the data that is sent. + + Examples are shown in Appendix A. + + At the CoAP level, within the Constrained BRSKI and the EST-COAP + [RFC9148] level, the block option [RFC7959] is often used. The + Registrar and the Pledge MUST select a block size that would allow + the addition of the jpy_message header without violating MTU sizes. + +6. Discovery + + + + + + + +Richardson, et al. Expires 27 March 2023 [Page 14] + +Internet-Draft Join Proxy September 2022 + + +6.1. Discovery operations by Join-Proxy + + In order to accomodate automatic configuration of the Join-Proxy, it + must discover the location and a capabilities of the Registar. + Section 10.2 of [I-D.ietf-anima-constrained-voucher] explains the + basic mechanism, and this section explains the extensions required to + discover if stateless operation is supported. + +6.1.1. CoAP discovery + + Section 10.2.2 of [I-D.ietf-anima-constrained-voucher] describes how + to use CoAP Discovery. The stateless Join Proxy requires a different + end point that can accept the JPY encapsulation. + + The stateless Join Proxy can discover the join-port of the Registrar + by sending a GET request to "/.well-known/core" including a resource + type (rt) parameter with the value "brski.rjp" [RFC6690]. Upon + success, the return payload will contain the join-port of the + Registrar. + + REQ: GET /.well-known/core?rt=brski.rjp + + RES: 2.05 Content + ;rt=brski.rjp + + In the [RFC6690] link format, and [RFC3986], Section 3.2, the + authority attribute can not include a port number unless it also + includes the IP address. + + The returned join-port is expected to process the encapsulated JPY + messages described in section Section 5.3. The scheme remains coaps, + as the inside protocol is still CoAP and DTLS. + + An EST/Registrar server running at address 2001:db8:0:abcd::52, with + the JPY process on port 7634, and the stateful Registrar on port 5683 + could reply to a multicast query as follows: + + REQ: GET /.well-known/core?rt=brski* + + RES: 2.05 Content + ;rt=brski.rjp, + ;rt=brski.rv;ct=836, + ;rt=brski.vs;ct="50 60", + ;rt=brski.es;ct="50 60", + + The coaps+jpy scheme is registered is defined in Section 9.2, as per + [RFC7252], Section 6.2 + + + + +Richardson, et al. Expires 27 March 2023 [Page 15] + +Internet-Draft Join Proxy September 2022 + + +6.1.2. GRASP discovery + + Section 10.2.1 of [I-D.ietf-anima-constrained-voucher] describes how + to use GRASP [RFC8990] discovery within the ACP to locate the + stateful port of the Registrar. + + A join proxy which supports a stateless mode of operation using the + mechanism described in Section 5.3 must know where to send the + encoded content from the pledge. The Registrar announces its + willingness to use the stateless mechanism by including an additional + objective in it's M_FLOOD'ed AN_join_registrar announcements, but + with a different objective value. + + The following changes are necessary with respect to figure 10 of + [RFC8995]: + + * The transport-proto is IPPROTO_UDP + + * the objective is AN_join_registrar, identical to [RFC8995]. + + * the objective name is "BRSKI_RJP". + + Here is an example M_FLOOD announcing the Registrar on example port + 5685, which is a port number chosen by the Registrar. + + [M_FLOOD, 51804231, h'fda379a6f6ee00000200000064000001', 180000, + [["AN_join_registrar", 4, 255, "BRSKI_RJP"], + [O_IPv6_LOCATOR, + h'fda379a6f6ee00000200000064000001', IPPROTO_UDP, 5685]]] + + Figure 6: Example of Registrar announcement message + + Most Registrars will announce both a JPY-stateless and stateful + ports, and may also announce an HTTPS/TLS service: + + [M_FLOOD, 51840231, h'fda379a6f6ee00000200000064000001', 180000, + [["AN_join_registrar", 4, 255, ""], + [O_IPv6_LOCATOR, + h'fda379a6f6ee00000200000064000001', IPPROTO_TCP, 8443], + ["AN_join_registrar", 4, 255, "BRSKI_JP"], + [O_IPv6_LOCATOR, + h'fda379a6f6ee00000200000064000001', IPPROTO_UDP, 5684], + ["AN_join_registrar", 4, 255, "BRSKI_RJP"], + [O_IPv6_LOCATOR, + h'fda379a6f6ee00000200000064000001', IPPROTO_UDP, 5685]]] + + Figure 7: Example of Registrar announcing two services + + + + +Richardson, et al. Expires 27 March 2023 [Page 16] + +Internet-Draft Join Proxy September 2022 + + +6.2. Pledge discovers Join-Proxy + + Regardless of whether the Join Proxy operates in stateful or + stateless mode, the Join Proxy is discovered by the Pledge + identically. When doing constrained onboarding with DTLS as + security, the Pledge will always see an IPv6 Link-Local destination, + with a single UDP port to which DTLS messages are to be sent. + +6.2.1. CoAP discovery + + In the context of a coap network without Autonomic Network support, + discovery follows the standard coap policy. The Pledge can discover + a Join Proxy by sending a link-local multicast message to ALL CoAP + Nodes with address FF02::FD. Multiple or no nodes may respond. The + handling of multiple responses and the absence of responses follow + section 4 of [RFC8995]. + + The join-port of the Join Proxy is discovered by sending a GET + request to "/.well-known/core" including a resource type (rt) + parameter with the value "brski.jp" [RFC6690]. Upon success, the + return payload will contain the join-port. + + The example below shows the discovery of the join-port of the Join + Proxy. + + REQ: GET coap://[FF02::FD]/.well-known/core?rt=brski.jp + + RES: 2.05 Content + ; rt="brski.jp" + + Port numbers are assumed to be the default numbers 5683 and 5684 for + coap and coaps respectively (sections 12.6 and 12.7 of [RFC7252]) + when not shown in the response. Discoverable port numbers are + usually returned for Join Proxy resources in the of + the payload (see section 5.1 of [RFC9148]). + +6.2.2. GRASP discovery + + This section is normative for uses with an ANIMA ACP. In the context + of autonomic networks, the Join-Proxy uses the DULL GRASP M_FLOOD + mechanism to announce itself. Section 4.1.1 of [RFC8995] discusses + this in more detail. + + The following changes are necessary with respect to figure 10 of + [RFC8995]: + + * The transport-proto is IPPROTO_UDP + + + + +Richardson, et al. Expires 27 March 2023 [Page 17] + +Internet-Draft Join Proxy September 2022 + + + * the objective is AN_Proxy + + The Registrar announces itself using ACP instance of GRASP using + M_FLOOD messages. Autonomic Network Join Proxies MUST support GRASP + discovery of Registrar as described in section 4.3 of [RFC8995] . + + Here is an example M_FLOOD announcing the Join-Proxy at fe80::1, on + standard coaps port 5684. + + [M_FLOOD, 12340815, h'fe800000000000000000000000000001', 180000, + [["AN_Proxy", 4, 1, ""], + [O_IPv6_LOCATOR, + h'fe800000000000000000000000000001', IPPROTO_UDP, 5684]]] + + Figure 8: Example of Registrar announcement message + +6.2.3. 6tisch discovery + + The discovery of Join-Proxy by the Pledge uses the enhanced beacons + as discussed in [RFC9032]. 6tisch does not use DTLS and so this + specification does not apply to it. + +7. Comparison of stateless and stateful modes + + The stateful and stateless mode of operation for the Join Proxy have + their advantages and disadvantages. This section should enable + operators to make a choice between the two modes based on the + available device resources and network bandwidth. + + + + + + + + + + + + + + + + + + + + + + + +Richardson, et al. Expires 27 March 2023 [Page 18] + +Internet-Draft Join Proxy September 2022 + + + +-------------+----------------------------+------------------------+ + | Properties | Stateful mode | Stateless mode | + +-------------+----------------------------+------------------------+ + | State |The Join Proxy needs | No information is | + | Information |additional storage to | maintained by the Join | + | |maintain mapping between | Proxy. Registrar needs | + | |the address and port number | to store the packet | + | |of the Pledge and those | header. | + | |of the Registrar. | | + +-------------+----------------------------+------------------------+ + |Packet size |The size of the forwarded |Size of the forwarded | + | |message is the same as the |message is bigger than | + | |original message. |the original,it includes| + | | |additional information | + +-------------+----------------------------+------------------------+ + |Specification|The Join Proxy needs |New JPY message to | + |complexity |additional functionality |encapsulate DTLS payload| + | |to maintain state |The Registrar | + | |information, and specify |and the Join Proxy | + | |the source and destination |have to understand the | + | |addresses of the DTLS |JPY message in order | + | |handshake messages |to process it. | + +-------------+----------------------------+------------------------+ + | Ports | Join Proxy needs |Join Proxy and Registrar| + | | discoverable join-port |need discoverable | + | | | join-ports | + +-------------+----------------------------+------------------------+ + + Figure 9: Comparison between stateful and stateless mode + +8. Security Considerations + + All the concerns in [RFC8995] section 4.1 apply. The Pledge can be + deceived by malicious Join Proxy announcements. The Pledge will only + join a network to which it receives a valid [RFC8366] voucher + [I-D.ietf-anima-constrained-voucher]. Once the Pledge joined, the + payload between Pledge and Registrar is protected by DTLS. + + A malicious constrained Join Proxy has a number of routing + possibilities: + + * It sends the message on to a malicious Registrar. This is the + same case as the presence of a malicious Registrar discussed in + RFC 8995. + + * It does not send on the request or does not return the response + from the Registrar. This is the case of the not responding or + crashing Registrar discussed in RFC 8995. + + + +Richardson, et al. Expires 27 March 2023 [Page 19] + +Internet-Draft Join Proxy September 2022 + + + * It uses the returned response of the Registrar to enroll itself in + the network. With very low probability it can decrypt the + response because successful enrollment is deemed unlikely. + + * It uses the request from the pledge to appropriate the pledge + certificate, but then it still needs to acquire the private key of + the pledge. This, too, is assumed to be highly unlikely. + + * A malicious node can construct an invalid Join Proxy message. + Suppose, the destination port is the coaps port. In that case, a + Join Proxy can accept the message and add the routing addresses + without checking the payload. The Join Proxy then routes it to + the Registrar. In all cases, the Registrar needs to receive the + message at the join-port, checks that the message consists of two + parts and uses the DTLS payload to start the BRSKI procedure. It + is highly unlikely that this malicious payload will lead to node + acceptance. + + * A malicious node can sniff the messages routed by the constrained + Join Proxy. It is very unlikely that the malicious node can + decrypt the DTLS payload. A malicious node can read the header + field of the message sent by the stateless Join Proxy. This + ability does not yield much more information than the visible + addresses transported in the network packets. + + It should be noted here that the contents of the CBOR array used to + convey return address information is not DTLS protected. When the + communication between JOIN Proxy and Registrar passes over an + unsecure network, an attacker can change the CBOR array, causing the + Registrar to deviate traffic from the intended Pledge. These + concerns are also expressed in [RFC8974]. It is also pointed out + that the encryption in the source is a local matter. Similarly to + [RFC8974], the use of AES-CCM [RFC3610] with a 64-bit tag is + recommended, combined with a sequence number and a replay window. + + If such scenario needs to be avoided, the constrained Join Proxy MUST + encrypt the CBOR array using a locally generated symmetric key. The + Registrar is not able to examine the encrypted result, but does not + need to. The Registrar stores the encrypted header in the return + packet without modifications. The constrained Join Proxy can decrypt + the contents to route the message to the right destination. + + In some installations, layer 2 protection is provided between all + member pairs of the mesh. In such an environment encryption of the + CBOR array is unnecessary because the layer 2 protection already + provide it. + + + + + +Richardson, et al. Expires 27 March 2023 [Page 20] + +Internet-Draft Join Proxy September 2022 + + +9. IANA Considerations + +9.1. Resource Type Attributes registry + + This specification registers two new Resource Type (rt=) Link Target + Attributes in the "Resource Type (rt=) Link Target Attribute Values" + subregistry under the "Constrained RESTful Environments (CoRE) + Parameters" registry per the [RFC6690] procedure. + + Attribute Value: brski.jp + Description: This BRSKI resource type is used to query and return + the supported BRSKI resources of the constrained + Join Proxy. + Reference: [this document] + + Attribute Value: brski.rjp + Description: This BRSKI resource type is used for the constrained + Join Proxy to query and return Join Proxy specific + BRSKI resources of a Registrar. + Reference: [this document] + +9.2. CoAPS+JPY Scheme Registration + +Scheme name: coaps+jpy +Status: permanent +Applications/protocols that use this scheme name: Constrained BRSKI Join Proxy +Contact: ANIMA WG +Change controller: IESG +References: [THIS RFC] +Scheme syntax: identical to coaps +Scheme semantics: The encapsulation mechanism described in {{stateless-jpy}} is used with coaps. +Security considerations: The new encapsulation allows traffic to be returned to a calling node + behind a proxy. The form of the encapsulation can include privacy and integrity protection + under the control of the proxy system. + +9.3. service name and port number registry + + This specification registers two service names under the "Service + Name and Transport Protocol Port Number" registry. + + + + + + + + + + + + +Richardson, et al. Expires 27 March 2023 [Page 21] + +Internet-Draft Join Proxy September 2022 + + + Service Name: brski-jp + Transport Protocol(s): udp + Assignee: IESG + Contact: IESG + Description: Bootstrapping Remote Secure Key Infrastructure + constrained Join Proxy + Reference: [this document] + + Service Name: brski-rjp + Transport Protocol(s): udp + Assignee: IESG + Contact: IESG + Description: Bootstrapping Remote Secure Key Infrastructure + Registrar join-port used by stateless constrained + Join Proxy + Reference: [this document] + +10. Acknowledgements + + Many thanks for the comments by 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. + +11. Contributors + + Sandeep Kumar, Sye loong Keoh, and Oscar Garcia-Morchon are the co- + authors of the draft-kumar-dice-dtls-relay-02. Their draft has + served as a basis for this document. Much text from their draft is + copied over to this draft. + +12. Changelog + +12.1. 13 to 12 + + * jpy message encrypted and no longer standardized + +12.2. 12 to 11 + +* many typos fixes and text re-organized +* core of GRASP and CoAP discovery moved to contrained-voucher document, only stateless extensions remain + +12.3. 11 to 10 + + * Join-Proxy and Registrar discovery merged + * GRASP discovery updated + * ARTART review + * TSVART review + + + +Richardson, et al. Expires 27 March 2023 [Page 22] + +Internet-Draft Join Proxy September 2022 + + +12.4. 10 to 09 + + * OPSDIR review + * IANA review + * SECDIR review + * GENART review + +12.5. 09 to 07 + + * typos + +12.6. 06 to 07 + + * AD review changes + +12.7. 05 to 06 + + * RT value change to brski.jp and brski.rjp + * new registry values for IANA + * improved handling of jpy header array + +12.8. 04 to 05 + + * Join Proxy and join-port consistent spelling + * some nits removed + * restructured discovery + * section + * rephrased parts of security section + +12.9. 03 to 04 + + * mail address and reference + +12.10. 02 to 03 + + * Terminology updated + * Several clarifications on discovery and routability + * DTLS payload introduced + +12.11. 01 to 02 + + * Discovery of Join Proxy and Registrar ports + +12.12. 00 to 01 + + * Registrar used throughout instead of EST server + + * Emphasized additional Join Proxy port for Join Proxy and Registrar + + + +Richardson, et al. Expires 27 March 2023 [Page 23] + +Internet-Draft Join Proxy September 2022 + + + * updated discovery accordingly + + * updated stateless Join Proxy JPY header + + * JPY header described with CDDL + + * Example simplified and corrected + +12.13. 00 to 00 + + * copied from vanderstok-anima-constrained-join-proxy-05 + +13. References + +13.1. Normative References + + [family] "Address Family Numbers", IANA, 19 October 2021, + . + + [I-D.ietf-anima-constrained-voucher] + Richardson, M., Van der Stok, P., Kampanakis, P., and E. + Dijk, "Constrained Bootstrapping Remote Secure Key + Infrastructure (BRSKI)", Work in Progress, Internet-Draft, + draft-ietf-anima-constrained-voucher-18, 11 July 2022, + . + + [ieee802-1AR] + "IEEE 802.1AR Secure Device Identifier", IEEE Standard, + 2009, + . + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + . + + [RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer + Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347, + January 2012, . + + [RFC768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, + DOI 10.17487/RFC0768, August 1980, + . + + + + + + +Richardson, et al. Expires 27 March 2023 [Page 24] + +Internet-Draft Join Proxy September 2022 + + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, . + + [RFC8366] Watsen, K., Richardson, M., Pritikin, M., and T. Eckert, + "A Voucher Artifact for Bootstrapping Protocols", + RFC 8366, DOI 10.17487/RFC8366, May 2018, + . + + [RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object + Representation (CBOR)", STD 94, RFC 8949, + DOI 10.17487/RFC8949, December 2020, + . + + [RFC8990] Bormann, C., Carpenter, B., Ed., and B. Liu, Ed., "GeneRic + Autonomic Signaling Protocol (GRASP)", RFC 8990, + DOI 10.17487/RFC8990, May 2021, + . + + [RFC8995] Pritikin, M., Richardson, M., Eckert, T., Behringer, M., + and K. Watsen, "Bootstrapping Remote Secure Key + Infrastructure (BRSKI)", RFC 8995, DOI 10.17487/RFC8995, + May 2021, . + + [RFC9032] Dujovne, D., Ed. and M. Richardson, "Encapsulation of + 6TiSCH Join and Enrollment Information Elements", + RFC 9032, DOI 10.17487/RFC9032, May 2021, + . + + [RFC9147] Rescorla, E., Tschofenig, H., and N. Modadugu, "The + Datagram Transport Layer Security (DTLS) Protocol Version + 1.3", RFC 9147, DOI 10.17487/RFC9147, April 2022, + . + + [RFC9148] van der Stok, P., Kampanakis, P., Richardson, M., and S. + Raza, "EST-coaps: Enrollment over Secure Transport with + the Secure Constrained Application Protocol", RFC 9148, + DOI 10.17487/RFC9148, April 2022, + . + +13.2. Informative References + + [I-D.kumar-dice-dtls-relay] + Kumar, S. S., Keoh, S. L., and O. Garcia-Morchon, "DTLS + Relay for Constrained Environments", Work in Progress, + Internet-Draft, draft-kumar-dice-dtls-relay-02, 20 October + 2014, . + + + +Richardson, et al. Expires 27 March 2023 [Page 25] + +Internet-Draft Join Proxy September 2022 + + + [I-D.richardson-anima-state-for-joinrouter] + Richardson, M., "Considerations for stateful vs stateless + join router in ANIMA bootstrap", Work in Progress, + Internet-Draft, draft-richardson-anima-state-for- + joinrouter-03, 22 September 2020, + . + + [RFC3610] Whiting, D., Housley, R., and N. Ferguson, "Counter with + CBC-MAC (CCM)", RFC 3610, DOI 10.17487/RFC3610, September + 2003, . + + [RFC3927] Cheshire, S., Aboba, B., and E. Guttman, "Dynamic + Configuration of IPv4 Link-Local Addresses", RFC 3927, + DOI 10.17487/RFC3927, May 2005, + . + + [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform + Resource Identifier (URI): Generic Syntax", STD 66, + RFC 3986, DOI 10.17487/RFC3986, January 2005, + . + + [RFC4944] Montenegro, G., Kushalnagar, N., Hui, J., and D. Culler, + "Transmission of IPv6 Packets over IEEE 802.15.4 + Networks", RFC 4944, DOI 10.17487/RFC4944, September 2007, + . + + [RFC6550] Winter, T., Ed., Thubert, P., Ed., Brandt, A., Hui, J., + Kelsey, R., Levis, P., Pister, K., Struik, R., Vasseur, + JP., and R. Alexander, "RPL: IPv6 Routing Protocol for + Low-Power and Lossy Networks", RFC 6550, + DOI 10.17487/RFC6550, March 2012, + . + + [RFC6690] Shelby, Z., "Constrained RESTful Environments (CoRE) Link + Format", RFC 6690, DOI 10.17487/RFC6690, August 2012, + . + + [RFC6775] Shelby, Z., Ed., Chakrabarti, S., Nordmark, E., and C. + Bormann, "Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)", + RFC 6775, DOI 10.17487/RFC6775, November 2012, + . + + [RFC7030] Pritikin, M., Ed., Yee, P., Ed., and D. Harkins, Ed., + "Enrollment over Secure Transport", RFC 7030, + DOI 10.17487/RFC7030, October 2013, + . + + + +Richardson, et al. Expires 27 March 2023 [Page 26] + +Internet-Draft Join Proxy September 2022 + + + [RFC7102] Vasseur, JP., "Terms Used in Routing for Low-Power and + Lossy Networks", RFC 7102, DOI 10.17487/RFC7102, January + 2014, . + + [RFC7228] Bormann, C., Ersue, M., and A. Keranen, "Terminology for + Constrained-Node Networks", RFC 7228, + DOI 10.17487/RFC7228, May 2014, + . + + [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained + Application Protocol (CoAP)", RFC 7252, + DOI 10.17487/RFC7252, June 2014, + . + + [RFC7959] Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in + the Constrained Application Protocol (CoAP)", RFC 7959, + DOI 10.17487/RFC7959, August 2016, + . + + [RFC8610] Birkholz, H., Vigano, C., and C. Bormann, "Concise Data + Definition Language (CDDL): A Notational Convention to + Express Concise Binary Object Representation (CBOR) and + JSON Data Structures", RFC 8610, DOI 10.17487/RFC8610, + June 2019, . + + [RFC8974] Hartke, K. and M. Richardson, "Extended Tokens and + Stateless Clients in the Constrained Application Protocol + (CoAP)", RFC 8974, DOI 10.17487/RFC8974, January 2021, + . + + [RFC9031] Vučinić, M., Ed., Simon, J., Pister, K., and M. + Richardson, "Constrained Join Protocol (CoJP) for 6TiSCH", + RFC 9031, DOI 10.17487/RFC9031, May 2021, + . + +Appendix A. Stateless Proxy payload examples + + The examples show the request "GET coaps://192.168.1.200:5965/est/ + crts" to a Registrar. The header generated between Join Proxy and + Registrar and from Registrar to Join Proxy are shown in detail. The + DTLS payload is not shown. + + The request from Join Proxy to Registrar looks like: + + + + + + + + +Richardson, et al. Expires 27 March 2023 [Page 27] + +Internet-Draft Join Proxy September 2022 + + + 85 # array(5) + 50 # bytes(16) + FE800000000000000000FFFFC0A801C8 # + 19 BDA7 # unsigned(48551) + 01 # unsigned(1) IP + 00 # unsigned(0) + 58 2D # bytes(45) + + + In CBOR Diagnostic: + + [h'FE800000000000000000FFFFC0A801C8', 48551, 1, 0, + h''] + + The response is: + + 85 # array(5) + 50 # bytes(16) + FE800000000000000000FFFFC0A801C8 # + 19 BDA7 # unsigned(48551) + 01 # unsigned(1) IP + 00 # unsigned(0) + 59 026A # bytes(618) + + + In CBOR diagnostic: + + [h'FE800000000000000000FFFFC0A801C8', 48551, 1, 0, + h''] + +Authors' Addresses + + Michael Richardson + Sandelman Software Works + Email: mcr+ietf@sandelman.ca + + + Peter van der Stok + vanderstok consultancy + Email: stokcons@bbhmail.nl + + + Panos Kampanakis + Cisco Systems + Email: pkampana@cisco.com + + + + + + +Richardson, et al. Expires 27 March 2023 [Page 28]