<?xml version="1.0" encoding="utf-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.9 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC4086 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4086.xml">
<!ENTITY RFC4648 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml">
<!ENTITY RFC5234 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml">
<!ENTITY RFC6347 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6347.xml">
<!ENTITY RFC7049 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7049.xml">
<!ENTITY RFC7230 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7230.xml">
<!ENTITY RFC7231 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7231.xml">
<!ENTITY RFC7252 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7252.xml">
<!ENTITY RFC7641 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7641.xml">
<!ENTITY RFC7959 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7959.xml">
<!ENTITY RFC8075 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8075.xml">
<!ENTITY RFC8132 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8132.xml">
<!ENTITY RFC8152 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8152.xml">
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8288 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8288.xml">
<!ENTITY RFC8323 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8323.xml">
<!ENTITY RFC8446 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8446.xml">
<!ENTITY RFC3552 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3552.xml">
<!ENTITY RFC3986 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml">
<!ENTITY RFC5116 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5116.xml">
<!ENTITY RFC5869 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5869.xml">
<!ENTITY RFC6690 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6690.xml">
<!ENTITY RFC7228 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7228.xml">
<!ENTITY RFC7515 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7515.xml">
<!ENTITY RFC7967 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7967.xml">
<!ENTITY I-D.ietf-ace-oauth-authz SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-ace-oauth-authz.xml">
<!ENTITY I-D.ietf-cbor-cddl SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-cbor-cddl.xml">
<!ENTITY I-D.bormann-6lo-coap-802-15-ie SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.bormann-6lo-coap-802-15-ie.xml">
<!ENTITY I-D.hartke-core-e2e-security-reqs SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.hartke-core-e2e-security-reqs.xml">
<!ENTITY I-D.mattsson-core-coap-actuators SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.mattsson-core-coap-actuators.xml">
<!ENTITY I-D.ietf-ace-oscore-profile SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-ace-oscore-profile.xml">
<!ENTITY I-D.ietf-core-oscore-groupcomm SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-core-oscore-groupcomm.xml">
<!ENTITY I-D.ietf-core-echo-request-tag SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-core-echo-request-tag.xml">
<!ENTITY I-D.mcgrew-iv-gen SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.mcgrew-iv-gen.xml">
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc tocdepth="2"?>

<rfc ipr="trust200902" docName="draft-ietf-core-object-security-16" category="std" updates="7252">

  <front>
    <title abbrev="OSCORE">Object Security for Constrained RESTful Environments (OSCORE)</title>

    <author initials="G." surname="Selander" fullname="Göran Selander">
      <organization>Ericsson AB</organization>
      <address>
        <email>goran.selander@ericsson.com</email>
      </address>
    </author>
    <author initials="J." surname="Mattsson" fullname="John Mattsson">
      <organization>Ericsson AB</organization>
      <address>
        <email>john.mattsson@ericsson.com</email>
      </address>
    </author>
    <author initials="F." surname="Palombini" fullname="Francesca Palombini">
      <organization>Ericsson AB</organization>
      <address>
        <email>francesca.palombini@ericsson.com</email>
      </address>
    </author>
    <author initials="L." surname="Seitz" fullname="Ludwig Seitz">
      <organization>RISE SICS</organization>
      <address>
        <email>ludwig.seitz@ri.se</email>
      </address>
    </author>

    <date year="2019" month="March" day="06"/>

    
    <workgroup>CoRE Working Group</workgroup>
    

    <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 being an optional functionality of CoAP, OSCORE alters CoAP options processing and IANA registration. Therefore, this document updates <xref target="RFC7252"/>.</t>



    </abstract>


  </front>

  <middle>


<section anchor="intro" title="Introduction">

<t>The Constrained Application Protocol (CoAP) <xref target="RFC7252"/> is a web transfer protocol, designed for constrained nodes and networks <xref target="RFC7228"/>, and may be mapped from HTTP <xref target="RFC8075"/>. CoAP specifies the use of proxies for scalability and efficiency and references DTLS <xref target="RFC6347"/> for security. CoAP-to-CoAP, HTTP-to-CoAP, and CoAP-to-HTTP proxies require DTLS or TLS <xref target="RFC8446"/> to be terminated at the proxy. The proxy therefore not only has access to the data required for performing the intended proxy functionality, but is also able to eavesdrop on, or manipulate any part of, the message payload and metadata in transit between the endpoints. The proxy can also inject, delete, or reorder packets since they are no longer protected by (D)TLS.</t>

<t>This document defines the Object Security for Constrained RESTful Environments (OSCORE) security protocol, protecting CoAP and CoAP-mappable HTTP requests and responses end-to-end across intermediary nodes such as CoAP forward proxies and cross-protocol translators including HTTP-to-CoAP proxies <xref target="RFC8075"/>. In addition to the core CoAP features defined in <xref target="RFC7252"/>, OSCORE supports the Observe <xref target="RFC7641"/>, Block-wise <xref target="RFC7959"/>, and No-Response <xref target="RFC7967"/> options, as well as the PATCH and FETCH methods <xref target="RFC8132"/>. An analysis of end-to-end security for CoAP messages through some types of intermediary nodes is performed in <xref target="I-D.hartke-core-e2e-security-reqs"/>. OSCORE essentially protects the RESTful interactions; the request method, the requested resource, the message payload, etc. (see <xref target="protected-fields"/>). OSCORE protects neither the CoAP Messaging Layer nor the CoAP Token which may change between the endpoints, and those are therefore processed as defined in <xref target="RFC7252"/>. Additionally, since the message formats for CoAP over unreliable transport <xref target="RFC7252"/> and for CoAP over reliable transport <xref target="RFC8323"/> differ only in terms of CoAP Messaging Layer, OSCORE can be applied to both unreliable and reliable transports (see <xref target="fig-stack"/>).</t>

<t>OSCORE works in very constrained nodes and networks, thanks to its small message size and the restricted code and memory requirements in addition to what is required by CoAP. Examples of the use of OSCORE are given in <xref target="examples"/>. OSCORE may be used over any underlying layer, such as e.g. UDP or TCP, and with non-IP transports (e.g., <xref target="I-D.bormann-6lo-coap-802-15-ie"/>). OSCORE may also be used in different ways with HTTP. OSCORE messages may be transported in HTTP, and OSCORE may also be used to protect CoAP-mappable HTTP messages, as described below.</t>

<figure title="Abstract Layering of CoAP with OSCORE" anchor="fig-stack"><artwork align="center"><![CDATA[
+-----------------------------------+
|            Application            |
+-----------------------------------+
+-----------------------------------+  \
|  Requests / Responses / Signaling |  |
|-----------------------------------|  |
|               OSCORE              |  | CoAP
|-----------------------------------|  |
| Messaging Layer / Message Framing |  |
+-----------------------------------+  /
+-----------------------------------+
|          UDP / TCP / ...          |
+-----------------------------------+  
]]></artwork></figure>

<t>OSCORE is designed to protect as much information as possible while still allowing CoAP proxy operations (<xref target="coap-coap-proxy"/>). It works with existing CoAP-to-CoAP forward proxies <xref target="RFC7252"/>, but an OSCORE-aware proxy will be more efficient. HTTP-to-CoAP proxies <xref target="RFC8075"/> and CoAP-to-HTTP proxies can also be used with OSCORE, as specified in <xref target="http-op"/>. OSCORE may be used together with TLS or DTLS over one or more hops in the end-to-end path, e.g. transported with HTTPS in one hop and with plain CoAP in another hop. The use of OSCORE does not affect the URI scheme and OSCORE can therefore be used with any URI scheme defined for CoAP or HTTP. The application decides the conditions for which OSCORE is required.</t>

<t>OSCORE uses pre-shared keys which may have been established out-of-band or with a key establishment protocol (see <xref target="context-derivation"/>). The technical solution builds on CBOR Object Signing and Encryption (COSE) <xref target="RFC8152"/>, providing end-to-end encryption, integrity, replay protection, and binding of response to request. A compressed version of COSE is used, as specified in <xref target="compression"/>. The use of OSCORE is signaled in CoAP with a new option (<xref target="option"/>), and in HTTP with a new header field (<xref target="header-field"/>) and content type (<xref target="oscore-media-type"/>). The solution transforms a CoAP/HTTP message into an “OSCORE message” before sending, and vice versa after receiving. The OSCORE message is a CoAP/HTTP message related to the original message in the following way: the original CoAP/HTTP message is translated to CoAP (if not already in CoAP) and protected in a COSE object. The encrypted message fields of this COSE object are transported in the CoAP payload/HTTP body of the OSCORE message, and the OSCORE option/header field is included in the message. A sketch of an exchange of OSCORE messages, in the case of the original message being CoAP, is provided in <xref target="fig-sketch"/>. The  use of OSCORE with HTTP is detailed in <xref target="http-op"/>.</t>

<figure title="Sketch of CoAP with OSCORE" anchor="fig-sketch"><artwork align="center"><![CDATA[
Client                                          Server
   |      OSCORE request - POST example.com:      |
   |        Header, Token,                        |
   |        Options: OSCORE, ...,                 |
   |        Payload: COSE ciphertext              |
   +--------------------------------------------->|
   |                                              |
   |<---------------------------------------------+
   |      OSCORE response - 2.04 (Changed):       |
   |        Header, Token,                        |
   |        Options: OSCORE, ...,                 |
   |        Payload: COSE ciphertext              |
   |                                              |
]]></artwork></figure>

<t>An implementation supporting this specification MAY implement only the client part, MAY implement only the server part, or MAY implement only one of the proxy parts.</t>

<section anchor="terminology" title="Terminology">

<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 described in CoAP <xref target="RFC7252"/>, Observe <xref target="RFC7641"/>, Block-wise  <xref target="RFC7959"/>, COSE <xref target="RFC8152"/>, CBOR <xref target="RFC7049"/>, CDDL <xref target="I-D.ietf-cbor-cddl"/> as summarized in <xref target="cddl-sum"/>, and constrained environments <xref target="RFC7228"/>.</t>

<t>The term “hop” is used to denote a particular leg in the end-to-end path. The concept “hop-by-hop” (as in “hop-by-hop encryption” or “hop-by-hop fragmentation”) opposed to “end-to-end”, is used in this document to indicate that the messages are processed accordingly in the intermediaries, rather than just forwarded to the next node.</t>

<t>The term “stop processing” is used throughout the document to denote that the message is not passed up to the CoAP Request/Response Layer (see <xref target="fig-stack"/>).</t>

<t>The terms Common/Sender/Recipient Context, Master Secret/Salt, Sender ID/Key, Recipient ID/Key, ID Context, and Common IV are defined in <xref target="context-definition"/>.</t>

</section>
</section>
<section anchor="option" title="The OSCORE Option">

<t>The OSCORE option defined in this section (see <xref target="fig-option"/>, which extends Table 4: Options of <xref target="RFC7252"/>) indicates that the CoAP message is an OSCORE message and that it contains a compressed COSE object (see Sections <xref target="cose-object" format="counter"/> and <xref target="compression" format="counter"/>). The OSCORE option is critical, safe to forward, part of the cache key, and not repeatable.</t>

<figure title="The OSCORE Option" anchor="fig-option"><artwork align="center"><![CDATA[
+------+---+---+---+---+----------------+--------+--------+---------+
| No.  | C | U | N | R | Name           | Format | Length | Default |
+------+---+---+---+---+----------------+--------+--------+---------+
| TBD1 | x |   |   |   | OSCORE         |  (*)   | 0-255  | (none)  |
+------+---+---+---+---+----------------+--------+--------+---------+
    C = Critical,   U = Unsafe,   N = NoCacheKey,   R = Repeatable   
    (*) See below.
]]></artwork></figure>

<t>The OSCORE option includes the OSCORE flag bits (<xref target="compression"/>), the Sender Sequence Number, the Sender ID, and the ID Context when these fields are present (<xref target="context"/>). The detailed format and length is specified in <xref target="compression"/>. If the OSCORE flag bits are all zero (0x00) the Option value SHALL be empty (Option Length = 0). An endpoint receiving a CoAP message without payload, that also contains an OSCORE option SHALL treat it as malformed and reject it.</t>

<t>A successful response to a request with the OSCORE option SHALL contain the OSCORE option. Whether error responses contain the OSCORE option depends on the error type (see <xref target="processing"/>).</t>

<t>For CoAP proxy operations, see <xref target="coap-coap-proxy"/>.</t>

</section>
<section anchor="context" title="The Security Context">

<t>OSCORE requires that client and server establish a shared security context used to process the COSE objects. OSCORE uses COSE with an Authenticated Encryption with Additional Data (AEAD, <xref target="RFC5116"/>) algorithm for protecting message data between a client and a server. In this section, we define the security context and how it is derived in client and server based on a shared secret and a key derivation function.</t>

<section anchor="context-definition" title="Security Context Definition">

<t>The security context is the set of information elements necessary to carry out the cryptographic operations in OSCORE. For each endpoint, the security context is composed of a “Common Context”, a “Sender Context”, and a “Recipient Context”.</t>

<t>The endpoints protect messages to send using the Sender Context and verify messages received using the Recipient Context, both contexts being derived from the Common Context and other data. Clients and servers need to be able to retrieve the correct security context to use.</t>

<t>An endpoint uses its Sender ID (SID) to derive its Sender Context, and the other endpoint uses the same ID, now called Recipient ID (RID), to derive its Recipient Context. In communication between two endpoints, the Sender Context of one endpoint matches the Recipient Context of the other endpoint, and vice versa. Thus, the two security contexts identified by the same IDs in the two endpoints are not the same, but they are partly mirrored. Retrieval and use of the security context are shown in <xref target="fig-context"/>.</t>

<figure title="Retrieval and Use of the Security Context" anchor="fig-context"><artwork align="center"><![CDATA[
          .-----------------------------------------------.
          |                Common Context                 |
          +---------------------.---.---------------------+        
          |    Sender Context   | = |  Recipient Context  |
          +---------------------+   +---------------------+ 
          |  Recipient Context  | = |    Sender Context   |
          '---------------------'   '---------------------'
                   Client                   Server
                      |                       |
Retrieve context for  | OSCORE request:       |
 target resource      |   Token = Token1,     |
Protect request with  |   kid = SID, ...      |
  Sender Context      +---------------------->| Retrieve context with
                      |                       |  RID = kid
                      |                       | Verify request with
                      |                       |  Recipient Context
                      | OSCORE response:      | Protect response with
                      |   Token = Token1, ... |  Sender Context
Retrieve context with |<----------------------+
 Token = Token1       |                       |
Verify request with   |                       |
 Recipient Context    |                       |
]]></artwork></figure>

<t>The Common Context contains the following parameters:</t>

<t><list style="symbols">
  <t>AEAD Algorithm. The COSE AEAD algorithm to use for encryption.</t>
  <t>HKDF Algorithm. An HMAC-based key derivation function HKDF <xref target="RFC5869"/> used to derive Sender Key, Recipient Key, and Common IV.</t>
  <t>Master Secret. Variable length, random byte string (see <xref target="master-secret"/>) used to derive AEAD keys and Common IV.</t>
  <t>Master Salt. Optional variable length byte string containing the salt used to derive AEAD keys and Common IV.</t>
  <t>ID Context. Optional variable length byte string providing additional information to identify the Common Context and to derive AEAD keys and Common IV. The use of ID Context is described in <xref target="context-hint"/>.</t>
  <t>Common IV. Byte string derived from Master Secret, Master Salt, and ID Context. Used to generate the AEAD Nonce (see <xref target="nonce"/>). Same length as the nonce of the AEAD Algorithm.</t>
</list></t>

<t>The Sender Context contains the following parameters:</t>

<t><list style="symbols">
  <t>Sender ID. Byte string used to identify the Sender Context, to derive AEAD keys and Common IV, and to assure unique AEAD nonces. Maximum length is determined by the AEAD Algorithm.</t>
  <t>Sender Key. Byte string containing the symmetric AEAD key to protect messages to send. Derived from Common Context and Sender ID. Length is determined by the AEAD Algorithm.</t>
  <t>Sender Sequence Number. Non-negative integer used by the sender to enumerate requests and certain responses, e.g. Observe notifications. Used as ‘Partial IV’ <xref target="RFC8152"/> to generate unique AEAD nonces. Maximum value is determined by the AEAD Algorithm. Initialization is described in <xref target="initial-replay"/>.</t>
</list></t>

<t>The Recipient Context contains the following parameters:</t>

<t><list style="symbols">
  <t>Recipient ID. Byte string used to identify the Recipient Context, to derive AEAD keys and Common IV, and to assure unique AEAD nonces. Maximum length is determined by the AEAD Algorithm.</t>
  <t>Recipient Key. Byte string containing the symmetric AEAD key to verify messages received. Derived from Common Context and Recipient ID. Length is determined by the AEAD Algorithm.</t>
  <t>Replay Window (Server only). The replay window to verify requests received. Replay protection is described in <xref target="replay-protection"/> and <xref target="initial-replay"/>.</t>
</list></t>

<t>All parameters except Sender Sequence Number and Replay Window are immutable once the security context is established. An endpoint may free up memory by not storing the Common IV, Sender Key, and Recipient Key, deriving them when needed. Alternatively, an endpoint may free up memory by not storing the Master Secret and Master Salt after the other parameters have been derived.</t>

<t>Endpoints MAY operate as both client and server and use the same security context for those roles. Independent of being client or server, the endpoint protects messages to send using its Sender Context, and verifies messages received using its Recipient Context. The endpoints MUST NOT change the Sender/Recipient ID when changing roles. In other words, changing the roles does not change the set of AEAD keys to be used.</t>

</section>
<section anchor="context-derivation" title="Establishment of Security Context Parameters">

<t>Each endpoint derives the parameters in the security context from a small set of input parameters. The following input parameters SHALL be pre-established:</t>

<t><list style="symbols">
  <t>Master Secret</t>
  <t>Sender ID</t>
  <t>Recipient ID</t>
</list></t>

<t>The following input parameters MAY be pre-established. In case any of these parameters is not pre-established, the default value indicated below is used:</t>

<t><list style="symbols">
  <t>AEAD Algorithm  <list style="symbols">
      <t>Default is AES-CCM-16-64-128 (COSE algorithm encoding: 10)</t>
    </list></t>
  <t>Master Salt  <list style="symbols">
      <t>Default is the empty byte string</t>
    </list></t>
  <t>HKDF Algorithm  <list style="symbols">
      <t>Default is HKDF SHA-256</t>
    </list></t>
  <t>Replay Window  <list style="symbols">
      <t>Default is DTLS-type replay protection with a window size of 32 <xref target="RFC6347"/></t>
    </list></t>
</list></t>

<t>All input parameters need to be known to and agreed on by both endpoints, but the replay window may be different in the two endpoints. The way the input parameters are pre-established, is application specific. Considerations of security context establishment are given in <xref target="sec-context-establish"/> and examples of deploying OSCORE in <xref target="deployment-examples"/>.</t>

<section anchor="derivation-of-sender-key-recipient-key-and-common-iv" title="Derivation of Sender Key, Recipient Key, and Common IV">

<t>The HKDF MUST be one of the HMAC-based HKDF <xref target="RFC5869"/> algorithms defined for COSE <xref target="RFC8152"/>. HKDF SHA-256 is mandatory to implement. The security context parameters Sender Key, Recipient Key, and Common IV SHALL be derived from the input parameters using the HKDF, which consists of the composition of the HKDF-Extract and HKDF-Expand steps <xref target="RFC5869"/>:</t>

<figure><artwork><![CDATA[
   output parameter = HKDF(salt, IKM, info, L) 
]]></artwork></figure>

<t>where:</t>

<t><list style="symbols">
  <t>salt is the Master Salt as defined above</t>
  <t>IKM is the Master Secret as defined above</t>
  <t>info is the serialization of a CBOR array consisting of (the notation follows <xref target="cddl-sum"/>):</t>
</list></t>

<figure><artwork type="CDDL"><![CDATA[
   info = [
     id : bstr,
     id_context : bstr / nil,
     alg_aead : int / tstr,
     type : tstr,
     L : uint,
   ]
]]></artwork></figure>
<t>where:</t>

<t><list style="symbols">
  <t>id is the Sender ID or Recipient ID when deriving Sender Key and Recipient Key, respectively, and the empty byte string when deriving the Common IV.</t>
  <t>id_context is the ID Context, or nil if ID Context is not provided.</t>
  <t>alg_aead is the AEAD Algorithm, encoded as defined in <xref target="RFC8152"/>.</t>
  <t>type is “Key” or “IV”. The label is an ASCII string, and does not include a trailing NUL byte.</t>
  <t>L is the size of the key/nonce for the AEAD algorithm used, in bytes.</t>
</list></t>

<t>For example, if the algorithm AES-CCM-16-64-128 (see Section 10.2 in <xref target="RFC8152"/>) is used, the integer value for alg_aead is 10, the value for L is 16 for keys and 13 for the Common IV. Assuming use of the default algorithms HKDF SHA-256 and AES-CCM-16-64-128, the extract phase of HKDF produces a pseudorandom key (PRK) as follows:</t>

<figure><artwork><![CDATA[
   PRK = HMAC-SHA-256(Master Salt, Master Secret)
]]></artwork></figure>

<t>and as L is smaller than the hash function output size, the expand phase of HKDF consists of a single HMAC invocation, and the Sender Key, Recipient Key, and Common IV are therefore the first 16 or 13 bytes of</t>

<figure><artwork><![CDATA[
   output parameter = HMAC-SHA-256(PRK, info || 0x01)
]]></artwork></figure>

<t>where different info are used for each derived parameter and where || denotes byte string concatenation.</t>

<t>Note that <xref target="RFC5869"/> specifies that if the salt is not provided, it is set to a string of zeros. For implementation purposes, not providing the salt is the same as setting the salt to the empty byte string. OSCORE sets the salt default value to empty byte string, which is converted to a string of zeroes (see Section 2.2 of <xref target="RFC5869"/>).</t>

</section>
<section anchor="initial-replay" title="Initial Sequence Numbers and Replay Window">

<t>The Sender Sequence Number is initialized to 0.</t>

<t>The supported types of replay protection and replay window length is application specific and depends on how OSCORE is transported, see <xref target="replay-protection"/>. The default is DTLS-type replay protection with a window size of 32 initiated as described in Section 4.1.2.6 of <xref target="RFC6347"/>.</t>

</section>
</section>
<section anchor="req-params" title="Requirements on the Security Context Parameters">

<t>To ensure unique Sender Keys, the quartet (Master Secret, Master Salt, ID Context, Sender ID) MUST be unique, i.e. the pair (ID Context, Sender ID) SHALL be unique in the set of all security contexts using the same Master Secret and Master Salt. This means that Sender ID SHALL be unique in the set of all security contexts using the same Master Secret, Master Salt, and ID Context; such a requirement guarantees unique (key, nonce) pairs for the AEAD.</t>

<t>Different methods can be used to assign Sender IDs: a protocol that allows the parties to negotiate locally unique identifiers, a trusted third party (e.g., <xref target="I-D.ietf-ace-oauth-authz"/>), or the identifiers can be assigned out-of-band. The Sender IDs can be very short (note that the empty string is a legitimate value). The maximum length of Sender ID in bytes equals the length of AEAD nonce minus 6, see <xref target="nonce"/>. For AES-CCM-16-64-128 the maximum length of Sender ID is 7 bytes.</t>

<t>To simplify retrieval of the right Recipient Context, the Recipient ID SHOULD be unique in the sets of all Recipient Contexts used by an endpoint. If an endpoint has the same Recipient ID with different Recipient Contexts, i.e. the Recipient Contexts are derived from different Common Contexts, then the endpoint may need to try multiple times before verifying the right security context associated to the Recipient ID.</t>

<t>The ID Context is used to distinguish between security contexts. The methods used for assigning Sender ID can also be used for assigning the ID Context. Additionally, the ID Context can be used to introduce randomness into new Sender and Recipient Contexts (see <xref target="master-secret-multiple"/>). ID Context can be arbitrarily long.</t>

</section>
</section>
<section anchor="protected-fields" title="Protected Message Fields">

<t>OSCORE transforms a CoAP message (which may have been generated from an HTTP message) into an OSCORE message, and vice versa. OSCORE protects as much of the original message as possible while still allowing certain proxy operations (see Sections <xref target="coap-coap-proxy" format="counter"/> and <xref target="http-op" format="counter"/>). This section defines how OSCORE protects the message fields and transfers them end-to-end between client and server (in any direction).</t>

<t>The remainder of this section and later sections focus on the behavior in terms of CoAP messages. If HTTP is used for a particular hop in the end-to-end path, then this section applies to the conceptual CoAP message that is mappable to/from the original HTTP message as discussed in <xref target="http-op"/>.  That is, an HTTP message is conceptually transformed to a CoAP message and then to an OSCORE message, and similarly in the reverse direction.  An actual implementation might translate directly from HTTP to OSCORE without the intervening CoAP representation.</t>

<t>Protection of Signaling messages (Section 5 of <xref target="RFC8323"/>) is specified in <xref target="coap-signaling"/>. The other parts of this section target Request/Response messages.</t>

<t>Message fields of the CoAP message may be protected end-to-end between CoAP client and CoAP server in different ways:</t>

<t><list style="symbols">
  <t>Class E: encrypted and integrity protected,</t>
  <t>Class I: integrity protected only, or</t>
  <t>Class U: unprotected.</t>
</list></t>

<t>The sending endpoint SHALL transfer Class E message fields in the ciphertext of the COSE object in the OSCORE message. The sending endpoint SHALL include Class I message fields in the Additional Authenticated Data (AAD) of the AEAD algorithm, allowing the receiving endpoint to detect if the value has changed in transfer. Class U message fields SHALL NOT be protected in transfer. Class I and Class U message field values are transferred in the header or options part of the OSCORE message, which is visible to proxies.</t>

<t>Message fields not visible to proxies, i.e., transported in the ciphertext of the COSE object, are called “Inner” (Class E). Message fields transferred in the header or options part of the OSCORE message, which is visible to proxies, are called “Outer” (Class I or U). There are currently no Class I options defined.</t>

<t>An OSCORE message may contain both an Inner and an Outer instance of a certain CoAP message field. Inner message fields are intended for the receiving endpoint, whereas Outer message fields are used to enable proxy operations.</t>

<section anchor="coap-options" title="CoAP Options">

<t>A summary of how options are protected is shown in <xref target="fig-option-protection"/>. Note that some options may have both Inner and Outer message fields which are protected accordingly. Certain options require special processing as is described in <xref target="special-options"/>.</t>

<t>Options that are unknown or for which OSCORE processing is not defined SHALL be processed as class E (and no special processing). Specifications of new CoAP options SHOULD define how they are processed with OSCORE. A new COAP option SHOULD be of class E unless it requires proxy processing. If a new CoAP option is of class U, the potential issues with
the option being unprotected SHOULD be documented (see <xref target="unprot-fields"/>).</t>

<section anchor="inner-options" title="Inner Options">

<t>Inner option message fields (class E) are used to communicate directly with
the other endpoint.</t>

<t>The sending endpoint SHALL write the Inner option message fields present in the original CoAP message into the plaintext of the COSE object (<xref target="plaintext"/>), and then remove the Inner option message fields from the OSCORE message.</t>

<t>The processing of Inner option message fields by the receiving endpoint is specified in Sections <xref target="ver-req" format="counter"/> and <xref target="ver-res" format="counter"/>.</t>

<figure title="Protection of CoAP Options" anchor="fig-option-protection"><artwork align="center"><![CDATA[
  +------+-----------------+---+---+
  | No.  | Name            | E | U |
  +------+-----------------+---+---+
  |   1  | If-Match        | x |   |
  |   3  | Uri-Host        |   | x |
  |   4  | ETag            | x |   |
  |   5  | If-None-Match   | x |   |
  |   6  | Observe         | x | x |
  |   7  | Uri-Port        |   | x |
  |   8  | Location-Path   | x |   |
  | TBD1 | OSCORE          |   | x |
  |  11  | Uri-Path        | x |   |
  |  12  | Content-Format  | x |   |
  |  14  | Max-Age         | x | x |
  |  15  | Uri-Query       | x |   |
  |  17  | Accept          | x |   |
  |  20  | Location-Query  | x |   |
  |  23  | Block2          | x | x |
  |  27  | Block1          | x | x |
  |  28  | Size2           | x | x |
  |  35  | Proxy-Uri       |   | x |
  |  39  | Proxy-Scheme    |   | x |
  |  60  | Size1           | x | x |
  | 258  | No-Response     | x | x |
  +------+-----------------+---+---+

E = Encrypt and Integrity Protect (Inner)
U = Unprotected (Outer)
]]></artwork></figure>

</section>
<section anchor="outer-options" title="Outer Options">

<t>Outer option message fields (Class U or I) are used to support proxy operations, see <xref target="supp-proxy-op"/>.</t>

<t>The sending endpoint SHALL include the Outer option message field present in the original message in the options part of the OSCORE message. All Outer option message fields, including the OSCORE option, SHALL be encoded as described in Section 3.1 of <xref target="RFC7252"/>, where the delta is the difference to the previously included instance of Outer option message field.</t>

<t>The processing of Outer options by the receiving endpoint is specified in Sections <xref target="ver-req" format="counter"/> and <xref target="ver-res" format="counter"/>.</t>

<t>A procedure for integrity-protection-only of Class I option message fields is specified in <xref target="AAD"/>. Specifications that introduce repeatable Class I options MUST specify that proxies MUST NOT change the order of the instances of such an option in the CoAP message.</t>

<t>Note: There are currently no Class I option message fields defined.</t>

</section>
<section anchor="special-options" title="Special Options">

<t>Some options require special processing as specified in this section.</t>

<section anchor="max-age" title="Max-Age">

<t>An Inner Max-Age message field is used to indicate the maximum time a response may be cached by the client (as defined in <xref target="RFC7252"/>), end-to-end from the server to the client, taking into account that the option is not accessible to proxies. The Inner Max-Age SHALL be processed by OSCORE as a normal Inner option, specified in <xref target="inner-options"/>.</t>

<t>An Outer Max-Age message field is used to avoid unnecessary caching of error responses  caused by OSCORE processing at OSCORE-unaware intermediary nodes. A server MAY set a Class U Max-Age message field with value zero to such error responses, described in Sections <xref target="replay-protection" format="counter"/>, <xref target="ver-req" format="counter"/>, and <xref target="ver-res" format="counter"/>, since these error responses are cacheable, but subsequent OSCORE requests would never create a hit in the intermediary caching it. Setting the Outer Max-Age to zero relieves the intermediary from uselessly caching responses. Successful OSCORE responses do not need to include an Outer Max-Age option since the responses appear to the OSCORE-unaware intermediary as 2.04 (Changed) responses, which are non-cacheable (see <xref target="coap-header"/>).</t>

<t>The Outer Max-Age message field is processed according to <xref target="outer-options"/>.</t>

</section>
<section anchor="uri-host" title="Uri-Host and Uri-Port">

<t>When the Uri-Host and Uri-Port are set to their default values (see Section 5.10.1 <xref target="RFC7252"/>), they are omitted from the message (Section 5.4.4 of <xref target="RFC7252"/>), which is favorable both for overhead and privacy.</t>

<t>In order to support forward proxy operations, Proxy-Scheme, Uri-Host, and Uri-Port need to be Class U. 
For the use of Proxy-Uri, see <xref target="proxy-uri"/>.</t>

<t>Manipulation of unprotected message fields (including Uri-Host, Uri-Port, destination IP/port or request scheme) MUST NOT lead to an OSCORE message becoming verified by an unintended server. Different servers SHALL have different security contexts.</t>

</section>
<section anchor="proxy-uri" title="Proxy-Uri">

<t>When Proxy-Uri is present, the client SHALL first decompose the Proxy-Uri value of the original CoAP message into the Proxy-Scheme, Uri-Host, Uri-Port, Uri-Path, and Uri-Query options according to Section 6.4 of <xref target="RFC7252"/>.</t>

<t>Uri-Path and Uri-Query are class E options and SHALL be protected and processed as Inner options (<xref target="inner-options"/>).</t>

<t>The Proxy-Uri option of the OSCORE message SHALL be set to the composition of Proxy-Scheme, Uri-Host, and Uri-Port options as specified in Section 6.5 of <xref target="RFC7252"/>, and processed as an Outer option of Class U (<xref target="outer-options"/>).</t>

<t>Note that replacing the Proxy-Uri value with the Proxy-Scheme and Uri-* options works by design for all CoAP URIs (see Section 6 of <xref target="RFC7252"/>). OSCORE-aware HTTP servers should not use the userinfo component of the HTTP URI (as defined in Section 3.2.1 of <xref target="RFC3986"/>), so that this type of replacement is possible in the presence of CoAP-to-HTTP proxies (see <xref target="coap2http"/>). In future specifications of cross-protocol proxying behavior using different URI structures, it is expected that the authors will create Uri-* options that allow decomposing the Proxy-Uri, and specifying the OSCORE processing.</t>

<t>An example of how Proxy-Uri is processed is given here. Assume that the original CoAP message contains:</t>

<t><list style="symbols">
  <t>Proxy-Uri = “coap://example.com/resource?q=1”</t>
</list></t>

<t>During OSCORE processing, Proxy-Uri is split into:</t>

<t><list style="symbols">
  <t>Proxy-Scheme = “coap”</t>
  <t>Uri-Host = “example.com”</t>
  <t>Uri-Port = “5683”</t>
  <t>Uri-Path = “resource”</t>
  <t>Uri-Query = “q=1”</t>
</list></t>

<t>Uri-Path and Uri-Query follow the processing defined in <xref target="inner-options"/>, and are thus encrypted and transported in the COSE object:</t>

<t><list style="symbols">
  <t>Uri-Path = “resource”</t>
  <t>Uri-Query = “q=1”</t>
</list></t>

<t>The remaining options are composed into the Proxy-Uri included in the options part of the OSCORE message, which has value:</t>

<t><list style="symbols">
  <t>Proxy-Uri = “coap://example.com”</t>
</list></t>

<t>See Sections 6.1 and 12.6 of <xref target="RFC7252"/> for more details.</t>

</section>
<section anchor="block-options" title="The Block Options">

<t>Block-wise <xref target="RFC7959"/> is an optional feature. An implementation MAY support <xref target="RFC7252"/> and the OSCORE option without supporting block-wise transfers. The Block options (Block1, Block2, Size1, Size2), when Inner message fields, provide secure message segmentation such that each segment can be verified. The Block options, when Outer message fields, enables hop-by-hop fragmentation of the OSCORE message. Inner and Outer block processing may have different performance properties depending on the underlying transport. The end-to-end integrity of the message can be verified both in case of Inner and Outer Block-wise transfers provided all blocks are received.</t>

<section anchor="inner-block-options" title="Inner Block Options">

<t>The sending CoAP endpoint MAY fragment a CoAP message as defined in <xref target="RFC7959"/> before the message is processed by OSCORE. In this case the Block options SHALL be processed by OSCORE as normal Inner options (<xref target="inner-options"/>). The receiving CoAP endpoint SHALL process the OSCORE message before processing Block-wise as defined in <xref target="RFC7959"/>.</t>

</section>
<section anchor="outer-block-options" title="Outer Block Options">

<t>Proxies MAY fragment an OSCORE message using <xref target="RFC7959"/>, by introducing Block option message fields that are Outer (<xref target="outer-options"/>). Note that the Outer Block options are neither encrypted nor integrity protected. As a consequence, a proxy can maliciously inject block fragments indefinitely, since the receiving endpoint needs to receive the last block (see <xref target="RFC7959"/>) to be able to compose the OSCORE message and verify its integrity. Therefore, applications supporting OSCORE and <xref target="RFC7959"/> MUST specify a security policy defining a maximum unfragmented message size (MAX_UNFRAGMENTED_SIZE) considering the maximum size of message which can be handled by the endpoints. Messages exceeding this size SHOULD be fragmented by the sending endpoint using Inner Block options (<xref target="inner-block-options"/>).</t>

<t>An endpoint receiving an OSCORE message with an Outer Block option SHALL first process this option according to <xref target="RFC7959"/>, until all blocks of the OSCORE message have been received, or the cumulated message size of the blocks exceeds MAX_UNFRAGMENTED_SIZE.  In the former case, the processing of the OSCORE message continues as defined in this document. In the latter case the message SHALL be discarded.</t>

<t>Because of encryption of Uri-Path and Uri-Query, messages to the same server may, from the point of view of a proxy, look like they also target the same resource. A proxy SHOULD mitigate a potential mix-up of blocks from concurrent requests to the same server, for example using the Request-Tag processing specified in Section 3.3.2 of <xref target="I-D.ietf-core-echo-request-tag"/>.</t>

</section>
</section>
<section anchor="observe" title="Observe">

<t>Observe <xref target="RFC7641"/> is an optional feature. An implementation MAY support <xref target="RFC7252"/> and the OSCORE option without supporting <xref target="RFC7641"/>, in which case the Observe related processing can be omitted.</t>

<t>The support for Observe <xref target="RFC7641"/> with OSCORE targets the requirements on forwarding of Section 2.2.1 of <xref target="I-D.hartke-core-e2e-security-reqs"/>, i.e. that observations go through intermediary nodes, as illustrated in Figure 8 of <xref target="RFC7641"/>.</t>

<t>Inner Observe SHALL be used to protect the value of the Observe option between the endpoints. Outer Observe SHALL be used to support forwarding by intermediary nodes.</t>

<t>The server SHALL include a new Partial IV (see <xref target="cose-object"/>) in responses (with or without the Observe option) to Observe registrations, except for the first response where Partial IV MAY be omitted.</t>

<t>For cancellations, Section 3.6 of <xref target="RFC7641"/> specifies that all options MUST be identical to those in the registration request except for Observe and the set of ETag Options. For OSCORE messages, this matching is to be done to the options in the decrypted message.</t>

<t><xref target="RFC7252"/> does not specify how the server should act upon receiving the same Token in different requests. When using OSCORE, the server SHOULD NOT remove an active observation just because it receives a request with the same Token.</t>

<t>Since POST with Observe is not defined, for messages with Observe, the Outer Code MUST be set to 0.05 (FETCH) for requests and to 2.05 (Content) for responses (see <xref target="coap-header"/>).</t>

<section anchor="observe-registration" title="Registrations and Cancellations">

<t>The Inner and Outer Observe in the request MUST contain the Observe value of the original CoAP request; 0 (registration) or 1 (cancellation).</t>

<t>Every time a client issues a new Observe request, a new Partial IV MUST be used (see <xref target="cose-object"/>), and so the payload and OSCORE option are changed. The server uses the Partial IV of the new request as the ‘request_piv’ of all associated notifications (see <xref target="AAD"/>).</t>

<t>Intermediaries are not assumed to have access to the OSCORE security context used by the endpoints, and thus cannot make requests or transform responses with the OSCORE option which verify at the receiving endpoint as coming from the other endpoint. This has the following consequences and limitations for Observe operations.</t>

<t><list style="symbols">
  <t>An intermediary node removing the Outer Observe 0 does not change the registration request to a request without Observe (see Section 2 of <xref target="RFC7641"/>). Instead other means for cancellation may be used as described in Section 3.6 of <xref target="RFC7641"/>.</t>
  <t>An intermediary node is not able to transform a normal response into an OSCORE protected Observe notification (see figure 7 of <xref target="RFC7641"/>) which verifies as coming from the server.</t>
  <t>An intermediary node is not able to initiate an OSCORE protected Observe registration (Observe with value 0) which verifies as coming from the client. An OSCORE-aware intermediary SHALL NOT initiate registrations of observations (see <xref target="coap-coap-proxy"/>). If an OSCORE-unaware proxy re-sends an old registration message from a client this will trigger the replay protection mechanism in the server. To prevent this from resulting in the OSCORE-unaware proxy to cancel of the registration, a server MAY respond to a replayed registration request with a replay of a cached notification. Alternatively, the server MAY send a new notification.</t>
  <t>An intermediary node is not able to initiate an OSCORE protected Observe cancellation (Observe with value 1) which verifies as coming from the client. An application MAY decide to allow intermediaries to cancel Observe registrations, e.g. to send Observe with value 1 (see Section 3.6 of <xref target="RFC7641"/>), but that can also be done with other methods, e.g. reusing the Token in a different request or sending a RST message. This is out of scope for this specification.</t>
</list></t>

</section>
<section anchor="notifications" title="Notifications">

<t>If the server accepts an Observe registration, a Partial IV MUST be included in all notifications (both successful and error), except for the first one where Partial IV MAY be omitted. To protect against replay, the client SHALL maintain a Notification Number for each Observation it registers. The Notification Number is a non-negative integer containing the largest Partial IV of the received notifications for the associated Observe registration. Further details of replay protection of notifications are specified in <xref target="replay-notifications"/>.</t>

<t>For notifications, the Inner Observe value MUST be empty (see Section 3.2 of <xref target="RFC7252"/>). The Outer Observe in a notification is needed for intermediary nodes to allow multiple responses to one request, and may be set to the value of Observe in the original CoAP message. The client performs ordering of notifications and replay protection by comparing their Partial IVs and SHALL ignore the outer Observe value.</t>

<t>If the client receives a response to an Observe request without an Inner Observe option, then it verifies the response as a non-Observe response, as specified in <xref target="ver-res"/>. If the client receives a response to a non-Observe request with an Inner Observe option, then it stops processing the message, as specified in <xref target="ver-res"/>.</t>

<t>A client MUST consider the notification with the highest Partial IV as the freshest, regardless of the order of arrival. In order to support existing Observe implementations the OSCORE client implementation MAY set the Observe value to the three least significant bytes of the Partial IV. Implementations need to make sure that the notification without Partial IV is considered the oldest.</t>

</section>
</section>
<section anchor="no-resp" title="No-Response">

<t>No-Response <xref target="RFC7967"/> is an optional feature used by the client to communicate its disinterest in certain classes of responses to a particular request. An implementation MAY support <xref target="RFC7252"/> and the OSCORE option without supporting <xref target="RFC7967"/>.</t>

<t>If used, No-Response MUST be Inner. The Inner No-Response SHALL be processed by OSCORE as specified in <xref target="inner-options"/>. The Outer option SHOULD NOT be present. The server SHALL ignore the Outer No-Response option. The client MAY set the Outer No-Response value to 26 (‘suppress all known codes’) if the Inner value is set to 26. The client MUST be prepared to receive and discard 5.04 (Gateway Timeout) error messages from intermediaries potentially resulting from destination time out due to no response.</t>

</section>
<section anchor="oscore" title="OSCORE">

<t>The OSCORE option is only defined to be present in OSCORE messages, as an indication that OSCORE processing have been performed. The content in the OSCORE option is neither encrypted nor integrity protected as a whole but some part of the content of this option is protected (see <xref target="AAD"/>). Nested use of OSCORE is not supported: If OSCORE processing detects an OSCORE option in the original CoAP message, then processing SHALL be stopped.</t>

<figure title="Protection of CoAP Header Fields and Payload" anchor="fig-fields-protection"><artwork align="center"><![CDATA[
      +------------------+---+---+
      | Field            | E | U |
      +------------------+---+---+
      | Version (UDP)    |   | x |
      | Type (UDP)       |   | x |
      | Length (TCP)     |   | x |
      | Token Length     |   | x |
      | Code             | x |   |
      | Message ID (UDP) |   | x |
      | Token            |   | x |
      | Payload          | x |   |
      +------------------+---+---+

E = Encrypt and Integrity Protect (Inner)
U = Unprotected (Outer)
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="coap-header" title="CoAP Header Fields and Payload">

<t>A summary of how the CoAP header fields and payload are protected is shown in <xref target="fig-fields-protection"/>, including fields specific to CoAP over UDP and CoAP over TCP (marked accordingly in the table).</t>

<t>Most CoAP Header fields (i.e. the message fields in the fixed 4-byte header) are required to be read and/or changed by CoAP proxies and thus cannot in general be protected end-to-end between the endpoints. As mentioned in <xref target="intro"/>, OSCORE protects the CoAP Request/Response Layer only, and not the Messaging Layer (Section 2 of <xref target="RFC7252"/>), so fields such as Type and Message ID are not protected with OSCORE.</t>

<t>The CoAP Header field Code is protected by OSCORE. Code SHALL be encrypted and integrity protected (Class E) to prevent an intermediary from eavesdropping on or manipulating the Code (e.g., changing from GET to DELETE).</t>

<t>The sending endpoint SHALL write the Code of the original CoAP message into the plaintext of the COSE object (see <xref target="plaintext"/>). After that, the sending endpoint writes an Outer Code to the OSCORE message. With one exception (see <xref target="observe"/>) the Outer Code SHALL be set to 0.02 (POST) for requests and to 2.04 (Changed) for responses. The receiving endpoint SHALL discard the Outer Code in the OSCORE message and write the Code of the COSE object plaintext (<xref target="plaintext"/>) into the decrypted CoAP message.</t>

<t>The other currently defined CoAP Header fields are Unprotected (Class U). The sending endpoint SHALL write all other header fields of the original message into the header of the OSCORE message. The receiving endpoint SHALL write the header fields from the received OSCORE message into the header of the decrypted CoAP message.</t>

<t>The CoAP Payload, if present in the original CoAP message, SHALL be encrypted and integrity protected and is thus an Inner message field. The sending endpoint writes the payload of the original CoAP message into the plaintext (<xref target="plaintext"/>) input to the COSE object. The receiving endpoint verifies and decrypts the COSE object, and recreates the payload of the original CoAP message.</t>

</section>
<section anchor="coap-signaling" title="Signaling Messages">

<t>Signaling messages (CoAP Code 7.00-7.31) were introduced to exchange information related to an underlying transport connection in the specific case of CoAP over reliable transports <xref target="RFC8323"/>.</t>

<t>OSCORE MAY be used to protect Signaling if the endpoints for OSCORE coincide with the endpoints for the signaling message. If OSCORE is used to protect Signaling then:</t>

<t><list style="symbols">
  <t>To comply with <xref target="RFC8323"/>, an initial empty CSM message SHALL be sent. The subsequent signaling message SHALL be protected.</t>
  <t>Signaling messages SHALL be protected as CoAP Request messages, except in the case the Signaling message is a response to a previous Signaling message, in which case it SHALL be protected as a CoAP Response message. 
For example, 7.02 (Ping) is protected as a CoAP Request and 7.03 (Pong) as a CoAP response.</t>
  <t>The Outer Code for Signaling messages SHALL be set to 0.02 (POST), unless it is a response to a previous Signaling message, in which case it SHALL be set to 2.04 (Changed).</t>
  <t>All Signaling options, except the OSCORE option, SHALL be Inner (Class E).</t>
</list></t>

<t>NOTE: Option numbers for Signaling messages are specific to the CoAP Code (see Section 5.2 of <xref target="RFC8323"/>).</t>

<t>If OSCORE is not used to protect Signaling, Signaling messages SHALL be unaltered by OSCORE.</t>

</section>
</section>
<section anchor="cose-object" title="The COSE Object">

<t>This section defines how to use COSE <xref target="RFC8152"/> to wrap and protect data in the original message. OSCORE uses the untagged COSE_Encrypt0 structure with an Authenticated Encryption with Additional Data (AEAD) algorithm. The AEAD key lengths, AEAD nonce length, and maximum Sender Sequence Number are algorithm dependent.</t>

<t>The AEAD algorithm AES-CCM-16-64-128 defined in Section 10.2 of <xref target="RFC8152"/> is mandatory to implement. For AES-CCM-16-64-128 the length of Sender Key and Recipient Key is 128 bits, the length of AEAD nonce and Common IV is 13 bytes. The maximum Sender Sequence Number is specified in <xref target="sec-considerations"/>.</t>

<t>As specified in <xref target="RFC5116"/>, plaintext denotes the data that is to be encrypted and integrity protected, and Additional Authenticated Data (AAD) denotes the data that is to be integrity protected only.</t>

<t>The COSE Object SHALL be a COSE_Encrypt0 object with fields defined as follows</t>

<t><list style="symbols">
  <t>The ‘protected’ field is empty.</t>
  <t>The ‘unprotected’ field includes:  <list style="symbols">
      <t>The ‘Partial IV’ parameter. The value is set to the Sender Sequence Number. All leading bytes of value zero SHALL be removed when encoding the Partial IV, except in the case of Partial IV of value 0 which is encoded to the byte string 0x00. This parameter SHALL be present in requests. The Partial IV SHALL be present in responses to Observe registrations (see <xref target="observe-registration"/>), otherwise the Partial IV will not typically be present in responses (for one exception, see <xref target="reboot-replay"/>).</t>
      <t>The ‘kid’ parameter. The value is set to the Sender ID. This parameter SHALL be present in requests and will not typically be present in responses. An example where the Sender ID is included in a response is the extension of OSCORE to group communication <xref target="I-D.ietf-core-oscore-groupcomm"/>.</t>
      <t>Optionally, a ‘kid context’ parameter (see <xref target="context-hint"/>). This parameter MAY be present in requests, and if so, MUST contain an ID Context (see <xref target="context-definition"/>). This parameter SHOULD NOT be present in responses: an example of how ‘kid context’ can be used in responses is given in <xref target="master-secret-multiple"/>. If ‘kid context’ is present in the request, then the server SHALL use a security context with that ID Context when verifying the request.</t>
    </list></t>
  <t>The ‘ciphertext’ field is computed from the secret key (Sender Key or Recipient Key), AEAD nonce (see <xref target="nonce"/>), plaintext (see <xref target="plaintext"/>), and the Additional Authenticated Data (AAD) (see <xref target="AAD"/>) following Section 5.2 of <xref target="RFC8152"/>.</t>
</list></t>

<t>The encryption process is described in Section 5.3 of <xref target="RFC8152"/>.</t>

<section anchor="context-hint" title="ID Context and ‘kid context’">

<t>For certain use cases, e.g. deployments where the same Sender ID is used with multiple contexts, it is possible (and sometimes necessary, see <xref target="req-params"/>) for the client to use an ID Context to distinguish the security contexts (see <xref target="context-definition"/>). For example:</t>

<t><list style="symbols">
  <t>If the client has a unique identifier in some namespace then that identifier can be used as ID Context.</t>
  <t>The ID Context may be used to add randomness into new Sender and Recipient Contexts, see <xref target="master-secret-multiple"/>.</t>
  <t>In case of group communication <xref target="I-D.ietf-core-oscore-groupcomm"/>, a group identifier is used as ID Context to enable different security contexts for a server belonging to multiple groups.</t>
</list></t>

<t>The Sender ID and ID Context are used to establish the necessary input parameters and in the derivation of the security context (see <xref target="context-derivation"/>).</t>

<t>Whereas the ‘kid’ parameter is used to transport the Sender ID, the new COSE header parameter ‘kid context’ is used to transport the ID Context in requests, see <xref target="tab-1"/>.</t>

<figure title="Common Header Parameter 'kid context' for the COSE object" anchor="tab-1"><artwork align="center"><![CDATA[
+----------+--------+------------+----------------+-----------------+
|   name   |  label | value type | value registry |   description   |
+----------+--------+------------+----------------+-----------------+
|   kid    |  TBD2  | bstr       |                | Identifies the  |
| context  |        |            |                | context for kid |
+----------+--------+------------+----------------+-----------------+
]]></artwork></figure>

<t>If ID Context is non-empty and the client sends a request without ‘kid context’ which results in an error indicating that the server could not find the security context, then the client could include the ID Context in the ‘kid context’ when making another request. Note that since the error is unprotected it may have been spoofed and the real response blocked by an on-path attacker.</t>

</section>
<section anchor="nonce" title="AEAD Nonce">

<t>The high level design of the AEAD nonce follows Section 4.4 of <xref target="I-D.mcgrew-iv-gen"/>, here follows the detailed construction (see Figure 8):</t>

<t><list style="numbers">
  <t>left-pad the Partial IV (PIV) with zeroes to exactly 5 bytes,</t>
  <t>left-pad the Sender ID of the endpoint that generated the Partial IV (ID_PIV) with zeroes to exactly nonce length minus 6 bytes,</t>
  <t>concatenate the size of the ID_PIV (a single byte S) with the padded ID_PIV and the padded PIV,</t>
  <t>and then XOR with the Common IV.</t>
</list></t>

<t>Note that in this specification only AEAD algorithms that use nonces equal or greater than 7 bytes are supported. The nonce construction with S, ID_PIV, and PIV together with endpoint unique IDs and encryption keys makes it easy to verify that the nonces used with a specific key will be unique, see <xref target="kn-uniqueness"/>.</t>

<t>If the Partial IV is not present in a response, the nonce from the request is used. For responses that are not notifications (i.e. when there is a single response to a request), the request and the response should typically use the same nonce to reduce message overhead. Both alternatives provide all the required security properties, see <xref target="replay-protection"/> and <xref target="kn-uniqueness"/>. The only non-Observe scenario where a Partial IV must be included in a response is when the server is unable to perform replay protection, see <xref target="reboot-replay"/>. For processing instructions see <xref target="processing"/>.</t>

<figure title="AEAD Nonce Formation" anchor="fig-nonce"><artwork align="center"><![CDATA[
     <- nonce length minus 6 B -> <-- 5 bytes -->
+---+-------------------+--------+---------+-----+
| S |      padding      | ID_PIV | padding | PIV |----+ 
+---+-------------------+--------+---------+-----+    | 
                                                      |
 <---------------- nonce length ---------------->     |               
+------------------------------------------------+    | 
|                   Common IV                    |->(XOR)
+------------------------------------------------+    | 
                                                      | 
 <---------------- nonce length ---------------->     |               
+------------------------------------------------+    | 
|                     Nonce                      |<---+ 
+------------------------------------------------+     
]]></artwork></figure>

</section>
<section anchor="plaintext" title="Plaintext">

<t>The plaintext is formatted as a CoAP message without Header (see <xref target="fig-plaintext"/>) consisting of:</t>

<t><list style="symbols">
  <t>the Code of the original CoAP message as defined in Section 3 of <xref target="RFC7252"/>; and</t>
  <t>all Inner option message fields (see <xref target="inner-options"/>) present in the original CoAP message (see <xref target="coap-options"/>). The options are encoded as described in Section 3.1 of <xref target="RFC7252"/>, where the delta is the difference to the previously included instance of Class E option; and</t>
  <t>the Payload of original CoAP message, if present, and in that case prefixed by the one-byte Payload Marker (0xff).</t>
</list></t>

<t>NOTE: The plaintext contains all CoAP data that needs to be encrypted end-to-end between the endpoints.</t>

<figure title="Plaintext" anchor="fig-plaintext"><artwork align="center"><![CDATA[
 0                   1                   2                   3   
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Code      |    Class E options (if any) ...                
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1 1 1 1 1 1 1 1|    Payload (if any) ...                        
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 (only if there 
   is payload)
]]></artwork></figure>

</section>
<section anchor="AAD" title="Additional Authenticated Data">

<t>The external_aad SHALL be a CBOR array wrapped in a bstr object as defined below:</t>

<figure><artwork type="CDDL"><![CDATA[
external_aad = bstr .cbor aad_array

aad_array = [
  oscore_version : uint,
  algorithms : [ alg_aead : int / tstr ],
  request_kid : bstr,
  request_piv : bstr,
  options : bstr,
]
]]></artwork></figure>

<t>where:</t>

<t><list style="symbols">
  <t>oscore_version: contains the OSCORE version number. Implementations of this specification MUST set this field to 1. Other values are reserved for future versions.</t>
  <t>algorithms: contains (for extensibility) an array of algorithms, according to this specification only containing alg_aead.</t>
  <t>alg_aead: contains the AEAD Algorithm from the security context used for the exchange (see <xref target="context-definition"/>).</t>
  <t>request_kid: contains the value of the ‘kid’ in the COSE object of the request (see <xref target="cose-object"/>).</t>
  <t>request_piv: contains the value of the ‘Partial IV’ in the COSE object of the request (see <xref target="cose-object"/>).</t>
  <t>options: contains the Class I options (see <xref target="outer-options"/>) present in the original CoAP message encoded as described in Section 3.1 of <xref target="RFC7252"/>, where the delta is the difference to the previously included instance of class I option.</t>
</list></t>

<t>The oscore_version and algorithms parameters are established out-of-band and are thus never transported in OSCORE, but the external_aad allows to verify that they are the same in both endpoints.</t>

<t>NOTE: The format of the external_aad is for simplicity the same for requests and responses, although some parameters, e.g. request_kid, need not be integrity protected in all requests.</t>

<t>The Additional Authenticated Data (AAD) is composed from the external_aad as described in Section 5.3 of <xref target="RFC8152"/>:</t>

<figure><artwork><![CDATA[
   AAD = Enc_structure = [ "Encrypt0", h'', external_aad ]
]]></artwork></figure>

<t>The following is an example of AAD constructed using AEAD Algorithm = AES-CCM-16-64-128 (10), request_kid = 0x00, request_piv = 0x25 and no Class I options:</t>

<t><list style="symbols">
  <t>oscore_version: 0x01 (1 byte)</t>
  <t>algorithms: 0x810a (2 bytes)</t>
  <t>request_kid: 0x00 (1 byte)</t>
  <t>request_piv: 0x25 (1 byte)</t>
  <t>options: 0x (0 bytes)</t>
  <t>aad_array: 0x8501810a4100412540 (9 bytes)</t>
  <t>external_aad: 0x498501810a4100412540 (10 bytes)</t>
  <t>AAD: 0x8368456e63727970743040498501810a4100412540 (21 bytes)</t>
</list></t>

<t>Note that the AAD consists of a fixed string of 11 bytes concatenated with the external_aad.</t>

</section>
</section>
<section anchor="compression" title="OSCORE Header Compression">

<t>The Concise Binary Object Representation (CBOR) <xref target="RFC7049"/> combines very small message sizes with extensibility. The CBOR Object Signing and Encryption (COSE) <xref target="RFC8152"/> uses CBOR to create compact encoding of signed and encrypted data. COSE is however constructed to support a large number of different stateless use cases, and is not fully optimized for use as a stateful security protocol, leading to a larger than necessary message expansion. In this section, we define a stateless header compression mechanism, simply removing redundant information from the COSE objects, which significantly reduces the per-packet overhead. The result of applying this mechanism to a COSE object is called the “compressed COSE object”.</t>

<t>The COSE_Encrypt0 object used in OSCORE is transported in the OSCORE option and in the Payload. The Payload contains the Ciphertext of the COSE object. The headers of the COSE object are compactly encoded as described in the next section.</t>

<section anchor="obj-sec-value" title="Encoding of the OSCORE Option Value">

<t>The value of the OSCORE option SHALL contain the OSCORE flag bits, the Partial IV parameter, the ‘kid context’ parameter (length and value), and the ‘kid’ parameter as follows:</t>

<figure title="The OSCORE Option Value" anchor="fig-option-value"><artwork align="center"><![CDATA[
 0 1 2 3 4 5 6 7 <------------- n bytes -------------->
+-+-+-+-+-+-+-+-+--------------------------------------
|0 0 0|h|k|  n  |       Partial IV (if any) ...    
+-+-+-+-+-+-+-+-+--------------------------------------

 <- 1 byte -> <----- s bytes ------>                    
+------------+----------------------+------------------+
| s (if any) | kid context (if any) | kid (if any) ... |
+------------+----------------------+------------------+
]]></artwork></figure>

<t><list style="symbols">
  <t>The first byte, containing the OSCORE flag bits, encodes the following set of bits and the length of the Partial IV parameter:  <list style="symbols">
      <t>The three least significant bits encode the Partial IV length n. If n = 0 then the Partial IV is not present in the compressed COSE object. The values n = 6 and n = 7 are reserved.</t>
      <t>The fourth least significant bit is the ‘kid’ flag, k: it is set to 1 if the kid is present in the compressed COSE object.</t>
      <t>The fifth least significant bit is the ‘kid context’ flag, h: it is set to 1 if the compressed COSE object contains a ‘kid context (see <xref target="context-hint"/>).</t>
      <t>The sixth to eighth least significant bits are reserved for future use. These bits SHALL be set to zero when not in use. According to this specification, if any of these bits are set to 1 the message is considered to be malformed and decompression fails as specified in item 2 of <xref target="ver-req"/>.</t>
    </list></t>
</list></t>

<t>The flag bits are registered in the OSCORE Flag Bits registry specified in <xref target="oscore-flag-bits"/>.</t>

<t><list style="symbols">
  <t>The following n bytes encode the value of the Partial IV, if the Partial IV is present (n &gt; 0).</t>
  <t>The following 1 byte encode the length of the ‘kid context’ (<xref target="context-hint"/>) s, if the ‘kid context’ flag is set (h = 1).</t>
  <t>The following s bytes encode the ‘kid context’, if the ‘kid context’ flag is set (h = 1).</t>
  <t>The remaining bytes encode the value of the ‘kid’, if the ‘kid’ is present (k = 1).</t>
</list></t>

<t>Note that the ‘kid’ MUST be the last field of the OSCORE option value, even in case reserved bits are used and additional fields are added to it.</t>

<t>The length of the OSCORE option thus depends on the presence and length of Partial IV, ‘kid context’, ‘kid’, as specified in this section, and on the presence and length of the other parameters, as defined in the separate documents.</t>

</section>
<section anchor="oscore-payl" title="Encoding of the OSCORE Payload">

<t>The payload of the OSCORE message SHALL encode the ciphertext of the COSE object.</t>

</section>
<section anchor="examples-of-compressed-cose-objects" title="Examples of Compressed COSE Objects">

<t>This section covers a list of OSCORE Header Compression examples for requests and responses. The examples assume the COSE_Encrypt0 object is set (which means the CoAP message and cryptographic material is known). Note that the full CoAP unprotected message, as well as the full security context, is not reported in the examples, but only the input necessary to the compression mechanism, i.e. the COSE_Encrypt0 object. The output is the compressed COSE object as defined in <xref target="compression"/>, divided into two parts, since the object is transported in two CoAP fields: OSCORE option and payload.</t>

<t><list style="format %d." counter="bar">
  <t>Request with ciphertext = 0xaea0155667924dff8a24e4cb35b9, kid = 0x25, and Partial IV = 0x05</t>
</list></t>

<figure><artwork><![CDATA[
    Before compression (24 bytes):

      [
        h'',
        { 4:h'25', 6:h'05' },
        h'aea0155667924dff8a24e4cb35b9',
      ]
]]></artwork></figure>

<figure><artwork><![CDATA[
    After compression (17 bytes):

      Flag byte: 0b00001001 = 0x09 (1 byte)

      Option Value: 0x090525 (3 bytes)

      Payload: 0xaea0155667924dff8a24e4cb35b9 (14 bytes)
]]></artwork></figure>

<t><list style="format %d." counter="bar">
  <t>Request with ciphertext = 0xaea0155667924dff8a24e4cb35b9, kid = empty string, and Partial IV = 0x00</t>
</list></t>

<figure><artwork><![CDATA[
    Before compression (23 bytes):

      [
        h'',
        { 4:h'', 6:h'00' },
        h'aea0155667924dff8a24e4cb35b9',
      ]
]]></artwork></figure>

<figure><artwork><![CDATA[
    After compression (16 bytes):

      Flag byte: 0b00001001 = 0x09 (1 byte)

      Option Value: 0x0900 (2 bytes)

      Payload: 0xaea0155667924dff8a24e4cb35b9 (14 bytes)
]]></artwork></figure>

<t><list style="format %d." counter="bar">
  <t>Request with ciphertext = 0xaea0155667924dff8a24e4cb35b9, kid = empty string, Partial IV = 0x05, and kid context = 0x44616c656b</t>
</list></t>

<!--
NOTE (IANA registration) that the following example uses kid context = 8. This might need to be changed following IANA assignment.
-->

<figure><artwork><![CDATA[
    Before compression (30 bytes):

      [
        h'',
        { 4:h'', 6:h'05', 8:h'44616c656b' },
        h'aea0155667924dff8a24e4cb35b9',
      ]
]]></artwork></figure>

<figure><artwork><![CDATA[
    After compression (22  bytes):

      Flag byte: 0b00011001 = 0x19 (1 byte)

      Option Value: 0x19050544616c656b (8 bytes)

      Payload: 0xae a0155667924dff8a24e4cb35b9 (14 bytes)
]]></artwork></figure>

<t><list style="format %d." counter="bar">
  <t>Response with ciphertext = 0xaea0155667924dff8a24e4cb35b9 and no Partial IV</t>
</list></t>

<figure><artwork><![CDATA[
    Before compression (18 bytes):

      [
        h'',
        {},
        h'aea0155667924dff8a24e4cb35b9',
      ]
]]></artwork></figure>

<figure><artwork><![CDATA[
    After compression (14 bytes):

      Flag byte: 0b00000000 = 0x00 (1 byte)

      Option Value: 0x (0 bytes)

      Payload: 0xaea0155667924dff8a24e4cb35b9 (14 bytes)
]]></artwork></figure>

<t><list style="format %d." counter="bar">
  <t>Response with ciphertext = 0xaea0155667924dff8a24e4cb35b9 and Partial IV = 0x07</t>
</list></t>

<figure><artwork><![CDATA[
    Before compression (21 bytes):

      [
        h'',
        { 6:h'07' },
        h'aea0155667924dff8a24e4cb35b9',
      ]
]]></artwork></figure>

<figure><artwork><![CDATA[
    After compression (16 bytes):

      Flag byte: 0b00000001 = 0x01 (1 byte)

      Option Value: 0x0107 (2 bytes)

      Payload: 0xaea0155667924dff8a24e4cb35b9 (14 bytes)
]]></artwork></figure>

</section>
</section>
<section anchor="sequence-numbers" title="Message Binding, Sequence Numbers, Freshness, and Replay Protection">

<section anchor="message-binding" title="Message Binding">

<t>In order to prevent response delay and mismatch attacks <xref target="I-D.mattsson-core-coap-actuators"/> from on-path attackers and compromised intermediaries, OSCORE binds responses to the requests by including the ‘kid’ and Partial IV of the request in the AAD of the response. The server therefore needs to store the ‘kid’ and Partial IV of the request until all responses have been sent.</t>

</section>
<section anchor="nonce-uniqueness" title="Sequence Numbers">

<t>An AEAD nonce MUST NOT be used more than once per AEAD key. The uniqueness of (key, nonce) pairs is shown in <xref target="kn-uniqueness"/>, and in particular depends on a correct usage of Partial IVs (which encode the Sender Sequence Numbers, see <xref target="cose-object"/>). If messages are processed concurrently, the operation of reading and increasing the Sender Sequence Number MUST be atomic.</t>

<section anchor="max-seq" title="Maximum Sequence Number">

<t>The maximum Sender Sequence Number is algorithm dependent (see <xref target="sec-considerations"/>), and SHALL be less than 2^40. If the Sender Sequence Number exceeds the maximum, the endpoint MUST NOT process any more messages with the given Sender Context. If necessary, the endpoint SHOULD acquire a new security context before this happens. The latter is out of scope of this document.</t>

</section>
</section>
<section anchor="freshness" title="Freshness">

<t>For requests, OSCORE provides only the guarantee that the request is not older than the security context. For applications having stronger demands on request freshness (e.g., control of actuators), OSCORE needs to be augmented with mechanisms providing freshness, for example as specified in <xref target="I-D.ietf-core-echo-request-tag"/>.</t>

<t>Assuming an honest server (see <xref target="overview-sec-properties"/>), the message binding guarantees that a response is not older than its request. For responses that are not notifications (i.e. when there is a single response to a request), this gives absolute freshness. For notifications, the absolute freshness gets weaker with time, and it is RECOMMENDED that the client regularly re-register the observation. Note that the message binding does not guarantee that misbehaving server created the response before receiving the request, i.e. it does not verify server aliveness.</t>

<t>For requests and notifications, OSCORE also provides relative freshness in the sense that the received Partial IV allows a recipient to determine the relative order of requests or responses.</t>

</section>
<section anchor="replay-protection" title="Replay Protection">

<t>In order to protect from replay of requests, the server’s Recipient Context includes a Replay Window. A server SHALL verify that a Partial IV = Sender Sequence Number received in the COSE object has not been received before. If this verification fails, the server SHALL stop processing the message, and MAY optionally respond with a 4.01 (Unauthorized) error message. Also, the server MAY set an Outer Max-Age option with value zero, to inform any intermediary that the response is not to be cached. The diagnostic payload MAY contain the “Replay detected” string. The size and type of the Replay Window depends on the use case and the protocol with which the OSCORE message is transported. In case of reliable and ordered transport from endpoint to endpoint, e.g. TCP, the server MAY just store the last received Partial IV and require that newly received Partial IVs equals the last received Partial IV + 1. However, in case of mixed reliable and unreliable transports and where messages may be lost, such a replay mechanism may be too restrictive and the default replay window be more suitable (see <xref target="initial-replay"/>).</t>

<t>Responses (with or without Partial IV) are protected against replay as they are bound to the request and the fact that only a single response is accepted. Note that the Partial IV is not used for replay protection in this case.</t>

<t>The operation of validating the Partial IV and updating the replay protection MUST be atomic.</t>

<section anchor="replay-notifications" title="Replay Protection of Notifications">

<t>The following applies additionally when Observe is supported.</t>

<t>The Notification Number is initialized to the Partial IV of the first successfully verified notification in response to the registration request. A client MUST only accept at most one Observe notifications without Partial IV, and treat it as the oldest notification received. A client receiving a notification containing a Partial IV SHALL compare the Partial IV with the Notification Number associated to that Observe registration. The client MUST stop processing notifications with a Partial IV which has been previously received. Applications MAY decide that a client only processes notifications which have greater Partial IV than the Notification Number.</t>

<t>If the verification of the response succeeds, and the received Partial IV was greater than the Notification Number then the client SHALL overwrite the corresponding Notification Number with the received Partial IV.</t>

</section>
</section>
<section anchor="context-state" title="Losing Part of the Context State">

<t>To prevent reuse of an AEAD nonce with the same AEAD key, or from accepting replayed messages, an endpoint needs to handle the situation of losing rapidly changing parts of the context, such as the Sender Sequence Number, and Replay Window. These are typically stored in RAM and therefore lost in the case of e.g. an unplanned reboot. There are different alternatives to recover, for example:</t>

<t><list style="numbers">
  <t>The endpoints can reuse an existing Security Context after updating the mutable parts of the security context (Sender Sequence Number, and Replay Window). This requires that the mutable parts of the security context are available throughout the lifetime of the device, or that the device can establish safe security context after loss of mutable security context data. Examples is given based on careful use of non-volatile memory, see <xref target="seq-numb"/>, and additionally the use of the Echo option, see <xref target="reboot-replay"/>. If an endpoint makes use of a partial security context stored in non-volatile memory, it MUST NOT reuse a previous Sender Sequence Number and MUST NOT accept previously received messages.</t>
  <t>The endpoints can reuse an existing shared Master Secret and derive new Sender and Recipient Contexts, see <xref target="master-secret-multiple"/> for an example. This typically requires a good source of randomness.</t>
  <t>The endpoints can use a trusted-third party assisted key establishment protocol such as <xref target="I-D.ietf-ace-oscore-profile"/>. This requires the execution of three-party protocol and may require a good source of randomness.</t>
  <t>The endpoints can run a key exchange protocol providing forward secrecy resulting in a fresh Master Secret, from which an entirely new Security Context is derived. This requires a good source of randomness, and additionally, the transmission and processing of the protocol may have a non-negligible cost, e.g. in terms of power consumption.</t>
</list></t>

<t>The endpoints need to be configured with information about which method is used. The choice of method may depend on capabilities of the devices deployed and the solution architecture. Using a key exchange protocol is necessary for deployments that require forward secrecy.</t>

</section>
</section>
<section anchor="processing" title="Processing">

<t>This section describes the OSCORE message processing. Additional processing for Observe or Block-wise are described in subsections.</t>

<t>Note that, analogously to <xref target="RFC7252"/> where the Token and source/destination pair are used to match a response with a request, both endpoints MUST keep the association (Token, {Security Context, Partial IV of the request}), in order to be able to find the Security Context and compute the AAD to protect or verify the response. The association MAY be forgotten after it has been used to successfully protect or verify the response, with the exception of Observe processing, where the association MUST be kept as long as the Observation is active.</t>

<t>The processing of the Sender Sequence Number follows the procedure described in Section 3 of <xref target="I-D.mcgrew-iv-gen"/>.</t>

<section anchor="prot-req" title="Protecting the Request">

<t>Given a CoAP request, the client SHALL perform the following steps to create an OSCORE request:</t>

<t><list style="numbers">
  <t>Retrieve the Sender Context associated with the target resource.</t>
  <t>Compose the Additional Authenticated Data and the plaintext, as described in Sections <xref target="plaintext" format="counter"/> and <xref target="AAD" format="counter"/>.</t>
  <t>Encode the Partial IV (Sender Sequence Number in network byte order) and increment the Sender Sequence Number by one. Compute the AEAD nonce from the Sender ID, Common IV, and Partial IV as described in <xref target="nonce"/>.</t>
  <t>Encrypt the COSE object using the Sender Key. Compress the COSE Object as specified in <xref target="compression"/>.</t>
  <t>Format the OSCORE message according to <xref target="protected-fields"/>. The OSCORE option is added (see <xref target="outer-options"/>).</t>
</list></t>

</section>
<section anchor="ver-req" title="Verifying the Request">

<t>A server receiving a request containing the OSCORE option SHALL perform the following steps:</t>

<t><list style="numbers">
  <t>Discard Code and all class E options (marked in <xref target="fig-option-protection"/> with ‘x’ in column E) present in the received message. For example, an If-Match Outer option is discarded, but an Uri-Host Outer option is not discarded.</t>
  <t>Decompress the COSE Object (<xref target="compression"/>) and retrieve the Recipient Context associated with the Recipient ID in the ‘kid’ parameter, additionally using the ‘kid context’, if present. If either the decompression or the COSE message fails to decode, or the server fails to retrieve a Recipient Context with Recipient ID corresponding to the ‘kid’ parameter received, then the server SHALL stop processing the request.  <list style="symbols">
      <t>If either the decompression or the COSE message fails to decode, the server MAY respond with a 4.02 (Bad Option) error message. The server MAY set an Outer Max-Age option with value zero. The diagnostic payload MAY contain the string “Failed to decode COSE”.</t>
      <t>If the server fails to retrieve a Recipient Context with Recipient ID corresponding to the ‘kid’ parameter received, the server MAY respond with a 4.01 (Unauthorized) error message. The server MAY set an Outer Max-Age option with value zero. The diagnostic payload MAY contain the string “Security context not found”.</t>
    </list></t>
  <t>Verify that the ‘Partial IV’ has not been received before using the Replay Window, as described in <xref target="replay-protection"/>.</t>
  <t>Compose the Additional Authenticated Data, as described in <xref target="AAD"/>.</t>
  <t>Compute the AEAD nonce from the Recipient ID, Common IV, and the ‘Partial IV’ parameter, received in the COSE Object.</t>
  <t>Decrypt the COSE object using the Recipient Key, as per <xref target="RFC8152"/> Section 5.3. (The decrypt operation includes the verification of the integrity.)  <list style="symbols">
      <t>If decryption fails, the server MUST stop processing the request and MAY respond with a 4.00 (Bad Request) error message. The server MAY set an Outer Max-Age option with value zero. The diagnostic payload MAY contain the “Decryption failed” string.</t>
      <t>If decryption succeeds, update the Replay Window, as described in <xref target="sequence-numbers"/>.</t>
    </list></t>
  <t>Add decrypted Code, options, and payload to the decrypted request. The OSCORE option is removed.</t>
  <t>The decrypted CoAP request is processed according to <xref target="RFC7252"/>.</t>
</list></t>

<section anchor="supporting-block-wise" title="Supporting Block-wise">

<t>If Block-wise is supported, insert the following step before any other:</t>

<t>A.  If Block-wise is present in the request, then process the Outer Block options according to <xref target="RFC7959"/>, until all blocks of the request have been received (see <xref target="block-options"/>).</t>

</section>
</section>
<section anchor="prot-res" title="Protecting the Response">

<t>If a CoAP response is generated in response to an OSCORE request, the server SHALL perform the following steps to create an OSCORE response. Note that CoAP error responses derived from CoAP processing (step 8 in <xref target="ver-req"/>) are protected, as well as successful CoAP responses, while the OSCORE errors (steps 2, 3, and 6 in <xref target="ver-req"/>) do not follow the processing below, but are sent as simple CoAP responses, without OSCORE processing.</t>

<t><list style="numbers">
  <t>Retrieve the Sender Context in the Security Context associated with the Token.</t>
  <t>Compose the Additional Authenticated Data and the plaintext, as described in Sections <xref target="plaintext" format="counter"/> and <xref target="AAD" format="counter"/>.</t>
  <t>Compute the AEAD nonce as described in <xref target="nonce"/>:  <list style="symbols">
      <t>Either use the AEAD nonce from the request, or</t>
      <t>Encode the Partial IV (Sender Sequence Number in network byte order) and increment the Sender Sequence Number by one. Compute the AEAD nonce from the Sender ID, Common IV, and Partial IV.</t>
    </list></t>
  <t>Encrypt the COSE object using the Sender Key. Compress the COSE Object as specified in <xref target="compression"/>. If the AEAD nonce was constructed from a new Partial IV, this Partial IV MUST be included in the message. If the AEAD nonce from the request was used, the Partial IV MUST NOT be included in the message.</t>
  <t>Format the OSCORE message according to <xref target="protected-fields"/>. The OSCORE option is added (see <xref target="outer-options"/>).</t>
</list></t>

<section anchor="observe-prot-res" title="Supporting Observe">

<t>If Observe is supported, insert the following step between step 2 and 3 of <xref target="prot-res"/>:</t>

<t>A. If the response is an observe notification:</t>

<t><list style="symbols">
  <t>If the response is the first notification:
  <list style="symbols">
      <t>compute the AEAD nonce as described in <xref target="nonce"/>:
      <list style="symbols">
          <t>Either use the AEAD nonce from the request, or</t>
          <t>Encode the Partial IV (Sender Sequence Number in network byte order) and increment the Sender Sequence Number by one. Compute the AEAD nonce from the Sender ID, Common IV, and Partial IV.</t>
        </list>
Then go to 4.</t>
    </list></t>
  <t>If the response is not the first notification:
  <list style="symbols">
      <t>encode the Partial IV (Sender Sequence Number in network byte order) and increment the Sender Sequence Number by one. Compute the AEAD nonce from the Sender ID, Common IV, and Partial IV, then go to 4.</t>
    </list></t>
</list></t>

</section>
</section>
<section anchor="ver-res" title="Verifying the Response">

<t>A client receiving a response containing the OSCORE option SHALL perform the following steps:</t>

<t><list style="numbers">
  <t>Discard Code and all class E options (marked in <xref target="fig-option-protection"/> with ‘x’ in column E) present in the received message. For example, ETag Outer option is discarded, as well as Max-Age Outer option.</t>
  <t>Retrieve the Recipient Context in the Security Context associated with the Token. Decompress the COSE Object (<xref target="compression"/>). If either the decompression or the COSE message fails to decode, then go to 8.</t>
  <t>Compose the Additional Authenticated Data, as described in <xref target="AAD"/>.</t>
  <t>Compute the AEAD nonce  <list style="symbols">
      <t>If the Partial IV is not present in the response, the AEAD nonce from the request is used.</t>
      <t>If the Partial IV is present in the response, compute the AEAD nonce from the Recipient ID, Common IV, and the ‘Partial IV’ parameter, received in the COSE Object.</t>
    </list></t>
  <t>Decrypt the COSE object using the Recipient Key, as per <xref target="RFC8152"/> Section 5.3. (The decrypt operation includes the verification of the integrity.) If decryption fails, then go to 8.</t>
  <t>Add decrypted Code, options and payload to the decrypted request. The OSCORE option is removed.</t>
  <t>The decrypted CoAP response is processed according to <xref target="RFC7252"/>.</t>
  <t>In case any of the previous erroneous conditions apply: the client SHALL stop processing the response.</t>
</list></t>

<section anchor="supporting-block-wise-1" title="Supporting Block-wise">

<t>If Block-wise is supported, insert the following step before any other:</t>

<t>A.  If Block-wise is present in the request, then process the Outer Block options according to <xref target="RFC7959"/>, until all blocks of the request have been received (see <xref target="block-options"/>).</t>

</section>
<section anchor="observe-ver-res" title="Supporting Observe">

<t>If Observe is supported:</t>

<t>Insert the following step between step 5 and step 6:</t>

<t>A. If the request was an Observe registration, then:</t>

<t><list style="symbols">
  <t>If the Partial IV is not present in the response, and Inner Observe is present, and the AEAD nonce from the request was already used once, then go to 8.</t>
  <t>If the Partial IV is present in the response and Inner Observe is present, then follow the processing described in <xref target="notifications"/> and <xref target="replay-notifications"/>, then:  <list style="symbols">
      <t>initialize the Notification Number (if first successfully verified notification), or</t>
      <t>overwrite the Notification Number (if the received Partial IV was greater than the Notification Number).</t>
    </list></t>
</list></t>

<t>Replace step 8 of <xref target="ver-res"/> with:</t>

<t>B. In case any of the previous erroneous conditions apply: the client SHALL stop processing the response. An error condition occurring while processing a response to an observation request does not cancel the observation. A client MUST NOT react to failure by re-registering the observation immediately.</t>

</section>
</section>
</section>
<section anchor="web-linking" title="Web Linking">

<t>The use of OSCORE MAY be indicated by a target attribute “osc” in a web link <xref target="RFC8288"/> to a resource, e.g. using a link-format document <xref target="RFC6690"/> if the resource is accessible over CoAP.</t>

<t>The “osc” attribute is a hint indicating that the destination of that link is only accessible using OSCORE, and unprotected access to it is not supported. Note that this is simply a hint, it does not include any security context material or any other information required to run OSCORE.</t>

<t>A value MUST NOT be given for the “osc” attribute; any present value MUST be ignored by parsers. The “osc” attribute MUST NOT appear more than once in a given link-value; occurrences after the first MUST be ignored by parsers.</t>

<t>The example in <xref target="fig-web-link"/> shows a use of the “osc” attribute: the client does resource discovery on a server, and gets back a list of resources, one of which includes the “osc” attribute indicating that the resource is protected with OSCORE. The link-format notation (see Section 5 of <xref target="RFC6690"/>) is used.</t>

<figure title="The web link" anchor="fig-web-link"><artwork align="center"><![CDATA[
REQ: GET /.well-known/core

RES: 2.05 Content
   </sensors/temp>;osc,
   </sensors/light>;if="sensor"
]]></artwork></figure>

</section>
<section anchor="coap-coap-proxy" title="CoAP-to-CoAP Forwarding Proxy">

<t>CoAP is designed for proxy operations (see Section 5.7 of <xref target="RFC7252"/>).</t>

<t>OSCORE is designed to work with OSCORE-unaware CoAP proxies. Security requirements for forwarding are listed in Section 2.2.1 of <xref target="I-D.hartke-core-e2e-security-reqs"/>. Proxy processing of the (Outer) Proxy-Uri option works as defined in <xref target="RFC7252"/>. Proxy processing of the (Outer) Block options works as defined in <xref target="RFC7959"/>.</t>

<t>However, not all CoAP proxy operations are useful:</t>

<t><list style="symbols">
  <t>Since a CoAP response is only applicable to the original CoAP request, caching is in general not useful. In support of existing proxies, OSCORE uses the outer Max-Age option, see <xref target="max-age"/>.</t>
  <t>Proxy processing of the (Outer) Observe option as defined in <xref target="RFC7641"/> is specified in <xref target="observe"/>.</t>
</list></t>

<t>Optionally, a CoAP proxy MAY detect OSCORE and act accordingly. An OSCORE-aware CoAP proxy:</t>

<t><list style="symbols">
  <t>SHALL bypass caching for the request if the OSCORE option is present</t>
  <t>SHOULD avoid caching responses to requests with an OSCORE option</t>
</list></t>

<t>In the case of Observe (see <xref target="observe"/>) the OSCORE-aware CoAP proxy:</t>

<t><list style="symbols">
  <t>SHALL NOT initiate an Observe registration</t>
  <t>MAY verify the order of notifications using Partial IV rather than the Observe option</t>
</list></t>

</section>
<section anchor="http-op" title="HTTP Operations">

<t>The CoAP request/response model may be mapped to HTTP and vice versa as described in Section 10 of <xref target="RFC7252"/>. The HTTP-CoAP mapping is further detailed in <xref target="RFC8075"/>. This section defines the components needed to map and transport OSCORE messages over HTTP hops. By mapping between HTTP and CoAP and by using cross-protocol proxies OSCORE may be used end-to-end between e.g. an HTTP client and a CoAP server. Examples are provided at the end of the section.</t>

<section anchor="header-field" title="The HTTP OSCORE Header Field">

<t>The HTTP OSCORE Header Field (see <xref target="iana-http"/>) is used for carrying the content of the CoAP OSCORE option when transporting OSCORE messages over HTTP hops.</t>

<t>The HTTP OSCORE header field is only used in POST requests and 200 (OK) responses. When used, the HTTP header field Content-Type is set to ‘application/oscore’ (see <xref target="oscore-media-type"/>) indicating that the HTTP body of this message contains the OSCORE payload (see <xref target="oscore-payl"/>). No additional semantics is provided by other message fields.</t>

<t>Using the Augmented Backus-Naur Form (ABNF) notation of <xref target="RFC5234"/>, including the following core ABNF syntax rules defined by that specification: ALPHA (letters) and DIGIT (decimal digits), the HTTP OSCORE header field value is as follows.</t>

<figure><artwork type="abnf"><![CDATA[
base64url-char = ALPHA / DIGIT / "-" / "_"

OSCORE = 2*base64url-char
]]></artwork></figure>

<t>The HTTP OSCORE header field is not appropriate to list in the Connection header field (see Section 6.1 of <xref target="RFC7230"/>) since it is not hop-by-hop. OSCORE messages are generally not useful when served from cache (i.e., they will generally be marked Cache-Control: no-cache) and so interaction with Vary is not relevant (Section 7.1.4 of <xref target="RFC7231"/>). Since the HTTP OSCORE header field is critical for message processing, moving it from headers to trailers renders the message unusable in case trailers are ignored (see Section 4.1 of <xref target="RFC7230"/>).</t>

<t>Intermediaries are in general not allowed to insert, delete, or modify the OSCORE header. Changes to the HTTP OSCORE header field will in general violate the integrity of the OSCORE message resulting in an error. For the same reason the HTTP OSCORE header field is in general not preserved across redirects.</t>

<t>Since redirects are not defined in the mappings between HTTP and CoAP <xref target="RFC8075"/><xref target="RFC7252"/>, a number of conditions need to be fulfilled for redirects to work. For CoAP client to HTTP server, such conditions include:</t>

<t><list style="symbols">
  <t>the CoAP-to-HTTP proxy follows the redirect, instead of the CoAP client as in the HTTP case</t>
  <t>the CoAP-to-HTTP proxy copies the HTTP OSCORE header field and body to the new request</t>
  <t>the target of the redirect has the necessary OSCORE security context required to decrypt and verify the message</t>
</list></t>

<t>Since OSCORE requires HTTP body to be preserved across redirects, the HTTP server is RECOMMENDED to reply with 307 or 308 instead of 301 or 302.</t>

<t>For the case of HTTP client to CoAP server, although redirect is not defined for CoAP servers <xref target="RFC7252"/>, an HTTP client receiving a redirect should generate a new OSCORE request for the server it was redirected to.</t>

</section>
<section anchor="coap2http" title="CoAP-to-HTTP Mapping">

<t>Section 10.1 of <xref target="RFC7252"/> describes the fundamentals of the CoAP-to-HTTP cross-protocol mapping process. The additional rules for OSCORE messages are:</t>

<t><list style="symbols">
  <t>The HTTP OSCORE header field value is set to  <list style="symbols">
      <t>AA if the CoAP OSCORE option is empty, otherwise</t>
      <t>the value of the CoAP OSCORE option (<xref target="obj-sec-value"/>) in base64url (Section 5 of <xref target="RFC4648"/>) encoding without padding. Implementation notes for this encoding are given in Appendix C of <xref target="RFC7515"/>.</t>
    </list></t>
  <t>The HTTP Content-Type is set to ‘application/oscore’ (see <xref target="oscore-media-type"/>), independent of CoAP Content-Format.</t>
</list></t>

</section>
<section anchor="http2coap" title="HTTP-to-CoAP Mapping">

<t>Section 10.2 of <xref target="RFC7252"/> and <xref target="RFC8075"/> specify the behavior of an HTTP-to-CoAP proxy. 
The additional rules for HTTP messages with the OSCORE header field are:</t>

<t><list style="symbols">
  <t>The CoAP OSCORE option is set as follows:  <list style="symbols">
      <t>empty if the value of the HTTP OSCORE header field is a single zero byte (0x00) represented by AA, otherwise</t>
      <t>the value of the HTTP OSCORE header field decoded from base64url (Section 5 of <xref target="RFC4648"/>) without padding. Implementation notes for this encoding are given in Appendix C of <xref target="RFC7515"/>.</t>
    </list></t>
  <t>The CoAP Content-Format option is omitted, the content format for OSCORE (<xref target="content-format"/>) MUST NOT be used.</t>
</list></t>

</section>
<section anchor="http-endpoints" title="HTTP Endpoints">

<t>Restricted to subsets of HTTP and CoAP supporting a bijective mapping, OSCORE can be originated or terminated in HTTP endpoints.</t>

<t>The sending HTTP endpoint uses <xref target="RFC8075"/> to translate the HTTP message into a CoAP message. The CoAP message is then processed with OSCORE as defined in this document. The OSCORE message is then mapped to HTTP as described in <xref target="coap2http"/> and sent in compliance with the rules in <xref target="header-field"/>.</t>

<t>The receiving HTTP endpoint maps the HTTP message to a CoAP message using <xref target="RFC8075"/> and <xref target="http2coap"/>. The resulting OSCORE message is processed as defined in this document. If successful, the plaintext CoAP message is translated to HTTP for normal processing in the endpoint.</t>

</section>
<section anchor="example-http-client-and-coap-server" title="Example: HTTP Client and CoAP Server">

<t>This section is giving an example of how a request and a response between an HTTP client and a CoAP server could look like. The example is not a test vector but intended as an illustration of how the message fields are translated in the different steps.</t>

<t>Mapping and notation here is based on “Simple Form” (Section 5.4.1 of <xref target="RFC8075"/>).</t>

<figure><artwork><![CDATA[
[HTTP request -- Before client object security processing]

  GET http://proxy.url/hc/?target_uri=coap://server.url/orders 
   HTTP/1.1
]]></artwork></figure>

<figure><artwork><![CDATA[
[HTTP request -- HTTP Client to Proxy]

  POST http://proxy.url/hc/?target_uri=coap://server.url/ HTTP/1.1
  Content-Type: application/oscore
  OSCORE: CSU
  Body: 09 07 01 13 61 f7 0f d2 97 b1 [binary]
]]></artwork></figure>

<figure><artwork><![CDATA[
[CoAP request -- Proxy to CoAP Server]

  POST coap://server.url/
  OSCORE: 09 25
  Payload: 09 07 01 13 61 f7 0f d2 97 b1 [binary]
]]></artwork></figure>

<figure><artwork><![CDATA[
[CoAP request -- After server object security processing]

  GET coap://server.url/orders 
]]></artwork></figure>

<figure><artwork><![CDATA[
[CoAP response -- Before server object security processing]

  2.05 Content
  Content-Format: 0
  Payload: Exterminate! Exterminate!
]]></artwork></figure>

<figure><artwork><![CDATA[
[CoAP response -- CoAP Server to Proxy]

  2.04 Changed
  OSCORE: [empty]
  Payload: 00 31 d1 fc f6 70 fb 0c 1d d5 ... [binary]
]]></artwork></figure>

<figure><artwork><![CDATA[
[HTTP response -- Proxy to HTTP Client]

  HTTP/1.1 200 OK
  Content-Type: application/oscore
  OSCORE: AA 
  Body: 00 31 d1 fc f6 70 fb 0c 1d d5 ... [binary]
]]></artwork></figure>

<figure><artwork><![CDATA[
[HTTP response -- After client object security processing]

  HTTP/1.1 200 OK
  Content-Type: text/plain
  Body: Exterminate! Exterminate!
]]></artwork></figure>

<t>Note that the HTTP Status Code 200 in the next-to-last message is the mapping of CoAP Code 2.04 (Changed), whereas the HTTP Status Code 200 in the last message is the mapping of the CoAP Code 2.05 (Content), which was encrypted within the compressed COSE object carried in the Body of the HTTP response.</t>

</section>
<section anchor="example-coap-client-and-http-server" title="Example: CoAP Client and HTTP Server">

<t>This section is giving an example of how a request and a response between a CoAP client and an HTTP server could look like.  The example is not a test vector but intended as an illustration of how the message fields are translated in the different steps</t>

<figure><artwork><![CDATA[
[CoAP request -- Before client object security processing]

  GET coap://proxy.url/
  Proxy-Uri=http://server.url/orders
]]></artwork></figure>

<figure><artwork><![CDATA[
[CoAP request -- CoAP Client to Proxy]

  POST coap://proxy.url/
  Proxy-Uri=http://server.url/
  OSCORE: 09 25
  Payload: 09 07 01 13 61 f7 0f d2 97 b1 [binary]
]]></artwork></figure>

<figure><artwork><![CDATA[
[HTTP request -- Proxy to HTTP Server]

  POST http://server.url/ HTTP/1.1
  Content-Type: application/oscore
  OSCORE: CSU
  Body: 09 07 01 13 61 f7 0f d2 97 b1 [binary]
]]></artwork></figure>

<figure><artwork><![CDATA[
[HTTP request -- After server object security processing]

  GET http://server.url/orders HTTP/1.1
]]></artwork></figure>

<figure><artwork><![CDATA[
[HTTP response -- Before server object security processing]

  HTTP/1.1 200 OK
  Content-Type: text/plain
  Body: Exterminate! Exterminate!
]]></artwork></figure>

<figure><artwork><![CDATA[
[HTTP response -- HTTP Server to Proxy]

  HTTP/1.1 200 OK
  Content-Type: application/oscore
  OSCORE: AA
  Body: 00 31 d1 fc f6 70 fb 0c 1d d5 ... [binary]
]]></artwork></figure>

<figure><artwork><![CDATA[
[CoAP response -- Proxy to CoAP Client]

  2.04 Changed
  OSCORE: [empty]
  Payload: 00 31 d1 fc f6 70 fb 0c 1d d5 ... [binary]
]]></artwork></figure>

<figure><artwork><![CDATA[
[CoAP response -- After client object security processing]

  2.05 Content
  Content-Format: 0
  Payload: Exterminate! Exterminate!
]]></artwork></figure>

<t>Note that the HTTP Code 2.04 (Changed) in the next-to-last message is the mapping of HTTP Status Code 200, whereas the CoAP Code 2.05 (Content) in the last message is the value that was encrypted within the compressed COSE object carried in the Body of the HTTP response.</t>

</section>
</section>
<section anchor="sec-considerations" title="Security Considerations">

<t>An overview of the security properties is given in <xref target="overview-sec-properties"/>.</t>

<section anchor="end-to-end-protection" title="End-to-end Protection">

<t>In scenarios with intermediary nodes such as proxies or gateways, transport layer security such as (D)TLS only protects data hop-by-hop. As a consequence, the intermediary nodes can read and modify any information. The trust model where all intermediary nodes are considered trustworthy is problematic, not only from a privacy perspective, but also from a security perspective, as the intermediaries are free to delete resources on sensors and falsify commands to actuators (such as “unlock door”, “start fire alarm”, “raise bridge”). Even in the rare cases where all the owners of the intermediary nodes are fully trusted, attacks and data breaches make such an architecture brittle.</t>

<t>(D)TLS protects hop-by-hop the entire message. OSCORE protects end-to-end all information that is not required for proxy operations (see <xref target="protected-fields"/>). (D)TLS and OSCORE can be combined, thereby enabling end-to-end security of the message payload, in combination with hop-by-hop protection of the entire message, during transport between end-point and intermediary node. In particular when OSCORE is used with HTTP, the additional TLS protection of HTTP hops is RECOMMENDED, e.g. between an HTTP endpoint and a proxy translating between HTTP and CoAP.</t>

<t>Applications need to consider that certain message fields and messages types are not protected end-to-end and may be spoofed or manipulated. The consequences of unprotected message fields are analyzed in <xref target="unprot-fields"/>.</t>

</section>
<section anchor="sec-context-establish" title="Security Context Establishment">

<t>The use of COSE_Encrypt0 and AEAD to protect messages as specified in this document requires an established security context. The method to establish the security context described in <xref target="context-derivation"/> is based on a common Master Secret and unique Sender IDs. The necessary input parameters may be pre-established or obtained using a key establishment protocol augmented with establishment of Sender/Recipient ID, such as a key exchange protocol or the OSCORE profile of the ACE framework <xref target="I-D.ietf-ace-oscore-profile"/>. Such a procedure must ensure that the requirements of the security context parameters for the intended use are complied with (see <xref target="req-params"/>) and also in error situations. While recipient IDs are allowed to coincide between different security contexts (see <xref target="req-params"/>), this may cause a server to process multiple verifications before finding the right security context or rejecting a message. Considerations for deploying OSCORE with a fixed Master Secret are given in <xref target="deployment-examples"/>.</t>

</section>
<section anchor="master-secret" title="Master Secret">

<t>OSCORE uses HKDF <xref target="RFC5869"/> and the established input parameters to derive the security context. The required properties of the security context parameters are discussed in <xref target="req-params"/>, in this section we focus on the Master Secret. HKDF denotes in this specification the composition of the expand and extract functions as defined in <xref target="RFC5869"/> and the Master Secret is used as Input Key Material (IKM).</t>

<t>Informally, HKDF takes as source an IKM containing some good amount of randomness but not necessarily distributed uniformly (or for which an attacker has some partial knowledge) and derive from it one or more cryptographically strong secret keys <xref target="RFC5869"/>.</t>

<t>Therefore, the main requirement for the OSCORE Master Secret, in addition to being secret, is that it is has a good amount of randomness. The selected key establishment schemes must ensure that the necessary properties for the Master Secret are fulfilled. For pre-shared key deployments and key transport solutions such as <xref target="I-D.ietf-ace-oscore-profile"/>, the Master Secret can be generated offline using a good random number generator. Randomness requirements for security are described in <xref target="RFC4086"/>.</t>

</section>
<section anchor="replay-protection2" title="Replay Protection">

<t>Replay attacks need to be considered in different parts of the implementation. Most AEAD algorithms require a unique nonce for each message, for which the sender sequence numbers in the COSE message field ‘Partial IV’ is used. If the recipient accepts any sequence number larger than the one previously received, then the problem of sequence number synchronization is avoided. With reliable transport, it may be defined that only messages with sequence number which are equal to previous sequence number + 1 are accepted. An adversary may try to induce a device reboot for the purpose of replaying a message (see <xref target="context-state"/>).</t>

<t>Note that sharing a security context between servers may open up for replay attacks, for example if the replay windows are not synchronized.</t>

</section>
<section anchor="client-aliveness" title="Client Aliveness">

<t>A verified OSCORE request enables the server to verify the identity of the entity who generated the message. However, it does not verify that the client is currently involved in the communication, since the message may be a delayed delivery of a previously generated request which now reaches the server. To verify the aliveness of the client the server may use the Echo option in the response to a request from the client (see <xref target="I-D.ietf-core-echo-request-tag"/>).</t>

</section>
<section anchor="cryptographic-considerations" title="Cryptographic Considerations">

<t>The maximum sender sequence number is dependent on the AEAD algorithm. The maximum sender sequence number is 2^40 - 1, or any algorithm specific lower limit, after which a new security context must be generated. The mechanism to build the AEAD nonce (<xref target="nonce"/>) assumes that the nonce is at least 56 bits, and the Partial IV is at most 40 bits. The mandatory-to-implement AEAD algorithm AES-CCM-16-64-128 is selected for compatibility with CCM*. AEAD algorithms that require unpredictable nonces are not supported.</t>

<t>In order to prevent cryptanalysis when the same plaintext is repeatedly encrypted by many different users with distinct AEAD keys, the AEAD nonce is formed by mixing the sequence number with a secret per-context initialization vector (Common IV) derived along with the keys (see Section 3.1 of <xref target="RFC8152"/>), and by using a Master Salt in the key derivation (see <xref target="MF00"/> for an overview). The Master Secret, Sender Key, Recipient Key, and Common IV must be secret, the rest of the parameters may be public. The Master Secret must have a good amount of randomness (see <xref target="master-secret"/>).</t>

<t>The ID Context, Sender ID, and Partial IV are always at least implicitly integrity protected, as manipulation leads to the wrong nonce or key being used and therefore results in decryption failure.</t>

</section>
<section anchor="message-segmentation" title="Message Segmentation">

<t>The Inner Block options enable the sender to split large messages into OSCORE-protected blocks such that the receiving endpoint can verify blocks before having received the complete message. The Outer Block options allow for arbitrary proxy fragmentation operations that cannot be verified by the endpoints, but can by policy be restricted in size since the Inner Block options allow for secure fragmentation of very large messages. A maximum message size (above which the sending endpoint fragments the message and the receiving endpoint discards the message, if complying to the policy) may be obtained as part of normal resource discovery.</t>

</section>
<section anchor="priv-cons" title="Privacy Considerations">

<t>Privacy threats executed through intermediary nodes are considerably reduced by means of OSCORE. End-to-end integrity protection and encryption of the message payload and all options that are not used for proxy operations, provide mitigation against attacks on sensor and actuator communication, which may have a direct impact on the personal sphere.</t>

<t>The unprotected options (<xref target="fig-option-protection"/>) may reveal privacy sensitive information, see <xref target="unprot-fields"/>. CoAP headers sent in plaintext allow, for example, matching of CON and ACK (CoAP Message Identifier), matching of request and responses (Token) and traffic analysis. OSCORE does not provide protection for HTTP header fields which are not both CoAP-mappable and class E. The HTTP message fields which are visible to on-path entity are only used for the purpose of transporting the OSCORE message, whereas the application layer message is encoded in CoAP and encrypted.</t>

<t>COSE message fields, i.e. the OSCORE option, may reveal information about the communicating endpoints. E.g. ‘kid’ and ‘kid context’, which are intended to help the server find the right context, may reveal information about the client. Tracking ‘kid’ and ‘kid context’ to one server may be used for correlating requests from one client.</t>

<t>Unprotected error messages reveal information about the security state in the communication between the endpoints. Unprotected signaling messages reveal information about the reliable transport used on a leg of the path. Using the mechanisms described in <xref target="context-state"/> may reveal when a device goes through a reboot. This can be mitigated by the device storing the precise state of sender sequence number and replay window on a clean shutdown.</t>

<t>The length of message fields can reveal information about the message. Applications may use a padding scheme to protect against traffic analysis.</t>

</section>
</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>Note to RFC Editor: Please replace all occurrences of “[[this document]]” with the RFC number of this specification.</t>

<t>Note to IANA: Please note all occurrences of “TBD1” in this specification should be assigned the same number.</t>

<section anchor="cose-header-parameters-registry" title="COSE Header Parameters Registry">

<t>The ‘kid context’ parameter is added to the “COSE Header Parameters Registry”:</t>

<t><list style="symbols">
  <t>Name: kid context</t>
  <t>Label: TBD2</t>
  <t>Value Type: bstr</t>
  <t>Value Registry:</t>
  <t>Description: Identifies the context for ‘kid’</t>
  <t>Reference: <xref target="context-hint"/> of this document</t>
</list></t>

<t>Note to IANA: Label assignment in (Integer value between 1 and 255) is requested. (RFC Editor: Delete this note after IANA assignment)</t>

</section>
<section anchor="coap-option-numbers-registry" title="CoAP Option Numbers Registry">

<t>The OSCORE option is added to the CoAP Option Numbers registry:</t>

<figure><artwork align="center"><![CDATA[
+--------+-----------------+-------------------+
| Number | Name            | Reference         |
+--------+-----------------+-------------------+
|  TBD1  | OSCORE          | [[this document]] |
+--------+-----------------+-------------------+
]]></artwork></figure>

<t>Note to IANA: Label assignment in (Integer value between 0 and 12) is requested. We also request Expert review if possible, to make sure a correct number for the option is selected (RFC Editor: Delete this note after IANA assignment)</t>

<t>Furthermore, the following existing entries in the CoAP Option Numbers registry are updated with a reference to the document specifying OSCORE processing of that option:</t>

<figure><artwork align="center"><![CDATA[
+--------+-----------------+---------------------------------------+
| Number | Name            |          Reference                    |
+--------+-----------------+---------------------------------------+
|   1    | If-Match        | [RFC7252] [[this document]]           |
|   3    | Uri-Host        | [RFC7252] [[this document]]           | 
|   4    | ETag            | [RFC7252] [[this document]]           |
|   5    | If-None-Match   | [RFC7252] [[this document]]           |
|   6    | Observe         | [RFC7641] [[this document]]           |
|   7    | Uri-Port        | [RFC7252] [[this document]]           |
|   8    | Location-Path   | [RFC7252] [[this document]]           |
|  11    | Uri-Path        | [RFC7252] [[this document]]           |
|  12    | Content-Format  | [RFC7252] [[this document]]           |
|  14    | Max-Age         | [RFC7252] [[this document]]           |
|  15    | Uri-Query       | [RFC7252] [[this document]]           |
|  17    | Accept          | [RFC7252] [[this document]]           |
|  20    | Location-Query  | [RFC7252] [[this document]]           |
|  23    | Block2          | [RFC7959] [RFC8323] [[this document]] |
|  27    | Block1          | [RFC7959] [RFC8323] [[this document]] |
|  28    | Size2           | [RFC7959] [[this document]]           |
|  35    | Proxy-Uri       | [RFC7252] [[this document]]           |
|  39    | Proxy-Scheme    | [RFC7252] [[this document]]           |
|  60    | Size1           | [RFC7252] [[this document]]           |
| 258    | No-Response     | [RFC7967] [[this document]]           |
+--------+-----------------+---------------------------------------+
]]></artwork></figure>

<t>Future additions to the CoAP Option Numbers registry need to provide a reference to the document where the OSCORE processing of that CoAP Option is defined.</t>

</section>
<section anchor="coap-signaling-option-numbers-registry" title="CoAP Signaling Option Numbers Registry">

<t>The OSCORE option is added to the CoAP Signaling Option Numbers registry:</t>

<figure><artwork align="center"><![CDATA[
+------------+--------+---------------------+-------------------+
| Applies to | Number | Name                | Reference         |
+------------+--------+---------------------+-------------------+
| 7.xx (all) |  TBD1  | OSCORE              | [[this document]] |
+------------+--------+---------------------+-------------------+
]]></artwork></figure>

<t>Note to IANA: The value in the “Number” field is the same value that’s being assigned to the new Option Number. Please make sure TBD1 is not the same as any value in Numbers for any existing entry in the CoAP Signaling Option Numbers registry (at the time of writing this, that means make sure TBD1 is not 2 or 4)(RFC Editor: Delete this note after IANA assignment)</t>

</section>
<section anchor="iana-http" title="Header Field Registrations">

<t>The HTTP OSCORE header field is added to the Message Headers registry:</t>

<figure><artwork align="center"><![CDATA[
+-------------------+----------+----------+---------------------+
| Header Field Name | Protocol | Status   | Reference           |
+-------------------+----------+----------+---------------------+
| OSCORE            | http     | standard | [[this document]],  |
|                   |          |          | Section 11.1        |
+-------------------+----------+----------+---------------------+
]]></artwork></figure>

</section>
<section anchor="oscore-media-type" title="Media Type Registrations">

<t>This section registers the ‘application/oscore’ media type in the “Media Types” registry. These media types are used to indicate that the content is an OSCORE message. The OSCORE body cannot be understood without the OSCORE header field value and the security context.</t>

<figure><artwork><![CDATA[
  Type name: application

  Subtype name: oscore

  Required parameters: N/A

  Optional parameters: N/A

  Encoding considerations: binary

  Security considerations: See the Security Considerations section
  of [[This document]].

  Interoperability considerations: N/A

  Published specification: [[This document]]

  Applications that use this media type: IoT applications sending
  security content over HTTP(S) transports.

  Fragment identifier considerations: N/A

  Additional information:

  *  Deprecated alias names for this type: N/A

  *  Magic number(s): N/A

  *  File extension(s): N/A

  *  Macintosh file type code(s): N/A

  Person & email address to contact for further information:
  iesg@ietf.org

  Intended usage: COMMON

  Restrictions on usage: N/A

  Author: Göran Selander, goran.selander@ericsson.com

  Change Controller: IESG

  Provisional registration?  No
]]></artwork></figure>

</section>
<section anchor="content-format" title="CoAP Content-Formats Registry">

<t>Note to IANA: ID assignment in the 10000-64999 range is requested. (RFC Editor: Delete this note after IANA assignment)</t>

<t>This section registers the media type ‘application/oscore’ media type in the “CoAP Content-Formats” registry. This Content-Format for the OSCORE payload is defined for potential future use cases and SHALL NOT be used in the OSCORE message. The OSCORE payload cannot be understood without the OSCORE option value and the security context.</t>

<figure><artwork align="center"><![CDATA[
+----------------------+----------+----------+-------------------+
| Media Type           | Encoding |   ID     |     Reference     |
+----------------------+----------+----------+-------------------+
| application/oscore   |          |   TBD3   | [[this document]] |
+----------------------+----------+----------+-------------------+
]]></artwork></figure>

</section>
<section anchor="oscore-flag-bits" title="OSCORE Flag Bits Registry">

<t>This document defines a sub-registry for the OSCORE flag bits within the “CoRE Parameters” registry. The name of the sub-registry is “OSCORE Flag Bits”. The registry should be created with the Expert Review policy. Guidelines for the experts are provided in <xref target="exp-instr"/>.</t>

<t>The columns of the registry are:</t>

<t><list style="symbols">
  <t>bit position: This indicates the position of the bit in the set of OSCORE flag bits, starting at 0 for the most significant bit. The bit position must be an integer or a range of integers, in the range 0 to 63.</t>
  <t>name: The name is present to make it easier to refer to and discuss the registration entry. The value is not used in the protocol. Names are to be unique in the table.</t>
  <t>description: This contains a brief description of the use of the bit.</t>
  <t>specification: This contains a pointer to the specification defining the entry.</t>
</list></t>

<t>The initial contents of the registry can be found in the table below. The specification column for all rows in that table should be this document. The entries with Bit Position of 0 and 1 are to be marked as ‘Reserved’. The entry with Bit Position of 1 is going to be specified in a future document, and will be used to expand the space for the OSCORE flag bits in <xref target="obj-sec-value"/>, so that entries 8-63 of the registry are defined.</t>

<figure><artwork align="center"><![CDATA[
+--------------+-------------+---------------------+-------------------+
| Bit Position |     Name    |     Description     |   Specification   |
+--------------+-------------+---------------------+-------------------+
|       0      | Reserved    |                     |                   |
+--------------+-------------+---------------------+-------------------+
|       1      | Reserved    |                     |                   |
+--------------+-------------+---------------------+-------------------+
|       2      | Unassigned  |                     |                   |
+--------------+-------------+---------------------+-------------------+
|       3      | Kid Context | Set to 1 if 'kid    | [[this document]] |
|              | Flag        | context' is present |                   |
|              |             | in the compressed   |                   |
|              |             | COSE object         |                   |
+--------------+-------------+---------------------+-------------------+
|       4      | Kid Flag    | Set to 1 if kid is  | [[this document]] |
|              |             | present in the com- |                   |
|              |             | pressed COSE object |                   |
+--------------+-------------+---------------------+-------------------+
|     5-7      | Partial IV  | Encodes the Partial | [[this document]] |
|              | Length      | IV length; can have |                   |
|              |             | value 0 to 5        |                   |
+--------------+-------------+---------------------+-------------------+
|    8-63      | Unassigned  |                     |                   |
+--------------+-------------+---------------------+-------------------+
]]></artwork></figure>

</section>
<section anchor="exp-instr" title="Expert Review Instructions">

<t>The expert reviewers for the registry defined in this document are expected to ensure that the usage solves a valid use case that could not be solved better in a different way, that it is not going to duplicate one that is already registered, and that the registered point is likely to be used in deployments. They are furthermore expected to check the clarity of purpose and use of the requested code points. Experts should take into account the expected usage of entries when approving point assignment, and the length of the encoded value should be weighed against the number of code points left that encode to that size and the size of device it will be used on. Experts should block registration for entries 8-63 until these points are defined (i.e. until the mechanism for the OSCORE flag bits expansion via bit 1 is specified).</t>

</section>
</section>


  </middle>

  <back>

    <references title='Normative References'>

&RFC2119;
&RFC4086;
&RFC4648;
&RFC5234;
&RFC6347;
&RFC7049;
&RFC7230;
&RFC7231;
&RFC7252;
&RFC7641;
&RFC7959;
&RFC8075;
&RFC8132;
&RFC8152;
&RFC8174;
&RFC8288;
&RFC8323;
&RFC8446;


    </references>

    <references title='Informative References'>

&RFC3552;
&RFC3986;
&RFC5116;
&RFC5869;
&RFC6690;
&RFC7228;
&RFC7515;
&RFC7967;
&I-D.ietf-ace-oauth-authz;
&I-D.ietf-cbor-cddl;
&I-D.bormann-6lo-coap-802-15-ie;
&I-D.hartke-core-e2e-security-reqs;
&I-D.mattsson-core-coap-actuators;
&I-D.ietf-ace-oscore-profile;
&I-D.ietf-core-oscore-groupcomm;
&I-D.ietf-core-echo-request-tag;
&I-D.mcgrew-iv-gen;
<reference anchor="MF00" >
  <front>
    <title>Attacks on Encryption of Redundant Plaintext and Implications on Internet Security</title>
    <author initials="D." surname="McGrew">
      <organization></organization>
    </author>
    <author initials="S." surname="Fluhrer">
      <organization></organization>
    </author>
    <date year="2000"/>
  </front>
  <seriesInfo name="the Proceedings of the Seventh Annual Workshop on Selected Areas in Cryptography (SAC 2000), Springer-Verlag." value=""/>
</reference>


    </references>


<section anchor="examples" title="Scenario Examples">

<t>This section gives examples of OSCORE, targeting scenarios in Section 2.2.1.1 of <xref target="I-D.hartke-core-e2e-security-reqs"/>. The message exchanges are made, based on the assumption that there is a security context established between client and server. For simplicity, these examples only indicate the content of the messages without going into detail of the (compressed) COSE message format.</t>

<section anchor="secure-access-to-sensor" title="Secure Access to Sensor">

<t>This example illustrates a client requesting the alarm status from a server.</t>

<figure title="Secure Access to Sensor. Square brackets [ ... ] indicate content of compressed COSE object. Curly brackets { ... } indicate encrypted data." anchor="fig-alarm"><artwork align="center"><![CDATA[
Client  Proxy  Server
  |       |       |
  +------>|       |            Code: 0.02 (POST)
  | POST  |       |           Token: 0x8c
  |       |       |          OSCORE: [kid:5f, Partial IV:42]
  |       |       |         Payload: {Code:0.01,
  |       |       |                   Uri-Path:"alarm_status"}
  |       |       |
  |       +------>|            Code: 0.02 (POST)
  |       | POST  |           Token: 0x7b
  |       |       |          OSCORE: [kid:5f, Partial IV:42]
  |       |       |         Payload: {Code:0.01,
  |       |       |                   Uri-Path:"alarm_status"}
  |       |       |
  |       |<------+            Code: 2.04 (Changed)
  |       |  2.04 |           Token: 0x7b
  |       |       |          OSCORE: -
  |       |       |         Payload: {Code:2.05, "0"}
  |       |       |
  |<------+       |            Code: 2.04 (Changed)
  |  2.04 |       |           Token: 0x8c
  |       |       |          OSCORE: -
  |       |       |         Payload: {Code:2.05, "0"}
  |       |       |
]]></artwork></figure>

<t>The request/response Codes are encrypted by OSCORE and only dummy Codes (POST/Changed) are visible in the header of the OSCORE message. The option Uri-Path (“alarm_status”) and payload (“0”) are encrypted.</t>

<t>The COSE header of the request contains an identifier (5f), indicating which security context was used to protect the message and a Partial IV (42).</t>

<t>The server verifies the request as specified in <xref target="ver-req"/>. The client verifies the response as specified in <xref target="ver-res"/>.</t>

</section>
<section anchor="secure-subscribe-to-sensor" title="Secure Subscribe to Sensor">

<t>This example illustrates a client requesting subscription to a blood sugar measurement resource (GET /glucose), first receiving the value 220 mg/dl and then a second value 180 mg/dl.</t>

<figure title="Secure Subscribe to Sensor. Square brackets [ ... ] indicate content of compressed COSE object header. Curly brackets { ... } indicate encrypted data." anchor="fig-blood-sugar"><artwork align="center"><![CDATA[
Client  Proxy  Server
  |       |       |
  +------>|       |            Code: 0.05 (FETCH)
  | FETCH |       |           Token: 0x83
  |       |       |         Observe: 0
  |       |       |          OSCORE: [kid:ca, Partial IV:15]
  |       |       |         Payload: {Code:0.01,
  |       |       |                   Uri-Path:"glucose"}
  |       |       |
  |       +------>|            Code: 0.05 (FETCH)
  |       | FETCH |           Token: 0xbe
  |       |       |         Observe: 0
  |       |       |          OSCORE: [kid:ca, Partial IV:15]
  |       |       |         Payload: {Code:0.01,
  |       |       |                   Uri-Path:"glucose"}
  |       |       |
  |       |<------+            Code: 2.05 (Content)
  |       |  2.05 |           Token: 0xbe
  |       |       |         Observe: 7
  |       |       |          OSCORE: [Partial IV:32]
  |       |       |         Payload: {Code:2.05,   
  |       |       |                   Content-Format:0, "220"}
  |       |       |
  |<------+       |            Code: 2.05 (Content)
  |  2.05 |       |           Token: 0x83
  |       |       |         Observe: 7
  |       |       |          OSCORE: [Partial IV:32]
  |       |       |         Payload: {Code:2.05,   
  |       |       |                   Content-Format:0, "220"}
 ...     ...     ...
  |       |       |
  |       |<------+            Code: 2.05 (Content)
  |       |  2.05 |           Token: 0xbe
  |       |       |         Observe: 8
  |       |       |          OSCORE: [Partial IV:36]
  |       |       |         Payload: {Code:2.05,
  |       |       |                   Content-Format:0, "180"}
  |       |       |
  |<------+       |            Code: 2.05 (Content)
  |  2.05 |       |           Token: 0x83
  |       |       |         Observe: 8
  |       |       |          OSCORE: [Partial IV:36]
  |       |       |         Payload: {Code:2.05,
  |       |       |                   Content-Format:0, "180"}
  |       |       |
]]></artwork></figure>

<t>The dummy Codes (FETCH/Content) are used to allow forwarding of Observe messages. The options Content-Format (0) and the payload (“220” and “180”), are encrypted.</t>

<t>The COSE header of the request contains an identifier (ca), indicating the security context used to protect the message and a Partial IV (15). The COSE headers of the responses contains Partial IVs (32 and 36).</t>

<t>The server verifies that the Partial IV has not been received before. The client verifies that the responses are bound to the request and that the Partial IVs are greater than any Partial IV previously received in a response bound to the request.</t>

</section>
</section>
<section anchor="deployment-examples" title="Deployment Examples">

<t>For many IoT deployments, a 128 bit uniformly random Master Key is sufficient for encrypting all data exchanged with the IoT device throughout its lifetime. Two examples are given in this section. In the first example, the security context is only derived once from the Master Secret. In the second example, security contexts are derived multiple times using random inputs.</t>

<section anchor="master-secret-once" title="Security Context Derived Once">

<t>An application that only derives the security context once needs to handle the loss of mutable security context parameters, e.g. due to reboot.</t>

<section anchor="seq-numb" title="Sender Sequence Number">

<t>In order to handle loss of Sender Sequence Numbers, the device may implement procedures for writing to non-volatile memory during normal operations and updating the security context after reboot, provided that the procedures comply with the requirements on the security context parameters (<xref target="req-params"/>). This section gives an example of such a procedure.</t>

<t>There are known issues related to writing to non-volatile memory. For example, flash drives may have a limited number of erase operations during its life time. Also, the time for a write operation to non-volatile memory to be completed may be unpredictable, e.g. due to caching, which could result in important security context data not being stored at the time when the device reboots.</t>

<t>However, many devices have predictable limits for writing to non-volatile memory, are physically limited to only send a small amount of messages per minute, and may have no good source of randomness.</t>

<t>To prevent reuse of Sender Sequence Numbers (SSN), an endpoint may perform the following procedure during normal operations:</t>

<t><list style="symbols">
  <t>Before using a Sender Sequence Number that is evenly divisible by K, where K is a positive integer, store the Sender Sequence Number (SSN1) in non-volatile memory. After boot, the endpoint initiates the new Sender Sequence Number (SSN2) to the value stored in persistent memory plus K plus F: SSN2 = SSN1 + K + F, where F is a positive integer.  <list style="symbols">
      <t>Writing to non-volatile memory can be costly; the value K gives a trade-off between frequency of storage operations and efficient use of Sender Sequence Numbers.</t>
      <t>Writing to non-volatile memory may be subject to delays, or failure; F MUST be set so that the last Sender Sequence Number used before reboot is never larger than SSN2.</t>
    </list></t>
</list></t>

<t>If F cannot be set so SSN2 is always larger than the last Sender Sequence Number used before reboot, the method described in this section MUST NOT be used.</t>

</section>
<section anchor="reboot-replay" title="Replay Window">

<t>In case of loss of security context on the server, to prevent accepting replay of previously received requests, the server may perform the following procedure after boot:</t>

<t><list style="symbols">
  <t>The server updates its Sender Sequence Number as specified in <xref target="seq-numb"/>, to be used as Partial IV in the response containing the Echo option (next bullet).</t>
  <t>For each stored security context, the first time after boot the server receives an OSCORE request, the server responds with an OSCORE protected 4.01 (Unauthorized), containing only the Echo option <xref target="I-D.ietf-core-echo-request-tag"/> and no diagnostic payload. The server MUST use its Partial IV when generating the AEAD nonce and MUST include the Partial IV in the response (see <xref target="cose-object"/>). If the server with use of the Echo option can verify a second OSCORE request as fresh, then the Partial IV of the second request is set as the lower limit of the replay window of that security context.</t>
</list></t>

</section>
<section anchor="replay-notif" title="Notifications">

<t>To prevent accepting replay of previously received notifications, the client may perform the following procedure after boot:</t>

<t><list style="symbols">
  <t>The client forgets about earlier registrations, removes all Notification Numbers and registers using Observe.</t>
</list></t>

</section>
</section>
<section anchor="master-secret-multiple" title="Security Context Derived Multiple Times">

<t>An application which does not require forward secrecy may allow multiple security contexts to be derived from one Master Secret. The requirements on the security context parameters MUST be fulfilled (<xref target="req-params"/>) even if the client or server is rebooted, recommissioned or in error cases.</t>

<t>This section gives an example of a protocol which adds randomness to the ID Context parameter and uses that together with input parameters pre-established between client and server, in particular Master Secret, Master Salt, and Sender/Recipient ID (see <xref target="context-derivation"/>), to derive new security contexts. The random input is transported between client and server in the ‘kid context’ parameter. This protocol MUST NOT be used unless both endpoints have good sources of randomness.</t>

<t>During normal requests the ID Context of an established security context may be sent in the ‘kid context’ which, together with ‘kid’, facilitates for the server to locate a security context. Alternatively, the ‘kid context’ may be omitted since the ID Context is expected to be known to both client and server, see <xref target="context-hint"/>.</t>

<t>The protocol described in this section may only be needed when the mutable part of security context is lost in the client or server, e.g. when the endpoint has rebooted. The protocol may additionally be used whenever the client and server need to derive a new security context. For example, if a device is provisioned with one fixed set of input parameters (including Master Secret, Sender and Recipient Identifiers) then a randomized ID Context ensures that the security context is different for each deployment.</t>

<t>The protocol is described below with reference to <xref target="fig-B2"/>. The client or the server may initiate the protocol, in the latter case step 1 is omitted.</t>

<figure title="Protocol for establishing a new security context." anchor="fig-B2"><artwork align="center"><![CDATA[
                      Client                Server
                        |                      |
1. Protect with         |      request #1      |
   ID Context = ID1     |--------------------->| 2. Verify with
                        |  kid_context = ID1   |    ID Context = ID1
                        |                      | 
                        |      response #1     |    Protect with
3. Verify with          |<---------------------|    ID Context = R2||ID1
   ID Context = R2||ID1 |   kid_context = R2   |
                        |                      |
   Protect with         |      request #2      |
   ID Context = R2||R3  |--------------------->| 4. Verify with 
                        | kid_context = R2||R3 |    ID Context = R2||R3
                        |                      | 
                        |      response #2     |    Protect with
5. Verify with          |<---------------------|    ID Context = R2||R3
   ID Context = R2||R3  |                      | 
]]></artwork></figure>

<t><list style="numbers">
  <t>(Optional) If the client does not have a valid security context with the server, e.g. because of reboot or because this is the first time it contacts the server, then it generates a random string R1, and uses this as ID Context together with the input parameters shared with the server to derive a first security context. The client sends an OSCORE request to the server protected with the first security context, containing R1 wrapped in a CBOR bstr as ‘kid context’. The request may target a special resource used for updating security contexts.</t>
  <t>The server receives an OSCORE request for which it does not have a valid security context, either because the client has generated a new security context ID1 = R1, or because the server has lost part of its security context, e.g. ID Context, Sender Sequence Number or replay window. If the server is able to verify the request (see <xref target="ver-req"/>) with the new derived first security context using the received ID1 (transported in ‘kid context’) as ID Context and the input parameters associated to the received ‘kid’, then the server generates a random string R2, and derives a second security context with ID Context = ID2 = R2 || ID1. The server sends a 4.01 (Unauthorized) response protected with the second security context, containing R2 wrapped in a CBOR bstr as ‘kid context’, and caches R2. R2 MUST NOT be reused as that may lead to reuse of key and nonce in reponse #1. Note that the server may receive several requests #1 associated with one security context, leading to multiple parallel protocol runs. Multiple instances of R2 may need to be cached until one of the protocol runs is completed, see <xref target="impl-cons"/>.</t>
  <t>The client receives a response with ‘kid context’ containing a CBOR bstr wrapping R2 to an OSCORE request it made with ID Context = ID1. The client derives a second security context using ID Context = ID2 = R2 || ID1. If the client can verify the response (see <xref target="ver-res"/>) using the second security context, then the client makes a request protected with a third security context derived from ID Context = ID3 = R2 || R3, where R3 is a random byte string generated by the client. The request includes R2 || R3 wrapped in a CBOR bstr as ‘kid context’.</t>
  <t>If the server receives a request with ‘kid context’ containing a CBOR bstr wrapping ID3, where the first part of ID3 is identical to an R2 sent in a previous response #1 which it has not received before, then the server derives a third security context with ID Context = ID3. The server MUST NOT accept replayed request #2 messages. If the server can verify the request (see <xref target="ver-req"/>) with the third security context, then the server marks the third security context to be used with this client and removes all instances of R2 associated to this security context from the cache. This security context replaces the previous security context with the client, and the first and the second security contexts are deleted. The server responds using the same security context as in the request.</t>
  <t>If the client receives a response to the request with the third security context and the response verifies (see <xref target="ver-res"/>), then the client marks the third security context to be used with this server. This security context replaces the previous security context with the server, and the first and second security contexts are deleted.</t>
</list></t>

<t>If verification fails in any step, the endpoint stops processing that message.</t>

<t>The length of the nonces R1, R2, and R3 is application specific. The application needs to set the length of each nonce such the probability of its value being repeated is negligible; typically, at least 8 bytes long. Since R2 may be generated as the result of a replayed request #1, the probability for collision of R2s is impacted by the birthday paradox. For example, setting the length of R2 to 8 bytes results in an average collision after 2^32 response #1 messages, which should not be an issue for a constrained server handling on the order of one request per second.</t>

<t>Request #2 can be an ordinary request. The server performs the action of the request and sends response #2 after having successfully completed the security context related operations in step 4. The client acts on response #2 after having successfully completed step 5.</t>

<t>When sending request #2, the client is assured that the Sender Key (derived with the random value R3) has never been used before. When receiving response #2, the client is assured that the response (protected with a key derived from the random value R3 and the Master Secret) was created by the server in response to request #2.</t>

<t>Similarly, when receiving request #2, the server is assured that the request (protected with a key derived from the random value R2 and the Master Secret) was created by the client in response to response #1. When sending response #2, the server is assured that the Sender Key (derived with the random value R2) has never been used before.</t>

<t>Implementation and denial-of-service considerations are made in <xref target="impl-cons"/> and <xref target="attack-cons"/>.</t>

<section anchor="impl-cons" title="Implementation Considerations">

<t>This section add some implemention considerations to the protocol described in the previous section.</t>

<t>The server may only have space for a few security contexts, or only be able to handle a few protocol runs in parallel. 
The server may legitimately receive multiple request #1 messages using the same non-mutable security context, e.g. due to packet loss. Replays of old request #1 messages could be difficult for the server to distinguish from legitimate. The server needs to handle the case when the maximum number of cached R2s is reached. If the server receives a request #1 and is not capable of executing it then it may respond with an unprotected 5.03 (Service Unavailable). The server may clear up state from protocol runs which never complete, e.g. set a timer when caching R2, and remove R2 and the associated security contexts from the cache at timeout. Additionally, state information can be flushed at reboot.</t>

<t>As an alternative to caching R2, the server could generate R2 in such a way that it can be sent (in response #1) and verified (at reception of request #2) as the value of R2 it had generated. Such a procedure MUST NOT lead to the server accepting replayed request #2 messages. One construction described in the following is based on using a secret random HMAC key K_HMAC per set of non-mutable security context parameters associated to a client. This construction allows the server to handle verification of R2 in response #2 at the cost of storing the K_HMAC keys and a slightly larger message overhead in response #1. Steps below refer to modifications to <xref target="master-secret-multiple"/>:</t>

<t><list style="symbols">
  <t>In step 2, R2 is generated in the following way. First, the server generates a random K_HMAC (unless it already has one associated with the security context), then it sets R2 = S2 || HMAC(K_HMAC, S2) where S2 is a random byte string, and the HMAC is truncated to 8 bytes. K_HMAC may have an expiration time, after which it is erased. Note that neither R2, S2 nor the derived first and second security contexts need to be cached.</t>
  <t>In step 4, instead of verifying that R2 coincides with a cached value, the server looks up the associated K_HMAC and verifies the truncated HMAC, and the processing continues accordingly depending on verification success or failure.  K_HMAC is used until a run of the protocol is completed (after verification of request #2), or until it expires (whatever comes first), after which K_HMAC is erased. (The latter corresponds to removing the cached values of R2 in step 4 of <xref target="master-secret-multiple"/>, and makes the server reject replays of request #2.)</t>
</list></t>

<t>The length of S2 is application specific and the probability for collision of S2s is impacted by the birthday paradox. For example, setting the length of S2 to 8 bytes results in an average collision after 2^32 response #1 messages, which should not be an issue for a constrained server handling on the order of one request per second.</t>

<t>Two endpoints sharing a security context may accidently initiate two instances of the protocol at the same time, each in the role of client, e.g. after a power outage affecting both endpoints. Such a race condition could potentially lead to both protocols failing, and both endpoints repeatedly re-initiating the protocol without converging. Both endpoints can detect this situation and it can be handled in different ways. The requests could potentially be more spread out in time, for example by only initiating this protocol when the endpoint actually needs to make a request, potentially adding a random delay before requests immediately after reboot or if such parallel protocol runs are detected.</t>

</section>
<section anchor="attack-cons" title="Attack Considerations">

<t>An on-path attacker may inject a message causing the endpoint to process verification of the message. A message crafted without access to the Master Secret will fail to verify.</t>

<t>Replaying an old request with a value of ‘kid_context’ which the server does not recognize could trigger the protocol. This causes the server to generate the first and second security context and send a response. But if the client did not expect a response it will be discarded. This may still result in a denial-of-service attack against the server e.g. because of not being able to manage the state associated with many parallel protocol runs, and it may prevent legitimate client requests. Implementation alternatives with less data caching per request #1 message are favorable in this respect, see <xref target="impl-cons"/>.</t>

<t>Replaying response #1 in response to some request other than request #1 will fail to verify, since response #1 is associated to request #1, through the dependencies of ID Contexts and the Partial IV of request #1 included in the external_aad of response #1.</t>

<t>If request #2 has already been well received, then the server has a valid security context, so a replay of request #2 is handled by the normal replay protection mechanism. Similarly if response #2 has already been received, a replay of response #2 to some other request from the client will fail by the normal verification of binding of response to request.</t>

</section>
</section>
</section>
<section anchor="test-vectors" title="Test Vectors">

<t>This appendix includes the test vectors for different examples of CoAP messages using OSCORE. Given a set of inputs, OSCORE defines how to set up the Security Context in both the client and the server.</t>

<t>Note that in <xref target="tv4"/> and all following test vectors the Token and the Message ID of the OSCORE-protected CoAP messages are set to the same value of the unprotected CoAP message, to help the reader with comparisons.</t>

<t>[NOTE: the following examples use option number = 9 (TBD1 assigned by IANA). If that differs, the RFC editor is asked to update the test vectors with data provided by the authors. Please remove this paragraph before publication.]</t>

<section anchor="key-der-tv-ms" title="Test Vector 1: Key Derivation with Master Salt">

<t>In this test vector, a Master Salt of 8 bytes is used. The default values are used for AEAD Algorithm and HKDF.</t>

<section anchor="client" title="Client">

<t>Inputs:</t>

<t><list style="symbols">
  <t>Master Secret: 0x0102030405060708090a0b0c0d0e0f10 (16 bytes)</t>
  <t>Master Salt: 0x9e7ca92223786340 (8 bytes)</t>
  <t>Sender ID: 0x (0 byte)</t>
  <t>Recipient ID: 0x01 (1 byte)</t>
</list></t>

<t>From the previous parameters,</t>

<t><list style="symbols">
  <t>info (for Sender Key): 0x8540f60a634b657910 (9 bytes)</t>
  <t>info (for Recipient Key): 0x854101f60a634b657910 (10 bytes)</t>
  <t>info (for Common IV): 0x8540f60a6249560d (8 bytes)</t>
</list></t>

<t>Outputs:</t>

<t><list style="symbols">
  <t>Sender Key: 0xf0910ed7295e6ad4b54fc793154302ff (16 bytes)</t>
  <t>Recipient Key: 0xffb14e093c94c9cac9471648b4f98710 (16 bytes)</t>
  <t>Common IV: 0x4622d4dd6d944168eefb54987c (13 bytes)</t>
</list></t>

<t>From the previous parameters and a Partial IV equal to 0 (both for sender and recipient):</t>

<t><list style="symbols">
  <t>sender nonce: 0x4622d4dd6d944168eefb54987c (13 bytes)</t>
  <t>recipient nonce: 0x4722d4dd6d944169eefb54987c (13 bytes)</t>
</list></t>

</section>
<section anchor="server" title="Server">

<t>Inputs:</t>

<t><list style="symbols">
  <t>Master Secret: 0x0102030405060708090a0b0c0d0e0f10 (16 bytes)</t>
  <t>Master Salt: 0x9e7ca92223786340 (8 bytes)</t>
  <t>Sender ID: 0x01 (1 byte)</t>
  <t>Recipient ID: 0x (0 byte)</t>
</list></t>

<t>From the previous parameters,</t>

<t><list style="symbols">
  <t>info (for Sender Key): 0x854101f60a634b657910 (10 bytes)</t>
  <t>info (for Recipient Key): 0x8540f60a634b657910 (9 bytes)</t>
  <t>info (for Common IV): 0x8540f60a6249560d (8 bytes)</t>
</list></t>

<t>Outputs:</t>

<t><list style="symbols">
  <t>Sender Key: 0xffb14e093c94c9cac9471648b4f98710 (16 bytes)</t>
  <t>Recipient Key: 0xf0910ed7295e6ad4b54fc793154302ff (16 bytes)</t>
  <t>Common IV: 0x4622d4dd6d944168eefb54987c (13 bytes)</t>
</list></t>

<t>From the previous parameters and a Partial IV equal to 0 (both for sender and recipient):</t>

<t><list style="symbols">
  <t>sender nonce: 0x4722d4dd6d944169eefb54987c (13 bytes)</t>
  <t>recipient nonce: 0x4622d4dd6d944168eefb54987c (13 bytes)</t>
</list></t>

</section>
</section>
<section anchor="key-der-tv" title="Test Vector 2: Key Derivation without Master Salt">

<t>In this test vector, the default values are used for AEAD Algorithm, HKDF, and Master Salt.</t>

<section anchor="client-1" title="Client">

<t>Inputs:</t>

<t><list style="symbols">
  <t>Master Secret: 0x0102030405060708090a0b0c0d0e0f10 (16 bytes)</t>
  <t>Sender ID: 0x00 (1 byte)</t>
  <t>Recipient ID: 0x01 (1 byte)</t>
</list></t>

<t>From the previous parameters,</t>

<t><list style="symbols">
  <t>info (for Sender Key): 0x854100f60a634b657910 (10 bytes)</t>
  <t>info (for Recipient Key): 0x854101f60a634b657910 (10 bytes)</t>
  <t>info (for Common IV): 0x8540f60a6249560d (8 bytes)</t>
</list></t>

<t>Outputs:</t>

<t><list style="symbols">
  <t>Sender Key: 0x321b26943253c7ffb6003b0b64d74041 (16 bytes)</t>
  <t>Recipient Key: 0xe57b5635815177cd679ab4bcec9d7dda (16 bytes)</t>
  <t>Common IV: 0xbe35ae297d2dace910c52e99f9 (13 bytes)</t>
</list></t>

<t>From the previous parameters and a Partial IV equal to 0 (both for sender and recipient):</t>

<t><list style="symbols">
  <t>sender nonce: 0xbf35ae297d2dace910c52e99f9 (13 bytes)</t>
  <t>recipient nonce: 0xbf35ae297d2dace810c52e99f9 (13 bytes)</t>
</list></t>

</section>
<section anchor="server-1" title="Server">

<t>Inputs:</t>

<t><list style="symbols">
  <t>Master Secret: 0x0102030405060708090a0b0c0d0e0f10 (16 bytes)</t>
  <t>Sender ID: 0x01 (1 byte)</t>
  <t>Recipient ID: 0x00 (1 byte)</t>
</list></t>

<t>From the previous parameters,</t>

<t><list style="symbols">
  <t>info (for Sender Key): 0x854101f60a634b657910 (10 bytes)</t>
  <t>info (for Recipient Key): 0x854100f60a634b657910 (10 bytes)</t>
  <t>info (for Common IV): 0x8540f60a6249560d (8 bytes)</t>
</list></t>

<t>Outputs:</t>

<t><list style="symbols">
  <t>Sender Key: 0xe57b5635815177cd679ab4bcec9d7dda (16 bytes)</t>
  <t>Recipient Key: 0x321b26943253c7ffb6003b0b64d74041 (16 bytes)</t>
  <t>Common IV: 0xbe35ae297d2dace910c52e99f9 (13 bytes)</t>
</list></t>

<t>From the previous parameters and a Partial IV equal to 0 (both for sender and recipient):</t>

<t><list style="symbols">
  <t>sender nonce: 0xbf35ae297d2dace810c52e99f9 (13 bytes)</t>
  <t>recipient nonce: 0xbf35ae297d2dace910c52e99f9 (13 bytes)</t>
</list></t>

</section>
</section>
<section anchor="key-der-kc" title="Test Vector 3: Key Derivation with ID Context">

<t>In this test vector, a Master Salt of 8 bytes and a ID Context of 8 bytes are used. The default values are used for AEAD Algorithm and HKDF.</t>

<section anchor="client-2" title="Client">

<t>Inputs:</t>

<t><list style="symbols">
  <t>Master Secret: 0x0102030405060708090a0b0c0d0e0f10 (16 bytes)</t>
  <t>Master Salt: 0x9e7ca92223786340 (8 bytes)</t>
  <t>Sender ID: 0x (0 byte)</t>
  <t>Recipient ID: 0x01 (1 byte)</t>
  <t>ID Context: 0x37cbf3210017a2d3 (8 bytes)</t>
</list></t>

<t>From the previous parameters,</t>

<t><list style="symbols">
  <t>info (for Sender Key): 0x85404837cbf3210017a2d30a634b657910 (17 bytes)</t>
  <t>info (for Recipient Key): 0x8541014837cbf3210017a2d30a634b657910 (18 bytes)</t>
  <t>info (for Common IV): 0x85404837cbf3210017a2d30a6249560d (16 bytes)</t>
</list></t>

<t>Outputs:</t>

<t><list style="symbols">
  <t>Sender Key: 0xaf2a1300a5e95788b356336eeecd2b92 (16 bytes)</t>
  <t>Recipient Key: 0xe39a0c7c77b43f03b4b39ab9a268699f (16 bytes)</t>
  <t>Common IV: 0x2ca58fb85ff1b81c0b7181b85e (13 bytes)</t>
</list></t>

<t>From the previous parameters and a Partial IV equal to 0 (both for sender and recipient):</t>

<t><list style="symbols">
  <t>sender nonce: 0x2ca58fb85ff1b81c0b7181b85e (13 bytes)</t>
  <t>recipient nonce: 0x2da58fb85ff1b81d0b7181b85e (13 bytes)</t>
</list></t>

</section>
<section anchor="server-2" title="Server">

<t>Inputs:</t>

<t><list style="symbols">
  <t>Master Secret: 0x0102030405060708090a0b0c0d0e0f10 (16 bytes)</t>
  <t>Master Salt: 0x9e7ca92223786340 (8 bytes)</t>
  <t>Sender ID: 0x01 (1 byte)</t>
  <t>Recipient ID: 0x (0 byte)</t>
  <t>ID Context: 0x37cbf3210017a2d3 (8 bytes)</t>
</list></t>

<t>From the previous parameters,</t>

<t><list style="symbols">
  <t>info (for Sender Key): 0x8541014837cbf3210017a2d30a634b657910 (18 bytes)</t>
  <t>info (for Recipient Key): 0x85404837cbf3210017a2d30a634b657910 (17 bytes)</t>
  <t>info (for Common IV): 0x85404837cbf3210017a2d30a6249560d (16 bytes)</t>
</list></t>

<t>Outputs:</t>

<t><list style="symbols">
  <t>Sender Key: 0xe39a0c7c77b43f03b4b39ab9a268699f (16 bytes)</t>
  <t>Recipient Key: 0xaf2a1300a5e95788b356336eeecd2b92 (16 bytes)</t>
  <t>Common IV: 0x2ca58fb85ff1b81c0b7181b85e (13 bytes)</t>
</list></t>

<t>From the previous parameters and a Partial IV equal to 0 (both for sender and recipient):</t>

<t><list style="symbols">
  <t>sender nonce: 0x2da58fb85ff1b81d0b7181b85e (13 bytes)</t>
  <t>recipient nonce: 0x2ca58fb85ff1b81c0b7181b85e (13 bytes)</t>
</list></t>

</section>
</section>
<section anchor="tv4" title="Test Vector 4: OSCORE Request, Client">

<t>This section contains a test vector for an OSCORE protected CoAP GET request using the security context derived in <xref target="key-der-tv-ms"/>. The unprotected request only contains the Uri-Path and Uri-Host options.</t>

<t>Unprotected CoAP request: 0x44015d1f00003974396c6f63616c686f737483747631 (22 bytes)</t>

<t>Common Context:</t>

<t><list style="symbols">
  <t>AEAD Algorithm: 10 (AES-CCM-16-64-128)</t>
  <t>Key Derivation Function: HKDF SHA-256</t>
  <t>Common IV: 0x4622d4dd6d944168eefb54987c (13 bytes)</t>
</list></t>

<t>Sender Context:</t>

<t><list style="symbols">
  <t>Sender ID: 0x (0 byte)</t>
  <t>Sender Key: 0xf0910ed7295e6ad4b54fc793154302ff (16 bytes)</t>
  <t>Sender Sequence Number: 20</t>
</list></t>

<t>The following COSE and cryptographic parameters are derived:</t>

<t><list style="symbols">
  <t>Partial IV: 0x14 (1 byte)</t>
  <t>kid: 0x (0 byte)</t>
  <t>external_aad: 0x8501810a40411440 (8 bytes)</t>
  <t>AAD: 0x8368456e63727970743040488501810a40411440 (20 bytes)</t>
  <t>plaintext: 0x01b3747631 (5 bytes)</t>
  <t>encryption key: 0xf0910ed7295e6ad4b54fc793154302ff (16 bytes)</t>
  <t>nonce: 0x4622d4dd6d944168eefb549868 (13 bytes)</t>
</list></t>

<t>From the previous parameter, the following is derived:</t>

<t><list style="symbols">
  <t>OSCORE option value: 0x0914 (2 bytes)</t>
  <t>ciphertext: 0x612f1092f1776f1c1668b3825e (13 bytes)</t>
</list></t>

<t>From there:</t>

<t><list style="symbols">
  <t>Protected CoAP request (OSCORE message): 0x44025d1f00003974396c6f63616c686f7374620914ff612f1092f1776f1c1668b3825e (35 bytes)</t>
</list></t>

</section>
<section anchor="tv5" title="Test Vector 5: OSCORE Request, Client">

<t>This section contains a test vector for an OSCORE protected CoAP GET request using the security context derived in <xref target="key-der-tv"/>. The unprotected request only contains the Uri-Path and Uri-Host options.</t>

<t>Unprotected CoAP request: 0x440171c30000b932396c6f63616c686f737483747631 (22 bytes)</t>

<t>Common Context:</t>

<t><list style="symbols">
  <t>AEAD Algorithm: 10 (AES-CCM-16-64-128)</t>
  <t>Key Derivation Function: HKDF SHA-256</t>
  <t>Common IV: 0xbe35ae297d2dace910c52e99f9 (13 bytes)</t>
</list></t>

<t>Sender Context:</t>

<t><list style="symbols">
  <t>Sender ID: 0x00 (1 bytes)</t>
  <t>Sender Key: 0x321b26943253c7ffb6003b0b64d74041 (16 bytes)</t>
  <t>Sender Sequence Number: 20</t>
</list></t>

<t>The following COSE and cryptographic parameters are derived:</t>

<t><list style="symbols">
  <t>Partial IV: 0x14 (1 byte)</t>
  <t>kid: 0x00 (1 byte)</t>
  <t>external_aad: 0x8501810a4100411440 (9 bytes)</t>
  <t>AAD: 0x8368456e63727970743040498501810a4100411440 (21 bytes)</t>
  <t>plaintext: 0x01b3747631 (5 bytes)</t>
  <t>encryption key: 0x321b26943253c7ffb6003b0b64d74041 (16 bytes)</t>
  <t>nonce: 0xbf35ae297d2dace910c52e99ed (13 bytes)</t>
</list></t>

<t>From the previous parameter, the following is derived:</t>

<t><list style="symbols">
  <t>OSCORE option value: 0x091400 (3 bytes)</t>
  <t>ciphertext: 0x4ed339a5a379b0b8bc731fffb0 (13 bytes)</t>
</list></t>

<t>From there:</t>

<t><list style="symbols">
  <t>Protected CoAP request (OSCORE message): 0x440271c30000b932396c6f63616c686f737463091400ff4ed339a5a379b0b8bc731fffb0 (36 bytes)</t>
</list></t>

</section>
<section anchor="tv6" title="Test Vector 6: OSCORE Request, Client">

<t>This section contains a test vector for an OSCORE protected CoAP GET request for an application that sets the ID Context and requires it to be sent in the request, so ‘kid context’ is present in the protected message. This test vector uses the security context derived in <xref target="key-der-kc"/>. The unprotected request only contains the Uri-Path and Uri-Host options.</t>

<t>Unprotected CoAP request: 0x44012f8eef9bbf7a396c6f63616c686f737483747631 (22 bytes)</t>

<t>Common Context:</t>

<t><list style="symbols">
  <t>AEAD Algorithm: 10 (AES-CCM-16-64-128)</t>
  <t>Key Derivation Function: HKDF SHA-256</t>
  <t>Common IV: 0x2ca58fb85ff1b81c0b7181b85e (13 bytes)</t>
  <t>ID Context: 0x37cbf3210017a2d3 (8 bytes)</t>
</list></t>

<t>Sender Context:</t>

<t><list style="symbols">
  <t>Sender ID: 0x (0 bytes)</t>
  <t>Sender Key: 0xaf2a1300a5e95788b356336eeecd2b92 (16 bytes)</t>
  <t>Sender Sequence Number: 20</t>
</list></t>

<t>The following COSE and cryptographic parameters are derived:</t>

<t><list style="symbols">
  <t>Partial IV: 0x14 (1 byte)</t>
  <t>kid: 0x (0 byte)</t>
  <t>kid context: 0x37cbf3210017a2d3 (8 bytes)</t>
  <t>external_aad: 0x8501810a40411440 (8 bytes)</t>
  <t>AAD: 0x8368456e63727970743040488501810a40411440 (20 bytes)</t>
  <t>plaintext: 0x01b3747631 (5 bytes)</t>
  <t>encryption key: 0xaf2a1300a5e95788b356336eeecd2b92 (16 bytes)</t>
  <t>nonce: 0x2ca58fb85ff1b81c0b7181b84a (13 bytes)</t>
</list></t>

<t>From the previous parameter, the following is derived:</t>

<t><list style="symbols">
  <t>OSCORE option value: 0x19140837cbf3210017a2d3 (11 bytes)</t>
  <t>ciphertext: 0x72cd7273fd331ac45cffbe55c3 (13 bytes)</t>
</list></t>

<t>From there:</t>

<t><list style="symbols">
  <t>Protected CoAP request (OSCORE message): 0x44022f8eef9bbf7a396c6f63616c686f73746b19140837cbf3210017a2d3ff
72cd7273fd331ac45cffbe55c3 (44 bytes)</t>
</list></t>

</section>
<section anchor="tv7" title="Test Vector 7: OSCORE Response, Server">

<t>This section contains a test vector for an OSCORE protected 2.05 (Content) response to the request in <xref target="tv4"/>. The unprotected response has payload “Hello World!” and no options. The protected response does not contain a ‘kid’ nor a Partial IV. Note that some parameters are derived from the request.</t>

<t>Unprotected CoAP response: 0x64455d1f00003974ff48656c6c6f20576f726c6421 (21 bytes)</t>

<t>Common Context:</t>

<t><list style="symbols">
  <t>AEAD Algorithm: 10 (AES-CCM-16-64-128)</t>
  <t>Key Derivation Function: HKDF SHA-256</t>
  <t>Common IV: 0x4622d4dd6d944168eefb54987c (13 bytes)</t>
</list></t>

<t>Sender Context:</t>

<t><list style="symbols">
  <t>Sender ID: 0x01 (1 byte)</t>
  <t>Sender Key: 0xffb14e093c94c9cac9471648b4f98710 (16 bytes)</t>
  <t>Sender Sequence Number: 0</t>
</list></t>

<t>The following COSE and cryptographic parameters are derived:</t>

<t><list style="symbols">
  <t>external_aad: 0x8501810a40411440 (8 bytes)</t>
  <t>AAD: 0x8368456e63727970743040488501810a40411440 (20 bytes)</t>
  <t>plaintext: 0x45ff48656c6c6f20576f726c6421 (14 bytes)</t>
  <t>encryption key: 0xffb14e093c94c9cac9471648b4f98710 (16 bytes)</t>
  <t>nonce: 0x4622d4dd6d944168eefb549868 (13 bytes)</t>
</list></t>

<t>From the previous parameter, the following is derived:</t>

<t><list style="symbols">
  <t>OSCORE option value: 0x (0 bytes)</t>
  <t>ciphertext: 0xdbaad1e9a7e7b2a813d3c31524378303cdafae119106 (22 bytes)</t>
</list></t>

<t>From there:</t>

<t><list style="symbols">
  <t>Protected CoAP response (OSCORE message): 0x64445d1f0000397490ffdbaad1e9a7e7b2a813d3c31524378303cdafae119106 (32 bytes)</t>
</list></t>

</section>
<section anchor="tv8" title="Test Vector 8: OSCORE Response with Partial IV, Server">

<t>This section contains a test vector for an OSCORE protected 2.05 (Content) response to the request in <xref target="tv4"/>. The unprotected response has payload “Hello World!” and no options. The protected response does not contain a ‘kid’, but contains a  Partial IV. Note that some parameters are derived from the request.</t>

<t>Unprotected CoAP response: 0x64455d1f00003974ff48656c6c6f20576f726c6421 (21 bytes)</t>

<t>Common Context:</t>

<t><list style="symbols">
  <t>AEAD Algorithm: 10 (AES-CCM-16-64-128)</t>
  <t>Key Derivation Function: HKDF SHA-256</t>
  <t>Common IV: 0x4622d4dd6d944168eefb54987c (13 bytes)</t>
</list></t>

<t>Sender Context:</t>

<t><list style="symbols">
  <t>Sender ID: 0x01 (1 byte)</t>
  <t>Sender Key: 0xffb14e093c94c9cac9471648b4f98710 (16 bytes)</t>
  <t>Sender Sequence Number: 0</t>
</list></t>

<t>The following COSE and cryptographic parameters are derived:</t>

<t><list style="symbols">
  <t>Partial IV: 0x00 (1 byte)</t>
  <t>external_aad: 0x8501810a40411440 (8 bytes)</t>
  <t>AAD: 0x8368456e63727970743040488501810a40411440 (20 bytes)</t>
  <t>plaintext: 0x45ff48656c6c6f20576f726c6421 (14 bytes)</t>
  <t>encryption key: 0xffb14e093c94c9cac9471648b4f98710 (16 bytes)</t>
  <t>nonce: 0x4722d4dd6d944169eefb54987c (13 bytes)</t>
</list></t>

<t>From the previous parameter, the following is derived:</t>

<t><list style="symbols">
  <t>OSCORE option value: 0x0100 (2 bytes)</t>
  <t>ciphertext: 0x4d4c13669384b67354b2b6175ff4b8658c666a6cf88e (22 bytes)</t>
</list></t>

<t>From there:</t>

<t><list style="symbols">
  <t>Protected CoAP response (OSCORE message): 0x64445d1f00003974920100ff4d4c13669384b67354b2b6175ff4b8658c666a6cf88e (34 bytes)</t>
</list></t>

</section>
</section>
<section anchor="overview-sec-properties" title="Overview of Security Properties">

<section anchor="threat-model" title="Threat Model">

<t>This section describes the threat model using the terms of <xref target="RFC3552"/>.</t>

<t>It is assumed that the endpoints running OSCORE have not themselves been compromised. The attacker is assumed to have control of the CoAP channel over which the endpoints communicate, including intermediary nodes. The attacker is capable of launching any passive or active, on-path or off-path attacks; including eavesdropping, traffic analysis, spoofing, insertion, modification, deletion, delay, replay, man-in-the-middle, and denial-of-service attacks. This means that the attacker can read any CoAP message on the network and undetectably remove, change, or inject forged messages onto the wire.</t>

<t>OSCORE targets the protection of the CoAP request/response layer (Section 2 of <xref target="RFC7252"/>) between the endpoints, including the CoAP Payload, Code, Uri-Path/Uri-Query, and the other Class E option instances (<xref target="coap-options"/>).</t>

<t>OSCORE does not protect the CoAP messaging layer (Section 2 of <xref target="RFC7252"/>) or other lower layers involved in routing and transporting the CoAP requests and responses.</t>

<t>Additionally, OSCORE does not protect Class U option instances (<xref target="coap-options"/>), as these are used to support CoAP forward proxy operations (see Section 5.7.2 of <xref target="RFC7252"/>). The supported proxies (forwarding, cross-protocol e.g. CoAP to CoAP-mappable protocols such as HTTP) must be able to change certain Class U options (by instruction from the Client), resulting in the CoAP request being redirected to the server. Changes caused by the proxy may result in the request not reaching the server or reaching the wrong server. For cross-protocol proxies, mappings are done on the Outer part of the message so these protocols are essentially used as transport. Manipulation of these options may thus impact whether the protected message reaches or does not reach the destination endpoint.</t>

<t>Attacks on unprotected CoAP message fields generally causes denial-of-service attacks which are out of scope of this document, more details are given in <xref target="unprot-fields"/>.</t>

<t>Attacks against the CoAP request-response layer are in scope. OSCORE is intended to protect against eavesdropping, spoofing, insertion, modification, deletion, replay, and man-in-the middle attacks.</t>

<t>OSCORE is susceptible to traffic analysis as discussed later in <xref target="overview-sec-properties"/>.</t>

</section>
<section anchor="supp-proxy-op" title="Supporting Proxy Operations">

<t>CoAP is designed to work with intermediaries reading and/or changing CoAP message fields to perform supporting operations in constrained environments, e.g. forwarding and cross-protocol translations.</t>

<t>Securing CoAP on transport layer protects the entire message between the endpoints in which case CoAP proxy operations are not possible. In order to enable proxy operations, security on transport layer needs to be terminated at the proxy in which case the CoAP message in its entirety is unprotected in the proxy.</t>

<t>Requirements for CoAP end-to-end security are specified in <xref target="I-D.hartke-core-e2e-security-reqs"/>, in particular forwarding is detailed in Section 2.2.1. The client and server are assumed to be honest, while proxies and gateways are only trusted to perform their intended operations.</t>

<t>By working at the CoAP layer, OSCORE enables different CoAP message fields to be protected differently, which allows message fields required for proxy operations to be available to the proxy while message fields intended for the other endpoint remain protected. In the remainder of this section we analyze how OSCORE protects the protected message fields and the consequences of message fields intended for proxy operation being unprotected.</t>

</section>
<section anchor="prot-message-fields" title="Protected Message Fields">

<t>Protected message fields are included in the Plaintext (<xref target="plaintext"/>) and the Additional Authenticated Data (<xref target="AAD"/>) of the COSE_Encrypt0 object and encrypted using an AEAD algorithm.</t>

<t>OSCORE depends on a pre-established random Master Secret (<xref target="master-secret"/>) used to derive encryption keys, and a construction for making (key, nonce) pairs unique (<xref target="kn-uniqueness"/>). Assuming this is true, and the keys are used for no more data than indicated in <xref target="max-seq"/>, OSCORE should provide the following guarantees:</t>

<t><list style="symbols">
  <t>Confidentiality: An attacker should not be able to determine the plaintext contents of a given OSCORE message or determine that different plaintexts are related (<xref target="plaintext"/>).</t>
  <t>Integrity: An attacker should not be able to craft a new OSCORE message with protected message fields different from an existing OSCORE message which will be accepted by the receiver.</t>
  <t>Request-response binding: An attacker should not be able to make a client match a response to the wrong request.</t>
  <t>Non-replayability: An attacker should not be able to cause the receiver to accept a message which it has previously received and accepted.</t>
</list></t>

<t>In the above, the attacker is anyone except the endpoints, e.g. a compromised intermediary. Informally, OSCORE provides these properties by AEAD-protecting the plaintext with a strong key and uniqueness of (key, nonce) pairs. AEAD encryption <xref target="RFC5116"/> provides confidentiality and integrity for the data. Response-request binding is provided by including the ‘kid’ and Partial IV of the request in the AAD of the response. Non-replayability of requests and notifications is provided by using unique (key, nonce) pairs and a replay protection mechanism (application dependent, see <xref target="replay-protection"/>).</t>

<t>OSCORE is susceptible to a variety of traffic analysis attacks based on observing the length and timing of encrypted packets. OSCORE does not provide any specific defenses against this form of attack but the application may use a padding mechanism to prevent an attacker from directly determine the length of the padding. However, information about padding may still be revealed by side-channel attacks observing differences in timing.</t>

</section>
<section anchor="kn-uniqueness" title="Uniqueness of (key, nonce)">

<t>In this section we show that (key, nonce) pairs are unique as long as the requirements in Sections <xref target="req-params" format="counter"/> and <xref target="max-seq" format="counter"/> are followed.</t>

<t>Fix a Common Context (<xref target="context-definition"/>) and an endpoint, called the encrypting endpoint. An endpoint may alternate between client and server roles, but each endpoint always encrypts with the Sender Key of its Sender Context. Sender Keys are (stochastically) unique since they are derived with HKDF using unique Sender IDs, so messages encrypted by different endpoints use different keys. It remains to prove that the nonces used by the fixed endpoint are unique.</t>

<t>Since the Common IV is fixed, the nonces are determined by a Partial IV (PIV) and the Sender ID of the endpoint generating that Partial IV (ID_PIV). The nonce construction (<xref target="nonce"/>) with the size of the ID_PIV (S) creates unique nonces for different (ID_PIV, PIV) pairs. There are two cases:</t>

<t>A. For requests, and responses with Partial IV (e.g. Observe notifications):</t>

<t><list style="symbols">
  <t>ID_PIV = Sender ID of the encrypting endpoint</t>
  <t>PIV = current Partial IV of the encrypting endpoint</t>
</list></t>

<t>Since the encrypting endpoint steps the Partial IV for each use, the nonces used in case A are all unique as long as the number of encrypted messages is kept within the required range (<xref target="max-seq"/>).</t>

<t>B. For responses without Partial IV (e.g. single response to a request):</t>

<t><list style="symbols">
  <t>ID_PIV = Sender ID of the endpoint generating the request</t>
  <t>PIV = Partial IV of the request</t>
</list></t>

<t>Since the Sender IDs are unique, ID_PIV is different from the Sender ID of the encrypting endpoint. Therefore, the nonces in case B are different compared to nonces in case A, where the encrypting endpoint generated the Partial IV. Since the Partial IV of the request is verified for replay (<xref target="replay-protection"/>) associated to this Recipient Context, PIV is unique for this ID_PIV, which makes all nonces in case B distinct.</t>

</section>
<section anchor="unprot-fields" title="Unprotected Message Fields">

<t>This sections analyses attacks on message fields which are not protected by OSCORE according to the threat model <xref target="threat-model"/>.</t>

<section anchor="sec-coap-headers" title="CoAP Header Fields">

<t><list style="symbols">
  <t>Version. The CoAP version <xref target="RFC7252"/> is not expected to be sensitive to disclose. Currently there is only one CoAP version defined. A change of this parameter is potentially a denial-of-service attack. Future versions of CoAP need to analyze attacks to OSCORE protected messages due to an adversary changing the CoAP version.</t>
  <t>Token/Token Length. The Token field is a client-local identifier for differentiating between concurrent requests <xref target="RFC7252"/>. CoAP proxies are allowed to read and change Token and Token Length between hops. An eavesdropper reading the Token can match requests to responses which can be used in traffic analysis. In particular this is true for notifications, where multiple responses are matched with one request. Modifications of Token and Token Length by an on-path attacker may become a denial-of-service attack, since it may prevent the client to identify to which request the response belongs or to find the correct information to verify integrity of the response.</t>
  <t>Code. The Outer CoAP Code of an OSCORE message is POST or FETCH for requests with corresponding response codes. An endpoint receiving the message discards the Outer CoAP Code and uses the Inner CoAP Code instead (see <xref target="coap-header"/>). Hence, modifications from attackers to the Outer Code do not impact the receiving endpoint. However, changing the Outer Code from FETCH to a Code value for a method that does not work with Observe (such as POST) may, depending on proxy implementation since Observe is undefined for several Codes, cause the proxy to not forward notifications, which is a denial-of-service attack. The use of FETCH rather than POST reveals no more than what is revealed by the presence of the Outer Observe option.</t>
  <t>Type/Message ID. The Type/Message ID fields <xref target="RFC7252"/> reveal information about the UDP transport binding, e.g. an eavesdropper reading the Type or Message ID gain information about how UDP messages are related to each other. CoAP proxies are allowed to change Type and Message ID. These message fields are not present in CoAP over TCP <xref target="RFC8323"/>, and does not impact the request/response message. A change of these fields in a UDP hop is a denial-of-service attack. By sending an ACK, an attacker can make the endpoint believe that it does not need to retransmit the previous message. By sending a RST, an attacker may be able to cancel an observation. By changing a NON to a CON, the attacker can cause the receiving endpoint to ACK messages for which no ACK was requested.</t>
  <t>Length. This field contain the length of the message <xref target="RFC8323"/> which may be used for traffic analysis. These message fields are not present in CoAP over UDP, and does not impact the request/response message. A change of Length is a denial-of-service attack similar to changing TCP header fields.</t>
</list></t>

</section>
<section anchor="sec-coap-options" title="CoAP Options">

<t><list style="symbols">
  <t>Max-Age. The Outer Max-Age is set to zero to avoid unnecessary caching of OSCORE error responses. Changing this value thus may cause unnecessary caching. No additional information is carried with this option.</t>
  <t>Proxy-Uri/Proxy-Scheme. These options are used in CoAP forward proxy deployments. With OSCORE, the Proxy-Uri option does not contain the Uri-Path/Uri-Query parts of the URI. The other parts of Proxy-Uri cannot be protected because forward proxies need to change them in order to perform their functions. The server can verify what scheme is used in the last hop, but not what was requested by the client or what was used in previous hops.</t>
  <t>Uri-Host/Uri-Port. In forward proxy deployments, the Uri-Host/Uri-Port may be changed by an adversary, and the application needs to handle the consequences of that (see <xref target="uri-host"/>). 
The Uri-Host may either be omitted, reveal information equivalent to that of the IP address or more privacy-sensitive information, which is discouraged.</t>
  <t>Observe. The Outer Observe option is intended for a proxy to support forwarding of Observe messages, but is ignored by the endpoints since the Inner Observe determines the processing in the endpoints. Since the Partial IV provides absolute ordering of notifications it is not possible for an intermediary to spoof reordering (see <xref target="observe"/>). The absence of Partial IV, since only allowed for the first notification, does not prevent correct ordering of notifications. The size and distributions of notifications over time may reveal information about the content or nature of the notifications.
Cancellations (<xref target="observe-registration"/>) are not bound to the corresponding registrations in the same way responses are bound to requests in OSCORE (see <xref target="prot-message-fields"/>), but that does not open up for attacks based on mismatched cancellations, since for cancellations to be accepted, all options in the decrypted message except for ETag Options MUST be the same (see <xref target="observe"/>).</t>
  <t>Block1/Block2/Size1/Size2. The Outer Block options enables fragmentation of OSCORE messages in addition to segmentation performed by the Inner Block options. The presence of these options indicates a large message being sent and the message size can be estimated and used for traffic analysis. Manipulating these options is a potential denial-of-service attack, e.g. injection of alleged Block fragments. The specification of a maximum size of message, MAX_UNFRAGMENTED_SIZE (<xref target="outer-block-options"/>), above which messages will be dropped, is intended as one measure to mitigate this kind of attack.</t>
  <t>No-Response. The Outer No-Response option is used to support proxy functionality, specifically to avoid error transmissions from proxies to clients, and to avoid bandwidth reduction to servers by proxies applying congestion control when not receiving responses. Modifying or introducing this option is a potential denial-of-service attack against the proxy operations, but since the option has an Inner value its use can be securely agreed between the endpoints. The presence of this option is not expected to reveal any sensitive information about the message exchange.</t>
  <t>OSCORE. The OSCORE option contains information about the compressed COSE header. Changing this field may cause OSCORE verification to fail.</t>
</list></t>

</section>
<section anchor="error-and-signaling-messages" title="Error and Signaling Messages">

<t>Error messages occurring during CoAP processing are protected end-to-end. Error messages occurring during OSCORE processing are not always possible to protect, e.g. if the receiving endpoint cannot locate the right security context. For this setting, unprotected error messages are allowed as specified to prevent extensive retransmissions. Those error messages can be spoofed or manipulated, which is a potential denial-of-service attack.</t>

<t>This document specifies OPTIONAL error codes and specific diagnostic payloads for OSCORE processing error messages. Such messages might reveal information about how many and which security contexts exist on the server. Servers MAY want to omit the diagnostic payload of error messages, use the same error code for all errors, or avoid responding altogether in case of OSCORE processing errors, if that is a security concern for the application. Moreover, clients MUST NOT rely on the error code or the diagnostic payload to trigger specific actions, as these errors are unprotected and can be spoofed or manipulated.</t>

<t>Signaling messages used in CoAP over TCP <xref target="RFC8323"/> are intended to be hop-by-hop; spoofing signaling messages can be used as a denial-of-service attack of a TCP connection.</t>

</section>
<section anchor="http-message-fields" title="HTTP Message Fields">

<t>In contrast to CoAP, where OSCORE does not protect header fields to enable CoAP-CoAP proxy operations, the use of OSCORE with HTTP is restricted to transporting a protected CoAP message over an HTTP hop. Any unprotected HTTP message fields may reveal information about the transport of the OSCORE message and enable various denial-of-service attacks.
It is RECOMMENDED to additionally use TLS <xref target="RFC8446"/> for HTTP hops, which enables encryption and integrity protection of headers, but still leaves some information for traffic analysis.</t>

</section>
</section>
</section>
<section anchor="cddl-sum" title="CDDL Summary">

<t>Data structure definitions in the present specification employ the
CDDL language for conciseness and precision.  CDDL is defined in
<xref target="I-D.ietf-cbor-cddl"/>, which at the time of writing this appendix is
in the process of completion.  As the document is not yet available
for a normative reference, the present appendix defines the small
subset of CDDL that is being used in the present specification.</t>

<t>Within the subset being used here, a CDDL rule is of the form <spanx style="verb">name =
type</spanx>, where <spanx style="verb">name</spanx> is the name given to the <spanx style="verb">type</spanx>.
A <spanx style="verb">type</spanx> can be one of:</t>

<t><list style="symbols">
  <t>a reference to another named type, by giving its name.  The
predefined named types used in the present specification are:
<spanx style="verb">uint</spanx>, an unsigned integer (as represented in CBOR by major type 0);
<spanx style="verb">int</spanx>, an unsigned or negative integer (as represented in CBOR by major
type 0 or 1);
<spanx style="verb">bstr</spanx>, a byte string (as represented in CBOR by major type 2);
<spanx style="verb">tstr</spanx>, a text string (as represented in CBOR by major type 3);</t>
  <t>a choice between two types, by giving both types separated by a <spanx style="verb">/</spanx>;</t>
  <t>an array type (as represented in CBOR by major type 4), where the
sequence of elements of the array is described by giving a sequence
of entries separated by commas <spanx style="verb">,</spanx>, and this sequence is enclosed by
square brackets <spanx style="verb">[</spanx> and <spanx style="verb">]</spanx>.
Arrays described by an array description contain elements that
correspond one-to-one to the sequence of entries given.
Each entry of an array description is of the form <spanx style="verb">name : type</spanx>, where
<spanx style="verb">name</spanx> is the name given to the entry and <spanx style="verb">type</spanx> is the type of the
array element corresponding to this entry.</t>
</list></t>

</section>
<section numbered="no" anchor="acknowledgments" title="Acknowledgments">

<t>The following individuals provided input to this document: Christian Amsüss, Tobias Andersson, Carsten Bormann, Joakim Brorsson, Ben Campbell, Esko Dijk, Jaro Fietz, Thomas Fossati, Martin Gunnarsson, Klaus Hartke, Mirja Kühlewind, Kathleen Moriarty, Eric Rescorla, Michael Richardson, Adam Roach, Jim Schaad, Peter van der Stok, Dave Thaler, Martin Thomson, Marco Tiloca, William Vignat, and Mališa Vucinic.</t>

<t>Ludwig Seitz and Göran Selander worked on this document as part of the CelticPlus project CyberWI, with funding from Vinnova.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAJ7If1wAA+y9+XobSZIn+D+fIob6dpPIBCCAlyRWq7opicrkpK4WqayZ
rcrNLwAEyGgBCFREQBRT0j7LPsU8wMyLjZ3u5h4BkFRmHb3fsjtLJBDhp7ld
bvazXq+3Vef1LDtKXo/+IxvXyVk2XpV5fZ1MizJ5WiyqukzzRTZJ3p6cnU9X
s+Rk8SEvi8U8W9RVsvP67OnrtyedrXQ0KrMP0Ar9vTUpxot0Dq1OynRa9/Ks
nvbGRZn1CuqlV0kvveHh1la+LI+SulxV9e5g8Giwu3V1cQRdvz1J/lSU7/PF
RfJ9WayWW+O0PkqqerK1Wk7SOquOkge7B7tbW+NiAg8dJSvo5OHWMj/aSpK6
GB8l11kFv1ZFWZfZtHJ/X8/tn/DkJFvWl0cJNJWu6suixAbwpyf/Jkm+gOe/
78PqzNLFJCvdFzzL7//X/yjTRfPbooRhnZT5uKqKRXL8xH2RzdN8dpRcFPBa
v5LX/i2TJ/vjYt4+hP/aT16mdY0PRUP4r8XlovndTQP4D3irP5e3btH/837y
Jp0V81G+yKMBPIepjLNqnLY8cdMwpvpuf6nv3mIwL3A/8vrXaCAvVpOr/CL6
ikbw9vTsJDk7fXoW9z+jV2Aj4JV/K3P4ZWtrUZSwMPmH7GgLHn/7/OnucPjo
iH/dHzw81F8P9x/Krwe7e/vy6+He/gP59cFgX197sLs38L8O3a8Hu/rr4b77
9NGBvvZw8OBAfx3u7bpfD/yvD7Tjh7sPdTgP93b39Nf9fRov/n++mMYz2ztw
Te09cjM7GA7drw8PdTCHh4/8HHa1rwcHwwM38EOa+mnvWZ/OfTqGY48Hq4f/
82vw3XhUlL3xZDLTT0c4tsWidzgrgGGky97DwW5veAAcRJ+4TMv6fcbcJNvN
PCsps79W+pCSND9GDaXjepXWRVk1B1fRU8uymOazLBwf8Sz+/gKZEBDjvPlE
Nr4ssP9VVtW9Or1wwxhflNlVL//Qu8gWsgEvnw8GzGCE8R7XdTp+XyVwMk4W
4/J6WefwazFN3maT1WKSLurkzQx4cJ19rBNgFMnpfDnLgRnCY/TWKXxVLjLP
u6n1jazsGfCR8fcwtvavz/rJ89nqshRWhtwW2ONgMKA/KziaWYV0pK3Xl1ny
pizGWYacuMLB40dn2QeQEpfJ8WKxSmfEzavLYoljBlYJcgDEynGZpRX0mjzF
mRcXZbq8vE52zo6fUoedbnK2LKHRrOz9lJWz9KK/tdXr9ZJ0hJJpXG9tnV/m
VQICZ4UiKZlkUxBX1W8TZ90kTeYZrN+E3kuXbsF7s/Q6KxOglRqal43Cudq2
j/3zuCwgYYpZsvO0OH4DLa8qlGhPn7x+68aYXyzwM9xbQwE7T1+fnXT6IlKx
yw/5BGaWLSa9uujBP3YYo6y+yrIFfrsscpwMkupqQeOAxqVbGENCK3H8pjeH
eaWjWZb8cH7+xvWDiwm7e4ETwcmPzcQWBQ4AxwnkdoXbmVSr5RIELI0/ATZ+
keGKwMA+XifFMiuZTLuww2PgsvgYNLaoZmkw6kk+nWYl7h99iy3S5HDlKtjx
4xlsxuriEl7glYK2sQGgqulqMeZfcZuhb5xbV2eTzuBsVDLvJR+ZJVJqVemS
nx6/Ok7K7CLHaeIT/eT8EgYDk8+6sLeWukTzSD59Esb95YvQ4zwHLgZi4x4e
x7KYrHhbPt3L8c8vSKa3JhLbPO5HmlxlI16ZqRAfPt2900ZJm7sPv3zp0jfz
9BqWM0EqwBbKYk6EwA+izIG58cJVy2ycT+HME6WvKrfF+BF2DZJ7lo5y2gFs
OptO83GeLcb8J6wlbi4sevLs/MUZ94AiEqZHr8sh5e6QuHkPcTj+L2xJv6eB
6giQ8eZlxm1Dc64LFHvQRV3gPIEO5vkiRZ6T1jQRIlLabKHXWrcd1q8GLjW7
Ti6BOaVjJBdsBt8CAki1S154oHIUqUTb8AByalDnJtJoQJ/dZLSqaUtnVZHQ
4YNms/RDVk1K4oxdnAGIwHy5gjOSwayvkyWIPFjyLjU/h7GkcMqW6fWsSCe8
lVmd0riAjxKZ5LU7WviOYwp2tmM4RTSMfIFsCKlpltUZDaDMinKCpAaSKQNe
AodlnGFTsKG0PMmsQJ6sHAhmOwKu/awDa99fx5JxJL+JLTtCMUdAWaAyN0cl
AXdLRDhXQo/AYRZVyEvTcVlUFe1eOQc5lpbXcoyq1fgySYWJwICv0nLiiA/b
ozd7OibH4EDXMGzPErN7Ozhrp7Afk0lOHEGIDbUL6TdL6xUMXFZzgltt2IRj
eMKPdbVBVn/I5EFQLvHBJ7Ni/L53lVf6OWiayhNeFb23sjj65SGeUmGdXVyG
q2w2w39J6B+fP/2B3nx+gr+x0NR5gbKK8zqGeQH5X1c5aQZmzauQDGCaQt3Y
ekkMvyrmQHjXy4zebdkdaFQOoC7KjVoiDkqWC7oDEsvT2exaSYlnpoRIPaZ0
gqs/0DdCSjLXrv0sI9oqVuU4az2s3SSrx/1kp8pwed3Z6QFvnU1gWIG057Es
wCYBtiQ6BqzQS2oSKeoFqSJgp/gvz4v3cOSvLnOgWOTv40uSyK28gHcc5gB7
jYfacz8RkMgp19Eb7KqQKi5d1zMIN2W2Miq/tcUHGO1qUWaznBmfk/RW3OGY
wlfWvYD2DbzAqgNza2R/QB+VqgHxYrlTgrwPZAIpdjA3lBAFKKpmdMwn4p4r
3btpftGrUG+nTdvaknZZ1MIwYODXN0hkpJB08Z4ES448dg5L6Zavyn/NZIOQ
vKCdnNjsGNoRnj8voA+RRMwo85CDXF2mJGyctAIejcvST04+pmBEZE5TF5mu
ShPQwAXYhwve9EweNsdGdIcV0ghtEoqpFToxZte42jNebeWcWf+in7x7Rqrn
+VOR5VdA2LAsi97pm2CB8eGuHOP15qA9LDgakmQ6pNxqlFfpdcWdBXqu4zQy
FzcEfh+f5XGu6wQWWE5pm8DR5rt8hqpxmY9wB7JZcQUS8v/xP1vf9W7++W7r
c2J+rPJofj7fsq1bPZUkf8FO36rkvJ+8dXLzPhktoNLAXn/Gfj/fokV+MAl/
ZHWDH3yQ1vQuzcZ88b58kqFnau4Gesup37/7riB930fyhv/t9/t33pUkCaji
01Fyz3EZ9hU83j4Wq5fniJNSTkcEzou5DQeYWEwPNuhi8Xh7nKEQ2/7i2JS1
8QwZA6XO8cQ6FxFQF3y2BO0mR8IGuQL/W9U5KgAzIGSndcX2XrLz6ROdV/of
+pYO7GktLJKGm30Em0vbcLpRrGEFWg6qz8C7eR699CotVZ29wlGhPYMSTA2Q
un+j3rXernAKsp54s8Z0rNUuEuF4WdfLXrFcwybr4iIjSU6tiKnCJssHkl8Z
af44+stiSbxcxLWz9tP6ssu81DIrx9rO8B1sB30sjsMu0XfEu4TiASwbHAQ8
wrZAyPknBcwbjZ8UuOeYzaR3b0/BwLsEEWPZIS6O1xiCFUJZYF5SBcJL9VI4
MfZvfCvw5Jg8HKz5LliQsQbBKo0nXxVpRvaukDEtQd+rQPmD/t5nyPedKnQJ
RhaME10kcKRGs7y6ROG1qnvFtDfCmRWyNym+6p8iG8Yp9yL/YXjoj+uBxMs/
0OiJvnFGcJQu0e0yA911tmI3xyoH/Q79Xrf2+6gKzWTPzh982NBD5t7pkpp6
UZKFWWaw5dfGN8RibJQvJsIw1P7Bsy+aK+hz6DCC5SO9DyiyEucWjgZXHPe3
jer1LVqCNprK0XxEYcFveG6Vgip0JaYFMgz+DdaRByxC2D57maVolZK6jG/w
36w+w3tsjOHOoCMJbAZqlb23ZDT08EO3UW572LNSoOKY0vjuWxGOa1sg09kO
NYdtoCYifrAgcGV51B9y0INx+VI4QzWpr+Ms/wDfc6dhG+zdaXYJmid5KsQM
LMocJFs6M0Oiz6eFcmFQco7CR1vmUTnTlJumrdjJp3ziZyWs5rVuES+mN++R
dzAt8BUez0ZIMJt4tZ9MGdYroUPzBhsZoZblDBcxkHjAo2JyrZppuF5dpxLL
50wz9wPCyNXs9n3I60jl1XuwwS6xedjS7KNYSJ5cveIm745TJufWjWB/JDuo
8kqdtHI0SHxTd3oyoqPhWDdL5DrNZ01hEiqLT2co1pJb/5yhA4Dc+J8DhUut
2F7y5vXZeSI6Pl62HanW4t9Jkh9ogbtsYHbXdRa+85qdBkdOZIJW1Hw1fOcN
08ERE844X4KIoYuP5ju3Uar8zx/Dfm73w+/8y506+q5trYXf9pLd/mAfODwR
3aRz1LoG/4Rrfed1a9Vk+eSJKnvmzuEd9NdjMEmRTlEms85g7h+I4Yh0Eo3i
5fF/9y+wj4CONB8i9Kt21z1DnrNSngHVoOUx0tmm3pdMD1eokty7l5yTv7mY
FRfXW+z9R60CpgXccfvlu7Pz7S7/m7x6Tb+/Pfn3d6dvT57h72c/HL944X7R
J85+eP3uxTP/m3/z6euXL09ePeOX4dMk+ggGv828c/v1m/PT16+OX2wzf7OO
WmLQpO6S1wvEeq0+ILVf4Z0nYOEM91k/wTtxUKFFV3mwD79fXWaicdAa8Z/s
OV4us7QkSQKq+jhd5jWo16xTXBZXiwTVSWB3b4n+KxpO9nHJ8ofHNQVLbpan
oqjVl5n4e0Twj7NlHY2WiCt0lN7gFA29onQ2Al2MVDh+ZrDPzzx79kIcFuGt
NloX6D+ez9My/9VpTPBNDz5Up6t1E2XW722ubPpMQjjbZBuU921VyXBhJhkI
cFClif7y8WoGCzTLLtaYECyJZLWosd7oukdt7vBVrPnMKJnbeArsV9MyvXAH
cbsDshgsRR7Rtu9zu+uG2iA49HyB7jTGi476Uq5lnGMmDV2RY9DjUM8SP5/c
tIg3OEeBDcYnu0pBsv/HCoSbmJJekVoge0NXXLCeVQ2z8beCZm3ZCQ1GAl/9
mHHLmsejxldRm1qmNOjVUnsmOhRfyn3nY2dXRZtP0Y8PLx7mc1ByzvBaqYSX
gVUT/3rKRgiwsLRCVfMsG8ORvX+WzuAzfjo5fXb/xwysAv+WfnL6zDfANjD2
kpz+RAsfuH29tQMf5qylwwjxttPotCyDkk/3RJHnKQSKmm2W2bVcX5slUDOg
K8YbdAxTqZJzcq7tH6msQ9ZrDnbHkVLld8XeKZCuvYgVcNYn0U9ak+kAxxBV
cmMLWRWWhnnGY65oYSqNafvyBeQc+01AYhUrFlnUfmQktT3XCawDWSwYMDCy
Gm3JblKlU+LOQtNdvRUUHXXMAoa3EikQzMAsRRM2a3c3ftfyX6jIrP+FHF+v
ij756eC/d/DfK/jvLf6bgs1vVIHkOc0VfnmRLS6Aa39OnmXTdDWrvWPsN4/l
/MmzITT8kRQV/1/kXIQPd77t0C+D3u7BAf6yswAp3kl+t7FgP0+Tx8lTt3EJ
LM/j5N0CNxD/egV/vSqe4o7ROUxg2R7D+dTtSihMiId6lmXqMm7TqIRORKNq
HMUNilQLsbHJVFnrajpLL5IRXk7sRDTc6UqEDzGZM+RreAH0ajUfoepqvjt9
5o02z3JIL8DPKmcyMrvP8D6Ou6MHnbXuzCM+O9TmjCkqv8kpcTptnxV2ibrI
r1lZJDuDj4NBhx/kJfmQzlYwD1LBQPnI5sv6OtmRL4WaHyeDDl1x6r2aN/jF
snesBnUWFCXuMpD4DnkYPedZRNvCvddgmxOLQhdtOpPbTr6jIsaU1xglgxcu
KMTw4tI6eVJn7jm9qa0XGUXz+37yp0t2XmZlSeEBehGw9hXYryWx7UKUEHqR
nTLu+lMELsu75+ofbAYPqc8tcij3VQC5cAKlrk/3lHyce1A8hiIcxAJI6RKa
FH3n74PVEg+iu56Wxuy9D4eEoIjx4qFyjl/yRdI34hFNjlfw8KImARW4++gB
f5maPMM4jp3jk+NnXRZvGIdJzq3ZRQGjuZxz0ImPe1D6oggQvepN7RRTmSTF
GFi5CzJWRb0YPdGM8W3QzZH0yEVR5h/4jDUXcJTSbeAiWD/QR2QEaP14b6kL
i+mTsdTYwGdO0/B7adUP5mCN4eaVTKPmaAF/j5HN5I50keHWYfwAbOQ4LeEX
1e/GPgQxH9vbjFxPZR+lWZKlqJbIee+2L1xOAXisEKOvKdkW/UpmiOYY2HHM
I81ntFbbDR1vWxRCH96nlzY+YqIgT6RE+hkO/NTsJWxUPr32LzGzyuxbLfol
XY7LzCrxeSktUOAY61p2fmwBEs9Auuwn7LiqDMXgXjjLTmOhgGBAmf+QafhL
iXNsrC48CEcMLW3LeenUIV93oifZOTt91mF9HYdrvw2UX3LuMYcLWqO9RY0G
xdgCDgKIdBRCVp1Odt5CJ92ol8Yy0uEzQZkm/BGEtI3LaNk7ICH0NrjBAVWD
/lC1b5jzVgYTiv3TKFZX0hsOIF5kWMoJciySqqNruxTudioYuISG1e5Jvq5z
UWOosILxNs9RFODVzVvea2B6KdGt86Y02RC62clH4ByrTj9AKrDKkdc9+7Hq
dsNP37zb8HhF5N10efnf2z2Tffmv+fOdvhj3HxEBfvo4oTv5eMdv0f93G74J
O25rnjtuG5J595vW5r9Z/4151y/0Og+3d2W3/KzzUH7eeqscRYkJxac3DkQz
Mq7YOi0vstpFcvn2ObrqMf877Mrzb4QRByoWPf8+n8DTZ8g6XEAALldjDdfu
TO+Pn5PG+LGDu64CbCowqsc4pDu/+hPLDDu/r+g+pqm1TUROc72OSPw6i2J7
w0Di3cIt+BwvfpM6aPvW+fzBvgubvWniWy2Lt/H5tsO36fk2s9BJSbYLQzb7
zrPZWOu6wV6MOKCzWcKbSODywPox6v5oa+vbBBXZ5FhVVzblSDGmL7xOyxKd
zqZ3OfaxhR9+fPbctgAS/4eXx097rG+uUSv5LdafHx6ij9o7S0lECxlEvrEf
1YPinGE0hMC/1k9+SkuOC2T7Ex2PiwloQaPrGsNjKC5HjJw5vdljTRi1+GgY
tAoUqbC+13QGfb7WfIcPYedBp7IlqslV8OZdOvTm+S3782EJqTdgrNaNDl5W
Iq7X6Yg3D83GFBgPQh55+r2b8hK0EbIOv7WtPDEDD5TXYHe7dtmZFuyyvJPV
vMgWaB2wmkoDf4UOdd32Bf5Brosz1Jhk6SRomr7UMxidDz5pkYC43UlzSm84
Vd3/YB9iFfjGTejqXqVVtQJlDHRYYGj8NM2nwszUj/l8NTdemUnGWRdegWxM
91tzEsOBx8R8PZ8jIxu7IdrQtdgK6oMFaba4he7Mcr34qgFHTq8+UkBvkV1Q
aiUH5GDAc2W0Z34RMz4WqznTT5CYMM5K8qY4/4qEe+mVFSjX7m6zEmIEovrm
Dd77wNE7/ekbe1cVEOqmHWNH123mDzZMjl3lv6bqoo4OYc4P9DgMyd1cNcXa
7ajaGlq3IOwW4/UfSduBZPkK8l5nrt9M3uG63ZHC33II2Z9yEGtXYEOzgwfv
c8UZKzFmV/yAH6ijZj/Qt3E4WgvNcHM9/8wXvThpoabj2cwQCYbw4D1m+6GU
pbCzQVMyByOcfe2Fpi20OXBMoGDo4sV4wmkJnH611Dj80TWZvlVdlLqlhsCs
thHuDn1E9Cmvzdk1jq4R6hYTGBfEU2b08l1HEUg36twIOIlR884Cs7A+YFKk
Jaz9ibP1MRyCPWQZsiD2EDV8gmrXO99BY5mnlL6COShlMcOTdrpgzzFFWUzF
2SQtU64gNtwNUll8tswaZ9g6rw9RLYb6rvOHrXHkhJ44DeLQbBsvYO8HbiLa
V3oGm3bTlZWnyJCu/57yPvAZH5Rr2hcPp+dotQtTZo/qSRC+Co82XKxv/FZb
F6uLZ4Xdtn5OoQJm14ZMxBPU3FhkTKlktTiH7JLuP/RlXknP++Pv/d0LxvWa
43jU0MoDDSiJJUfCQmhDT0jPzX7YZ4cBgBjUzCpbFU5f7vvD95g+J3LPKeJV
rqclCUSDDFqsJIRl6LlbUnju+OSs9/Tpy97wsHe43xvuPuQgYWM+Ac8TFJTh
oBMZD43m6OzQZZZR5pumVuM9+hq2pLd7cNgUE43HMbidIm6bIcka1CsChJKd
YHX3dm1uMLP6xk4Zp/H7BboEKToXFKGLMuMLCOCCxI+MS1UckZHgkvh8nyvU
5tZkIr1KryXmJBqOXFuGu4+hBiawXYPS+pTrCgqLXizAnBsHJww8j3Kx4Gk1
732PIi0zk9QFPHRWUCqWRmHj2/wpttszSV3IL+6xQpEqpMFtzWM5WEQZxAdH
mQ2LM4Z6wyB3xOtzDClFIAq46gdkhys7hxFgdi1pSC4kT2K649W0zOS2c3Jc
p3HH0dh9f22Co9SQFYzoylEN0vAMugnKLV4EPt47+cjZPNi9fLAk6Vlny8ou
1lHDxV2s6mAoyWNqYacis/X0x5ddMsS7yYtOmFe0dYVhdsR1yD8g/CBQCvyO
pKPiQ4augR9fxk+KQtF8Fvv1N3GlsRboIozi59KyTK91nSQtYYeNYwnsZF5d
BfFynXAdKPAOF4N6fJz8mb2B+SQ5SjBRqqt//6LUwJ8n95NFPpNvgQx/SbMU
30Epdz+p/ZvEvI7sJy/gzxVepuCfPwcLK+uasBv/WxyGLIKXS0DfTZXAaX+e
QNuURDQKkXuqIjhp5+NRm4Ei2t9yY/vF6LlhaAZFu8L6JHnsbmFBxxHufT9R
t4LSVCjMuiyb2pOJ9YhvcUu03tDKNkyYww1Pf9rmgz1LQWpKCNfx2dPTU5ku
r4RTkSSKBcgMIyopP/HVuxe0Pn3p5IWjTZE6NYdO3We/zFTyqSP/JKe/5Atq
qpJwBWGiXVwqfMc/3iKxTegYCOn+brQIHZ9ko7GN6D9g3YFQaMwyDwf8lP+W
ZjU8pN+diTvcc9MxjrBjMHPnYkHr/FVVMUw5YLvYWmNOooULE1teSqIEvbgk
DBSM4kyWVbaaFOIjRcN2583bHztIDnLGm9wNHkCGhtJDRrATuOUCHtQJ+Rvp
AhUvCGmfGhKKg4UxXnonsTBRJASdC/HfcCqWm6eY6X4xY8kGm/ShYBHvD+St
pUyYc09OkLysatxE2DPYOqI06PRWvN8uFawec//k8+dk8HEw7LRIgEDrgUdx
OORSmWqEg0o/3w8lFdLLf/n8l88SA1vFLmhUchep+O9fuShZK/stogwGNk29
vzriM10JPUELgiKZpB/YC4zaqjgiI0oKWK5KjLyouqapwCmem5v9lBqvg+8l
aLfBXF2AT5XVlX88VPTRvxe/qJoBhYUsPmSlxLTH88mqkFHsAp/QOFdeu47o
a+KIiz0eVYvLA0GIAjdK4GWOXSaUPiVOPh7koJ+InifZFvixQnI0dXsOS7N6
tveatWnFzMF9uBjGG/ncQZMxpoFgLe4ijRH8bcYHz7st6UH3Y78/7O/2D92e
sKUiKR9vLRaDxL1tNrvL7K89Ol4V7gkaHdYD6VmJhGn8dZXCOtTJzqYrCyvJ
nebRcdo5tw3Hqp/1xZbPy2RnzVtOFZYhOWuf7Hk27eOwEa8T0/na6IDCfUOV
PksXwgu8svR7973xaucPAlZhATWSC1jvFL4GSpcx7FCMNWkKHVq5KlAY4Gw+
c2xVwXAEbET91WmF6bB+ntURykgHHsQxoaT6iqelztmhtcguCiLPZFaMCbFG
F0bjdErMpmEoVcpeyEvi3hi1alE12mAZKaRXZmLac0gplcAFmITpfmK4CAYF
ybOEfVJdIlDLTpgkwWxROB6lvs6yCzhyc5wUMU/xL89Dd7s3SGHDVAdLYKPS
Ga+Sf8577RPQcVZVcqhcQ+7kWGA09bP6pm6r5IEofwmd1QqFDju99X5dlKky
v7isW68ighsKInHK42qj8UqJvNFO5S6VjDeYgpytd/gyNTIuNDqQ/Xnp32zf
MIeWzjk7xBjGvqnwHoKZVog6RC4X9eDUQCdz4Nf5EmP/8jmqEqwN8XWCc4PS
ejaDwqqqGOc2Tzq89GCRFZow7jaczc4VxvtqFF6DmwgtyjF2yhGfBWOwQRcN
rIjwwdDCisGTwm9jfpELnmAmYQaLjGHKCkqJlyGE9qLbq7YohJ4uOSNyNPpN
y1EOQrfMgcEgyhsJN42+gSE5WBUO2/90r4Fj5TEZGpn1Llh5pw2ZQS8rhbDS
RYCl03GZ+G1J4TawMQbRUmCTdVncN4Kc6MVsE+ekkRAUxahvSApyKd5rE4JM
gpSC6BnlKMAri/LvyRoRwMiKr5VMGqBSfPPCZocwQq7hfJTcccfpfiWCJROx
aXJ/ZRQ+BBUo9RMUiuOV04FGGWxxXpRNfC69dyHupYnw/vzYhEbMOFyHiSJs
xg6JkL0caKNkO64EF8GtVi0IWQ67qS7uO2efI5MARQE1w7yC2VUtuC+wZ9Rg
N6ZdUfxlEJhirCdD7YBgXGJMim+7ld5B/OSwLj4bssyQ+jO/dTAchN4b07Qj
C2lOLNXBQchLs2uDAwpdG5gCjZGnnMsP2cJB/4B6zUk7avG9CbBxPU6Uu2Pb
UWX6wKnRjOXWac3kgbNUaSOq6LvLyrpqUKOEbzZyLR2tbW29zJpgFVGyoFwN
eACMluNDL5gzxGCpfJAaEGTkcX06A5mQnBwZ4AyGOhH0Ft9fN3GPnx61PUDX
8aiyuefeHYEW4b7va4rEQnFjWABrQpGAycqIYv6h2BceFEAXyWRDhnk/DmNj
Q7fqnpOJrenVZMOEaTOSG3MMhokNn0q9r9FxbD4RmonlhkHBIBQxJD4HNtlR
WeLb1YnDUJ1iTI+sbDxQl5Yf0kjLq6dMGW3NcN+Vx0WB10qPWSKYJsAHHXCx
yfiMWYJzL3zIWY5xcBQCWTUJHr0izedY7eu2YbRspIMuzUASI7ZPFyDDt5Md
ISyQH1Hnf8uphkN5varNUE6x/XcdQXfmB1clns8ZRk24/dIhiK+6TzkmUdbw
nC8vSCegq8YUYdgXooghx8auEUy9TiXYL3VKRMBnaFH68nIsxEuDJqxmZpOo
u+yTAxLmXltaUV0yW5CUi9UY8V/QwDS7GmMC0qWkmKJ74liADOgeHNUQXSjJ
09czUMWZGvxc5K7xfkFCeNW2vD6Iq+qXtHVmTAhh9wYmAI6grLi2rkjRJGOA
u1gk8KolLkmec4uAd6W6Pmyok7OGr6FhfxpIZaYD8WvqDYiJbDBgq2Phxjuc
xd0yUAwptRAnJL3QEAggzsWulMw+3KzaZeG4/gzkCgIjUSOvXSPGNoUedGCr
xYzMj9rnUwr0iRshW6LxmBIG/+V23rHNsyxqBt+FLyvkhBTRT6rXUvKj6JrC
CzUzKAVjgA/FyuHnDJiuOkqRiDxZ5/i3oWv+XnqMKGxH5t0JTpFP4jKKkx97
bbOuNovhKxBb7PvfNArNihZuGUB8hShltKquWESLyN759Ml975DWSNME9b74
cPNYnHYcS32epyF4jNbe0JBEH7bI6FgJNOYVaFaI4LzRrOJnqvZn+vFlisn6
j1I99L8tTL8QsIMI3AA+OWH4g9u3lCRD/Od02nuJOXy+JQEvkIf28J93Zd77
oahq/5A8KA/t0wjO04twTGFLB9Ldq2KRuT7jhw4p80bCjMOWfHcPdExv0Le3
ZkwP8Z8Xci3We5PWze4ErSGGfo1aGg5dd9xI2+yGu4wVS5h/PYGaaDxE6/Qy
/dg7vlg7u+GBdvfvK3RgtndHS3A8ppDTdSu+OwiWQJqLH6INJtih3bglN6bd
B+6h4fqHaMXP8l8z01D80N6BpFB9vO7BHNtXfO+Rf+iMwTubDx0OtLvh2u52
Dx7yofFo8vFDtzgtWyfJY82UZ2+9s4I0F2yHOExnixE2vJjYIX2hswE0w6gj
micVGq5WGdqQGIUShpUTL2EK/NtIGP5+jYRR0wBUh9NQzMhl21o8BPye3Uzi
fdgoatT0It69dkBrZU2EPHmzno6hy7MNPYU1YS4j+Iiugd2w4SMtV3J7/WEE
BSQKsQQ2zLAuBjvJ1CIfZ+oYgul+yItVRW4Uhxnptfb142+XePb5f6CMO+Zh
TfAycUqONzk5hux7jGE3jQyfhk3ecMmA/Y3UFqmh7ErzvmqPZxMbVnQTyW1e
82uKuNwWSc2FSITEdGs4cpIu7BZOwTRwokqDHH9wdDuTL565NwDxkJ+JKu6P
eWwdbG2dWVNms7ERrKn1X3F395y4+nRvDr/BsBj+kFUq/TI8u+Z+w8Cq+Wst
vGKhG071iLGPi8CjXDqI+LN21pZ+6HStL8zpg+L3UocrtQJqfvqew63RkTkm
EvXXgd4yIABagq6JfRfkTQon3WI6wdi1dgHeNFDtvlmgfnZjKg7NgC9i5tPx
vXF10w9FPgG7xGOJ4BoKC4ghcuC7VThGSwm1YpmvFoxm3ixxQqi1vLoYpY73
36nzKLWPlUw7dm0RthFJEwzmD8fWbeWoVXuIRRur6d7Er7q3YVimfEiVNdaP
PTpAoshMOJK7WoGmilEruno+8eiqWM2wxgau1hhRk5DiL3Mn0ILl1V3Laywl
6WOAQjKAxaNFxHIgmWZABO3QIYBNRtt45pt1c4DWPTBTlN+O+R1E/3or6kIY
Y3KU4+JLrZg1YmhNOXybKArOR4hBa6nBO1SwLodbdA96ni577KvzEIU3HJkW
AEcc5qdPoZJEcILE95zNQ8nqamx8ureCXy/hc2CDf9Jb5fZnCSwk0yCuvAzD
s6IAq4P+cAAKRMjfnLOkmOe1u46012z+DqO/39+PoQiNj3IKvKKkRSSPFgpj
xPvHVRSE7fxDOr5GbQJTgUpJEFXdzxZDCHVAq6Z33Up0w6UwuRLCMKCj5+JJ
lPBPZxSoXskqJaw365QvtRiZKMbWHRMrs16j8wPSwRCzqXOODExO39ynCdJR
Z2wErhfQ8VrADBep7QYM5jMuKIRVMrg0GmK1cP5SRbzy8TiKOsTyg7yME/Nl
fPmvBOmNJrrqlqURKvRf5s5P07VylDvjyM5JJpBQ9IB/lRl1fDnd7t1Zt+1+
ldVi9qTAFqhz19pzqGR82CBi3HpnfIctEUcWh6BrdRH6NNUdyyDy3sNpZTLB
CkZyWNmKX53CFURtGhm+S3/g42yLWx0UN412vRzW56BhZDTm5ji2H7KK6Z0G
w6OyUd4LTgJ3rAIopg0H2xcY5zqDb93wubjK6FrKu0jcuNDSu7enEfM7jBmX
hk5IZRW6B9ZjU12yaC1ql9K5wvQODB6mJV9IpiF+Q29iEZBIj/RG264x27Dq
MLHNqlDtEC02jN7UCNMxR+TlJlJDJDqfOjbXWuu4GOm1i3f1HPeCWCFYUS9E
DGcndVjPjw497oyLY+AoQ888qNpJXa7GVKJPQ5Y9drUqvFyTt+JaNaKdhBvo
w/8ct2jQhNz/swEVWc/GDc/YaJyhoFc2EbtS2oU/OMeMELg5QcCE7bWzJM3f
p4tt3/DjZBtX+uj+fVNT4L6CKf3rXx8Pt7e2nq1Kk5vmB90NR1gtZ6S51YXp
RIhf+tmGz50aAJ+ZTvUrOuDw1cHhw73tJEn045TgO7d1aPo48zj4goe6hgdy
6oIQoFPnA4sp4mwC7kd+iVUVRQC01cXwbnua/R3G7MN1yCYx93QOkzASKLTg
UdGM29/F4vU5Marb0AKM78wGTR0CI6BkFRtXLdUAp1oSidFf5aLyHqN+kl/U
2OMjwnD31nh7oUvJIfL1g7mwJiX4R0EyZG2JIhbXKGx4rFyUjKlIMPIjcMFY
fTN2JwbZxSsw9Ltddq/yP7ukTWaL1itirQwkiY9eP62yC1sjAcsu4GmmvA75
zoTrkrhrGZj03Hb52pW7ZIxIa0eEX+cWjC91aZHsIXJ3wJ7BSoVP8srBk/An
BUVz0gDROJOsKUHoTpRL11eXhQ+mkRE6jhYuCGvs+cJVgIlH/qRle30JGJS7
NDc+eQ4RQ/RKvZiMqZi5RkzL1rFLXNh5EpFIdd0bYWQtPhw+BCOfdWQi1Foc
Kh4yllahbtDuTd6YFl9Mu94nwCLqKg1nyb1Y3N2GRWBLl2IDZnfWrkNf98Js
aMORH+/FG/VWBivfsFFYSQiKSYyunYfUjXCN89GFF/DIWvXHV0FwvZ2CZfla
QdYLnIX1CHtlHQU/Qd8vKkkJ6nJmghSLhm3Mx85ZTtfJfHZ1ETCASzB6s7Ao
bIsHHE3TihFf6WBwHH9aaaOitbnV60RAsdaUasH0F0CavK78VIPC7iYTKahi
r5RLbit/YAKndWoqURfQyjWTF2N+q7d1tdB1MYYyJRvtvDz+b7+8e/X87fH3
L09enZ88++Xs9P866XCi4SRz0C3akmYoOSBxTjJnbnUJI515962BLXipAZcI
kZNNfIkcbM4HUphRGpyqYK+YlC2/ahzk8JCQGbcGFL1xUBQiu0nAgfXsDz+G
kvD3kU/JHLXVos5nlge3248+9lz5s8uCGa/mKy6VFmyetCOt8tIiL2jZ0X7C
zJOLIaNDElhoN9YZ2weG2nW+oPDAgHkFBVT62j6Ms5b2A57ukQzyakyVUGBf
nmTkkeZa3A6HHP5qV3W7AapOrSkl4pEGYd317jHebGjqQ46l/abKP7rJrCje
J7P8vVaRx1wJidR1TapWiw5vZjtCpXMw5i/Yletjhub5x95qSRhBvBc0Cgyy
5ise7xNuDrvLWa5iHFnsa3qlhyEVZotaXQJ7/T1NzvSVf6je+Piy6EnnvTq9
cGLGlx66V/BveDncLEf091RRgypI+cLxFuWsMjotSGgWRfiPuEj7YYYorW/b
1EzQmex/JRIizJ0Ux6ccEJMOq26DW1R5d3lMICF5wYXdXyBBcH355nULFaQC
A32FRZnEHnueX6B2/dDbJzQb9tpSeJlM1ecsRiWifayxnnd5w4W6tZRo72to
wbrWIzcx2RzXrVdIqkLSoQ0jAjhWz2MIeoeJKW6DyTfmwmGH9lEqpmpuQDgl
Etiefi5yWk82KwS0TWNamcF7YF+6rTUDEnAmJTUGXxijNTCbaZP+WB5GuxRn
m6NQCO6iR5ryiEVbiVmgYuHSKvzInavajF9nqCdO0lMpKks0SU45bNSXJFZO
QO4SH8oKzgTxc7TwpwxTxjLJonKbsBT21DsYDFVUJPJT911ceIjWsFoWCyOV
HX9keOMge0H5KFUBWQi31DqDtaUqLUqnwYQppZ+gcmeOH5fmGokQylU3IKiI
RpkSPyaY6hnpk1SvktmILH0YWsu83cks+2TXKMpP4Vy47Rfv8aA/OEh2np+c
P/2hQ60E6JzwwC49IOFm+og7E623ZImaGG/tEeCsAEvBXij0LMmJ7Rebnm7q
C8c9cd1oPkFNFnluwxWDvPuHZJDs2J47BEOR7NhzhmrdCeX3SiyB3HJI/C5z
En/mqeFuk8G4XPTKR++G3EZ8nBKkwwVzElN+WvU/dGnxRabmnRAputoNplOZ
PA5Fl0tSZL+Rv//yyzL/8I3m3Zr00gB3VQdMYTC4IKdBGTpXBSElLyqRDWmZ
HN8Q3tGuKTET6/IapruiHGtsfJ6+N9ixyEY1n8wQ5JpiPyzixUBKFRetYaCl
VMEEP/IZcXUQ2swZippo7MH1jAXJhD7LgXPL6lmeaTIQFJkIVZxYfDE7CS/n
tYlBKzxiK9NuFEJCuaXthKgbkQSh+4KqxutIXgLGK5hGUiio974+XC2WT5vn
rtExYvb6fXZhLk5uRumx/hauDT+YZzxlxeZBPGFLJDkbITExyAXrVnKH0SvA
xsZRBpu3o5+akJbBbYbHnIl05uBOKxijz+NyIws0Faq7YjXHnTWlqDqafx/F
XrAZg0XpCd0EtfrZJJyhc/wwYKZwVFIO6J6oBm59kWnyT4xlMs+Q7PNq7qED
+N77vKDgRtcWNQ+kgsnfC1cbtHW4VBgJydoBGpjxdl01KVLLmPgmerhweNmk
/fwJ7IrMgVOiOPTM0mUD8tZoGBz+RCWSkI2Hr3lAst+NEoPD3UaJwztSooW/
wcmAQofOe1w8uk4KK5qajVinRyM6uGLdto0v5GtN3tNRaMy0DjAMSAllHV8Y
HoEgSI9l5k1mpzCmTZWRAXvZmZQmb0HomyTRnGJLkQdjLOcYZIHYA3EVZ1Sh
RId6FQjiT/cCwYy5PFNLLumYCwLjFresH1Jyi1Jir8FQD4iEP10KmDp7hLyJ
IWudNWYNreQNFg2fVrYU0wu8VZWIgOuWYBK81yMFLw3WQ/GbHH7Xa6Nzk5qN
U3c3UG2v5hw82QJjH6GVz9Byr+oW9coBKIfLpktilKq2LQFLaVUSwcmFXzvC
FKa8Bc2n/h4/whQPKeSL2I7BpwLAEdjxfHyUJKTyY3iUjJKgwRPnDfWEdikQ
u3kl2N4uMDs01T0zcNAoXqOD75CcvGYNxCdKhwmAccp+ZCW03uNLOWipiM73
bBUHoonzJVpqj+5ldmR0TQ75VH3XeWlow0YH5RcLvXgqgpWiQffdEZYBBbah
KWi5iK0Mp9C5TNzQGyEgEXAOHKuuTQilxg0ver5d/qbbiAky0ayutOgNw41a
tvLwpuFicerK+t2Mf3fz2DANQMaldiFdL7AZZGnSGQqX+cVldK5Vu4c2L4nm
4Lym5YTSQJ09KSH6aYnRjDNGNY9DGbOPAvXqqDJwZQa3empWtjg7s9DX5CD3
8MP6EuHwZxneIhH0Ds4Q2lEkxcgkhHFGQ9B4STKvCIrNXa81FgyJzawTA3zQ
AmdST3CGAY8ujtBmQ6Hkwl1afsEYMPM5X2EcPljrBA4MRNUVw5RUvPOa5BWx
FtxMvMGWRGiK2lPcPsNUAqQVoc+/obuZJkjO06lAntpFUK5L58ImANiHbrp2
viHa37DqMN3ZYTpQKGfgVGgwMH7fjkrL5RqWGhBt4wVHvruHyc43uFBYtpj0
Ds4qx9yn6puOwlXwQrh6LcL0dw/DLmUBoa0lFWI1t6yEtciXQckBBYJ/DzSD
6Obn+TyD3epIAL5zoJEeGymm7hZmdm1sCkYDM0G+5CRCCpjwJBeFIzt3LHjL
WitSV4Rx4m6/2D1qEtQaHlWOwZTcFxrApUuwsCzU3/qJwFP30Zg9exGyiclT
ue1dOsuTq8sCA79XAnIQVGyXnhS9xvdhshgDR1PyKiNYP7m68wiZ5PBVYM4j
lEjNGTPoSUt96U2qgQgh04wPtwWptCRXfLP0ZkspQ5sCzZmghB6WBBmkPpX6
1q38BOos2Wbvnr3pxMmq/Pc5lZzW71sfkeo4O+dP5aGWVsjKkQfbHyGHcjgj
n/HLfysSCtaMpRGt6yhoJX7kjbhD13a0cen+Rlm1HLZyu6zaHxju5bmHKpMp
bcyzveFdBSwRz3sLXgnSObUhcDMGKs15mG+AMmnMkm9NNelBWnTAtsCxGAID
xQdsuEeJok+A3pIdGOH7ELdEzyRlT6KD+SXGttrZu3QLhWlsx1Ga5h+h5f0e
4RDzpDsSi0aXrcpSS0lGuY/+TEFBGl37Yuy5uHGtAzpXtL7ZjTBZ0ZXmMcK9
LnDxvHCuywJXsg3YjkbRAPN6kV5npUBgMVYKS1g+YbgX/MROi0tXc3Sqwm0Y
ZZJWzCsIodYfVHXn+ykGuClaGjPaHOYGATc3IXX0pU1w3owF5sGU+EaZvXpp
5OUi6ZuBZKsmJTBniYpESe4SeFw9AOheEGFdvSF6/fuTc+zi2cmLk/OTzg0Z
5R68hBq8Xf7KZnQSSUAyCCVAL1KiKnWl1qPR0DhM9gWNJrxmcbbun8ilhZW0
yVXj/OCfPmlEBgaahZeEcY7JoD/YTXbwGnLtJaHNrwsuCeMox2hJVTOLRtAK
tMZo7K17YNfUL3iE/eL3xF8rR8nT5+7Ox6dNqzbWwo/wqATyQrJfOhsx4XgK
dClPXYXceR1kpxu8Yoe1BxtvXG2/eGGfznPrnFnRyq/pfOM60kciq6hgxG1Q
fbp34RL0ecVcOm2NF1+zD3KA7FXrXQ9zk7awQoE8Zshx7Y54BzqBwdNcq/jt
rnifOHXm9iPmkmgeitJFRorO4PElMcigCVhJbdEBe9AfDHoP+nvo+M/4NokB
Dxhe7aPcQdoauBo6xW6rtgh1NAYWWhxRbnFUhdDYc681YBoy32Lo+5UF0SS8
VqFX8TLHsUh+imJV+lp2Ux+oMoZP6HbCeYfCx2iY8WL1jflhEuabPaNlQdki
5xzKKwhadiZdFnFc5oBdsE/PXral/jlD3eeFN0bWkp3Yx1Sglv1uy2OsAkXE
2Jzi81egRA2cazTLzvXQK6joI82n41i8vF4zqlTHFaKcSpqvK1DzgGUWAsiF
WoltQoIi4IjB43vweIGP+ye87f6t8Z/QuUCC2LSSTdHZNVhyv9vSqD8kkMC0
zQhG45ty+S2yew1j3zBe5qMez3Jr69Xr85MjCe5KFlJ2Y80KmJuJseOHjp1E
qeheSRVAXPaHh6b+2jPV3bgDK/imJt+kV0TRB+Mrsr9mhQF5og/FQeG1Boa6
5pLtccE2/PyqTJeaH0uDnCBy6xpMIYfX7aJ2Vos6vUArBNv+RYzVgU+xdK7z
EB72xEcz0wMGR1aQY08QOjYNq9G7eruM+g9EYWoIaIV3vmjhcPx1pWZLWwDK
FTHF6A7XzaYCUS1ZslQmypEEr+6GAnjrCxs0Chq01hijElLwxigX7P72ugph
GSN8Z08LI+BEb1imJp6Q1DQ0dRH58qLxINbAGQ4PUTJ4zUOLEJEChrusmN5s
294CaJlqW90CcviGntZhNKv+Z46YO5RpROGisxP1hihEplzW1laPFvob1883
Hm+D5GTfPWLAGtxDfL+NebsULUHP2Qrirt4T72fsbCbptqYEOnJZRG3gQGS5
dDE4NG7iHCA64fxCLV4aXc+0ylZM6A8unSUkyCNuKF6YDNUWpxp8HAwk9MAX
tbI1ZlUh9yGv58GQ1jxsblJaAzUiGzMM8KTCK2j5cCJh2B9FAJFz43qZc9GX
dZ3vELaINW19vaRRUdSuhnbH1dujrX+fT+6y51hZ4w4ryFbqrWfBdbYlL8Oj
uAVlWIIADRP9JoVtP9bZohJ3oyYaFMlFWayW5poMH4gTN4qK/qFH8UkKzdOg
otdyEUceJ1o1jdk0q+fjw7hE6yUwhS+uloN/zFcbjteL2RHo5VXRDcN50aTz
xTqijiTtjumpZYNa7raCdT+i2jEhWEA4R1uVJKA7Bx5APHpdqREyDMIW8way
rYtrqBXhJ7h6Q20jbYbMin2S1nZ9iLFEZWT0XhO5I9O+xzU3LBTNkVWA+sOz
4dqFRoAG1Tzhg06gOuwEZYc6Vma1+Ll8AcHbiKLgZshE3raqklxjk6WQSfjS
fLoY9tq3sddsA9OW/SLjkMM99ZXEifQlU0Nun3H/kIlrGJkvR1yZs04h/8GB
Xzm0ahcSoyg9irXhQEF2OG4c6J7qCTmENs8LXcW1Lx1nx/qLdKKx4KRF1YKE
HqK6Y5uPozHFyOYNg0YuycJq1PLCvaBrwwUsSLVMOZVW7jTNY/ZgIsCOKTO0
JYaamY0NUUZDazK5e1khXcu1Z53m6PPmv473IpvlN+2aVC0TNcj2GwCdpKSM
cBSswc6Obwz3ULKi/qp+UB8R7wCCUnEhor4W4eYgEQcI2KwTvnDAGpOg1HYb
QTXpSd8Q8f0nQfyvmxLc+l28iymQol0Z7BVrpeLF9C00+HR7e7a0lpVgPHZY
lx7nyNkC1FvfhZeSTRTgxu1lC0bwFl53LhiMG37l4sCfNZoCb3H0D1G1rumC
lPkcsz+8Lv39xoILxmM5f/KMMKmp0LS/wo1uhk+VpHkLYSyf3d775z+HLzVa
0Teo6C+M4PeaUXS/Szup97li+Ynn/80amnFlh73zdsPl7mmz0vSixx4/lYrC
KyWMvhH1F/bOtgAHptBtKCo3FNWisSGkEkhkl3CEsYO3At49aT2WRjGR8fBL
Fls5PBR6Pu3YMkwUec+58Hzl4TQTUxXDYSfIwKsAeC+vo9JpcCqLqYIJkbJj
M0MoQ9qh5CH6NaV513UKH5cci8O6yyvSXTA+DdUWZoQYFQhm3Qc4Y4IrZqvv
aNlsrlnpC6Xu+zzd+fiizK56+YfeRUZX5iTs9RVmiRjum9E6sZvHXc1p7i0W
fx/2YRzTGoY/iS2lnTenP3VYS5BCuuSQT6k4wwFbo92t3agBU5o9dIXzLviC
dHFvp89+2dSh9R5pIUodw17fVEkWnccgC3DLoMhoqWmyYM863g8Pg0fzRx7U
HZdP4aPu1n7fF3b4b6/f+leDUvCe2hwGsY275+ir0G8lKbSoJdEUpQonqsIX
dCkjtbalVCa7PzU2iW1LXppgn2l4Z12ZEavCOLW6uMjogNADHo6CVSUsOUrR
916npcrnGLxJbmUQkOQik1Q3E8pJI/dqZepdtKjjk7lqSuWyPHu/6PEHqCmR
knMaB5T64tXOrPEGatf3bW8YmY+JjGVV0TgUFAWGAGLDRAQK/rgSflTK/YKQ
TOhLl04Y2NQnPzpOIc9KdrC30RXmjzRyHjhFEhLAt15rKJppP3lChZB88o7D
QqLLXe2a4k48fIoDc9pQ3FnAWOIN4EpwCz5tLrq6ArGSlnkhFkWQ4jHnzOMN
HoSryPAktqs5QxIs2Ax/X+No4d20NYA8zVcebFW+/dIsTgI//9Jr5yVPkt4f
4cuesrak1/vj1net8rxVFfjOKS9nqlkgA8FRqorC7OWz+/wzncnP9F7yFX1x
s1uxGnO7n89bONvwJ1yZ+Ns/tmpNW21j3vij427oX/Dj3eBtQ+79cQeYb+fr
u/zKpUr+KdcqEd2ifcz/0nNUdfcek9aQROFYrLYa5ea5Xs1v0EhRH3rj/DWf
7nlXjVR9cN/llQCah7epFtwIFVTRl8Wuw+EF8RJ0/8HpEcX0CB1UcUxPeyjG
GnTVKNjtD8hBsVFkxBvrXfHwYmy221WgsrmxMa6bBST7hxb0eBrgFruFYTnu
IknWBOP4qJ2ut+cpc7KinjngUpIzsNwSqW7a7kuM9AQSGHycTv01ckhNCqrq
UXv9TZNDTAuutW4MuIyEyqDl9A1bPttt+WwPjxq0MIRv95J9kD2HoOk9TB7d
6TM45L/x/4S/+Ihr+vtpBEm9k2NG9nUn6ff78Ux+jzEMk+D/aAy615v6/h3H
kOyQ/sNhPHBAUGKQ559G0R6p7YlNI7T1g83h15v90p/uoTNanMwfSQec/ZKm
k+Cu8wmYImlZgu6EAQJLVcDIVSJXn4ahoYvu6igg3+Tps2cvtoL2H/Pr/fEI
3Xvp5BfqYGvL/QpP/BnWhR2Mv3yQjIGjZIWlM+ELY9scJX/GP39JMSCaqu4m
95Mam/8ZnxTN+Re054+oW/vpMv9gPlUi1E9+DvZii/gZ8flwXEeeA5iYFB30
Qq5Z47Q1VwI5MN8YsjDT/H+63gDuATb0azKqTPlZZGrlB8lJFVxs6bTqs+DQ
RTIj3GEQNbpvG+Uz0Oc7BPlDq04oKvpSN0TqW2drmixj3Qbtnf6IVodk+rEL
qbDXNS2gKuqSckF6G3322K3Z76jnAE6H/a9N1GafEs0GVyvQTdARkNDGjuwt
/W/pT4gz6iuu06SX1hHu6P/8f2+lDfxDpfw4mIpGMoccgNC4/dm3rnpUUtSv
j1Ecq7pXTHsjru1rMLy5zEyE3a3IWCNBRQu4VSour4ZT4lpaFWtb6wpbMe71
BVY4ncvKdsDqKFaHR6QJPASuzUasuqn8Amb7JeHhaaKarIUDfHAnoctJsuiQ
WBP0IrgJLoaCV/8215py+UoA5e40h+t368vKo4YxDV1w6tMvPpAMZEOyreE3
293k8ptvumGPEePm5df7Vs7RNffm2IdzbVGyHj4WMarHLVFaO8NBpxtImMcU
rtIN5At+tnsgGS/xgT2i+75YnkAjQ2idvAQd+N5y8sHHh8MBLP4u+xDw64Dn
4QDsuwGfopGYL90oBh9Bx/UtOkFM/R0Mhtjn/nAw2B/uHuxD+4/8s3bl8fH9
R20vDE3rsODU7t7hw/2Dw+xw78Hug0cPBg/29wb7g/bXd4f6uvGAkjyRzcsJ
UwvxaVihl+gh+GQor1oH7sQESJvh42W5ym8x/p4CbWN6L91/3hv7v75oisBi
jDFAT4CbltcaLPY2E34rMDSoRXWEb8IMv3zBMzOiqExCZqvmePosZq0ggQWS
ms0y0sg0KA0T5ulSIoik3EEJ0wlCEClOk17FzHMuY0HoD9CKi+VCUBdoUa4k
vL2C9kyfxVZOcaRcqsucGYMZkDLSiCg+2Ka54IUFoYpbNq5AciDoFmeFPkyk
yjmsAcv/lSI90MsI32I9kVTuo+sC2Mh3Sv2LU9vf7joh93GZUrCRh0mv1CV4
lWn97dSMVe5azeZ7CKcus+1rj3eGvtbFJCVZ6zMKHGs0wt9V7zK4B9QSOmsl
UwLE+BIvfGrjtD1nDzCWx0KKXy4lN4GwKR22FC2FVTUID342k4uRbZ2OhOzq
jZ8JfWzEOGogkQ9ubqmBEaH9+St0sbM0Po+NrlCbcaE9LVlR/B7vRdXyvauV
wbc563QZvkX/WAe1G/HwuCNgJiHx4j+RRodgj/+BkRM90vCEAYQAscHc2YwK
oB35++ksvTARu8bb7aR4t+Ua0oSsiU+QUNNxACYWKQ4t8EGokV0Wm7YN4z90
SCYL57UO3JAtJvGtfrY+D6DHwefLz+/BDF94V6a9sotM8q/uC72rCQsCccLj
jKpgRn9cY/Bbz2V7823J21ufE+PO+JyYnYw/Dmb5+et73FA5WaIs2Hlw3k7g
G1wJHJLE2Fi4ZN0YXKpJ2Hz+YphJQdrFRxzB+oD1dYeBw54Tjo9eCxiDbXKv
cUPSw4ICGheokfmggI03gRQ10MonTcxtRU0esoYHvz0IzPO+Gfq0QKSs9rGr
4cTHFxeym7w/klA5CekdavIXUk0zFHPNSO0A8ult+jcxITSOy3XjaO/ReESD
5tZF2poBVvlH1MuKJMsvLtcNdb3/AwQUbQyGT+BzcZIRBbTTfaHkw9MLx5v9
HORDhvMpFKptm5KVQ1oMkzRmUYXI9wv6HWOWaK6k0SWmBJoW49/kdTbXDHhX
rlWEsztmshAMEtcQwc/xsSf4mIuoirIzJIIP2+thexIHGBpMyvfN2QqEno3+
z9uu15VMdxbJH5NBp6UL4cymh5AphES50yChpHJdN+lXCXcHy3AN27qvmjMM
mvmKxn0pr82LR8c9aD8Ist55r82GZg8/qKBBtGB4UNhh2KqMUK/AliXqm64/
3BFytMSBmugv8aa/yRTncBXMYKqFFMN9CrskfwsnVVVa7clV/iOMYfeypaFo
6WWFNtXfZuVncw/k9SIfqvWUxIU68Ejj93XmCnZUGzVEj2QiZwn9+HrhGKY5
t5bBNHQx3qj98iDYa1FxdnHIe9kkrKLkv3FBhSDBKMqr2qRXtJi3mTa+3ukk
dbn0wVSLDvJQ/9IwGPRwsJnDCMx8SWrvQ6EHeq24KNMlPIkA+1mJ5ADvE6RW
o3ASGorcSktpW9rWq4zwwP3TzcBAkfdlFhowOj12B5KTGz/m6GBvT5rKpS1W
oYN5aV0YuWBd1dikCN41sjSug2VdEF+6YFtz5TLO778qCLCqsnWc/FbExtqV
QN3wAT9qsdyEgrFkwRFQBDqfqf734+1RWm6DiXyN+qS4Nv+PSR91RdA8UVZh
3N9bE/FpyRtdYmmWDoYHB4eHDx7t7k+m04fp7n62Px7tHYwedRN1pu0eSGSZ
FyjkYztoht084Wpidj92dvfFbSQaZELXSvyDbkP3x6dk/+jym90DYDSH8Mvg
4JvkS9c8umm0rpnI7RgPkEFRgvENH8TjI5mNnx0lg9EAfobw/zznR95zJw9b
7Z08f48GB+jg23POMrWoaBuPblh2aF/XK5yJbunub99SjhBm71z71g5uubV7
d9pa3djB32ljD3/vjR0Yl+/vvK17v/e2Nk4r77Q1BfDz/f3D4eH48OBwtLX1
L/8FrHS8LUl2To9fHSdhVQvP953O5gtBgSAKW34oyXRztCFsPXUFyvKtUF8g
xsDAoHzsLXRo3Ir+9gZfRX/IYR7CL37ufx+C3N1NbqLIoaPI4c0UOQRWMzjw
s0h2Hm6izuQ3kOd+30Nl3JU+9drFU+Ttdnf48La7+3fhJg0x1uAm+CP888a9
M1c9vzMnOfitWxVzjge3FAbDWx9GOoUP/mmkwMBJgeHNUmA4ePD7S4F7Djnv
SU4gU90YIwDUyecIJY0x3F3JL6RoaoMT+emelo/pCboKRyBFbWPlHQ8zrbB4
Lpp7kmGzBNwBWjSW2ZKEl0qzUuDPqioWnIBIYYvpuF4hskaFtafxliVOlWEb
hjamgGZZWTbIuA7DcJSjoRpAA5jYjIrLtClupLfCI7qNIjrEqMB7SveNQPJY
oOJaq5z6kMGqVtDi2/Tji2f6CZhUIxJuhKgV7a3mDdk4faoDahKFyM8gmejk
IZjzyCgvaUy3VA6ShWflG8Nx7sDnXW6rAzZFXlYRTmeUJuAiNQ3CtfEjYL3b
suQLKUpnsP6DSq1NY1m3Q1+49IUo2gadxAEWkIer9pUqtcqJK4fE+Nx8C8mj
x1tWh/6+BllFPThAwPN8zDUnk5cOjSV8+NO9efqxVyGjJf/CzagtLdg26oRt
Q3CRWyTnNZ1x7VbY5t3/e3/ggPPX9Kd1VWs/tG4Q1+rpSPPY0atKtBSWfsOX
GJ9AunLZ0ei/9+nhQeMCmJCOKV9Fys00wspcEW2qgrWERRGnhpRjjcubaJie
K99Kh8ixQ06W92m0Hg0VzfLKew8uVilY33VmfBgmjwjdEAg9L5fW7IcKR86J
KUEFZDje5L2sy2JxQfU3EGWIjoi2PdWBOuzQAtHvqEqQY5wdN24brpyutMQw
p/Grb0NThBiA1IkFW5y1ieV+i2qrx+hMkmrDl8UCRy+8UYPa4HesUUtXsD4J
icjW+t9HLGr8kmtOVpA1FC05e8klpfNvndAl8Bvw7KgqZqs68wvJnbfUOmk+
mlAh1qssfa/ZdoifILyTyOrtydPXL1+evHp28syTnSt7cYF8leINenqFIA4j
V4MmdrvFS+zquEXkDWJ2lCl5SqouxZxE6WtyGsOalg5RhBYXZuJ6kfg7LRU0
QxaBaxaeQgUXtiuoRQawVJI7nITyiAD7fkmdE5j27TKotJcF4leiAnFjFWsB
USfQrzzHABJ+Tzpw1TZs+T/vVSWe0qZTNRPrYgWKodqkUJgW6fL8qHYaxjdV
ExXC4UphpSd++0+ws8UVVnMOYFxs5GMaaulrpIFbs5agV0TP4GBEU8RbiEGk
TF4JvKjEGtMlWVS6FAeGoPbrK60gLPTxf3cFObjyAdU+kxzS/T7q3e8W6aq+
BEn5K4L/BrUUEB8LYX1Mx1odwoEXg7zuHV9ktoSGAdDqcukyrv+3iCr9GhIL
WZM4LKjWGgsoeOFiUVSgD7mLBRyJDS/Zlk3kygHZZFs8MqJpYsIyXbpfL939
U7Dt8WWNBmn5fGUJuOI5sp7VcrUR+pr7FlfEIaHSjU0pd6QOooIBsV0+d+F+
l6DW86dvGntBtWm9skwXYa0nlm4yWDuQ5JwroojGo5IhXW1u7zsMy/+Bg+G6
7k4N5jinCMRgpqtFGwQs4WyR3HD6j2C9zApkgIxxrgfbh3bJQ3VBtTlgi7lg
r+7SJJumGBwm713x3uItdEGp3Tmh1PvEMUJrNVBjW1tvPUJZXDTaL0Angt4P
i6DJ3QvHSI+K1WIS2VNuuNN0LKn7pC015ScKVSoLh7QUCqRm9IbLG2gWvNJb
Q9wnjS+36juc2XziIdcj0lktzXfNxls1+RamDv3EFfFay57FYcuk+SGndhez
CL+LmocpqezT9vn1NQXjZMspxFI2pWlYcrSPr5oH3QngcyhdLbKY3+JmLUmU
KbbYDW827StWtJ0XUnevrfBp1UJ+EvGGagUqCXLVxwWcwgHq4TUj8BpHVOrN
prM0QQS5XloL4p8YLW3rbcrn0eqk9ZoyeueXYTWgWLQ1FyQcIrNjlK1cJsfn
W5gFsPaDrWbJgl26p61Rq7eKO5ZuPmQOPsIMwtkvLUvh4RcC0R65RZjksknl
QxrbuO8VzDOAr1i3/nUE/8I7icaEx5InfwIpBrjQba24LW4ZC8F3owr3oqCN
emNqBqmmdYbRxAZqjaKL8ZBbL5iUCUoD50tYV13dLF3kyVx+lo4QRx5LKVdT
XWnhpakz7mC1JjMFMUEbUHZhxsMv02U+wcwuLTNBV8pBEaSPTjhVGzwCga9Q
FctziqCiQ+RAK0h4k6b49vil7rq4w1ASxmiipAoQMDs0vViQsEUUB2q95NZ9
0HkAb8FltQoS2dMA4m0owQ0OMB1B2nhPKF9EUr3P1C53yGLk9w2kw3zFEjZY
uCZe2K1XTdEhRXupjEF2q54odOcDaNCsgFyWmDZUSK7TLJ9mXPRLKyJ8yMcZ
0Zfrhj+jFfHgaVU6beuLlgN2jYaj42s8xikFLp7FAVKO0ooweKGvkoL95Uwg
XMiHAs2pGWpLoMk4eMAq+yv5nNVvGEhIVWNlcifjy8LBha8BAOGi0O7YMDSN
Hk12SabNcBJDxK1jzY37S6jKAKavgadG+0VfElHZwtbdeQcGu3s7Kq4uqcjc
S0IDRJous1pCE0tUJX8zniAj97mgIiFgf+QdKafJRVEg/OOq5DxAD22IoHl7
bfPh1avLFRZX64FOV05oX67pKpcqriEmkCPVOdVJVdtFGZfxSqVjh2YIj01z
Rj+NzxyGBsGue6FVZhjvVZpMlESru6qhsWl6W3i12bJbK3Rx0wQ07dU1b1xv
RXmFZWdo5ce2pB/lZ5NLI9zfLssLlt9E4TWMEKF4aLMjtkYQoyVrDeFCbJhS
8wCytUY2zzyvXBKnUWvkZLopOow0V9Z4ll8QTuiYjCJi/igQMip6O02WYIJx
NtJqLrUcFThVl9XGABSLKaGTiQ/AJumkI2SKGqyG1bM9yBNpZ5dFzlOWb+dk
bKPNzCxrmVKmVu4rlzLnrAQ31YC9kTePOi3HlzlaByt0fryrWPVs3/7coKPS
CbNwrMStle4i8uCyAW/8qn+6Z1CMGgUDOF8myGdX296/1rf5oWZDqR6JVsYt
kyeIY9cjoGySyzYZh4p/MLaSDXFFMkpnxQWzOdg3W7fUJxxz3T0Gj0VavG/r
WOI1U4D6KdeJXs90te3F3Rgm7zLjfZ9lS3a/ihZP97rUcTf5y6f41HTXX9D9
Bd3UufHdoa0oIFUOvLCpXMjN5UoUVbxGNH4/WF7nmYsvFu2IBbsaduaiqGtc
NJLSee3NBV2mwODb3E/XZlFqaS5TwtrThE0TD8YlRvN7MgKrBPFdVacMSqGj
BwAVOLFrm+xjjQS1eIX00mQV02AEwNOCfcj+WbXhRcfTiCk6SDWF529tfU86
jCu94pGxQ+NDQcnCiCZg1cvKpGf6up/SEiupb7O6zMFisNN25OJtTbc1NWZD
0h07HRLWEZ5yyjbT1MYsb+f6U8SR7rqE7iqEx/50JDnvj7clanRbUeEIA7vt
+z4J/JPWJJ416jIpXBnlLXESAR2wjr+DJeG/gURG1+h24CVxx8yAZGripkHi
dRBijQjGeGkcljgLe63hGTvEV/E98Y94ka7B2f7x1y4mOLpfC6KCoa+DvkBm
tbHwANeD4OzYgyelMl2p5biSLkf/r4GY4EPyU4De7s+IZrBQiU923VoXjLoE
27PKgnTKDWeHz8czqcdHSEMMGDETcAmDMyQlPF2VUMmTCyAM6Qh985FwO0D6
ruYLLOfYwL8PlfAAOZwM8NNp7yXJnqB2dV5p5UCsZ4KR5vDouzLv/YAGb/wo
ejbd43yEn7kkogZ97EQE0RHft2EczbugNt7hn0JUdw+N+41NVA3sLU/JzQwa
V6AbLCwpyswqkg2asiDEDumMMqToeg05Q1cfEkpyX7sZpi3zo0kFEwq9PuK6
jNNndX/XFThou4AyVQsSrEPxm+cb3Xg0L7F2k50n6UQixhpXWOdffXl166sn
wVvYfs6QwG7sNLFtU5PjdPqP2brN63fTJeDfcQXPYscCASPgBco2i8efImjc
AGJo09WqOZyBe6kp0VshXVmE3VpzaGuVBD+Lp5vErd3uhsRtTNuwo9aL59ea
RHVIjPMGIRxUCKF5YISbhdMwGDZ9sAcuXSFRc6PkLtfXebwdEE+/4xmFtNN+
5916L2A4jrvxblL4gDmEiOR/BIFvPwunZu6nW6fv7wHIuZrdjnAbYahIbw/I
Vg2KvZIY0ZKCtp54o8Cu4+atSpFUxYJOHspKhBVlTZSXjyOMNDBn3Mq14Rlf
4+H33nqmyxNjTNvrPrQsYffiHAnUivTsUwIzyiDQko77SdJobGNdHw3YI62M
iIJe9hihzQk9OniEHlkfl0qA9lVkFpsYVXdwRcOk50MNs9UOE3PeGWIVVyeI
CmCSi9lBw0d3lg1TqyXS5O5Gm1rj/sqaRsQnz8eXiZuNWZ8WcNfDvUN7+JBp
2+WBR1fvQcKjN+DDBWC0Gbn3kTHSUCrupEp2u8ken4XDRn+TQuQQTtyb0zxI
Qn0UJbbk4q40Eqpz2ByFXOX6WEl1KN1o3wptNt0kLborOWn+E1i7awThWktS
cgm+TU5YpVTE9zYh6qgZCE7f+k9rXGP5g7+fDa2Kqr2JTasA9IqvX8l9bsMS
KMbErK06uSyCPbZsyy/fsIHUNXroGoBBNjR/XQf/MHdAIMnUK4gwSlxSMeTX
bWEsm+UaIyfTH7tEK+LCc+1+YVl3GgUYMAJg0RJnQmfr27YXaAAUERM+j4eq
F7pob3WGOXfn6w7xf/pjTD/yzzmqFxcF0t5+f93qU0Tkxh1oB/75z7AeomG5
JWhzozkVhyUyZei0hTK5Nfv/niPt5Dy92ORBMxqQ2iv2aVYE3m52gd1dvbiT
F+53cHwZUnno1YffbI/vryNl1TVuUzbHHtrujRJNL1ZdFuamntb2sobx/o29
CDLgg39OX8JaL4KlnMONFvHvYhDjEj1YYxN71n4ro/ihjyH3QFw+fAbNmEWG
v43RIyhTQFzMI3owuHxrd5+Irfb/298b7e8bVTovn9ZodEeYwHIrlY4hk+nX
w0iP8zpxumgNpuVVC7W5O/Auqh1KJVfMFIIqIrfR19MZ5oNe8806PhYfQuJ5
d+N4NwyN2m+30RuKqA02V1O1NRL9i6xmoiiMPnycOmkLl0VIy9sGkGMt9XLL
iYBeFJu7rvlAZ/iKwGDOc4D5jrNEnCwGbK8StQVo6Mnfi/lQHXVyDrmWkmKM
Ccf4KDtvzLtG3WMXlkncc4TocufGiLPPJd2CBL8wKJ+jEykhoyDJgeESoyBH
UIdte8vnlNBUZ7NrvPS6l/wpGyUv8sV7SvlHCSDxkyItJB5FKntmXORSIxXS
GpS0EUr17aIab3M82xU0OIMGRXLuPnwIGySJlRzYIJFhK1kbfLgnyFSavMsv
Hx4+GsDLjoQkkE2yTKQmNdIgCSuJOOGh+KFRoieiD7aWJ7WBSEQv8DmNPq98
3oP0xAPWCgScLGSSasbM9wtJ6cStNMUZbTZMzln1DEfNg+sG6ZNa8hSpuBG+
6jDXKG5TZFUQHecqAeJ13Ur9nLjfx3IdYJ0RHM6rBTyi5fsDdaE8zryMRHGx
oEBaIAnQx4DGJEE73gEfGLtcZmkZYxIQ1fAgiBSokz/IecqomCQHQXm7csMI
tEgO5zc7YweosoetAzkhmgHVBPfBxtGIA3ZAm+JoD+2YgpDgCd6A/c5MDJTk
O0pB1nsMP30P1DrMmIFPOGYx0BIbFNtCp5b4Pc2RjaO7i/O2ZwkISaLgUEtw
uqur5MCnq+P1+42Y029P/v0o+f7kPLnfR+utR2h/9zEQF5jzydlRstsfHLAd
tqhRPPzLfczNLcrqfp3Nl3/8A0yyG34+Q9SnP/4hnz7e5o+2W4GRdessKLIy
mU1FlYgpYPUu0mSfc5glZX2UxcdryvBIl4xMssRP4B16kuJpBV1/yiUmP157
Db+K1rP/IKq0QiXEPfC6awsOI/kxzKb1Vov0Ch3xepnwMUfoRmfWykHmqFFC
z/WzwNdmHEJtYuN2+7ta+gXj4y5hed5nksu/m/WUmeBlAfkLeS2aUXo7pLt2
+PveuzJ3d4owhaqBdehNgBtbDNXh9c2RVgxE6fI2kTG6wm2NTZEAUtBeuFLH
GcEqtlwtMVfn7CqJ6iQhGdTZcTo95vVKLRIYGV9LzTR9ETojjUMLKmDCi8bt
y2a6hPZVJae9aLmp9TH6H3vpRSbgvjetpAvdFRjIlkU83B+iAG140MUKoALy
W69d0nVXF4yXl9POKK5U0/LRuYQ+ebViUI04VgnTi4j5+oh2gkFKrpfoj9L1
VHHjnAxtsLReYaZmGDXkQ4HRStJMAAHkUvb5Ln0Rtkb5+MTXJTdJl0/94rok
HTOSTTNCicYKttwmtpg38DAuognJdQADYa7eyuWjiXIM719avTjc7C2KEv/h
/PxN8tqfgU/3Lusay0O6kieelO+7MzAvJtlMM5PnXCkOVo8aozIFGDmPWLTp
2oJAw0HE81j6YBPMbbFZOTZTRFInzBMpQq7E+XDw4MAlb/iI9ikVW6GNQofZ
ItO0AA0OX0o6qWaih5ckFSuENJvLYgnc9Mm1G46arW6uNFj8ZaQBceOyqKqe
TePAY+w64VUjQ7GlNqSmu1H7oj/QkeGOWFswyVRyN8zAsCLpKUXBpYeJRxSs
eV3gCBf4OQFJw87Tn3wTJNu/9mnNJ08XaQ8pxmgBdDDHaVk6n/aYRbpPkzx+
Ex1TRlXR/fA68votaY5PKrcwLLZyaa1i8ub12bk/3biguxgl8/rHjoHmSP50
KcHx7NLk7myzopz0zhFVwWPkf2Ogeu5zbtE3jilwqhHZTD1EY6ClatHPqLdR
Mbl2OETqGW4rOagOu7AXAqT+QgjKFtW7QrCgOh9XovsxtYxU8Q+LzAKtvHP2
6rEDBnoCaumq6r1KVyXdLyY7x09ePe94HVGP88Hu3j76EUL4NO/9wYEm+G5S
XcO8PoJ9MctMVUmJdgtg+Y+S4xdvfjjGWiiI3FTx9c2z0+9Pz5MdTGuewywn
IH7rqmP2ro0y2ADJK1MrJdRbUXVNR4vpFqYnHu6vyllvDEoQVgWjMdyXfu8n
271t/N9ftp2y9jjZ/TZ8LWr5ZrIlHWWJkEcliQUgLzIF1DddLBbC6II3A43y
MKjdt0c6OoNEe8MSjlFvdN2Df/qNw4ZMRRQVqt6uqgqfUy3FgH4wAi1haCRa
d0SgAAXLv0wCgm6NnuKjvaeMSXUErfbo5Y4k9TBWSjr2YWc/YeKTw+2eZR+w
JMSOzvFBf9jft7McEuGfOSzsTYsM8givS2bEq5rZTt1E6jvlglKilYhQ0ytR
BpVo0C34M3/7Dtb8qiKVUBFC3NO4pGprBnu139wrzJ0PUAv57VB5JEwiAegn
J2sXERWzmiOmQUKruhAsQT95SmlmDvBw7SrRPpo+P+SY5ZqFFxBr4O7D/ERx
dPEdHwklTG5HwDyBntm0U9Gsl66MQUpiFpqZ5AgPSCKBN9995IC8Ith/keXV
GmFuVIug+mVqypwZ95/JN4QjMs2p6haDkug4xG7jFaA+RLKr0qROAEpXNW2L
kU8qo4pO1BjoJdawbdaT9khXFHXmyxHYPlOHfMU6BpDp+tbHxTIXXWrtLpHy
g3JLSApjZETUSsPi7HO3ETxKil/mFzTNUZpvOKysO0ovzEjR9Fqx0J4SgQnx
o0RWL115q9YTkpEfEhMYo6sVhL5wzVxqb/AAD9ze4KFd9L3BkD/dFcAyazZY
3a4urGJnCn26VdKMEKHhqZIQv1GFFVojzTGMF5AGK+hgNnEBkhLVFMZEOutK
l4CvObQN2gny/t4LqealqMnsGtkl1RC2xCn9jaKyUQLqFMvpUeXkWWWJ13UQ
KdeqlgvvlmxIr/mwbkFZqk0Zd6QFXG5WFljR4zum42O1NVs0WXiW8NG7rFvR
ZSK+RHe5thhMy7s7aELaqnOkKSZOofDCz7vg9g/3H+Jzrq6jRlwucRUwcTcs
Ro20JCtCOqZ7j2R+LhVjjhEsc5J/TJ767ToYHrCxb9bsd9KHkV950FKqd3Ls
G+doNjZhyD5Uh5wnNqSzXaS4kNh2Y2Ljmy/H3kXJZAbCIIZFKagsQU/EDGHu
a6mLVqMJbNrKLg3htRMQBeTbSn5IQIy6L4QXUNIm8ekAtqgaFsU/7SBuOJo9
4hhhnfv4+EaKXdsPB6yIRngrav0bE6ld3ZCKzCoX87yu1dRTE1Uc34ZhaAEq
aIK/xPHHIMmeOJMTTSonZDXCa9Nk61GVMXBLqG9U/pI9TUY5xpQgLIewNuf+
Q7iIkfMyYqO4PIRAqWHu1K4tSX1OHJwTp4Iv2ZlojwKrtovKKXmWpLnkTBrU
8un7NbZYgCaCIbxeaNRfski7Nrwkbi12MDUim7yo4ROul+no/ZnlaQCsxEeW
Xgv8HVpuzUvMcL1gEFVzWRqLIi4gu7DMczyH+mKLujZdHVGczKY1O52aG3em
Yxel3twY3Vy/klNCny3nIaSDVkaSmQfFqI6E7Xu/FHVzRkpChCzBMD8C8mtK
cF8WVyYLmH1bBiSWNfKbPGBYnAg4z6wo3oN5/D4LilU5MxqOR4VIsuMaZooZ
C7g2C6kUi0DAs9nKQdfJ0Kw5Z6qhmeWTBbKVjrMlnjaVR4JJm4qVzlDBDuxo
+4xTJZAhbRsm2beWINNOJ/RMbP2Z1kSXrtdz9REEyo3j0WzJZNnUn1GG4NUb
kuHR/fssz4BJ378c3/9XVs9/gZceI4XC9+JmxAfI21xRuAb2fn/YH4blEDaP
0NIL0B1dSNBoyCN39+H4QSSB9nGUNHUOeITP1lHy9Owd/PUE9P+jZPAoAZ0d
FPThXnI4TKbw+zSZ7CaPHiSjYfLnEVX3/jmq+RDOMsj2glnyPYvq8nwc/Cyb
szAjg9HsHmzZ0g53H97mwXGxCjk3t6CR9TRwY59yij1l3q7X6OI3FNmwInZ5
Tj46mfdfgj/uMjqzTSFVwkj2xUUyMZv0Z9K+fg62aZDsDZMJbNA4mR4mDwbJ
dJQMxskQ9KEDqu57i62S0+IH5gjJnBsamJI9+a1f/3g36geLxVP/32TcUhDl
Vnzopqmg+LpPgswN+pabHuLF0iARi3FVcVw79meqgqN2T4C/ocLhbEpvh+C7
SBg7QhkdwbhJqxs7uqGD2qup3MkBdMKr0dGK8Wh4ZwsNqkVNZmMNYLp7yb2c
euKuFGSkQQCsl+w8DC9veVa/v2QPnVH40CLwtjQk+z9ctN/AX+8shIXBeqmH
fEWjJB6LTGyw3ztwfLuVTaF71+7/psIq1hdCBhhL0ubg/jn0gXgWdxW56/a8
XeW6gRffSfT+7Zjx5kGa7Q1J9DcKut9XzjUUh1DRM/L576w4NAZ2FwH8N1C3
WiRvi9i8o/Rtk6uh5F0nOjdJX/Zp0Vj/lpI1yCwzlZeoelqjHBNV4dKiNw1s
X18Ax4PnchDWujI5WsfaxZd4VHqKYqrGGZBYXlQKjGnqVCwKDCtV5FQNXwEx
ewH7fpVe4w2JC51BEOrSj1Tf2nnWOX9x5sDFa7oGQxzg4N75uKL6XgvF8ei6
28VoMAxsm/Jdk9xtcn0NF7LMHgDCiZX4JIYhTOkas9FiSmUFeQ/QJYLvXcGE
Lq/FATOaZdjwmKMGaSKSA74s8w/p+Bpzu9B/jM46wUPAijPykN87+5SQbd68
3Z2WWca3W3iH66N+0WMg0a40+Sl0grMHCuUCUOiC0uJOyY6u//ZqQUGSk6Io
t7vJdlUjTvmUUGpnaTnHz8oUs5FGZT65yLY7/eREyIrcZLQ+KToJ/TJS8NnV
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
ULvdjmb5ejbb+78D8wMFLogCAA==

-->

</rfc>

