draft-ietf-lpwan-coap-static-context-hc-08.txt | draft-ietf-lpwan-coap-static-context-hc-09.txt | |||
---|---|---|---|---|
lpwan Working Group A. Minaburo | lpwan Working Group A. Minaburo | |||
Internet-Draft Acklio | Internet-Draft Acklio | |||
Intended status: Standards Track L. Toutain | Intended status: Standards Track L. Toutain | |||
Expires: November 30, 2019 Institut MINES TELECOM; IMT Atlantique | Expires: January 7, 2020 Institut MINES TELECOM; IMT Atlantique | |||
R. Andreasen | R. Andreasen | |||
Universidad de Buenos Aires | Universidad de Buenos Aires | |||
May 29, 2019 | July 06, 2019 | |||
LPWAN Static Context Header Compression (SCHC) for CoAP | LPWAN Static Context Header Compression (SCHC) for CoAP | |||
draft-ietf-lpwan-coap-static-context-hc-08 | draft-ietf-lpwan-coap-static-context-hc-09 | |||
Abstract | Abstract | |||
This draft defines the way SCHC header compression can be applied to | This draft defines the way SCHC header compression can be applied to | |||
CoAP headers. The CoAP header structure differs from IPv6 and UDP | CoAP headers. The CoAP header structure differs from IPv6 and UDP | |||
protocols since CoAP | protocols since CoAP uses a flexible header with a variable number of | |||
uses a flexible header with a variable number of options themselves | options, themselves of variable length. The CoAP protocol is | |||
of variable length. The CoAP protocol is asymmetric in its message | asymmetric in its message format: the format of the packet header in | |||
format, the format of the header packet in the request messages is | the request messages is different from that in the response messages. | |||
different from that in the response messages. Most of the | Most of the compression mechanisms have been introduced in | |||
compression mechanisms have been introduced in | ||||
[I-D.ietf-lpwan-ipv6-static-context-hc], this document explains how | [I-D.ietf-lpwan-ipv6-static-context-hc], this document explains how | |||
to use the SCHC compression for CoAP. | to use the SCHC compression for CoAP. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on November 30, 2019. | This Internet-Draft will expire on January 7, 2020. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
skipping to change at page 2, line 28 ¶ | skipping to change at page 2, line 25 ¶ | |||
2. SCHC Compression Process . . . . . . . . . . . . . . . . . . 3 | 2. SCHC Compression Process . . . . . . . . . . . . . . . . . . 3 | |||
3. CoAP Compression with SCHC . . . . . . . . . . . . . . . . . 4 | 3. CoAP Compression with SCHC . . . . . . . . . . . . . . . . . 4 | |||
4. Compression of CoAP header fields . . . . . . . . . . . . . . 6 | 4. Compression of CoAP header fields . . . . . . . . . . . . . . 6 | |||
4.1. CoAP version field . . . . . . . . . . . . . . . . . . . 6 | 4.1. CoAP version field . . . . . . . . . . . . . . . . . . . 6 | |||
4.2. CoAP type field . . . . . . . . . . . . . . . . . . . . . 6 | 4.2. CoAP type field . . . . . . . . . . . . . . . . . . . . . 6 | |||
4.3. CoAP code field . . . . . . . . . . . . . . . . . . . . . 6 | 4.3. CoAP code field . . . . . . . . . . . . . . . . . . . . . 6 | |||
4.4. CoAP Message ID field . . . . . . . . . . . . . . . . . . 6 | 4.4. CoAP Message ID field . . . . . . . . . . . . . . . . . . 6 | |||
4.5. CoAP Token fields . . . . . . . . . . . . . . . . . . . . 7 | 4.5. CoAP Token fields . . . . . . . . . . . . . . . . . . . . 7 | |||
5. CoAP options . . . . . . . . . . . . . . . . . . . . . . . . 7 | 5. CoAP options . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
5.1. CoAP Content and Accept options. . . . . . . . . . . . . 7 | 5.1. CoAP Content and Accept options. . . . . . . . . . . . . 7 | |||
5.2. CoAP option Max-Age field, CoAP option Uri-Host and Uri- | 5.2. CoAP option Max-Age, Uri-Host and Uri-Port fields . . . . 7 | |||
Port fields . . . . . . . . . . . . . . . . . . . . . . . 8 | ||||
5.3. CoAP option Uri-Path and Uri-Query fields . . . . . . . . 8 | 5.3. CoAP option Uri-Path and Uri-Query fields . . . . . . . . 8 | |||
5.3.1. Variable length Uri-Path and Uri-Query . . . . . . . 8 | 5.3.1. Variable length Uri-Path and Uri-Query . . . . . . . 8 | |||
5.3.2. Variable number of path or query elements . . . . . . 9 | 5.3.2. Variable number of path or query elements . . . . . . 9 | |||
5.4. CoAP option Size1, Size2, Proxy-URI and Proxy-Scheme | 5.4. CoAP option Size1, Size2, Proxy-URI and Proxy-Scheme | |||
fields . . . . . . . . . . . . . . . . . . . . . . . . . 9 | fields . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
5.5. CoAP option ETag, If-Match, If-None-Match, Location-Path | 5.5. CoAP option ETag, If-Match, If-None-Match, Location-Path | |||
and Location-Query fields . . . . . . . . . . . . . . . . 9 | and Location-Query fields . . . . . . . . . . . . . . . . 9 | |||
6. Other RFCs . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 6. Other RFCs . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
6.1. Block . . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 6.1. Block . . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
6.2. Observe . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 6.2. Observe . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
6.3. No-Response . . . . . . . . . . . . . . . . . . . . . . . 10 | 6.3. No-Response . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
6.4. Time Scale . . . . . . . . . . . . . . . . . . . . . . . 10 | 6.4. OSCORE . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
6.5. OSCORE . . . . . . . . . . . . . . . . . . . . . . . . . 11 | 7. Examples of CoAP header compression . . . . . . . . . . . . . 11 | |||
7. Examples of CoAP header compression . . . . . . . . . . . . . 12 | 7.1. Mandatory header with CON message . . . . . . . . . . . . 11 | |||
7.1. Mandatory header with CON message . . . . . . . . . . . . 12 | 7.2. OSCORE Compression . . . . . . . . . . . . . . . . . . . 12 | |||
7.2. OSCORE Compression . . . . . . . . . . . . . . . . . . . 13 | 7.3. Example OSCORE Compression . . . . . . . . . . . . . . . 16 | |||
7.3. Example OSCORE Compression . . . . . . . . . . . . . . . 17 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 26 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27 | 9. Security considerations . . . . . . . . . . . . . . . . . . . 26 | |||
9. Security considerations . . . . . . . . . . . . . . . . . . . 27 | 10. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 26 | |||
10. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 27 | 11. Normative References . . . . . . . . . . . . . . . . . . . . 26 | |||
11. Normative References . . . . . . . . . . . . . . . . . . . . 27 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 28 | ||||
1. Introduction | 1. Introduction | |||
CoAP [rfc7252] is an implementation of the REST architecture for | CoAP [rfc7252] is an implementation of the REST architecture for | |||
constrained devices. Although CoAP was designed for constrained | constrained devices. Although CoAP was designed for constrained | |||
devices, the size of a CoAP header may still be too large for LPWAN | devices, the size of a CoAP header may still be too large for the | |||
constraints and some compression may be needed to reduce the header | constraints of Low Power Wide Area Networks (LPWAN) and some | |||
size. | compression may be needed to reduce the header size. | |||
[I-D.ietf-lpwan-ipv6-static-context-hc] defines a header compression | [I-D.ietf-lpwan-ipv6-static-context-hc] defines a header compression | |||
mechanism for LPWAN network based on a static context. The context | mechanism for LPWAN network based on a static context. The context | |||
is said static since the field description composing the Rules are | is said static since the field description composing the Rules are | |||
not learned during the packet exchanges but are previously defined. | not learned during the packet exchanges but are previously defined. | |||
The context(s) is(are) known by both ends before transmission. | The context(s) is(are) known by both ends before transmission. | |||
A context is composed of a set of rules that are referenced by Rule | A context is composed of a set of rules that are referenced by Rule | |||
IDs (identifiers). A rule contains an ordered list of the fields | IDs (identifiers). A rule contains an ordered list of the fields | |||
descriptions containing a field ID (FID), its length (FL) and its | descriptions containing a field ID (FID), its length (FL) and its | |||
position (FP), a direction indicator (DI) (upstream, downstream and | position (FP), a direction indicator (DI) (upstream, downstream and | |||
bidirectional) and some associated Target Values (TV). Target Value | bidirectional) and some associated Target Values (TV). Target Value | |||
indicates the value that can be expected. TV can also be a list of | indicates the value that can be expected. TV can also be a list of | |||
values. A Matching Operator (MO) is associated to each header field | values. A Matching Operator (MO) is associated to each header field | |||
description. The rule is selected if all the MOs fit the TVs for all | description. The rule is selected if all the MOs fit the TVs for all | |||
fields. In that case, a Compression/Decompression Action (CDA) | fields of the incoming packet. In that case, a Compression/ | |||
associated to each field defines the link between the compressed and | Decompression Action (CDA) associated to each field defines how the | |||
decompressed value for each of the header fields. Compression | compressed and the decompressed values are computed out of each | |||
results mainly in 4 actions: send the field value, send nothing, send | other, for each of the header fields. Compression mainly results in | |||
less significant bits of a field, send an index. Values sent are | one of 4 actions: send the field value, send nothing, send some least | |||
called Compression Residues and follows the rule ID. | significant bits of the field or send an index. Values sent are | |||
called Compression Residues and follow the rule ID in the transmitted | ||||
message. | ||||
The compression rules define a generic way to compress and decompress | ||||
the fields. If the device is modified, for example, to introduce new | ||||
functionalities or new CoAP options, the rules must be updated to | ||||
reflect the evolution. There is no risk to lock a device in a | ||||
particular version of CoAP. | ||||
2. SCHC Compression Process | 2. SCHC Compression Process | |||
The SCHC Compression rules can be applied to CoAP flows. SCHC | The SCHC Compression rules can be applied to CoAP flows. SCHC | |||
Compression of the CoAP header MAY be done in conjunction with the | Compression of the CoAP header MAY be done in conjunction with the | |||
above layers (IPv6/UDP) or independently. The SCHC adaptation layers | lower layers (IPv6/UDP) or independently. The SCHC adaptation layers | |||
as described in [I-D.ietf-lpwan-ipv6-static-context-hc] may be used | as described in [I-D.ietf-lpwan-ipv6-static-context-hc] may be used | |||
as shown in Figure 1. | as shown in Figure 1. | |||
^ +------------+ ^ +------------+ ^ +------------+ | ^ +------------+ ^ +------------+ ^ +------------+ | |||
| | CoAP | | | CoAP | inner | | CoAP | | | | CoAP | | | CoAP | inner | | CoAP | | |||
| +------------+ v +------------+ x | OSCORE | | | +------------+ v +------------+ x | OSCORE | | |||
| | UDP | | DTLS | outer | +------------+ | | | UDP | | DTLS | outer | +------------+ | |||
| +------------+ +------------+ | | UDP | | | +------------+ +------------+ | | UDP | | |||
| | IPv6 | | UDP | | +------------+ | | | IPv6 | | UDP | | +------------+ | |||
v +------------+ +------------+ | | IPv6 | | v +------------+ +------------+ | | IPv6 | | |||
| IPv6 | v +------------+ | | IPv6 | v +------------+ | |||
+------------+ | +------------+ | |||
Figure 1: rule scope for CoAP | Figure 1: rule scope for CoAP | |||
Figure 1 shows some examples for CoAP architecture and the SCHC | Figure 1 shows some examples for CoAP architecture and the SCHC | |||
rule's scope. A rule can cover all headers from IPv6 to CoAP, in | rule's scope. | |||
which case SCHC C/D is performed at the device and at the LPWAN | ||||
boundary. If an end-to-end encryption mechanisms is used between the | In the first example, a rule compresses all headers from IPv6 to | |||
device and the application, CoAP MAY be compressed independently of | CoAP. In this case, SCHC C/D is performed at the device and at the | |||
the other layers. The rule ID and the compression residue are | LPWAN boundary. | |||
encrypted using a mechanism such as DTLS. Only the other end can | ||||
decipher the information. | In the second example, an end-to-end encryption mechanisms is used | |||
between the device and the application. CoAP is compressed | ||||
independently of the other layers. The rule ID and the compression | ||||
residue are encrypted using a mechanism such as DTLS. Only the other | ||||
end can decipher the information. | ||||
Layers below may also be compressed using other SCHC rules (this is | Layers below may also be compressed using other SCHC rules (this is | |||
out of the scope of this document). OSCORE | out of the scope of this document). | |||
[I-D.ietf-core-object-security] can also define 2 rules to compress | ||||
the CoAP message. A first rule focuses on the inner header and is | In the third example, OSCORE [I-D.ietf-core-object-security] is used. | |||
end to end, a second rule may compress the outer header and the | 2 rulesets are used to compress the CoAP message. A first ruleset | |||
layers below. SCHC C/D for inner header is done by both ends, SCHC | focuses on the inner header and is end to end, a second ruleset | |||
C/D for outer header and other headers is done between the device and | compresses the outer header and the layers below. SCHC C/D for inner | |||
the LPWAN boundary. | header is done by both ends, and SCHC C/D for outer header and other | |||
headers is done between the device and the LPWAN boundary. | ||||
3. CoAP Compression with SCHC | 3. CoAP Compression with SCHC | |||
CoAP differs from IPv6 and UDP protocols on the following aspects: | CoAP differs from IPv6 and UDP protocols on the following aspects: | |||
o IPv6 and UDP are symmetrical protocols. The same fields are found | o IPv6 and UDP are symmetrical protocols. The same fields are found | |||
in the request and in the response, only the location in the | in the request and in the response, with the value of some fields | |||
header may vary (e.g. source and destination fields). A CoAP | being swapped on the return path (e.g. source and destination | |||
request is different from a response. For example, the URI-path | fields). A CoAP request is intrinsically different from a | |||
option is mandatory in the request and is not found in the | response. For example, the URI-path option is mandatory in the | |||
response, a request may contain an Accept option and the response | request and is not found in the response, a request may contain an | |||
a Content option. | Accept option and the response a Content option. | |||
[I-D.ietf-lpwan-ipv6-static-context-hc] defines the use of a | [I-D.ietf-lpwan-ipv6-static-context-hc] defines the use of a | |||
message direction (DI) in the Field Description, which allows a | message direction (DI) in the Field Description, which allows a | |||
single Rule to process message headers differently in both | single Rule to process message headers differently depending of | |||
directions. | the direction. | |||
o Even when a field is "symmetric" (i.e. found in both directions) | o Even when a field is "symmetric" (i.e. found in both directions) | |||
the values carried in each direction are different. Combined with | the values carried in each direction are different. Combined with | |||
a matching list in the TV, this allows reducing the range of | a matching list in the TV, this allows reducing the range of | |||
expected values in a particular direction and therefore reduce the | expected values in a particular direction and therefore reduce the | |||
size of the compression residue. For instance, if a client sends | size of the compression residue. For instance, if a client sends | |||
only CON request, the type can be elided by compression and the | only CON request, the type can be elided by compression and the | |||
answer may use one single bit to carry either the ACK or RST type. | answer may use one single bit to carry either the ACK or RST type. | |||
The same behavior can be applied to the CoAP Code field (0.0X code | The same behavior can be applied to the CoAP Code field (0.0X code | |||
are present in the request and Y.ZZ in the answer). The direction | are present in the request and Y.ZZ in the answer). The direction | |||
skipping to change at page 5, line 25 ¶ | skipping to change at page 5, line 30 ¶ | |||
direction. | direction. | |||
o In IPv6 and UDP, header fields have a fixed size. In CoAP, Token | o In IPv6 and UDP, header fields have a fixed size. In CoAP, Token | |||
size may vary from 0 to 8 bytes, the length being given by a field | size may vary from 0 to 8 bytes, the length being given by a field | |||
in the header. More systematically, the CoAP options are | in the header. More systematically, the CoAP options are | |||
described using the Type-Length-Value. | described using the Type-Length-Value. | |||
[I-D.ietf-lpwan-ipv6-static-context-hc] offers the possibility to | [I-D.ietf-lpwan-ipv6-static-context-hc] offers the possibility to | |||
define a function for the Field Length in the Field Description. | define a function for the Field Length in the Field Description. | |||
o In CoAP headers, a field can be present several times. This is | o In CoAP headers, a field can appear several times. This is | |||
typical for elements of an URI (path or queries). The position | typical for elements of a URI (path or queries). | |||
defined in a rule, associated to a Field ID, can be used to | ||||
identify the proper instance. | ||||
[I-D.ietf-lpwan-ipv6-static-context-hc] allows a Field ID to | [I-D.ietf-lpwan-ipv6-static-context-hc] allows a Field ID to | |||
appears several times in the rule, the Field Position (FP) removes | appears several times in the rule, the Field Position (FP) | |||
ambiguities for the matching operation. | identifies the proper instance, thereby removing the ambiguity of | |||
the matching operation. | ||||
o Field sizes defined in the CoAP protocol can be too large | o Field sizes defined in the CoAP protocol can be too large | |||
regarding LPWAN traffic constraints. This is particularly true | regarding LPWAN traffic constraints. This is particularly true | |||
for the message ID field or Token field. The MSB MO can be used | for the message ID field or Token field. The MSB MO can be used | |||
to reduce the information carried on LPWANs. | to reduce the information carried on LPWANs. | |||
o CoAP also obeys the client/server paradigm and the compression | o CoAP also obeys the client/server paradigm and the compression | |||
ratio can be different if the request is issued from an LPWAN | ratio can be different if the request is issued from an LPWAN | |||
device or from an non LPWAN device. For instance a Device (Dev) | device or from a non LPWAN device. For instance a Device (Dev) | |||
aware of LPWAN constraints can generate a 1 byte token, but a | aware of LPWAN constraints can generate a 1 byte token, but a | |||
regular CoAP client will certainly send a larger token to the Dev. | regular CoAP client will certainly send a larger token to the Dev. | |||
SCHC compression will not modify the values to offer a better | The SCHC compression-decompression process does not modify the | |||
compression rate. Nevertheless, a proxy placed before the | values. Nevertheless, a proxy placed before the compressor may | |||
compressor may change some field values to offer a better | change some field values to allow SCHC achieving a better | |||
compression ratio and maintain the necessary context for | compression ratio, while maintaining the necessary context for | |||
interoperability with existing CoAP implementations. | interoperability with existing CoAP implementations. | |||
4. Compression of CoAP header fields | 4. Compression of CoAP header fields | |||
This section discusses the compression of the different CoAP header | This section discusses the compression of the different CoAP header | |||
fields. | fields. | |||
4.1. CoAP version field | 4.1. CoAP version field | |||
This field is bidirectional and MUST be elided during the SCHC | This field is bidirectional and MUST be elided during the SCHC | |||
compression, since it always contains the same value. In the future, | compression, since it always contains the same value. In the future, | |||
if new versions of CoAP are defined, new rules will be defined to | if new versions of CoAP are defined, new rules will be defined to | |||
avoid ambiguities between versions. | avoid ambiguities between versions. | |||
4.2. CoAP type field | 4.2. CoAP type field | |||
[rfc7252] defines 4 types of messages: CON, NON, ACK and RST. The | [rfc7252] defines 4 types of messages: CON, NON, ACK and RST. The | |||
last two are a response to the first two. If the device plays a | last two are a response to the first two. If the device plays a | |||
specific role, a rule can exploit these properties with the mapping | specific client or server role, a rule can exploit these properties | |||
list: [CON, NON] for one direction and [ACK, RST] for the other | with the mapping list: [CON, NON] for one direction and [ACK, RST] | |||
direction. Compression residue is reduced to 1 bit. | for the other direction. The compression residue is reduced to 1 | |||
bit. | ||||
The field SHOULD be elided if for instance a client is sending only | The field SHOULD be elided if for instance a client is sending only | |||
NON or CON messages. | NON or only CON messages. | |||
In any case, a rule MUST be defined to carry RST to a client. | In any case, a rule MUST be defined to carry RST to a client. | |||
4.3. CoAP code field | 4.3. CoAP code field | |||
The compression of the CoAP code field follows the same principle as | The compression of the CoAP code field follows the same principle as | |||
for the CoAP type field. If the device plays a specific role, the | that of the CoAP type field. If the device plays a specific role, | |||
set of code values can be split in two parts, the request codes with | the set of code values can be split in two parts, the request codes | |||
the 0 class and the response values. | with the 0 class and the response values. | |||
If the device only implements a CoAP client, the request code can be | If the device only implements a CoAP client, the request code can be | |||
reduced to the set of requests the client is able to process. | reduced to the set of requests the client is able to process. | |||
All the response codes MUST be compressed with a SCHC rule. | All the response codes MUST be compressed with a SCHC rule. | |||
4.4. CoAP Message ID field | 4.4. CoAP Message ID field | |||
This field is bidirectional and is used to manage acknowledgments. | This field is bidirectional and is used to manage acknowledgments. | |||
The server memorizes the value for a EXCHANGE_LIFETIME period (by | The server memorizes the value for a EXCHANGE_LIFETIME period (by | |||
skipping to change at page 8, line 5 ¶ | skipping to change at page 7, line 48 ¶ | |||
These fields are both unidirectional and MUST NOT be set to | These fields are both unidirectional and MUST NOT be set to | |||
bidirectional in a rule entry. | bidirectional in a rule entry. | |||
If a single value is expected by the client, it can be stored in the | If a single value is expected by the client, it can be stored in the | |||
TV and elided during the transmission. Otherwise, if several | TV and elided during the transmission. Otherwise, if several | |||
possible values are expected by the client, a matching-list SHOULD be | possible values are expected by the client, a matching-list SHOULD be | |||
used to limit the size of the residue. If is not possible, the value | used to limit the size of the residue. If is not possible, the value | |||
has to be sent as a residue (fixed or variable length). | has to be sent as a residue (fixed or variable length). | |||
5.2. CoAP option Max-Age field, CoAP option Uri-Host and Uri-Port | 5.2. CoAP option Max-Age, Uri-Host and Uri-Port fields | |||
fields | ||||
These fields is unidirectional and MUST NOT be set to bidirectional | These fields are unidirectional and MUST NOT be set to bidirectional | |||
in a rule entry. It is used only by the server to inform of the | in a rule entry. They are used only by the server to inform of the | |||
caching duration and is never found in client requests. | caching duration and is never found in client requests. | |||
If the duration is known by both ends, the value can be elided on the | If the duration is known by both ends, the value can be elided on the | |||
LPWAN. | LPWAN. | |||
A matching list can be used if some well-known values are defined. | A matching list can be used if some well-known values are defined. | |||
Otherwise these options SHOULD be sent as a residue (fixed or | Otherwise these options SHOULD be sent as a residue (fixed or | |||
variable length). | variable length). | |||
skipping to change at page 10, line 37 ¶ | skipping to change at page 10, line 29 ¶ | |||
[rfc7967] defines a No-Response option limiting the responses made by | [rfc7967] defines a No-Response option limiting the responses made by | |||
a server to a request. If the value is known by both ends, then TV | a server to a request. If the value is known by both ends, then TV | |||
is set to this value, MO is set to "equal" and CDA is set to "not- | is set to this value, MO is set to "equal" and CDA is set to "not- | |||
sent". | sent". | |||
Otherwise, if the value is changing over time, TV is not set, MO is | Otherwise, if the value is changing over time, TV is not set, MO is | |||
set to "ignore" and CDA to "value-sent". A matching list can also be | set to "ignore" and CDA to "value-sent". A matching list can also be | |||
used to reduce the size. | used to reduce the size. | |||
6.4. Time Scale | 6.4. OSCORE | |||
The time scale [I-D.toutain-core-time-scale] option allows a client | ||||
to inform the server that it is in a constrained network and that | ||||
message ID MUST be kept for a duration given by the option. | ||||
If the value is known by both ends, then TV is set to this value, MO | ||||
is set to "equal" and CDA is set to "not-sent". | ||||
Otherwise, if the value is changing over time, TV is not set, MO is | ||||
set to "ignore" and CDA to "value-sent". A matching list can also be | ||||
used to reduce the size. | ||||
6.5. OSCORE | ||||
OSCORE [I-D.ietf-core-object-security] defines end-to-end protection | OSCORE [I-D.ietf-core-object-security] defines end-to-end protection | |||
for CoAP messages. This section describes how SCHC rules can be | for CoAP messages. This section describes how SCHC rules can be | |||
applied to compress OSCORE-protected messages. | applied to compress OSCORE-protected messages. | |||
0 1 2 3 4 5 6 7 <--------- n bytes -------------> | 0 1 2 3 4 5 6 7 <--------- n bytes -------------> | |||
+-+-+-+-+-+-+-+-+--------------------------------- | +-+-+-+-+-+-+-+-+--------------------------------- | |||
|0 0 0|h|k| n | Partial IV (if any) ... | |0 0 0|h|k| n | Partial IV (if any) ... | |||
+-+-+-+-+-+-+-+-+--------------------------------- | +-+-+-+-+-+-+-+-+--------------------------------- | |||
| | | | | | | | |||
skipping to change at page 12, line 4 ¶ | skipping to change at page 11, line 29 ¶ | |||
This draft recommends to implement a parser that is able to identify | This draft recommends to implement a parser that is able to identify | |||
the OSCORE Option and the fields it contains. | the OSCORE Option and the fields it contains. | |||
Conceptually, it discerns up to 4 distinct pieces of information | Conceptually, it discerns up to 4 distinct pieces of information | |||
within the OSCORE option: the flag bits, the piv, the kid context, | within the OSCORE option: the flag bits, the piv, the kid context, | |||
and the kid. It is thus recommended that the parser split the OSCORE | and the kid. It is thus recommended that the parser split the OSCORE | |||
option into the 4 subsequent fields: | option into the 4 subsequent fields: | |||
o CoAP OSCORE_flags, | o CoAP OSCORE_flags, | |||
o CoAP OSCORE_piv, | o CoAP OSCORE_piv, | |||
o CoAP OSCORE_kidctxt, | o CoAP OSCORE_kidctxt, | |||
o CoAP OSCORE_kid. | o CoAP OSCORE_kid. | |||
These fields are shown superimposed on the OSCORE Option format in | These fields are shown superimposed on the OSCORE Option format in | |||
Figure 4, the CoAP OSCORE_kidctxt field including the size bits s. | Figure 4, the CoAP OSCORE_kidctxt field including the size bits s. | |||
Their size SHOULD be reduced using the MSB matching operator. | Their size SHOULD be reduced using SCHC compression. | |||
7. Examples of CoAP header compression | 7. Examples of CoAP header compression | |||
7.1. Mandatory header with CON message | 7.1. Mandatory header with CON message | |||
In this first scenario, the LPWAN compressor at the Network Gateway | In this first scenario, the LPWAN compressor at the Network Gateway | |||
side receives from a client on the Internet a POST message, which is | side receives from a client on the Internet a POST message, which is | |||
immediately acknowledged by the Device. For this simple scenario, | immediately acknowledged by the Device. For this simple scenario, | |||
the rules are described Figure 5. | the rules are described Figure 5. | |||
Rule ID 1 | Rule ID 1 | |||
+-------------+--+--+--+------+---------+-------------++------------+ | +-------------+--+--+--+------+---------+-------------++------------+ | |||
| Field |FL|FP|DI|Target| Match | CDA || Sent | | | Field |FL|FP|DI|Target| Match | CDA || Sent | | |||
| | | | |Value | Opera. | || [bits] | | | | | | |Value | Opera. | || [bits] | | |||
+-------------+--+--+--+------+---------+-------------++------------+ | +-------------+--+--+--+------+---------+-------------++------------+ | |||
|CoAP version | | |bi| 01 |equal |not-sent || | | |CoAP version | | |bi| 01 |equal |not-sent || | | |||
|CoAP version | | |bi| 01 |equal |not-sent || | | ||||
|CoAP Type | | |dw| CON |equal |not-sent || | | |CoAP Type | | |dw| CON |equal |not-sent || | | |||
|CoAP Type | | |up|[ACK, | | || | | |CoAP Type | | |up|[ACK, | | || | | |||
| | | | | RST] |match-map|matching-sent|| T | | | | | | | RST] |match-map|matching-sent|| T | | |||
|CoAP TKL | | |bi| 0 |equal |not-sent || | | |CoAP TKL | | |bi| 0 |equal |not-sent || | | |||
|CoAP Code | | |bi| ML1 |match-map|matching-sent|| CC CCC | | |CoAP Code | | |bi|[0.00,| | || | | |||
|CoAP MID | | |bi| 0000 |MSB(7 ) |LSB(9) || M-ID| | | | | | | ... | | || | | |||
| | | | | 5.05]|match-map|matching-sent|| CC CCC | | ||||
|CoAP MID | | |bi| 0000 |MSB(7 ) |LSB || M-ID| | ||||
|CoAP Uri-Path| | |dw| path |equal 1 |not-sent || | | |CoAP Uri-Path| | |dw| path |equal 1 |not-sent || | | |||
+-------------+--+--+--+------+---------+-------------++------------+ | +-------------+--+--+--+------+---------+-------------++------------+ | |||
Figure 5: CoAP Context to compress header without token | Figure 5: CoAP Context to compress header without token | |||
The version and Token Length fields are elided. Code has shrunk to 5 | The version and Token Length fields are elided. The 26 method and | |||
bits using a matching list. Uri-Path contains a single element | response codes defined in [rfc7252] has been shrunk to 5 bits using a | |||
indicated in the matching operator. | matching list. Uri-Path contains a single element indicated in the | |||
matching operator. | ||||
Figure 6 shows the time diagram of the exchange. A client in the | ||||
Application Server sends a CON request. It can go through a proxy | ||||
which reduces the message ID to a smallest value, with at least the 9 | ||||
most significant bits equal to 0. SCHC Compression reduces the | ||||
header sending only the Type, a mapped code and the least 9 | ||||
significant bits of Message ID. | ||||
Device LPWAN SCHC C/D | SCHC Compression reduces the header sending only the Type, a mapped | |||
| | | code and the least significant bits of Message ID (9 bits in the | |||
| rule id=1 |<-------------------- | example above). | |||
|<-------------------| +-+-+--+----+------+ | ||||
<------------------- | CCCCCMMMMMMMMM | |1|0| 4|0.01|0x0034| | ||||
+-+-+--+----+-------+ | 00001000110100 | | 0xb4 p a t| | ||||
|1|0| 1|0.01|0x0034 | | | | h | | ||||
| 0xb4 p a t | | | +------+ | ||||
| h | | | | ||||
+------+ | | | ||||
| | | ||||
| | | ||||
---------------------->| rule id=1 | | ||||
+-+-+--+----+--------+ |------------------->| | ||||
|1|2| 0|2.05| 0x0034 | | TCCCCCMMMMMMMMM |---------------------> | ||||
+-+-+--+----+--------+ | 001100000110100 | +-+-+--+----+------+ | ||||
| | |1|2| 0|2.05|0x0034| | ||||
v v +-+-+--+----+------+ | ||||
Figure 6: Compression with global addresses | Note that a request sent by a client located an Application Server to | |||
a server in the device, may not be compressed through this rule since | ||||
the MID will not start with 7 bits equal to 0. A CoAP proxy, before | ||||
the core SCHC C/D can rewrite the message ID to a value matched by | ||||
the rule. | ||||
7.2. OSCORE Compression | 7.2. OSCORE Compression | |||
OSCORE aims to solve the problem of end-to-end encryption for CoAP | OSCORE aims to solve the problem of end-to-end encryption for CoAP | |||
messages. The goal, therefore, is to hide as much of the message as | messages. The goal, therefore, is to hide as much of the message as | |||
possible while still enabling proxy operation. | possible while still enabling proxy operation. | |||
Conceptually this is achieved by splitting the CoAP message into an | Conceptually this is achieved by splitting the CoAP message into an | |||
Inner Plaintext and Outer OSCORE Message. The Inner Plaintext | Inner Plaintext and Outer OSCORE Message. The Inner Plaintext | |||
contains sensible information which is not necessary for proxy | contains sensible information which is not necessary for proxy | |||
operation. This, in turn, is the part of the message which can be | operation. This, in turn, is the part of the message which can be | |||
encrypted until it reaches its end destination. The Outer Message | encrypted until it reaches its end destination. The Outer Message | |||
acts as a shell matching the format of a regular CoAP message, and | acts as a shell matching the format of a regular CoAP message, and | |||
includes all Options and information needed for proxy operation and | includes all Options and information needed for proxy operation and | |||
caching. This decomposition is illustrated in Figure 7. | caching. This decomposition is illustrated in Figure 6. | |||
CoAP options are sorted into one of 3 classes, each granted a | CoAP options are sorted into one of 3 classes, each granted a | |||
specific type of protection by the protocol: | specific type of protection by the protocol: | |||
o Class E: Encrypted options moved to the Inner Plaintext, | o Class E: Encrypted options moved to the Inner Plaintext, | |||
o Class I: Integrity-protected options included in the AAD for the | o Class I: Integrity-protected options included in the AAD for the | |||
encryption of the Plaintext but otherwise left untouched in the | encryption of the Plaintext but otherwise left untouched in the | |||
Outer Message, | Outer Message, | |||
skipping to change at page 14, line 44 ¶ | skipping to change at page 14, line 38 ¶ | |||
+-+-+---+--------+---------------+....+ +-------+-----......+ | +-+-+---+--------+---------------+....+ +-------+-----......+ | |||
| Token | | Options (E) | | | Token | | Options (E) | | |||
+--------------------------------.....+ +-------+------.....+ | +--------------------------------.....+ +-------+------.....+ | |||
| Options (IU) | | OxFF | | | Options (IU) | | OxFF | | |||
. . +-------+-----------+ | . . +-------+-----------+ | |||
. OSCORE Option . | | | . OSCORE Option . | | | |||
+------+-------------------+ | Payload | | +------+-------------------+ | Payload | | |||
| 0xFF | | | | | 0xFF | | | | |||
+------+ +-------------------+ | +------+ +-------------------+ | |||
Figure 7: OSCORE inner and outer header form a CoAP message | Figure 6: A CoAP message is split into an OSCORE outer and plaintext | |||
Figure 7 shows the message format for the OSCORE Message and | Figure 6 shows the message format for the OSCORE Message and | |||
Plaintext. | Plaintext. | |||
In the Outer Header, the original message code is hidden and replaced | In the Outer Header, the original message code is hidden and replaced | |||
by a default dummy value. As seen in sections 4.1.3.5 and 4.2 of | by a default dummy value. As seen in sections 4.1.3.5 and 4.2 of | |||
[I-D.ietf-core-object-security], the message code is replaced by POST | [I-D.ietf-core-object-security], the message code is replaced by POST | |||
for requests and Changed for responses when Observe is not used. If | for requests and Changed for responses when Observe is not used. If | |||
Observe is used, the message code is replaced by FETCH for requests | Observe is used, the message code is replaced by FETCH for requests | |||
and Content for responses. | and Content for responses. | |||
The original message code is put into the first byte of the | The original message code is put into the first byte of the | |||
Plaintext. Following the message code, the class E options comes and | Plaintext. Following the message code, the class E options comes and | |||
if present the original message Payload is preceded by its payload | if present the original message Payload is preceded by its payload | |||
marker. | marker. | |||
skipping to change at page 15, line 19 ¶ | skipping to change at page 15, line 11 ¶ | |||
The original message code is put into the first byte of the | The original message code is put into the first byte of the | |||
Plaintext. Following the message code, the class E options comes and | Plaintext. Following the message code, the class E options comes and | |||
if present the original message Payload is preceded by its payload | if present the original message Payload is preceded by its payload | |||
marker. | marker. | |||
The Plaintext is now encrypted by an AEAD algorithm which integrity | The Plaintext is now encrypted by an AEAD algorithm which integrity | |||
protects Security Context parameters and eventually any class I | protects Security Context parameters and eventually any class I | |||
options from the Outer Header. Currently no CoAP options are marked | options from the Outer Header. Currently no CoAP options are marked | |||
class I. The resulting Ciphertext becomes the new Payload of the | class I. The resulting Ciphertext becomes the new Payload of the | |||
OSCORE message, as illustrated in Figure 8. | OSCORE message, as illustrated in Figure 7. | |||
This Ciphertext is, as defined in RFC 5116, the concatenation of the | This Ciphertext is, as defined in RFC 5116, the concatenation of the | |||
encrypted Plaintext and its authentication tag. Note that Inner | encrypted Plaintext and its authentication tag. Note that Inner | |||
Compression only affects the Plaintext before encryption, thus we can | Compression only affects the Plaintext before encryption, thus we can | |||
only aim to reduce this first, variable length component of the | only aim to reduce this first, variable length component of the | |||
Ciphertext. The authentication tag is fixed in length and considered | Ciphertext. The authentication tag is fixed in length and considered | |||
part of the cost of protection. | part of the cost of protection. | |||
Outer Header | Outer Header | |||
+-+-+---+--------+---------------+ | +-+-+---+--------+---------------+ | |||
|v|t|tkl|new code| Msg Id. | | |v|t|tkl|new code| Msg Id. | | |||
+-+-+---+--------+---------------+....+ | +-+-+---+--------+---------------+....+ | |||
| Token | | | Token | | |||
+--------------------------------.....+ | +--------------------------------.....+ | |||
| Options (IU) | | | Options (IU) | | |||
. . | . . | |||
. OSCORE Option . | . OSCORE Option . | |||
+------+-------------------+ | +------+-------------------+ | |||
| 0xFF | | | 0xFF | | |||
+------+-------------------------+ | +------+---------------------------+ | |||
| | | | | | |||
| Encrypted Inner Header and | | | Ciphertext: Encrypted Inner | | |||
| Payload | | | Header and Payload | | |||
| | | | + Authentication Tag | | |||
+--------------------------------+ | | | | |||
+----------------------------------+ | ||||
Figure 8: OSCORE message | Figure 7: OSCORE message | |||
The SCHC Compression scheme consists of compressing both the | The SCHC Compression scheme consists of compressing both the | |||
Plaintext before encryption and the resulting OSCORE message after | Plaintext before encryption and the resulting OSCORE message after | |||
encryption, see Figure 9. | encryption, see Figure 8. | |||
This translates into a segmented process where SCHC compression is | This translates into a segmented process where SCHC compression is | |||
applied independently in 2 stages, each with its corresponding set of | applied independently in 2 stages, each with its corresponding set of | |||
rules, with the Inner SCHC Rules and the Outer SCHC Rules. This way | rules, with the Inner SCHC Rules and the Outer SCHC Rules. This way | |||
compression is applied to all fields of the original CoAP message. | compression is applied to all fields of the original CoAP message. | |||
Note that since the Inner part of the message can only be decrypted | Note that since the Inner part of the message can only be decrypted | |||
by the corresponding end-point, this end-point will also have to | by the corresponding end-point, this end-point will also have to | |||
implement Inner SCHC Compression/Decompression. | implement Inner SCHC Compression/Decompression. | |||
skipping to change at page 16, line 50 ¶ | skipping to change at page 16, line 41 ¶ | |||
v | +-------+--+ | v | +-------+--+ | |||
+--------+ +------------+ | Residue | | +--------+ +------------+ | Residue | | |||
|Rule ID'| | Encryption | <--- +----------+--------+ | |Rule ID'| | Encryption | <--- +----------+--------+ | |||
+--------+--+ +------------+ | | | +--------+--+ +------------+ | | | |||
| Residue' | | Payload | | | Residue' | | Payload | | |||
+-----------+-------+ | | | +-----------+-------+ | | | |||
| Ciphertext | +-------------------+ | | Ciphertext | +-------------------+ | |||
| | | | | | |||
+-------------------+ | +-------------------+ | |||
Figure 9: OSCORE Compression Diagram | Figure 8: OSCORE Compression Diagram | |||
7.3. Example OSCORE Compression | 7.3. Example OSCORE Compression | |||
An example is given with a GET Request and its consequent CONTENT | An example is given with a GET Request and its consequent CONTENT | |||
Response. A possible set of rules for the Inner and Outer SCHC | Response from a device-based CoAP client to a cloud-based CoAP | |||
server. A possible set of rules for the Inner and Outer SCHC | ||||
Compression is shown. A dump of the results and a contrast between | Compression is shown. A dump of the results and a contrast between | |||
SCHC + OSCORE performance with SCHC + COAP performance is also | SCHC + OSCORE performance with SCHC + COAP performance is also | |||
listed. This gives an approximation to the cost of security with | listed. This gives an approximation to the cost of security with | |||
SCHC-OSCORE. | SCHC-OSCORE. | |||
Our first example CoAP message is the GET Request in Figure 10 | Our first example CoAP message is the GET Request in Figure 9 | |||
Original message: | Original message: | |||
================= | ================= | |||
0x4101000182bb74656d7065726174757265 | 0x4101000182bb74656d7065726174757265 | |||
Header: | Header: | |||
0x4101 | 0x4101 | |||
01 Ver | 01 Ver | |||
00 CON | 00 CON | |||
0001 tkl | 0001 tkl | |||
skipping to change at page 17, line 37 ¶ | skipping to change at page 17, line 28 ¶ | |||
0x0001 = mid | 0x0001 = mid | |||
0x82 = token | 0x82 = token | |||
Options: | Options: | |||
0xbb74656d7065726174757265 | 0xbb74656d7065726174757265 | |||
Option 11: URI_PATH | Option 11: URI_PATH | |||
Value = temperature | Value = temperature | |||
Original msg length: 17 bytes. | Original msg length: 17 bytes. | |||
Figure 10: CoAP GET Request | Figure 9: CoAP GET Request | |||
Its corresponding response is the CONTENT Response in Figure 11. | Its corresponding response is the CONTENT Response in Figure 10. | |||
Original message: | Original message: | |||
================= | ================= | |||
0x6145000182ff32332043 | 0x6145000182ff32332043 | |||
Header: | Header: | |||
0x6145 | 0x6145 | |||
01 Ver | 01 Ver | |||
10 ACK | 10 ACK | |||
0001 tkl | 0001 tkl | |||
skipping to change at page 18, line 25 ¶ | skipping to change at page 17, line 52 ¶ | |||
0x0001 = mid | 0x0001 = mid | |||
0x82 = token | 0x82 = token | |||
0xFF Payload marker | 0xFF Payload marker | |||
Payload: | Payload: | |||
0x32332043 | 0x32332043 | |||
Original msg length: 10 | Original msg length: 10 | |||
Figure 11: CoAP CONTENT Response | Figure 10: CoAP CONTENT Response | |||
The SCHC Rules for the Inner Compression include all fields that are | The SCHC Rules for the Inner Compression include all fields that are | |||
already present in a regular CoAP message, what is important is the | already present in a regular CoAP message, what is important is the | |||
order of appearance and inclusion of only those CoAP fields that go | order of appearance and inclusion of only those CoAP fields that go | |||
into the Plaintext, Figure 12. | into the Plaintext, Figure 11. | |||
Rule ID 0 | Rule ID 0 | |||
+---------------+--+--+-----------+-----------+-----------++------+ | +---------------+--+--+-----------+-----------+-----------++------+ | |||
| Field |FP|DI| Target | MO | CDA || Sent | | | Field |FP|DI| Target | MO | CDA || Sent | | |||
| | | | Value | | ||[bits]| | | | | | Value | | ||[bits]| | |||
+---------------+--+--+-----------+-----------+-----------++------+ | +---------------+--+--+-----------+-----------+-----------++------+ | |||
|CoAP Code | |up| 1 | equal |not-sent || | | |CoAP Code | |up| 1 | equal |not-sent || | | |||
|CoAP Code | |dw|[69,132] | match-map |match-sent || c | | |CoAP Code | |dw|[69,132] | match-map |match-sent || c | | |||
|CoAP Uri-Path | |up|temperature| equal |not-sent || | | |CoAP Uri-Path | |up|temperature| equal |not-sent || | | |||
|COAP Option-End| |dw| 0xFF | equal |not-sent || | | |COAP Option-End| |dw| 0xFF | equal |not-sent || | | |||
+---------------+--+--+-----------+-----------+-----------++------+ | +---------------+--+--+-----------+-----------+-----------++------+ | |||
Figure 12: Inner SCHC Rules | Figure 11: Inner SCHC Rules | |||
Figure 13 shows the Plaintext obtained for our example GET Request | Figure 12 shows the Plaintext obtained for our example GET Request | |||
and follows the process of Inner Compression and Encryption until we | and follows the process of Inner Compression and Encryption until we | |||
end up with the Payload to be added in the outer OSCORE Message. | end up with the Payload to be added in the outer OSCORE Message. | |||
In this case the original message has no payload and its resulting | In this case the original message has no payload and its resulting | |||
Plaintext can be compressed up to only 1 byte (size of the Rule ID). | Plaintext can be compressed up to only 1 byte (size of the Rule ID). | |||
The AEAD algorithm preserves this length in its first output, but | The AEAD algorithm preserves this length in its first output, but | |||
also yields a fixed-size tag which cannot be compressed and has to be | also yields a fixed-size tag which cannot be compressed and has to be | |||
included in the OSCORE message. This translates into an overhead in | included in the OSCORE message. This translates into an overhead in | |||
total message length, which limits the amount of compression that can | total message length, which limits the amount of compression that can | |||
be achieved and plays into the cost of adding security to the | be achieved and plays into the cost of adding security to the | |||
skipping to change at page 19, line 48 ¶ | skipping to change at page 19, line 44 ¶ | |||
| (piv = 0x04) | | (piv = 0x04) | |||
v | v | |||
_________________________________________________ | _________________________________________________ | |||
| | | | | | |||
| encrypted_plaintext = 0xa2 (1 byte) | | | encrypted_plaintext = 0xa2 (1 byte) | | |||
| tag = 0xc54fe1b434297b62 (8 bytes) | | | tag = 0xc54fe1b434297b62 (8 bytes) | | |||
| | | | | | |||
| ciphertext = 0xa2c54fe1b434297b62 (9 bytes) | | | ciphertext = 0xa2c54fe1b434297b62 (9 bytes) | | |||
|_________________________________________________| | |_________________________________________________| | |||
Figure 13: Plaintext compression and encryption for GET Request | Figure 12: Plaintext compression and encryption for GET Request | |||
In Figure 14 we repeat the process for the example CONTENT Response. | In Figure 13 we repeat the process for the example CONTENT Response. | |||
In this case the misalignment produced by the compression residue (1 | In this case the misalignment produced by the compression residue (1 | |||
bit) makes it so that 7 bits of padding have to be applied after the | bit) makes it so that 7 bits of padding have to be applied after the | |||
payload, resulting in a compressed Plaintext that is the same size as | payload, resulting in a compressed Plaintext that is the same size as | |||
before compression. This misalignment also causes the hexcode from | before compression. This misalignment also causes the hexcode from | |||
the payload to differ from the original, even though it has not been | the payload to differ from the original, even though it has not been | |||
compressed. On top of this, the overhead from the tag bytes is | compressed. On top of this, the overhead from the tag bytes is | |||
incurred as before. | incurred as before. | |||
________________________________________________________ | ________________________________________________________ | |||
| | | | | | |||
skipping to change at page 21, line 48 ¶ | skipping to change at page 20, line 50 ¶ | |||
| (piv = 0x04) | | (piv = 0x04) | |||
v | v | |||
_________________________________________________________ | _________________________________________________________ | |||
| | | | | | |||
| encrypted_plaintext = 0x10c6d7c26cc1 (6 bytes) | | | encrypted_plaintext = 0x10c6d7c26cc1 (6 bytes) | | |||
| tag = 0xe9aef3f2461e0c29 (8 bytes) | | | tag = 0xe9aef3f2461e0c29 (8 bytes) | | |||
| | | | | | |||
| ciphertext = 0x10c6d7c26cc1e9aef3f2461e0c29 (14 bytes) | | | ciphertext = 0x10c6d7c26cc1e9aef3f2461e0c29 (14 bytes) | | |||
|_________________________________________________________| | |_________________________________________________________| | |||
Figure 14: Plaintext compression and encryption for CONTENT Response | Figure 13: Plaintext compression and encryption for CONTENT Response | |||
The Outer SCHC Rules (Figure 16) MUST process the OSCORE Options | ||||
The Outer SCHC Rules (Figure 17) MUST process the OSCORE Options | fields. In Figure 14 and Figure 15 we show a dump of the OSCORE | |||
fields. In Figure 15 and Figure 16 we show a dump of the OSCORE | ||||
Messages generated from our example messages once they have been | Messages generated from our example messages once they have been | |||
provided with the Inner Compressed Ciphertext in the payload. These | provided with the Inner Compressed Ciphertext in the payload. These | |||
are the messages that are to go through Outer SCHC Compression. | are the messages that are to go through Outer SCHC Compression. | |||
Protected message: | Protected message: | |||
================== | ================== | |||
0x4102000182d7080904636c69656e74ffa2c54fe1b434297b62 | 0x4102000182d7080904636c69656e74ffa2c54fe1b434297b62 | |||
(25 bytes) | (25 bytes) | |||
Header: | Header: | |||
0x4102 | 0x4102 | |||
01 Ver | 01 Ver | |||
00 CON | 00 CON | |||
0001 tkl | 0001 tkl | |||
00000010 Request Code 2 "POST" | 00000010 Request Code 2 "POST" | |||
0x0001 = mid | 0x0001 = mid | |||
0x82 = token | 0x82 = token | |||
Options: | Options: | |||
0xd7080904636c69656e74 (10 bytes) | 0xd8080904636c69656e74 (10 bytes) | |||
Option 21: OBJECT_SECURITY | Option 21: OBJECT_SECURITY | |||
Value = 0x0904636c69656e74 | Value = 0x0904636c69656e74 | |||
09 = 000 0 1 001 Flag byte | 09 = 000 0 1 001 Flag byte | |||
h k n | h k n | |||
04 piv | 04 piv | |||
636c69656e74 kid | 636c69656e74 kid | |||
0xFF Payload marker | 0xFF Payload marker | |||
Payload: | Payload: | |||
0xa2c54fe1b434297b62 (9 bytes) | 0xa2c54fe1b434297b62 (9 bytes) | |||
Figure 15: Protected and Inner SCHC Compressed GET Request | Figure 14: Protected and Inner SCHC Compressed GET Request | |||
Protected message: | Protected message: | |||
================== | ================== | |||
0x6144000182d008ff10c6d7c26cc1e9aef3f2461e0c29 | 0x6144000182d008ff10c6d7c26cc1e9aef3f2461e0c29 | |||
(22 bytes) | (22 bytes) | |||
Header: | Header: | |||
0x6144 | 0x6144 | |||
01 Ver | 01 Ver | |||
10 ACK | 10 ACK | |||
skipping to change at page 23, line 29 ¶ | skipping to change at page 22, line 29 ¶ | |||
Options: | Options: | |||
0xd008 (2 bytes) | 0xd008 (2 bytes) | |||
Option 21: OBJECT_SECURITY | Option 21: OBJECT_SECURITY | |||
Value = b'' | Value = b'' | |||
0xFF Payload marker | 0xFF Payload marker | |||
Payload: | Payload: | |||
0x10c6d7c26cc1e9aef3f2461e0c29 (14 bytes) | 0x10c6d7c26cc1e9aef3f2461e0c29 (14 bytes) | |||
Figure 16: Protected and Inner SCHC Compressed CONTENT Response | Figure 15: Protected and Inner SCHC Compressed CONTENT Response | |||
For the flag bits, a number of compression methods could prove to be | For the flag bits, a number of compression methods could prove to be | |||
useful depending on the application. The simplest alternative is to | useful depending on the application. The simplest alternative is to | |||
provide a fixed value for the flags, combining MO equal and CDA not- | provide a fixed value for the flags, combining MO equal and CDA not- | |||
sent. This saves most bits but could hinder flexibility. Otherwise, | sent. This saves most bits but could hinder flexibility. Otherwise, | |||
match-mapping could allow to choose from a number of configurations | match-mapping could allow to choose from a number of configurations | |||
of interest to the exchange. If neither of these alternatives is | of interest to the exchange. If neither of these alternatives is | |||
desirable, MSB could be used to mask off the 3 hard-coded most | desirable, MSB could be used to mask off the 3 hard-coded most | |||
significant bits. | significant bits. | |||
skipping to change at page 24, line 10 ¶ | skipping to change at page 23, line 10 ¶ | |||
technologies. Note that compressing the sequence numbers effectively | technologies. Note that compressing the sequence numbers effectively | |||
reduces the maximum amount of sequence numbers that can be used in an | reduces the maximum amount of sequence numbers that can be used in an | |||
exchange. Once this amount is exceeded, the SCHC Context would need | exchange. Once this amount is exceeded, the SCHC Context would need | |||
to be re-established. | to be re-established. | |||
The size s included in the kid context field MAY be masked off with | The size s included in the kid context field MAY be masked off with | |||
CDA MSB. The rest of the field could have additional bits masked | CDA MSB. The rest of the field could have additional bits masked | |||
off, or have the whole field be fixed with MO equal and CDA not-sent. | off, or have the whole field be fixed with MO equal and CDA not-sent. | |||
The same holds for the kid field. | The same holds for the kid field. | |||
Figure 17 shows a possible set of Outer Rules to compress the Outer | Figure 16 shows a possible set of Outer Rules to compress the Outer | |||
Header. | Header. | |||
Rule ID 0 | Rule ID 0 | |||
+-------------------+--+--+--------------+--------+---------++------+ | +-------------------+--+--+--------------+--------+---------++------+ | |||
| Field |FP|DI| Target | MO | CDA || Sent | | | Field |FP|DI| Target | MO | CDA || Sent | | |||
| | | | Value | | ||[bits]| | | | | | Value | | ||[bits]| | |||
+-------------------+--+--+--------------+--------+---------++------+ | +-------------------+--+--+--------------+--------+---------++------+ | |||
|CoAP version | |bi| 01 |equal |not-sent || | | |CoAP version | |bi| 01 |equal |not-sent || | | |||
|CoAP Type | |up| 0 |equal |not-sent || | | |CoAP Type | |up| 0 |equal |not-sent || | | |||
|CoAP Type | |dw| 2 |equal |not-sent || | | |CoAP Type | |dw| 2 |equal |not-sent || | | |||
skipping to change at page 24, line 36 ¶ | skipping to change at page 23, line 36 ¶ | |||
|CoAP OSCORE_flags | |up| 0x09 |equal |not-sent || | | |CoAP OSCORE_flags | |up| 0x09 |equal |not-sent || | | |||
|CoAP OSCORE_piv | |up| 0x00 |MSB(4) |LSB ||PPPP | | |CoAP OSCORE_piv | |up| 0x00 |MSB(4) |LSB ||PPPP | | |||
|COAP OSCORE_kid | |up|0x636c69656e70|MSB(52) |LSB ||KKKK | | |COAP OSCORE_kid | |up|0x636c69656e70|MSB(52) |LSB ||KKKK | | |||
|COAP OSCORE_kidctxt| |bi| b'' |equal |not-sent || | | |COAP OSCORE_kidctxt| |bi| b'' |equal |not-sent || | | |||
|CoAP OSCORE_flags | |dw| b'' |equal |not-sent || | | |CoAP OSCORE_flags | |dw| b'' |equal |not-sent || | | |||
|CoAP OSCORE_piv | |dw| b'' |equal |not-sent || | | |CoAP OSCORE_piv | |dw| b'' |equal |not-sent || | | |||
|CoAP OSCORE_kid | |dw| b'' |equal |not-sent || | | |CoAP OSCORE_kid | |dw| b'' |equal |not-sent || | | |||
|COAP Option-End | |dw| 0xFF |equal |not-sent || | | |COAP Option-End | |dw| 0xFF |equal |not-sent || | | |||
+-------------------+--+--+--------------+--------+---------++------+ | +-------------------+--+--+--------------+--------+---------++------+ | |||
Figure 17: Outer SCHC Rules | Figure 16: Outer SCHC Rules | |||
These Outer Rules are applied to the example GET Request and CONTENT | These Outer Rules are applied to the example GET Request and CONTENT | |||
Response. The resulting messages are shown in Figure 18 and | Response. The resulting messages are shown in Figure 17 and | |||
Figure 19. | Figure 18. | |||
Compressed message: | Compressed message: | |||
================== | ================== | |||
0x001489458a9fc3686852f6c4 (12 bytes) | 0x001489458a9fc3686852f6c4 (12 bytes) | |||
0x00 Rule ID | 0x00 Rule ID | |||
1489 Compression Residue | 1489 Compression Residue | |||
458a9fc3686852f6c4 Padded payload | 458a9fc3686852f6c4 Padded payload | |||
Compression residue: | Compression residue: | |||
0b 0001 010 0100 0100 (15 bits -> 2 bytes with padding) | 0b 0001 010 0100 0100 (15 bits -> 2 bytes with padding) | |||
mid tkn piv kid | mid tkn piv kid | |||
Payload | Payload | |||
0xa2c54fe1b434297b62 (9 bytes) | 0xa2c54fe1b434297b62 (9 bytes) | |||
Compressed message length: 12 bytes | Compressed message length: 12 bytes | |||
Figure 18: SCHC-OSCORE Compressed GET Request | Figure 17: SCHC-OSCORE Compressed GET Request | |||
Compressed message: | Compressed message: | |||
================== | ================== | |||
0x0014218daf84d983d35de7e48c3c1852 (16 bytes) | 0x0014218daf84d983d35de7e48c3c1852 (16 bytes) | |||
0x00 Rule ID | 0x00 Rule ID | |||
14 Compression residue | 14 Compression residue | |||
218daf84d983d35de7e48c3c1852 Padded payload | 218daf84d983d35de7e48c3c1852 Padded payload | |||
Compression residue: | Compression residue: | |||
0b0001 010 (7 bits -> 1 byte with padding) | 0b0001 010 (7 bits -> 1 byte with padding) | |||
mid tkn | mid tkn | |||
Payload | Payload | |||
0x10c6d7c26cc1e9aef3f2461e0c29 (14 bytes) | 0x10c6d7c26cc1e9aef3f2461e0c29 (14 bytes) | |||
Compressed msg length: 16 bytes | Compressed msg length: 16 bytes | |||
Figure 19: SCHC-OSCORE Compressed CONTENT Response | Figure 18: SCHC-OSCORE Compressed CONTENT Response | |||
For contrast, we compare these results with what would be obtained by | For contrast, we compare these results with what would be obtained by | |||
SCHC compressing the original CoAP messages without protecting them | SCHC compressing the original CoAP messages without protecting them | |||
with OSCORE. To do this, we compress the CoAP messages according to | with OSCORE. To do this, we compress the CoAP messages according to | |||
the SCHC rules in Figure 20. | the SCHC rules in Figure 19. | |||
Rule ID 1 | Rule ID 1 | |||
+---------------+--+--+-----------+---------+-----------++--------+ | +---------------+--+--+-----------+---------+-----------++--------+ | |||
| Field |FP|DI| Target | MO | CDA || Sent | | | Field |FP|DI| Target | MO | CDA || Sent | | |||
| | | | Value | | || [bits] | | | | | | Value | | || [bits] | | |||
+---------------+--+--+-----------+---------+-----------++--------+ | +---------------+--+--+-----------+---------+-----------++--------+ | |||
|CoAP version | |bi| 01 |equal |not-sent || | | |CoAP version | |bi| 01 |equal |not-sent || | | |||
|CoAP Type | |up| 0 |equal |not-sent || | | |CoAP Type | |up| 0 |equal |not-sent || | | |||
|CoAP Type | |dw| 2 |equal |not-sent || | | |CoAP Type | |dw| 2 |equal |not-sent || | | |||
|CoAP TKL | |bi| 1 |equal |not-sent || | | |CoAP TKL | |bi| 1 |equal |not-sent || | | |||
|CoAP Code | |up| 2 |equal |not-sent || | | |CoAP Code | |up| 2 |equal |not-sent || | | |||
|CoAP Code | |dw| [69,132] |equal |not-sent || | | |CoAP Code | |dw| [69,132] |match-map|map-sent ||C | | |||
|CoAP MID | |bi| 0000 |MSB(12) |LSB ||MMMM | | |CoAP MID | |bi| 0000 |MSB(12) |LSB ||MMMM | | |||
|CoAP Token | |bi| 0x80 |MSB(5) |LSB ||TTT | | |CoAP Token | |bi| 0x80 |MSB(5) |LSB ||TTT | | |||
|CoAP Uri-Path | |up|temperature|equal |not-sent || | | |CoAP Uri-Path | |up|temperature|equal |not-sent || | | |||
|COAP Option-End| |dw| 0xFF |equal |not-sent || | | |COAP Option-End| |dw| 0xFF |equal |not-sent || | | |||
+---------------+--+--+-----------+---------+-----------++--------+ | +---------------+--+--+-----------+---------+-----------++--------+ | |||
Figure 20: SCHC-CoAP Rules (No OSCORE) | Figure 19: SCHC-CoAP Rules (No OSCORE) | |||
This yields the results in Figure 21 for the Request, and Figure 22 | This yields the results in Figure 20 for the Request, and Figure 21 | |||
for the Response. | for the Response. | |||
Compressed message: | Compressed message: | |||
================== | ================== | |||
0x0114 | 0x0114 | |||
0x01 = Rule ID | 0x01 = Rule ID | |||
Compression residue: | Compression residue: | |||
0b00010100 (1 byte) | 0b00010100 (1 byte) | |||
Compressed msg length: 2 | Compressed msg length: 2 | |||
Figure 21: CoAP GET Compressed without OSCORE | Figure 20: CoAP GET Compressed without OSCORE | |||
Compressed message: | Compressed message: | |||
================== | ================== | |||
0x010a32332043 | 0x010a32332043 | |||
0x01 = Rule ID | 0x01 = Rule ID | |||
Compression residue: | Compression residue: | |||
0b00001010 (1 byte) | 0b00001010 (1 byte) | |||
Payload | Payload | |||
0x32332043 | 0x32332043 | |||
Compressed msg length: 6 | Compressed msg length: 6 | |||
Figure 22: CoAP CONTENT Compressed without OSCORE | Figure 21: CoAP CONTENT Compressed without OSCORE | |||
As can be seen, the difference between applying SCHC + OSCORE as | As can be seen, the difference between applying SCHC + OSCORE as | |||
compared to regular SCHC + COAP is about 10 bytes of cost. | compared to regular SCHC + COAP is about 10 bytes of cost. | |||
8. IANA Considerations | 8. IANA Considerations | |||
This document has no request to IANA. | This document has no request to IANA. | |||
9. Security considerations | 9. Security considerations | |||
This document does not have any more Security consideration than the | This document does not have any more Security consideration than the | |||
ones already raised on [I-D.ietf-lpwan-ipv6-static-context-hc] | ones already raised on [I-D.ietf-lpwan-ipv6-static-context-hc] | |||
10. Acknowledgements | 10. Acknowledgements | |||
Thanks to all the persons that have give us feedback | The authors would like to thank Dominique Barthel, Carsten Bormann, | |||
Thomas Fossati, Klaus Hartke, Francesca Palombini, Alexander Pelov, | ||||
Goran Selander. | ||||
11. Normative References | 11. Normative References | |||
[I-D.ietf-core-object-security] | [I-D.ietf-core-object-security] | |||
Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | |||
"Object Security for Constrained RESTful Environments | "Object Security for Constrained RESTful Environments | |||
(OSCORE)", draft-ietf-core-object-security-16 (work in | (OSCORE)", draft-ietf-core-object-security-16 (work in | |||
progress), March 2019. | progress), March 2019. | |||
[I-D.ietf-lpwan-ipv6-static-context-hc] | [I-D.ietf-lpwan-ipv6-static-context-hc] | |||
Minaburo, A., Toutain, L., Gomez, C., Barthel, D., and J. | Minaburo, A., Toutain, L., Gomez, C., Barthel, D., and J. | |||
Zuniga, "LPWAN Static Context Header Compression (SCHC) | Zuniga, "Static Context Header Compression (SCHC) and | |||
and fragmentation for IPv6 and UDP", draft-ietf-lpwan- | fragmentation for LPWAN, application to UDP/IPv6", draft- | |||
ipv6-static-context-hc-18 (work in progress), December | ietf-lpwan-ipv6-static-context-hc-19 (work in progress), | |||
2018. | July 2019. | |||
[I-D.toutain-core-time-scale] | [I-D.toutain-core-time-scale] | |||
Minaburo, A. and L. Toutain, "CoAP Time Scale Option", | Minaburo, A. and L. Toutain, "CoAP Time Scale Option", | |||
draft-toutain-core-time-scale-00 (work in progress), | draft-toutain-core-time-scale-00 (work in progress), | |||
October 2017. | October 2017. | |||
[rfc7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | [rfc7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | |||
Application Protocol (CoAP)", RFC 7252, | Application Protocol (CoAP)", RFC 7252, | |||
DOI 10.17487/RFC7252, June 2014, | DOI 10.17487/RFC7252, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7252>. | <https://www.rfc-editor.org/info/rfc7252>. | |||
End of changes. 68 change blocks. | ||||
175 lines changed or deleted | 157 lines changed or added | |||
This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |