<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version  (Ruby 3.0.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-tiloca-core-oscore-capable-proxies-06" category="std" consensus="true" submissionType="IETF" updates="8613" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.3 -->
  <front>
    <title abbrev="OSCORE-capable Proxies">OSCORE-capable Proxies</title>
    <seriesInfo name="Internet-Draft" value="draft-tiloca-core-oscore-capable-proxies-06"/>
    <author initials="M." surname="Tiloca" fullname="Marco Tiloca">
      <organization>RISE AB</organization>
      <address>
        <postal>
          <street>Isafjordsgatan 22</street>
          <city>Kista</city>
          <code>16440</code>
          <country>Sweden</country>
        </postal>
        <email>marco.tiloca@ri.se</email>
      </address>
    </author>
    <author initials="R." surname="Höglund" fullname="Rikard Höglund">
      <organization>RISE AB</organization>
      <address>
        <postal>
          <street>Isafjordsgatan 22</street>
          <city>Kista</city>
          <code>16440</code>
          <country>Sweden</country>
        </postal>
        <email>rikard.hoglund@ri.se</email>
      </address>
    </author>
    <date year="2023" month="April" day="05"/>
    <area>Internet</area>
    <workgroup>CoRE Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>Object Security for Constrained RESTful Environments (OSCORE) can be used to protect CoAP messages end-to-end between two endpoints at the application layer, also in the presence of intermediaries such as proxies. This document defines how to use OSCORE for protecting CoAP messages also between an origin application endpoint and an intermediary, or between two intermediaries. Also, it defines how to secure a CoAP message by applying multiple, nested OSCORE protections, e.g., both end-to-end between origin application endpoints, as well as between an application endpoint and an intermediary or between two intermediaries. Thus, this document updates RFC 8613. The same approach can be seamlessly used with Group OSCORE, for protecting CoAP messages when group communication with intermediaries is used.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
  Constrained RESTful Environments Working Group mailing list (core@ietf.org),
  which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/core/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://gitlab.com/crimson84/draft-tiloca-core-oscore-to-proxies"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <t>The Constrained Application Protocol (CoAP) <xref target="RFC7252"/> supports the presence of intermediaries, such as forward-proxies and reverse-proxies, which assist origin clients by performing requests to origin servers on their behalf, and forwarding back the related responses.</t>
      <t>CoAP supports also group communication scenarios <xref target="I-D.ietf-core-groupcomm-bis"/>, where clients can send a one-to-many request targeting all the servers in the group, e.g., by using IP multicast. Like for one-to-one communication, group settings can also rely on intermediaries <xref target="I-D.tiloca-core-groupcomm-proxy"/>.</t>
      <t>The protocol Object Security for Constrained RESTful Environments (OSCORE) <xref target="RFC8613"/> can be used to protect CoAP messages between two endpoints at the application layer, especially achieving end-to-end security in the presence of (non-trusted) intermediaries. When CoAP group communication is used, the same can be achieved by means of the protocol Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/>.</t>
      <t>For a number of use cases (see <xref target="sec-use-cases"/>), it is required and/or beneficial that communications are secured also between an application endpoint (i.e., a CoAP origin client/server) and an intermediary, as well as between two adjacent intermediaries in a chain. This especially applies to the communication leg between the CoAP origin client and the adjacent intermediary acting as next hop towards the CoAP origin server.</t>
      <t>In such cases, and especially if the origin client already uses OSCORE to achieve end-to-end security with the origin server, it would be convenient that OSCORE is used also to secure communications between the origin client and its next hop. However, the original specification <xref target="RFC8613"/> does not define how OSCORE can be used to protect CoAP messages in such communication leg, which would require to consider also the intermediary as an "OSCORE endpoint".</t>
      <t>This document fills this gap, and updates <xref target="RFC8613"/> as follows.</t>
      <ul spacing="normal">
        <li>It defines how to use OSCORE for protecting a CoAP message in the communication leg between: i) an origin client/server and an intermediary; or ii) two adjacent intermediaries in an intermediary chain. That is, besides origin clients/servers, it allows also intermediaries to be possible "OSCORE endpoints".</li>
        <li>It admits a CoAP message to be secured by multiple, nested OSCORE protections applied in sequence, as an "OSCORE-in-OSCORE" process. For instance, this is the case when the message is OSCORE-protected end-to-end between the origin client and origin server, and the result is further OSCORE-protected over the leg between the current and next hop (e.g., the origin client and the adjacent intermediary acting as next hop towards the origin server).</li>
      </ul>
      <t>This document does not specify any new signaling method to guide the message processing on the different endpoints. In particular, every endpoint is always able to understand what steps to take on an incoming message depending on the presence of the OSCORE Option, as exclusively included or instead combined together with CoAP options intended for an intermediary.</t>
      <t>The approach defined in this document can be seamlessly adopted also when Group OSCORE is used, for protecting CoAP messages in group communication scenarios that rely on intermediaries.</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>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 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
        <t>Readers are expected to be familiar with the terms and concepts related to CoAP <xref target="RFC7252"/>; OSCORE <xref target="RFC8613"/> and Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/>. This document especially builds on concepts and mechanics related to intermediaries such as CoAP forward-proxies.</t>
        <t>In addition, this document uses the following terms.</t>
        <ul spacing="normal">
          <li>Source application endpoint: an origin client producing a request, or an origin server producing a response.</li>
          <li>Destination application endpoint: an origin server intended to consume a request, or an origin client intended to consume a response.</li>
          <li>Application endpoint: a source or destination application endpoint.</li>
          <li>Source OSCORE endpoint: an endpoint protecting a message with OSCORE or Group OSCORE.</li>
          <li>Destination OSCORE endpoint: an endpoint unprotecting a message with OSCORE or Group OSCORE.</li>
          <li>OSCORE endpoint: a source/destination OSCORE endpoint. An OSCORE endpoint is not necessarily also an application endpoint with respect to a certain message.</li>
          <li>
            <t>Proxy-related options: either of the following (set of) CoAP options used for proxying a CoAP request.  </t>
            <ul spacing="normal">
              <li>The Proxy-Uri Option. This is relevant when using a forward-proxy.</li>
              <li>The set of CoAP options comprising the Proxy-Scheme Option together with any of the Uri-* Options. This is relevant when using a forward-proxy.</li>
              <li>One or more Uri-Path Options, when used not together with the Proxy-Scheme Option. This is relevant when using a reverse-proxy.</li>
            </ul>
          </li>
          <li>OSCORE-in-OSCORE: the process by which a message protected with (Group) OSCORE is further protected with (Group) OSCORE. This means that, if such a process is used, a successful decryption/verification of an OSCORE-protected message might yield an OSCORE-protected message.</li>
        </ul>
      </section>
    </section>
    <section anchor="sec-use-cases">
      <name>Use Cases</name>
      <t>The approach defined in this document has been motivated by a number of use cases, which are summarized below.</t>
      <section anchor="ssec-uc1">
        <name>CoAP Group Communication with Proxies</name>
        <t>CoAP supports also one-to-many group communication, e.g., over IP multicast <xref target="I-D.ietf-core-groupcomm-bis"/>, which can be protected end-to-end between origin client and origin servers by using Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/>.</t>
        <t>This communication model can be assisted by intermediaries such as a CoAP forward-proxy or reverse-proxy, which relays a group request to the origin servers. If Group OSCORE is used, the proxy is intentionally not a member of the OSCORE group. Furthermore, <xref target="I-D.tiloca-core-groupcomm-proxy"/> defines a signaling protocol between origin client and proxy, to ensure that responses from the different origin servers are forwarded back to the origin client within a time interval set by the client, and that they can be distinguished from one another.</t>
        <t>In particular, it is required that the proxy identifies the origin client as allowed-listed, before forwarding a group request to the servers (see <xref section="4" sectionFormat="of" target="I-D.tiloca-core-groupcomm-proxy"/>). This requires a security association between the origin client and the proxy, which would be convenient to provide with a dedicated OSCORE Security Context between the two, since the client is possibly using also Group OSCORE with the origin servers.</t>
      </section>
      <section anchor="ssec-uc2">
        <name>CoAP Observe Notifications over Multicast</name>
        <t>The Observe extension for CoAP <xref target="RFC7641"/> allows a client to register its interest in "observing" a resource at a server. The server can then send back notification responses upon changes to the resource representation, all matching with the original observation request.</t>
        <t>In some applications, such as pub-sub <xref target="I-D.ietf-core-coap-pubsub"/>, multiple clients are interested to observe the same resource at the same server. Hence, <xref target="I-D.ietf-core-observe-multicast-notifications"/> defines a method that allows the server to send a multicast notification to all the observer clients at once, e.g., over IP multicast. To this end, the server synchronizes the clients by providing them with a common "phantom observation request", against which the following multicast notifications will match.</t>
        <t>In case the clients and the server use Group OSCORE for end-to-end security and a proxy is also involved, an additional step is required (see <xref section="12" sectionFormat="of" target="I-D.ietf-core-observe-multicast-notifications"/>). That is, clients are in turn required to provide the proxy with the obtained "phantom observation request", thus enabling the proxy to receive the multicast notifications from the server.</t>
        <t>Therefore, it is preferable to have a security association also between each client and the proxy, to especially ensure the integrity of that information provided to the proxy (see <xref section="15.3" sectionFormat="of" target="I-D.ietf-core-observe-multicast-notifications"/>). Like for the use case in <xref target="ssec-uc1"/>, this would be conveniently achieved with a dedicated OSCORE Security Context between a client and the proxy, since the client is also using Group OSCORE with the origin server.</t>
      </section>
      <section anchor="ssec-uc3">
        <name>LwM2M Client and External Application Server</name>
        <t>The Lightweight Machine-to-Machine (LwM2M) protocol <xref target="LwM2M-Core"/> enables a LwM2M Client device to securely bootstrap and then register at a LwM2M Server, with which it will perform most of its following communication exchanges. As per the transport bindings specification of LwM2M <xref target="LwM2M-Transport"/>, the LwM2M Client and LwM2M Server can use CoAP and OSCORE to secure their communications at the application layer, including during the device registration process.</t>
        <t>Furthermore, Section 5.5.1 of <xref target="LwM2M-Transport"/> specifies that: "OSCORE MAY also be used between LwM2M endpoint and non-LwM2M endpoint, e.g., between an Application Server and a LwM2M Client via a LwM2M server. Both the LwM2M endpoint and non-LwM2M endpoint MUST implement OSCORE and be provisioned with an OSCORE Security Context."</t>
        <t>In such a case, the LwM2M Server can practically act as forward-proxy between the LwM2M Client and the external Application Server. At the same time, the LwM2M Client and LwM2M Server must continue protecting communications on their leg using their Security Context. Like for the use case in <xref target="ssec-uc1"/>, this also allows the LwM2M Server to identify the LwM2M Client, before forwarding its request outside the LwM2M domain and towards the external Application Server.</t>
      </section>
      <section anchor="ssec-uc4">
        <name>LwM2M Gateway</name>
        <t>The specification <xref target="LwM2M-Gateway"/> extends the LwM2M architecture by defining the LwM2M Gateway functionality. That is, a LwM2M Server can manage end IoT devices "behind" the LwM2M Gateway. While it is outside the scope of such specification, it is possible for the LwM2M Gateway to use any suitable protocol with its connected end IoT devices, as well as to carry out any required protocol translation.</t>
        <t>Practically, the LwM2M Server can send a request to the LwM2M Gateway, asking to forward it to an end IoT device. With particular reference to the CoAP protocol and the related transport binding specified in <xref target="LwM2M-Transport"/>, the LwM2M Server acting as CoAP client sends its request to the LwM2M Gateway acting as CoAP server.</t>
        <t>If CoAP is used in the communication leg between the LwM2M Gateway and the end IoT devices, then the LwM2M Gateway fundamentally acts as a reverse-proxy (see <xref section="5.7.3" sectionFormat="of" target="RFC7252"/>). That is, in addition to its own resources, the LwM2M Gateway serves the resources of each end IoT device behind itself, as exposed under a dedicated URI-Path. As per <xref target="LwM2M-Gateway"/>, the first URI-Path segment is used as "prefix" to identify the specific IoT device, while the remaining URI-Path segments specify the target resource at the IoT device.</t>
        <t>As per Section 7 of <xref target="LwM2M-Gateway"/>, message exchanges between the LwM2M Server and the L2M2M Gateway are secured using the LwM2M-defined technologies, while the LwM2M protocol does not provide end-to-end security between the LwM2M Server and the end IoT devices. However, the approach defined in this document makes it possible to achieve both goals, by allowing the LwM2M Server to use OSCORE for protecting a message both end-to-end for the targeted end IoT device as well as for the LwM2M Gateway acting as reverse-proxy.</t>
      </section>
      <section anchor="further-use-cases">
        <name>Further Use Cases</name>
        <t>The approach defined in this document can be useful also in the following use cases relying on a proxy.</t>
        <ul spacing="normal">
          <li>
            <t>A server aware of a suitable cross proxy can rely on it as a third-party service, in order to indicate transports for CoAP available to that server (see <xref section="4" sectionFormat="of" target="I-D.ietf-core-transport-indication"/>).  </t>
            <t>
From a security point of view, it would be convenient if the proxy could provide suitable credentials to the client, as a general trusted proxy for the system. At the same time, it can be desirable to limit the use of such a proxy to a set of clients which have permission to use it, and that the proxy can identify through a secure communication association.  </t>
            <t>
However, in order for OSCORE to be an applicable security mechanism for this scenario, OSCORE has to be terminated at the proxy. That is, it would be required for a client and the proxy to share a dedicated OSCORE Security Context and to use it for protecting their communication leg.</t>
          </li>
          <li>A proxy may be deployed to act as an entry point to a firewalled network, which only authenticated clients can join. In particular, authentication can rely on the used secure communication association between a client and the proxy. If the proxy could share a dedicated OSCORE Security Context with each client, the proxy can rely on it to identify the client, before forwarding its messages to any other member of the firewalled network.</li>
          <li>The approach defined in this document does not pose a limit to the number of OSCORE protections applied to the same CoAP message. This enables more privacy-oriented scenarios based on proxy chains, where the origin client protects a CoAP request using first the OSCORE Security Context shared with the origin server, and then the dedicated OSCORE Security Context shared with each of the different hops in the chain. Once received at a chain hop, the request would be stripped of the OSCORE protection associated with that hop before being forwarded to the next one.</li>
        </ul>
      </section>
    </section>
    <section anchor="sec-message-processing">
      <name>Message Processing</name>
      <t>As mentioned in <xref target="intro"/>, this document introduces the following two main deviations from the original OSCORE specification <xref target="RFC8613"/>.</t>
      <ol spacing="normal" type="1"><li>
          <t>An "OSCORE endpoint", i.e., a producer/consumer of an OSCORE Option can be not only an application endpoint (i.e., an origin client or server), but also an intermediary such as a proxy.  </t>
          <t>
Hence, OSCORE can be used between an origin client/server and a proxy, as well as between two proxies in an intermediary chain.</t>
        </li>
        <li>
          <t>A CoAP message can be secured by multiple OSCORE protections applied in sequence. Therefore, the final result is a message with nested OSCORE protections, as the output of an "OSCORE-in-OSCORE" process. Hence, following a decryption, the resulting message might legitimately include an OSCORE Option, and thus have in turn to be decrypted.  </t>
          <t>
The most common case is expected to consider a message protected with up to two OSCORE layers, i.e.: i) an inner layer, protecting the message end-to-end between the origin client and the origin server acting as application endpoints; and ii) an outer layer, protecting the message between a certain OSCORE endpoint and the other OSCORE endpoint adjacent in the intermediary chain.  </t>
          <t>
However, a message can also be protected with a higher arbitrary number of nested OSCORE layers, e.g., in scenarios relying on a longer chain of intermediaries. For instance, the origin client can sequentially apply multiple OSCORE layers to a request, each of which to be consumed and removed by one of the intermediaries in the chain, until the origin server is reached and it consumes the innermost OSCORE layer.</t>
        </li>
      </ol>
      <t><xref target="sec-examples"/> provides a number of examples where the approach defined in this document is used to protect message exchanges.</t>
      <section anchor="general-rules">
        <name>General Rules on Protecting Options</name>
        <t>Let us consider a sender endpoint that, when protecting an outgoing message, applies the i-th OSCORE layer in sequence, by using the OSCORE Security Context shared with another OSCORE endpoint X.</t>
        <t>In addition to the CoAP options specified as class E in <xref target="RFC8613"/> or in the document defining them, the sender endpoint MUST encrypt and integrity-protect the following CoAP options. That is, even if they are originally specified as class U or class I for OSCORE, such options are processed like if they were specified as class E.</t>
        <ul spacing="normal">
          <li>
            <t>Any CoAP option such that both the following conditions hold.  </t>
            <ol spacing="normal" type="1"><li>
                <t>The sender endpoint has added the option to the message either:      </t>
                <ul spacing="normal">
                  <li>Following a message protection previously performed for an OSCORE endpoint different than X; or</li>
                  <li>Before a message protection previously performed for an OSCORE endpoint different than X, where the option was treated as Class U or I.</li>
                </ul>
              </li>
              <li>The option is not intended to be consumed by the other OSCORE endpoint X.</li>
            </ol>
            <t>
Examples of such CoAP options are:  </t>
            <ul spacing="normal">
              <li>The OSCORE Option present as the result of the OSCORE layer immediately previously applied for an OSCORE endpoint different than X, when the sender endpoint is an origin endpoint.</li>
              <li>The EDHOC Option defined in <xref target="I-D.ietf-core-oscore-edhoc"/>, when the sender endpoint is the origin client.</li>
              <li>The Request-Hash Option defined in <xref target="I-D.amsuess-core-cachable-oscore"/>, when X is not an origin endpoint).</li>
            </ul>
          </li>
          <li>
            <t>Any CoAP option such that all the following conditions hold.  </t>
            <ol spacing="normal" type="1"><li>The sender endpoint has added the option to the message.</li>
              <li>The option is intended to be consumed by the other OSCORE endpoint X.</li>
              <li>At the other OSCORE endpoint X, the option does not play a role in processing the message before having removed the i-th OSCORE layer or in removing the i-th OSCORE layer altogether.</li>
            </ol>
            <t>
Examples of such CoAP options are:  </t>
            <ul spacing="normal">
              <li>The Proxy-Uri, Proxy-Scheme, Uri-Host and Uri-Port Options defined in <xref target="RFC7252"/>.</li>
              <li>The Listen-To-Multicast-Notifications Option defined in <xref target="I-D.ietf-core-observe-multicast-notifications"/>.</li>
              <li>The Multicast-Timeout, Response-Forwarding and Group-ETag Options defined in <xref target="I-D.tiloca-core-groupcomm-proxy"/>.</li>
            </ul>
          </li>
          <li>
            <t>Any CoAP option such that the sender endpoint has not added the option to the message.  </t>
            <t>
Examples of such CoAP options are:  </t>
            <ul spacing="normal">
              <li>The OSCORE Option present as the result of the OSCORE layer immediately previously applied for an OSCORE endpoint different than X, when the sender endpoint is not an origin endpoint.</li>
              <li>The EDHOC Option defined in <xref target="I-D.ietf-core-oscore-edhoc"/>, when the sender endpoint is not the origin client.</li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="outgoing-requests">
        <name>Processing an Outgoing Request</name>
        <t>The rules from <xref target="general-rules"/> apply when processing an outgoing request message, with the following addition.</t>
        <t>When an application endpoint applies multiple OSCORE layers in sequence to protect an outgoing request, and it uses an OSCORE Security Context shared with the other application endpoint, then the first OSCORE layer MUST be applied by using that Security Context.</t>
      </section>
      <section anchor="incoming-requests">
        <name>Processing an Incoming Request</name>
        <t>Upon receiving a request REQ, the recipient endpoint performs the actions described in the following steps.</t>
        <ol spacing="normal" type="1"><li>If REQ includes proxy-related options, the endpoint moves to step 2. Otherwise, the endpoint moves to step 3.</li>
          <li>
            <t>The endpoint proceeds as defined below, depending on which of the two following conditions holds.  </t>
            <ul spacing="normal">
              <li>
                <t>REQ includes either the Proxy-Uri Option, or the Proxy-Scheme Option together with any of the Uri-* Options.      </t>
                <t>
If the endpoint is not configured to be a forward-proxy, it MUST stop processing the request and MUST respond with a 5.05 (Proxying Not Supported) error response to (the previous hop towards) the origin client, as per <xref section="5.10.2" sectionFormat="of" target="RFC7252"/>. This may result in protecting the error response over that communication leg, as per <xref target="outgoing-responses"/>.      </t>
                <t>
Otherwise, the endpoint MUST check whether forwarding this request to (the next hop towards) the origin server is an authorized operation. This check can be based, for instance, on the specific OSCORE Security Context that the endpoint used to decrypt the incoming message, before performing this step.      </t>
                <t>
In case the authentication check fails, the endpoint MUST stop processing the request and MUST respond with a 4.01 (Unauthorized) error response to (the previous hop towards) the origin client, as per <xref section="5.10.2" sectionFormat="of" target="RFC7252"/>. This may result in protecting the error response over that communication leg, as per <xref target="outgoing-responses"/>.      </t>
                <t>
Otherwise, the endpoint consumes the proxy-related options as per <xref section="5.7.2" sectionFormat="of" target="RFC7252"/> and forwards REQ to (the next hop towards) the origin server, unless differently indicated in REQ, e.g., by means of any of its CoAP options. For instance, a forward-proxy does not forward a request that includes proxy-related options together with the Listen-To-Multicast-Notifications Option (see <xref section="12" sectionFormat="of" target="I-D.ietf-core-observe-multicast-notifications"/>).      </t>
                <t>
If the endpoint forwards REQ to (the next hop towards) the origin server, this may result in (further) protecting REQ over that communication leg, as per <xref target="outgoing-requests"/>.      </t>
                <t>
After that, the endpoint does not take any further action.</t>
              </li>
              <li>
                <t>REQ includes one or more Uri-Path Options but not the Proxy-Scheme Option.      </t>
                <t>
If the endpoint is not configured to be a reverse-proxy or its resource targeted by the Uri-Path Options is not intended to support reverse-proxy functionalities, then the endpoint proceeds to step 3.      </t>
                <t>
Otherwise, the endpoint MUST check whether forwarding this request to (the next hop towards) the origin server is an authorized operation. This check can be based, for instance, on the specific OSCORE Security Context that the endpoint used to decrypt the incoming message, before performing this step.      </t>
                <t>
In case the authentication check fails, the endpoint MUST stop processing the request and MUST respond with a 4.01 (Unauthorized) error response to (the previous hop towards) the origin client, as per <xref section="5.10.2" sectionFormat="of" target="RFC7252"/>. This may result in protecting the error response over that communication leg, as per <xref target="outgoing-responses"/>.      </t>
                <t>
Otherwise, the endpoint consumes the Uri-Path options as per <xref section="5.7.3" sectionFormat="of" target="RFC7252"/>, and forwards REQ to (the next hop towards) the origin server, unless differently indicated in REQ, e.g., by means of any of its CoAP options.      </t>
                <t>
If the endpoint forwards REQ to (the next hop towards) the origin server, this may result in (further) protecting REQ over that communication leg, as per <xref target="outgoing-requests"/>.      </t>
                <t>
After that, the endpoint does not take any further action.      </t>
                <t>
Note that, when forwarding REQ, the endpoint might not remove all the Uri-Path Options originally present, e.g., in case the next hop towards the origin server is a further reverse-proxy.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>The endpoint proceeds as defined below, depending on which of the two following conditions holds.  </t>
            <ul spacing="normal">
              <li>
                <t>REQ does not include an OSCORE Option.      </t>
                <t>
If the endpoint does not have an application to handle REQ, it MUST stop processing the request and MAY respond with a 4.00 (Bad Request) error response to (the previous hop towards) the origin client. This may result in protecting the error response over that communication leg, as per <xref target="outgoing-responses"/>.      </t>
                <t>
Otherwise, the endpoint delivers REQ to the application.</t>
              </li>
              <li>
                <t>REQ includes an OSCORE Option.      </t>
                <t>
If REQ includes any URI-Path Options, the endpoint MUST stop processing the request and MAY respond with a 4.00 (Bad Request) error response to (the previous hop towards) the origin client. This may result in protecting the error response over that communication leg, as per <xref target="outgoing-responses"/>.      </t>
                <t>
The endpoint decrypts REQ using the OSCORE Security Context indicated by the OSCORE Option, i.e., REQ* = dec(REQ). After that, the possible presence of an OSCORE Option in the decrypted request REQ* is not treated as an error situation.      </t>
                <t>
If the OSCORE processing results in an error, the endpoint MUST stop processing the request and performs error handling as per <xref section="8.2" sectionFormat="of" target="RFC8613"/> or Sections <xref target="I-D.ietf-core-oscore-groupcomm" section="8.2" sectionFormat="bare"/> and <xref target="I-D.ietf-core-oscore-groupcomm" section="9.4" sectionFormat="bare"/> of <xref target="I-D.ietf-core-oscore-groupcomm"/>, in case OSCORE or Group OSCORE is used, respectively. In case the endpoint sends an error response to (the previous hop towards) the origin client, this may result in protecting the error response over that communication leg, as per <xref target="outgoing-responses"/>.      </t>
                <t>
Otherwise, REQ takes REQ*, and the endpoint moves to step 1.</t>
              </li>
            </ul>
          </li>
        </ol>
      </section>
      <section anchor="outgoing-responses">
        <name>Processing an Outgoing Response</name>
        <t>The rules from <xref target="general-rules"/> apply when processing an outgoing response message, with the following additions.</t>
        <t>When an application endpoint applies multiple OSCORE layers in sequence to protect an outgoing response, and it uses an OSCORE Security Context shared with the other application endpoint, then the first OSCORE layer MUST be applied by using that Security Context.</t>
        <t>The sender endpoint protects the response by applying the same OSCORE layers that it removed from the corresponding incoming request, but in the reverse order than the one they were removed.</t>
        <t>In case the response is an error response, the sender endpoint protects it by applying the same OSCORE layers that it successfully removed from the corresponding incoming request, but in the reverse order than the one they were removed.</t>
      </section>
      <section anchor="incoming-responses">
        <name>Processing an Incoming Response</name>
        <t>The recipient endpoint removes the same OSCORE layers that it added when protecting the corresponding outgoing request, but in the reverse order than the one they were removed.</t>
        <t>When doing so, the possible presence of an OSCORE Option in the decrypted response following the removal of an OSCORE layer is not treated as an error situation, unless it occurs after having removed as many OSCORE layers as were added in the outgoing request. In such a case, the endpoint MUST stop processing the response.</t>
      </section>
    </section>
    <section anchor="sec-response-caching">
      <name>Caching of OSCORE-Protected Responses</name>
      <t>Although not possible as per the original OSCORE specification <xref target="RFC8613"/>, cacheability of OSCORE-protected responses at proxies can be achieved. To this end, the approach defined in <xref target="I-D.amsuess-core-cachable-oscore"/> can be used, as based on Deterministic Requests protected with the pairwise mode of Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/> used end-to-end between an origin client and an origin server. The applicability of this approach is limited to requests that are safe (in the RESTful sense) to process and do not yield side effects at the origin server.</t>
      <t>In particular, this approach requires both the origin client and the origin server to have already joined the correct OSCORE group. Then, starting from the same plain CoAP request, different clients in the OSCORE group are able to deterministically generate a same request protected with Group OSCORE, which is sent to a proxy for being forwarded to the origin server. The proxy can effectively cache the resulting OSCORE-protected response from the server, since the same plain CoAP request will result again in the same Deterministic Request and thus will produce a cache hit.</t>
      <t>When using this approach, the following also applies in addition to what is defined in <xref target="sec-message-processing"/>, when processing incoming messages at a proxy that implements caching of responses.</t>
      <ul spacing="normal">
        <li>
          <t>Upon receiving a request from (the previous hop towards) the origin client, the proxy checks if specifically the message available during the execution of step 2 in <xref target="incoming-requests"/> produces a cache hit.  </t>
          <t>
That is, such a message: i) is exactly the one to be forwarded to (the next hop towards) the origin server, if no cache hit has occurred; and ii) is the result of an OSCORE decryption at the proxy, if OSCORE is used on the communication leg between the proxy and (the previous hop towards) the origin client.</t>
        </li>
        <li>
          <t>Upon receiving a response from (the next hop towards) the origin server, the proxy first removes the same OSCORE layers that it added when protecting the corresponding outgoing request, as defined in <xref target="incoming-responses"/>.  </t>
          <t>
Then, the proxy stores specifically that resulting response message in its cache. That is, such a message is exactly the one to be forwarded to (the previous hop towards) the origin client.</t>
        </li>
      </ul>
      <t>The specific rules about serving a request with a cached response are defined in <xref section="5.6" sectionFormat="of" target="RFC7252"/>, as well as in <xref section="7" sectionFormat="of" target="I-D.tiloca-core-groupcomm-proxy"/> for group communication scenarios.</t>
    </section>
    <section anchor="establishment-of-oscore-security-contexts">
      <name>Establishment of OSCORE Security Contexts</name>
      <t>Like the original OSCORE specification <xref target="RFC8613"/>, this document is not devoted to any particular approach that two OSCORE endpoints use for establishing an OSCORE Security Context.</t>
      <t>At the same time the following applies, depending on the two peers using OSCORE or Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/> to protect their communications.</t>
      <ul spacing="normal">
        <li>
          <t>When using OSCORE, the establishment of the OSCORE Security Context can rely on the authenticated key establishment protocol EDHOC <xref target="I-D.ietf-lake-edhoc"/>.  </t>
          <t>
Assuming the use of OSCORE both between the two origin application endpoints as well as between the origin client and the first proxy in the chain, it is expected that the origin client first runs EDHOC with the first proxy in the chain, and then with the origin server through the chain of proxies (see the example in <xref target="sec-example-edhoc"/>).  </t>
          <t>
Furthermore, the additional use of the combined EDHOC + OSCORE request defined in <xref target="I-D.ietf-core-oscore-edhoc"/> is particularly beneficial in this case (see the example in <xref target="sec-example-edhoc-comb-req"/>), and especially when relying on a long chain of proxies.</t>
        </li>
        <li>
          <t>The use of Group OSCORE is expected to be limited between the origin applications endpoints, e.g., between the origin client and multiple origin servers. In order to join the same OSCORE group and obtain the corresponding Group OSCORE Security Context, those endpoints can use the approach defined in <xref target="I-D.ietf-ace-key-groupcomm-oscore"/> and based on the ACE framework for authentication and authorization in constrained environments <xref target="RFC9200"/>.  </t>
          <t>
In case a proxy in the chain uses Group OSCORE, then that proxy MUST NOT be a member of the same OSCORE group whose Group OSCORE Security Context is used by the origin application endpoints for protecting communications end-to-end through the chain of proxies.</t>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no actions for IANA.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC7252" target="https://www.rfc-editor.org/info/rfc7252">
          <front>
            <title>The Constrained Application Protocol (CoAP)</title>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby">
              <organization/>
            </author>
            <author fullname="K. Hartke" initials="K." surname="Hartke">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks.  The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s.  The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t>
              <t>CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types.  CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7252"/>
          <seriesInfo name="DOI" value="10.17487/RFC7252"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8613" target="https://www.rfc-editor.org/info/rfc8613">
          <front>
            <title>Object Security for Constrained RESTful Environments (OSCORE)</title>
            <author fullname="G. Selander" initials="G." surname="Selander">
              <organization/>
            </author>
            <author fullname="J. Mattsson" initials="J." surname="Mattsson">
              <organization/>
            </author>
            <author fullname="F. Palombini" initials="F." surname="Palombini">
              <organization/>
            </author>
            <author fullname="L. Seitz" initials="L." surname="Seitz">
              <organization/>
            </author>
            <date month="July" year="2019"/>
            <abstract>
              <t>This document defines Object Security for Constrained RESTful Environments (OSCORE), a method for application-layer protection of the Constrained Application Protocol (CoAP), using CBOR Object Signing and Encryption (COSE).  OSCORE provides end-to-end protection between endpoints communicating using CoAP or CoAP-mappable HTTP. OSCORE is designed for constrained nodes and networks supporting a range of proxy operations, including translation between different transport protocols.</t>
              <t>Although an optional functionality of CoAP, OSCORE alters CoAP options processing and IANA registration.  Therefore, this document updates RFC 7252.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8613"/>
          <seriesInfo name="DOI" value="10.17487/RFC8613"/>
        </reference>
        <reference anchor="I-D.ietf-core-oscore-groupcomm" target="https://datatracker.ietf.org/doc/html/draft-ietf-core-oscore-groupcomm-17">
          <front>
            <title>Group OSCORE - Secure Group Communication for CoAP</title>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Göran Selander" initials="G." surname="Selander">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="Francesca Palombini" initials="F." surname="Palombini">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="John Preuß Mattsson" initials="J. P." surname="Mattsson">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="Jiye Park" initials="J." surname="Park">
              <organization>Universitaet Duisburg-Essen</organization>
            </author>
            <date day="20" month="December" year="2022"/>
            <abstract>
              <t>   This document defines Group Object Security for Constrained RESTful
   Environments (Group OSCORE), providing end-to-end security of CoAP
   messages exchanged between members of a group, e.g., sent over IP
   multicast.  In particular, the described approach defines how OSCORE
   is used in a group communication setting to provide source
   authentication for CoAP group requests, sent by a client to multiple
   servers, and for protection of the corresponding CoAP responses.
   Group OSCORE also defines a pairwise mode where each member of the
   group can efficiently derive a symmetric pairwise key with any other
   member of the group for pairwise OSCORE communication.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-oscore-groupcomm-17"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC7641" target="https://www.rfc-editor.org/info/rfc7641">
          <front>
            <title>Observing Resources in the Constrained Application Protocol (CoAP)</title>
            <author fullname="K. Hartke" initials="K." surname="Hartke">
              <organization/>
            </author>
            <date month="September" year="2015"/>
            <abstract>
              <t>The Constrained Application Protocol (CoAP) is a RESTful application protocol for constrained nodes and networks.  The state of a resource on a CoAP server can change over time.  This document specifies a simple protocol extension for CoAP that enables CoAP clients to "observe" resources, i.e., to retrieve a representation of a resource and keep this representation updated by the server over a period of time.  The protocol follows a best-effort approach for sending new representations to clients and provides eventual consistency between the state observed by each client and the actual resource state at the server.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7641"/>
          <seriesInfo name="DOI" value="10.17487/RFC7641"/>
        </reference>
        <reference anchor="RFC8742" target="https://www.rfc-editor.org/info/rfc8742">
          <front>
            <title>Concise Binary Object Representation (CBOR) Sequences</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes the Concise Binary Object Representation (CBOR) Sequence format and associated media type "application/cbor-seq".  A CBOR Sequence consists of any number of encoded CBOR data items, simply concatenated in sequence.</t>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation.  This specification defines and registers "+cbor-seq" as a structured syntax suffix for CBOR Sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8742"/>
          <seriesInfo name="DOI" value="10.17487/RFC8742"/>
        </reference>
        <reference anchor="RFC9200" target="https://www.rfc-editor.org/info/rfc9200">
          <front>
            <title>Authentication and Authorization for Constrained Environments Using the OAuth 2.0 Framework (ACE-OAuth)</title>
            <author fullname="L. Seitz" initials="L." surname="Seitz">
              <organization/>
            </author>
            <author fullname="G. Selander" initials="G." surname="Selander">
              <organization/>
            </author>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem">
              <organization/>
            </author>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman">
              <organization/>
            </author>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig">
              <organization/>
            </author>
            <date month="August" year="2022"/>
            <abstract>
              <t>This specification defines a framework for authentication and authorization in Internet of Things (IoT) environments called ACE-OAuth. The framework is based on a set of building blocks including OAuth 2.0 and the Constrained Application Protocol (CoAP), thus transforming a well-known and widely used authorization solution into a form suitable for IoT devices.  Existing specifications are used where possible, but extensions are added and profiles are defined to better serve the IoT use cases.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9200"/>
          <seriesInfo name="DOI" value="10.17487/RFC9200"/>
        </reference>
        <reference anchor="I-D.ietf-core-groupcomm-bis" target="https://datatracker.ietf.org/doc/html/draft-ietf-core-groupcomm-bis-08">
          <front>
            <title>Group Communication for the Constrained Application Protocol (CoAP)</title>
            <author fullname="Esko Dijk" initials="E." surname="Dijk">
              <organization>IoTconsultancy.nl</organization>
            </author>
            <author fullname="Chonggang Wang" initials="C." surname="Wang">
              <organization>InterDigital</organization>
            </author>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <date day="11" month="January" year="2023"/>
            <abstract>
              <t>   This document specifies the use of the Constrained Application
   Protocol (CoAP) for group communication, including the use of UDP/IP
   multicast as the default underlying data transport.  Both unsecured
   and secured CoAP group communication are specified.  Security is
   achieved by use of the Group Object Security for Constrained RESTful
   Environments (Group OSCORE) protocol.  The target application area of
   this specification is any group communication use cases that involve
   resource-constrained devices or networks that support CoAP.  This
   document replaces RFC 7390, while it updates RFC 7252 and RFC 7641.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-groupcomm-bis-08"/>
        </reference>
        <reference anchor="I-D.tiloca-core-groupcomm-proxy" target="https://datatracker.ietf.org/doc/html/draft-tiloca-core-groupcomm-proxy-08">
          <front>
            <title>Proxy Operations for CoAP Group Communication</title>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Esko Dijk" initials="E." surname="Dijk">
              <organization>IoTconsultancy.nl</organization>
            </author>
            <date day="28" month="February" year="2023"/>
            <abstract>
              <t>   This document specifies the operations performed by a proxy, when
   using the Constrained Application Protocol (CoAP) in group
   communication scenarios.  Such a proxy processes a single request
   sent by a client over unicast, and distributes the request over IP
   multicast to a group of servers.  Then, the proxy collects the
   individual responses from those servers and relays those responses
   back to the client, in a way that allows the client to distinguish
   the responses and their origin servers through embedded addressing
   information.  This document updates RFC7252 with respect to caching
   of response messages at proxies.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-tiloca-core-groupcomm-proxy-08"/>
        </reference>
        <reference anchor="I-D.ietf-core-observe-multicast-notifications" target="https://datatracker.ietf.org/doc/html/draft-ietf-core-observe-multicast-notifications-05">
          <front>
            <title>Observe Notifications as CoAP Multicast Responses</title>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Rikard Höglund" initials="R." surname="Höglund">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Christian Amsüss" initials="C." surname="Amsüss">
         </author>
            <author fullname="Francesca Palombini" initials="F." surname="Palombini">
              <organization>Ericsson AB</organization>
            </author>
            <date day="24" month="October" year="2022"/>
            <abstract>
              <t>   The Constrained Application Protocol (CoAP) allows clients to
   "observe" resources at a server, and receive notifications as unicast
   responses upon changes of the resource state.  In some use cases,
   such as based on publish-subscribe, it would be convenient for the
   server to send a single notification addressed to all the clients
   observing a same target resource.  This document updates RFC7252 and
   RFC7641, and defines how a server sends observe notifications as
   response messages over multicast, synchronizing all the observers of
   a same resource on a same shared Token value.  Besides, this document
   defines how Group OSCORE can be used to protect multicast
   notifications end-to-end between the server and the observer clients.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-observe-multicast-notifications-05"/>
        </reference>
        <reference anchor="I-D.ietf-core-coap-pubsub" target="https://datatracker.ietf.org/doc/html/draft-ietf-core-coap-pubsub-12">
          <front>
            <title>A publish-subscribe architecture for the Constrained Application Protocol (CoAP)</title>
            <author fullname="Michael Koster" initials="M." surname="Koster">
              <organization>Unaffiliated</organization>
            </author>
            <author fullname="Ari Keränen" initials="A." surname="Keränen">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Jaime Jimenez" initials="J." surname="Jimenez">
              <organization>Ericsson</organization>
            </author>
            <date day="13" month="March" year="2023"/>
            <abstract>
              <t>   This document describes a publish-subscribe architecture for CoAP
   that extends the capabilities of CoAP for supporting nodes with long
   breaks in connectivity and/or up-time.  The Constrained Application
   Protocol (CoAP) is used by CoAP clients both to publish and to
   subscribe via a known topic resource.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-coap-pubsub-12"/>
        </reference>
        <reference anchor="I-D.ietf-core-oscore-edhoc" target="https://datatracker.ietf.org/doc/html/draft-ietf-core-oscore-edhoc-07">
          <front>
            <title>Using EDHOC with CoAP and OSCORE</title>
            <author fullname="Francesca Palombini" initials="F." surname="Palombini">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Rikard Höglund" initials="R." surname="Höglund">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Stefan Hristozov" initials="S." surname="Hristozov">
              <organization>Fraunhofer AISEC</organization>
            </author>
            <author fullname="Göran Selander" initials="G." surname="Selander">
              <organization>Ericsson</organization>
            </author>
            <date day="13" month="March" year="2023"/>
            <abstract>
              <t>   The lightweight authenticated key exchange protocol EDHOC can be run
   over CoAP and used by two peers to establish an OSCORE Security
   Context.  This document details this use of the EDHOC protocol, by
   specifying a number of additional and optional mechanisms.  These
   especially include an optimization approach for combining the
   execution of EDHOC with the first OSCORE transaction.  This
   combination reduces the number of round trips required to set up an
   OSCORE Security Context and to complete an OSCORE transaction using
   that Security Context.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-oscore-edhoc-07"/>
        </reference>
        <reference anchor="I-D.ietf-lake-edhoc" target="https://datatracker.ietf.org/doc/html/draft-ietf-lake-edhoc-19">
          <front>
            <title>Ephemeral Diffie-Hellman Over COSE (EDHOC)</title>
            <author fullname="Göran Selander" initials="G." surname="Selander">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="John Preuß Mattsson" initials="J. P." surname="Mattsson">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="Francesca Palombini" initials="F." surname="Palombini">
              <organization>Ericsson AB</organization>
            </author>
            <date day="3" month="February" year="2023"/>
            <abstract>
              <t>   This document specifies Ephemeral Diffie-Hellman Over COSE (EDHOC), a
   very compact and lightweight authenticated Diffie-Hellman key
   exchange with ephemeral keys.  EDHOC provides mutual authentication,
   forward secrecy, and identity protection.  EDHOC is intended for
   usage in constrained scenarios and a main use case is to establish an
   OSCORE security context.  By reusing COSE for cryptography, CBOR for
   encoding, and CoAP for transport, the additional code size can be
   kept very low.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-lake-edhoc-19"/>
        </reference>
        <reference anchor="I-D.ietf-core-transport-indication" target="https://datatracker.ietf.org/doc/html/draft-ietf-core-transport-indication-02">
          <front>
            <title>CoAP Protocol Indication</title>
            <author fullname="Christian Amsüss" initials="C." surname="Amsüss">
         </author>
            <date day="13" month="March" year="2023"/>
            <abstract>
              <t>   The Constrained Application Protocol (CoAP, [RFC7252]) is available
   over different transports (UDP, DTLS, TCP, TLS, WebSockets), but
   lacks a way to unify these addresses.  This document provides
   terminology and provisions based on Web Linking [RFC8288] to express
   alternative transports available to a device, and to optimize
   exchanges using these.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-transport-indication-02"/>
        </reference>
        <reference anchor="I-D.ietf-ace-key-groupcomm-oscore" target="https://datatracker.ietf.org/doc/html/draft-ietf-ace-key-groupcomm-oscore-16">
          <front>
            <title>Key Management for OSCORE Groups in ACE</title>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Jiye Park" initials="J." surname="Park">
              <organization>Universitaet Duisburg-Essen</organization>
            </author>
            <author fullname="Francesca Palombini" initials="F." surname="Palombini">
              <organization>Ericsson AB</organization>
            </author>
            <date day="6" month="March" year="2023"/>
            <abstract>
              <t>   This document defines an application profile of the ACE framework for
   Authentication and Authorization, to request and provision keying
   material in group communication scenarios that are based on CoAP and
   are secured with Group Object Security for Constrained RESTful
   Environments (Group OSCORE).  This application profile delegates the
   authentication and authorization of Clients, that join an OSCORE
   group through a Resource Server acting as Group Manager for that
   group.  This application profile leverages protocol-specific
   transport profiles of ACE to achieve communication security, server
   authentication and proof-of-possession for a key owned by the Client
   and bound to an OAuth 2.0 Access Token.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ace-key-groupcomm-oscore-16"/>
        </reference>
        <reference anchor="I-D.amsuess-core-cachable-oscore" target="https://datatracker.ietf.org/doc/html/draft-amsuess-core-cachable-oscore-06">
          <front>
            <title>Cacheable OSCORE</title>
            <author fullname="Christian Amsüss" initials="C." surname="Amsüss">
         </author>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <date day="11" month="January" year="2023"/>
            <abstract>
              <t>   Group communication with the Constrained Application Protocol (CoAP)
   can be secured end-to-end using Group Object Security for Constrained
   RESTful Environments (Group OSCORE), also across untrusted
   intermediary proxies.  However, this sidesteps the proxies' abilities
   to cache responses from the origin server(s).  This specification
   restores cacheability of protected responses at proxies, by
   introducing consensus requests which any client in a group can send
   to one server or multiple servers in the same group.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-amsuess-core-cachable-oscore-06"/>
        </reference>
        <reference anchor="LwM2M-Core" target="http://www.openmobilealliance.org/release/LightweightM2M/V1_2-20201110-A/OMA-TS-LightweightM2M_Core-V1_2-20201110-A.pdf">
          <front>
            <title>Lightweight Machine to Machine Technical Specification - Core, Approved Version 1.2, OMA-TS-LightweightM2M_Core-V1_2-20201110-A</title>
            <author>
              <organization>Open Mobile Alliance</organization>
            </author>
            <date year="2020" month="November"/>
          </front>
        </reference>
        <reference anchor="LwM2M-Transport" target="http://www.openmobilealliance.org/release/LightweightM2M/V1_2-20201110-A/OMA-TS-LightweightM2M_Transport-V1_2-20201110-A.pdf">
          <front>
            <title>Lightweight Machine to Machine Technical Specification - Transport Bindings, Approved Version 1.2, OMA-TS-LightweightM2M_Transport-V1_2-20201110-A</title>
            <author>
              <organization>Open Mobile Alliance</organization>
            </author>
            <date year="2020" month="November"/>
          </front>
        </reference>
        <reference anchor="LwM2M-Gateway" target="https://www.openmobilealliance.org/release/LwM2M_Gateway/V1_1-20210518-A/OMA-TS-LWM2M_Gateway-V1_1-20210518-A.pdf">
          <front>
            <title>Lightweight Machine to Machine Gateway Technical Specification - Approved Version 1.1, OMA-TS-LWM2M_Gateway-V1_1-20210518-A</title>
            <author>
              <organization>Open Mobile Alliance</organization>
            </author>
            <date year="2021" month="May"/>
          </front>
        </reference>
      </references>
    </references>
    <section anchor="sec-examples">
      <name>Examples</name>
      <t>This section provides a number of examples where the approach defined in this document is used to protect message exchanges.</t>
      <t>The presented examples build on the example shown in <xref section="A.1" sectionFormat="of" target="RFC8613"/>, and illustrate an origin client requesting the alarm status from an origin server, through a forward-proxy.</t>
      <section anchor="example-1">
        <name>Example 1</name>
        <t>In the example shown in <xref target="fig-example-client-proxy"/>, message exchanges are protected with OSCORE over the following legs.</t>
        <ul spacing="normal">
          <li>End-to-end, between the client and the server, using the OSCORE Security Context CTX_C_S. The client uses the OSCORE Sender ID 0x5f when using OSCORE with the server.</li>
          <li>Between the client and the proxy, using the OSCORE Security Context CTX_C_P. The client uses the OSCORE Sender ID 0x20 when using OSCORE with the proxy.</li>
        </ul>
        <figure anchor="fig-example-client-proxy">
          <name>Use of OSCORE between Client-Server and Client-Proxy</name>
          <artwork><![CDATA[
Client  Proxy  Server
  |       |       |
  +------>|       |     Code: 0.02 (POST)
  | POST  |       |    Token: 0x8c
  |       |       |   OSCORE: [kid: 0x20, Partial IV: 31]
  |       |       |     0xff
  |       |       |  Payload: {Code: 0.02,
  |       |       |            OSCORE: [kid: 0x5f, Partial IV: 42],
  |       |       |            Uri-Host: example.com,
  |       |       |            Proxy-Scheme: coap,
  |       |       |            0xff,
  |       |       |            {Code: 0.01,
  |       |       |             Uri-Path: "alarm_status"
  |       |       |            } // Encrypted with CTX_C_S
  |       |       |           } // Encrypted with CTX_C_P
  |       |       |
  |       +------>|     Code: 0.02 (POST)
  |       | POST  |    Token: 0x7b
  |       |       |   OSCORE: [kid: 0x5f, Partial IV: 42]
  |       |       |     0xff
  |       |       |  Payload: {
  |       |       |            Code: 0.01,
  |       |       |            Uri-Path: "alarm_status"
  |       |       |           } // Encrypted with CTX_C_S
  |       |       |
  |       |<------+     Code: 2.04 (Changed)
  |       |  2.04 |    Token: 0x7b
  |       |       |   OSCORE: -
  |       |       |     0xff
  |       |       |  Payload: {Code: 2.05,
  |       |       |            0xff,
  |       |       |            "0"
  |       |       |           } // Encrypted with CTX_C_S
  |       |       |
  |<------+       |     Code: 2.04 (Changed)
  |  2.04 |       |    Token: 0x8c
  |       |       |   OSCORE: -
  |       |       |     0xff
  |       |       |  Payload: {Code: 2.04,
  |       |       |            OSCORE: -,
  |       |       |            0xff,
  |       |       |            {Code: 2.05,
  |       |       |             0xff,
  |       |       |             "0"
  |       |       |            } // Encrypted with CTX_C_S
  |       |       |           } // Encrypted with CTX_C_P
  |       |       |

Square brackets [ ... ] indicate content of compressed COSE object.
Curly brackets { ... } indicate encrypted data.
]]></artwork>
        </figure>
      </section>
      <section anchor="example-2">
        <name>Example 2</name>
        <t>In the example shown in <xref target="fig-example-proxy-server"/>, message exchanges are protected with OSCORE over the following legs.</t>
        <ul spacing="normal">
          <li>End-to-end between the client and the server, using the OSCORE Security Context CTX_C_S. The client uses the OSCORE Sender ID 0x5f when using OSCORE with the server.</li>
          <li>Between the proxy and the server, using the OSCORE Security Context CTX_P_S. The proxy uses the OSCORE Sender ID 0xd4 when using OSCORE with the server.</li>
        </ul>
        <figure anchor="fig-example-proxy-server">
          <name>Use of OSCORE between Client-Server and Proxy-Server</name>
          <artwork><![CDATA[
Client  Proxy  Server
  |       |       |
  +------>|       |         Code: 0.02 (POST)
  | POST  |       |        Token: 0x8c
  |       |       |     Uri-Host: example.com
  |       |       | Proxy-Scheme: coap
  |       |       |       OSCORE: [kid: 0x5f, Partial IV: 42]
  |       |       |         0xff
  |       |       |      Payload: {Code: 0.01,
  |       |       |                Uri-Path: "alarm_status"
  |       |       |               } // Encrypted with CTX_C_S
  |       |       |
  |       +------>|         Code: 0.02 (POST)
  |       | POST  |        Token: 0x7b
  |       |       |       OSCORE: [kid: 0xd4, Partial IV: 31]
  |       |       |         0xff
  |       |       |      Payload: {Code: 0.02,
  |       |       |                OSCORE: [kid: 0x5f, Partial IV: 42],
  |       |       |                0xff,
  |       |       |                {Code: 0.01,
  |       |       |                 Uri-Path: "alarm_status"
  |       |       |                } // Encrypted with CTX_C_S
  |       |       |               } // Encrypted with CTX_P_S
  |       |       |
  |       |<------+         Code: 2.04 (Changed)
  |       |  2.04 |        Token: 0x7b
  |       |       |       OSCORE: -
  |       |       |         0xff
  |       |       |      Payload: {Code: 2.04,
  |       |       |                OSCORE: -,
  |       |       |                0xff,
  |       |       |                {Code: 2.05,
  |       |       |                 0xff,
  |       |       |                 "0"
  |       |       |                } // Encrypted with CTX_C_S
  |       |       |               } // Encrypted with CTX_P_S
  |       |       |
  |<------+       |         Code: 2.04 (Changed)
  |  2.04 |       |        Token: 0x8c
  |       |       |       OSCORE: -
  |       |       |               0xff
  |       |       |      Payload: {Code: 2.05,
  |       |       |                0xff,
  |       |       |                "0"
  |       |       |               } // Encrypted with CTX_C_S
  |       |       |

Square brackets [ ... ] indicate content of compressed COSE object.
Curly brackets { ... } indicate encrypted data.
]]></artwork>
        </figure>
      </section>
      <section anchor="example-3">
        <name>Example 3</name>
        <t>In the example shown in <xref target="fig-example-client-proxy-server"/>, message exchanges are protected with OSCORE over the following legs.</t>
        <ul spacing="normal">
          <li>End-to-end between the client and the server, using the OSCORE Security Context CTX_C_S. The client uses the OSCORE Sender ID 0x5f when using OSCORE with the server.</li>
          <li>Between the client and the proxy, using the OSCORE Security Context CTX_C_P. The client uses the OSCORE Sender ID 0x20 when using OSCORE with the proxy.</li>
          <li>Between the proxy and the server, using the OSCORE Security Context CTX_P_S. The proxy uses the OSCORE Sender ID 0xd4 when using OSCORE with the server.</li>
        </ul>
        <figure anchor="fig-example-client-proxy-server">
          <name>Use of OSCORE between Client-Server, Client-Proxy and Proxy-Server</name>
          <artwork><![CDATA[
Client  Proxy  Server
  |       |       |
  +------>|       |    Code: 0.02 (POST)
  | POST  |       |   Token: 0x8c
  |       |       |  OSCORE: [kid: 0x20, Partial IV: 31]
  |       |       |    0xff
  |       |       | Payload: {Code: 0.02,
  |       |       |           OSCORE: [kid: 0x5f, Partial IV: 42],
  |       |       |           Uri-Host: example.com,
  |       |       |           Proxy-Scheme: coap,
  |       |       |           0xff,
  |       |       |           {Code: 0.01,
  |       |       |            Uri-Path: "alarm_status"
  |       |       |           } // Encrypted with CTX_C_S
  |       |       |          } // Encrypted with CTX_C_P
  |       |       |
  |       +------>|    Code: 0.02 (POST)
  |       | POST  |   Token: 0x7b
  |       |       |  OSCORE: [kid: 0xd4, Partial IV: 31]
  |       |       |    0xff
  |       |       | Payload: {Code: 0.02,
  |       |       |           OSCORE: [kid: 0x5f, Partial IV: 42],
  |       |       |           0xff,
  |       |       |           {Code: 0.01,
  |       |       |            Uri-Path: "alarm_status"
  |       |       |           } // Encrypted with CTX_C_S
  |       |       |          } // Encrypted with CTX_P_S
  |       |       |
  |       |<------+    Code: 2.04 (Changed)
  |       |  2.04 |   Token: 0x7b
  |       |       |  OSCORE: -
  |       |       |    0xff
  |       |       | Payload: {Code: 2.04,
  |       |       |           OSCORE: -,
  |       |       |           0xff,
  |       |       |           {Code: 2.05,
  |       |       |            0xff,
  |       |       |            "0"
  |       |       |           } // Encrypted with CTX_C_S
  |       |       |          } // Encrypted with CTX_P_S
  |       |       |
  |<------+       |    Code: 2.04 (Changed)
  |  2.04 |       |   Token: 0x8c
  |       |       |  OSCORE: -
  |       |       |    0xff
  |       |       | Payload: {Code: 2.04,
  |       |       |           OSCORE: -,
  |       |       |           0xff,
  |       |       |           {Code: 2.05,
  |       |       |            0xff,
  |       |       |            "0"
  |       |       |           } // Encrypted with CTX_C_S
  |       |       |          } // Encrypted with CTX_C_P
  |       |       |

Square brackets [ ... ] indicate content of compressed COSE object.
Curly brackets { ... } indicate encrypted data.
]]></artwork>
        </figure>
      </section>
      <section anchor="sec-example-edhoc">
        <name>Example 4</name>
        <t>In the example shown in <xref target="fig-example-edhoc"/>, message exchanges are protected over the following legs.</t>
        <ul spacing="normal">
          <li>End-to-end, between the client and the server, using the OSCORE Security Context CTX_C_S. The client uses the OSCORE Sender ID 0x5f when using OSCORE with the server.</li>
          <li>Between the client and the proxy, using the OSCORE Security Context CTX_C_P. The client uses the OSCORE Sender ID 0x20 when using OSCORE with the proxy.</li>
        </ul>
        <t>The example also shows how the client establishes an OSCORE Security Context CTX_C_P with the proxy and CTX_C_S with the server, by using the key establishment protocol EDHOC <xref target="I-D.ietf-lake-edhoc"/>.</t>
        <figure anchor="fig-example-edhoc">
          <name>Use of OSCORE between Client-Server and Proxy-Server, with OSCORE Security Contexts established through EDHOC</name>
          <artwork><![CDATA[
Client  Proxy  Server
  |       |       |
  +------>|       |         Code: 0.02 (POST)
  | POST  |       |        Token: 0xf3
  |       |       |     Uri-Path: ".well-known"
  |       |       |     Uri-Path: "edhoc"
  |       |       |         0xff
  |       |       |      Payload: (true, EDHOC message_1)
  |       |       |
  |<------+       |         Code: 2.04 (Changed)
  |  2.04 |       |        Token: 0xf3
  |       |       |         0xff
  |       |       |      Payload: EDHOC message_2
  |       |       |
Est.      |       |
CTX_C_P   |       |
  |       |       |
  +------>|       |         Code: 0.02 (POST)
  | POST  |       |        Token: 0x82
  |       |       |     Uri-Path: ".well-known"
  |       |       |     Uri-Path: edhoc
  |       |       |         0xff
  |       |       |      Payload: (C_R, EDHOC message_3)
  |       |       |
  |     Est.      |
  |     CTX_C_P   |
  |       |       |
  |<------+       |
  |  ACK  |       |
  |       |       |
  +------>|       |         Code: 0.02 (POST)
  | POST  |       |        Token: 0xbe
  |       |       |       OSCORE: [kid: 0x20, Partial IV: 00]
  |       |       |         0xff
  |       |       |      Payload: {Code: 0.02,
  |       |       |                Uri-Host: "example.com",
  |       |       |                Uri-Path: ".well-known",
  |       |       |                Uri-Path: "edhoc",
  |       |       |                Proxy-Scheme: "coap",
  |       |       |                0xff,
  |       |       |                (true, EDHOC message_1)
  |       |       |               } // Encrypted with CTX_C_P
  |       |       |
  |       +------>|         Code: 0.02 (POST)
  |       | POST  |        Token: 0xa5
  |       |       |     Uri-Path: ".well-known"
  |       |       |     Uri-Path: "edhoc"
  |       |       |         0xff
  |       |       |      Payload: (true, EDHOC message_1)
  |       |       |
  |       |<------+         Code: 2.04 (Changed)
  |       |  2.04 |        Token: 0xa5
  |       |       |         0xff
  |       |       |      Payload: EDHOC message_2
  |       |       |
  |<------+       |         Code: 2.04 (Changed)
  |  2.04 |       |        Token: 0xbe
  |       |       |       OSCORE: -
  |       |       |         0xff
  |       |       |      Payload: {Code: 2.04,
  |       |       |                0xff,
  |       |       |                EDHOC message_2
  |       |       |               } // Encrypted with CTX_C_P
  |       |       |
Est.      |       |
CTX_C_S   |       |
  |       |       |
  +------>|       |         Code: 0.02 (POST)
  | POST  |       |        Token: 0xb9
  |       |       |       OSCORE: [kid: 0x20, Partial IV: 01]
  |       |       |         0xff
  |       |       |      Payload: {Code: 0.02,
  |       |       |                Uri-Host: "example.com",
  |       |       |                Uri-Path: ".well-known",
  |       |       |                Uri-Path: "edhoc",
  |       |       |                Proxy-Scheme: "coap",
  |       |       |                0xff,
  |       |       |                (C_R, EDHOC message_3)
  |       |       |               } // Encrypted with CTX_C_P
  |       |       |
  |       +------>|         Code: 0.02 (POST)
  |       | POST  |        Token: 0xdd
  |       |       |     Uri-Path: ".well-known"
  |       |       |     Uri-Path: "edhoc"
  |       |       |         0xff
  |       |       |      Payload: (C_R, EDHOC message_3)
  |       |       |
  |       |     Est.
  |       |     CTX_C_S
  |       |       |
  |       |<------+
  |       |  ACK  |
  |       |       |
  |<------+       |
  |  ACK  |       |
  |       |       |
  +------>|       |    Code: 0.02 (POST)
  | POST  |       |   Token: 0x8c
  |       |       |  OSCORE: [kid: 0x20, Partial IV: 02]
  |       |       |    0xff
  |       |       | Payload: {Code: 0.02,
  |       |       |           OSCORE: [kid: 0x5f, Partial IV: 00],
  |       |       |           Uri-Host: "example.com",
  |       |       |           Proxy-Scheme: "coap",
  |       |       |           0xff,
  |       |       |           {Code: 0.01,
  |       |       |            Uri-Path: "alarm_status"
  |       |       |           } // Encrypted with CTX_C_S
  |       |       |          } // Encrypted with CTX_C_P
  |       |       |
  |       +------>|    Code: 0.02 (POST)
  |       | POST  |   Token: 0x7b
  |       |       |  OSCORE: [kid: 0x5f, Partial IV: 00]
  |       |       |    0xff
  |       |       | Payload: {Code: 0.01,
  |       |       |           Uri-Path: "alarm_status"
  |       |       |          } // Encrypted with CTX_C_S
  |       |       |
  |       |<------+    Code: 2.04 (Changed)
  |       |  2.04 |   Token: 0x7b
  |       |       |  OSCORE: -
  |       |       |    0xff
  |       |       | Payload: {Code: 2.05,
  |       |       |           0xff,
  |       |       |           "0"
  |       |       |          } // Encrypted with CTX_C_S
  |       |       |
  |<------+       |    Code: 2.04 (Changed)
  |  2.04 |       |   Token: 0x8c
  |       |       |  OSCORE: -
  |       |       |    0xff
  |       |       | Payload: {Code: 2.04,
  |       |       |           OSCORE: -,
  |       |       |           0xff,
  |       |       |           {Code: 2.05,
  |       |       |            0xff,
  |       |       |            "0"
  |       |       |           } // Encrypted with CTX_C_S
  |       |       |          } // Encrypted with CTX_C_P
  |       |       |

Square brackets [ ... ] indicate content of compressed COSE object.
Curly brackets { ... } indicate encrypted data.
Round brackets (...) indicate a CBOR sequence [RFC 8742].
]]></artwork>
        </figure>
      </section>
      <section anchor="sec-example-edhoc-comb-req">
        <name>Example 5</name>
        <t>In the example shown in <xref target="fig-example-edhoc-comb-req"/>, message exchanges are protected over the following legs.</t>
        <ul spacing="normal">
          <li>End-to-end, between the client and the server. The client uses the OSCORE Sender ID 0x5f when using OSCORE with the server.</li>
          <li>Between the client and the proxy. The client uses the OSCORE Sender ID 0x20 when using OSCORE with the proxy.</li>
        </ul>
        <t>The example also shows how the client establishes an OSCORE Security Context CTX_C_P with the proxy and CTX_C_S with the server, by using the key establishment protocol EDHOC <xref target="I-D.ietf-lake-edhoc"/>.</t>
        <t>In particular, the client relies on the EDHOC + OSCORE request defined in <xref target="I-D.ietf-core-oscore-edhoc"/>, in order to transport the last EDHOC message_3 and the first OSCORE-protected application CoAP request combined together.</t>
        <figure anchor="fig-example-edhoc-comb-req">
          <name>Use of OSCORE between Client-Server and Proxy-Server, with OSCORE Security Contexts established through EDHOC using the EDHOC + OSCORE request</name>
          <artwork><![CDATA[
Client  Proxy  Server
  |       |       |
  +------>|       |         Code: 0.02 (POST)
  | POST  |       |        Token: 0xf3
  |       |       |     Uri-Path: ".well-known"
  |       |       |     Uri-Path: "edhoc"
  |       |       |         0xff
  |       |       |      Payload: (true, EDHOC message_1)
  |       |       |
  |<------+       |         Code: 2.04 (Changed)
  |  2.04 |       |        Token: 0xf3
  |       |       |         0xff
  |       |       |      Payload: EDHOC message_2
  |       |       |
Est.      |       |
CTX_C_P   |       |
  |       |       |
  +------>|       |         Code: 0.02 (POST)
  | POST  |       |        Token: 0x82
  |       |       |       OSCORE: [kid: 0x20, Partial IV: 00]
  |       |       |        EDHOC: -
  |       |       |         0xff
  |       |       |      Payload: EDHOC message_3, // Intended for P
  |       |       |               {Code: 0.02,
  |       |       |                Uri-Host: "example.com",
  |       |       |                Uri-Path: ".well-known",
  |       |       |                Uri-Path: "edhoc",
  |       |       |                Proxy-Scheme: "coap",
  |       |       |                0xff,
  |       |       |                (true, EDHOC message_1)
  |       |       |               } // Encrypted with CTX_C_P
  |       |       |
  |     Est.      |
  |     CTX_C_P   |
  |       |       |
  |       +------>|         Code: 0.02 (POST)
  |       | POST  |        Token: 0xa5
  |       |       |     Uri-Path: ".well-known"
  |       |       |     Uri-Path: "edhoc"
  |       |       |         0xff
  |       |       |      Payload: (true, EDHOC message_1)
  |       |       |
  |       |<------+         Code: 2.04 (Changed)
  |       |  2.04 |        Token: 0xa5
  |       |       |         0xff
  |       |       |      Payload: EDHOC message_2
  |       |       |
  |<------+       |    Code: 2.04 (Changed)
  |  2.04 |       |   Token: 0x82
  |       |       |  OSCORE: -
  |       |       |    0xff
  |       |       | Payload: {Code: 2.04,
  |       |       |           0xff,
  |       |       |           EDHOC message_2
  |       |       |          } // Encrypted with CTX_C_P
  |       |       |
Est.      |       |
CTX_C_S   |       |
  |       |       |
  +------>|       |         Code: 0.02 (POST)
  | POST  |       |        Token: 0x83
  |       |       |       OSCORE: [kid: 0x20, Partial IV: 01]
  |       |       |         0xff
  |       |       |      Payload: {Code: 0.02,
  |       |       |                Uri-Host: "example.com",
  |       |       |                OSCORE: [kid: 0x5f, Partial IV: 00],
  |       |       |                EDHOC: -,
  |       |       |                Proxy-Scheme: "coap",
  |       |       |                0xff,
  |       |       |                EDHOC message_3 // Intended for S
  |       |       |                {
  |       |       |                 Code: 0.01,
  |       |       |                 Uri-Path:"alarm_status"
  |       |       |                } // Encrypted with CTX_C_S
  |       |       |               } // Encrypted with CTX_C_P
  |       |       |
  |       +------>|         Code: 0.02 (POST)
  |       | POST  |        Token: 0xa6
  |       |       |       OSCORE: [kid: 0x5f, Partial IV: 00]
  |       |       |        EDHOC: -
  |       |       |         0xff
  |       |       |      Payload: EDHOC message_3 // Intended for S
  |       |       |               {
  |       |       |                Code: 0.01,
  |       |       |                Uri-Path: "alarm_status"
  |       |       |               } // Encrypted with CTX_C_S
  |       |       |
  |       |     Est.
  |       |     CTX_C_S
  |       |       |
  |       |<------+    Code: 2.04 (Changed)
  |       |  2.04 |   Token: 0xa6
  |       |       |  OSCORE: -
  |       |       |    0xff
  |       |       | Payload: {Code: 2.05,
  |       |       |           0xff,
  |       |       |           "0"
  |       |       |          } // Encrypted with CTX_C_S
  |       |       |
  |<------+       |    Code: 2.04 (Changed)
  |  2.04 |       |   Token: 0x83
  |       |       |  OSCORE: -
  |       |       |    0xff
  |       |       | Payload: {Code: 2.04,
  |       |       |           OSCORE: -,
  |       |       |           0xff,
  |       |       |           {Code: 2.05,
  |       |       |            0xff,
  |       |       |            "0"
  |       |       |           } // Encrypted with CTX_C_S
  |       |       |          } // Encrypted with CTX_C_P
  |       |       |

Square brackets [ ... ] indicate content of compressed COSE object.
Curly brackets { ... } indicate encrypted data.
Round brackets (...) indicate a CBOR sequence [RFC 8742].
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="onion-forwarding">
      <name>OSCORE-protected Onion Forwarding</name>
      <t>TODO: better elaborate on the listed points below.</t>
      <ul spacing="normal">
        <li>The client can hide its position in the network from the origin server, while still possibly protecting communications end-to-end with OSCORE.</li>
        <li>Use the method defined in <xref target="sec-message-processing"/> to achieve OSCORE-protected onion forwarding, through a chain of proxies (at least three are expected). Every message generated by or intended to the origin client must traverse the whole chain of proxies until the intended other endpoint (typically, the origin server). The chain of proxies has to be known in advance by the client, i.e., the exact proxies and their order in the chain.</li>
        <li>
          <t>The typical case addressed in this document considers an origin client that, at most, shares one OSCORE Security Context with the origin server and one OSCORE Security Context with the first proxy in the chain.  </t>
          <t>
If onion forwarding is used, the origin client shares an OSCORE Security Context with the origin server, and a dedicated OSCORE Security Context with each of the proxies in the chain.</t>
        </li>
        <li>
          <t>The origin client protects a request by applying first the OSCORE layer intended to the origin server, then the OSCORE layer intended to the last proxy in the chain, then the OSCORE layer intended to the second from last proxy in the chain and so on, until it applies the OSCORE layer intended to the first proxy in the chain.  </t>
          <t>
Before protecting a request with the OSCORE layer to be consumed by a certain proxy in the chain, the origin client also adds proxy-related options intended to that proxy, as indications to forward the request to (the next hop towards) the origin server.  </t>
          <t>
Other than the actions above from the client, there should be no difference from the basic approach defined in <xref target="sec-message-processing"/>. Each proxy in the chain would process and remove one OSCORE layer from the received request and then forward it to (the next hop towards) the origin server.</t>
        </li>
        <li>
          <t>The exact way used by the client to establish OSCORE Security Contexts with the proxies and the origin server is out of scope.  </t>
          <t>
If the EDHOC key establishment protocol is used (see <xref target="I-D.ietf-lake-edhoc"/>), it is most convenient for the client to run it with the first proxy in the chain, then with the second proxy in the chain through the first one and so on, and finally with the origin server by traversing the whole chain of proxies.  </t>
          <t>
Then, it is especially convenient to use the optimized workflow defined in <xref target="I-D.ietf-core-oscore-edhoc"/> and based on the EDHOC + OSCORE request. This would basically allow the client to complete the EDHOC execution with an endpoint and start the EDHOC execution with the next endpoint in the chain, by means of a single message sent on the wire.</t>
        </li>
        <li>
          <t>Hop-by-hop security has to also be achieved between each pair of proxies in the chain. To this end, two adjacent proxies would better use TLS over TCP than OSCORE between one another (this should be acceptable for non-constrained proxies). This takes advantage of the TCP packet aggregation policies, and thus:  </t>
          <ul spacing="normal">
            <li>As request forwarding occurs in MTU-size bundles, the length of the origin request can be hidden as well.</li>
            <li>Requests and responses traversing the proxy chain cannot be correlated, e.g., by externally monitoring the timing of message forwarding (which would jeopardize the client's wish to hide itself from anything but the first proxy in the chain).</li>
          </ul>
        </li>
        <li>
          <t>Cacheability of responses can still happen, as per <xref target="sec-response-caching"/> and using the approach defined in <xref target="I-D.amsuess-core-cachable-oscore"/>.  </t>
          <t>
The last proxy in the chain would be the only proxy actually seeing the Deterministic Request originated by the client and then caching the corresponding responses from the origin server. It is good that other proxies are not able to do the same, thus preventing what might lead to request-response correlation, again opening for localization of the origin client.</t>
        </li>
        <li>
          <t>Possible optimizations along the proxy chains  </t>
          <ul spacing="normal">
            <li>In particular settings involving additional configuration on the client, some proxy in the chain might be a reverse-proxy. Then, such a proxy can be configured to map on one hand the OSCORE Security Context shared with the origin client (and used to remove a corresponding OSCORE layer from a received request to forward) and, on the other hand, the addressing information of the next hop in the chain where to forward the received request to. This would spare the origin client to add a set of proxy-related options for every single proxy in the chain.</li>
            <li>
              <t>It is mentioned above to additionally use TLS over TCP hop-by-hop between every two adjacent proxies in the chain. That said:      </t>
              <ul spacing="normal">
                <li>The OSCORE protection of the request has certainly to rely on authenticated encryption algorithms (as usual), when applying the OSCORE layer intended to the origin server (the first one applied by the origin client) and the OSCORE layer intended to the first proxy in the chain (the last one applied by the origin client).</li>
                <li>For any other OSCORE layer applied by the origin client (i.e., intended for any proxy in the chain but the first one), the OSCORE protection can better rely on an encryption-only algorithm not providing an authentication tag (as admitted in the group mode of Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/> and assuming the registration of such algorithms in COSE).</li>
                <li>This would be secure to do, since every pair of adjacent proxies in the chain relies on its TLS connection for the respective hop-by-hop communication anyway. The benefit is that it avoids transmitting several unneeded authentication tags from OSCORE.</li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors sincerely thank <contact fullname="Christian Amsüss"/>, <contact fullname="Peter Blomqvist"/>, <contact fullname="David Navarro"/> and <contact fullname="Göran Selander"/> for their comments and feedback.</t>
      <t>The work on this document has been partly supported by VINNOVA and the Celtic-Next project CRITISEC; and by the H2020 project SIFIS-Home (Grant agreement 952652).</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
MZREez5rtC22/rJL8RG/tcmkWZek0Ta0kV31La6mrc8DyccKJbKRkyW7xwJH
WN3uezZ6zoafjd75hnji7H6SKjAkhhDNMbActIBBKCiDUy+luJFhG64lYhbD
cTXlb2IMHBgE8EUx98AWfPP6lPzt1uZoSAyGZpIUsFnmaQDneiYWIKc0AWej
aZ68224ISsOwHojkaEm1LAclIW53ffTSJiyQIUS5nY3Dskf3W1uyBrMNz33r
wVuQcYZbi6uFXjxdT18eBETkZexZ9SP3F4wrvMILBhhDN6m5qS//LfPZ5Axz
/Go7R64Fr0bNtcyw9W76mXqLqQSVE6ReGhxllV/nFPBG570N07aoyFX5VTa5
vZalbmQ273BD/PrCt128O3FRj+yAxhTb0kUzNszXgBVhvMW/nOAseJcSigcG
yUuREz/HcY3PQN0i0WB0xqmgcQHYlpMjzmaTNNilivCgMQaCnAUAcU6CXulY
DBK+W+adEkrnwlM3KknNSZnOrwJKl6t19e01lGEUsPseT+neoZvNVxjjJtG3
nYmQiU3HxcXSA4biPXxoEhwqdXmlxsVN4QWdwdk/jSR5WAYzNFEu4ctZm+GZ
2M2MdZlY70GazJLK2oW5H3hjn4UywVLjOuHDHXkd5pgjQxdzDdknNU+8t7Ge
PIRD8vXUoK+uujz/BePasrHddVytO6FhMMfGsXFZdlckaaOcCX6Ask1K0MAM
MFUmI5Azfkgj+MD7SsvbVmvxUDpUq7eAjo9TRTdb1nse2AwWLNYFR8vxE3W8
sBfPNlNL3t55mi/ZKSNHGjKPqsKQKe0qKDOQG2mKMWWQrHnx1nj+Ke8HL53h
fjHM/tWDX3LMxawFTrzHETSfkYW24rW7vcb3QkGzOvv0Ry9ZuJ4LbFAjT0/u
1JX3eOX5xiahkR0KY5CkDcN0TWTTzvWTwU475mi/G5Zl2eBiyCuyTk2YCaWB
nzhnMtrFGUTJB/MiuVHj5TAvcNG4bTaJ7krhNrLT4p1k5ZbmdkozrCSQ2Diq
sXbZWGBjyothNnaM9jbuTDa37ih2razbf380IgPZGheinOZze0dGMo7PMvLX
kNc2ZncX/YLPDsRy40VZuVBWRTKfI56CCK3bFkvybm2K01mFvq404cdGR81O
4yryjNMSXokZce7yUk1+guzt0KWs3pFROONQsjm/8O2tu3omWiK3vJr5aLd5
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
ZZorGPC9A3XQOY586qA8m4SgPD34x9oxzO2wQ8MsIxCja9/y0xoPI6xDv/YV
XPvah9zq99c+a7N1DqNtkh0/s+zYXvfiXfT4MfCoiTBwyz3msDWvdr953kGO
5u+QLNvJ0bztkaUlx+dXPcmxhQY+iBzXIXODDbvnfm24Xf53/5Ox/gcP0oPR
3tNo55jkexzinX/bEO/DB2B2mPfZw/DP9t5HwGaAxVCitmHTYdE83F+oPhA2
n/YWncMHlVu9NrLfiD228hMKsq2Lfy7QFroqwIzVYHr/PRqNRtE/XBVIrJwt
Pg/q6Mb1II7PLsBUon7yo63jBZ1ezRDvaYg7N4S28MSqUqPABHh/GD3qMt2i
KqlS/aftN6GbQ0wbNh6GXtFS+YZ02PZdYDoe9DUd+ZYGW1Ifx3T8DVmOzo2+
OXDnBjgeZBVs8dNesD2s5Yif3tYjftYLuw6jq/XppqG1grM/xBbAT7eMxU+L
idrDSIvub6dFH6L767u5gdGFn/UGQBvC46f9zwL3Qvj6M0EbWPc5Fxjwej24
KUV8CEl8gNZb9fb5htYkfjaxKPGzGVF120L42Yx0etlEweQfhUD62UcbjdzH
TsLPJ6eaVqsZP5tYzvjpo1D6Ug1/NqadfpvWe8/6bdmmsv+zs1F9G3FTG1X0
Pn1Rs1Gf3Me9+cVU/RydnP82ZnRfC3qtrPsA72un1LuPnfUAJta9PK+bO177
SOVN7LdP48Xr8+JGPte+1v9aG+0DbP7PjQJ/r6SxoS2/gRnfmzo6zbDeNNDH
ZO9trW+w05+xM3r9ixva4xuY4r0105ed/1V2/jfpud78cDAIvNfrjgpP61km
klPW9wRhazSuOzN8yYb4uAeFS2+v6J4EbhimQN/6wNp00dX3VQXE2iwcGmHU
1rFTK6X+Aampn4tzfvJkpXNerJgRpr0O32bAHN0CzXue1rla9PX0vexUxUIP
BJ3CfT/v726i3Dzs3MPZtAJBGywjhP+gFfwTvCtZ+86QaIf15n334FGbViDp
v/cnDKKLByGL459f16niSSdV0F8eeu13Hnr7UhQ/d3T8H59+S670BiGYukNg
b+9XCcG4w/22d7rf3jRe5tPZpu+yMOr1VuhV2Ea3Qr8Xe7t8N5BntTcfKucK
P/cLAapnvytdYf5+uHDWCgRtsIw+uuKjqLpe8uVXicb1Zq8euKu9sSlbdWvp
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
ag4bffvs4OtnB0B+/x+zUxFLBewAAA==

-->

</rfc>
