<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.6.6 (Ruby 3.1.1) -->
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-packed-05" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.3 -->
  <front>
    <title abbrev="Packed CBOR">Packed CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-packed-05"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2022" month="April" day="20"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>The Concise Binary Object Representation (CBOR, RFC 8949 == STD 94) is a data
format whose design goals include the possibility of extremely small
code size, fairly small message size, and extensibility without the
need for version negotiation.</t>
      <t>CBOR does not provide any forms of data compression.
CBOR data items, in particular when generated from legacy data models,
often allow considerable gains in compactness when applying data
compression.
While traditional data compression techniques such as DEFLATE (RFC 1951) can work well for CBOR encoded data items, their disadvantage is
that the receiver needs to uncompress the compressed form to make
use of the data.</t>
      <t>This specification describes Packed CBOR, a simple transformation of a
CBOR data item into another CBOR data item that is almost as easy to
consume as the original CBOR data item.  A separate decompression
step is therefore often not required at the receiver.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <t>This is a working-group draft of the CBOR working group of the
IETF, <eref target="https://datatracker.ietf.org/wg/cbor/about/">https://datatracker.ietf.org/wg/cbor/about/</eref>.
Discussion takes places on the GitHub repository
<eref target="https://github.com/cbor-wg/cbor-packed">https://github.com/cbor-wg/cbor-packed</eref> and on the CBOR WG mailing
list, <eref target="https://www.ietf.org/mailman/listinfo/cbor">https://www.ietf.org/mailman/listinfo/cbor</eref>.</t>
    </note>
  </front>
  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <t>The Concise Binary Object Representation (CBOR, <xref target="STD94"/>) is a data
format whose design goals include the possibility of extremely small
code size, fairly small message size, and extensibility without the
need for version negotiation.</t>
      <t>CBOR does not provide any forms of data compression.
CBOR data items, in particular when generated from legacy data models,
often allow considerable gains in compactness when applying data
compression.
While traditional data compression techniques such as DEFLATE <xref target="RFC1951"/> can work well for CBOR encoded data items, their disadvantage is
that the receiver needs to uncompress the compressed form to make
use of the data.</t>
      <t>This specification describes Packed CBOR, a simple transformation of a
CBOR data item into another CBOR data item that is almost as easy to
consume as the original CBOR data item.  A separate decompression
step is therefore often not required at the receiver.</t>
      <t>This document defines the Packed CBOR format by specifying the
transformation from a Packed CBOR data item to the original CBOR data
item; it does not define an algorithm for a packer.
Different packers can differ in the amount of effort they invest in
arriving at a minimal packed form; often, they simply employ the
sharing that is natural for a specific application.</t>
      <t>Packed CBOR can make use of two kinds of optimization:</t>
      <ul spacing="normal">
        <li>item sharing: substructures (data items) that occur repeatedly
in the original CBOR data item can be collapsed to a simple
reference to a common representation of that data item.
The processing required during consumption is limited to following
that reference.</li>
        <li>affix sharing: data items (strings, containers) that share a prefix
or suffix (affix) can be replaced by a
reference to a common affix plus the rest of the data item.  For
strings, the
processing required during consumption is similar to following the
affix reference plus that for an indefinite-length string.</li>
      </ul>
      <t>A specific application protocol that employs Packed CBOR might allow
both kinds of optimization or limit the representation to item
sharing only.</t>
      <t>Packed CBOR is defined in two parts: Referencing packing tables
(<xref target="sec-packed-cbor"/>) and setting up packing tables
(<xref target="sec-table-setup"/>).</t>
      <section anchor="terms">
        <name>Terminology</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
        <dl>
          <dt>Packed reference:</dt>
          <dd>
            <t>A shared item reference or an affix reference.</t>
          </dd>
          <dt>Shared item reference:</dt>
          <dd>
            <t>A reference to a shared item as defined in <xref target="sec-referencing-shared-items"/>.</t>
          </dd>
          <dt>Affix reference:</dt>
          <dd>
            <t>A reference that combines an affix item as defined in <xref target="sec-referencing-affix-items"/>.</t>
          </dd>
          <dt>Affix:</dt>
          <dd>
            <t>Prefix or suffix.</t>
          </dd>
          <dt>Packing tables:</dt>
          <dd>
            <t>The triple of a shared item table, a prefix table, and a suffix table.</t>
          </dd>
          <dt>Current set:</dt>
          <dd>
            <t>The packing tables in effect at the data item under consideration.</t>
          </dd>
          <dt>Expansion:</dt>
          <dd>
            <t>The result of applying a packed reference in the context of given
Packing tables.</t>
          </dd>
        </dl>
        <t>The definitions of <xref target="STD94"/> apply.
Specifically: The term "byte" is used in its now customary sense as a synonym for
"octet"; "byte strings" are CBOR data items carrying a sequence of
zero or more (binary) bytes, while "text strings" are CBOR data items carrying a
sequence of zero or more Unicode code points, encoded in UTF-8
<xref target="STD63"/>.</t>
        <t>Where bit arithmetic is explained, this document uses the notation
familiar from the programming language C (including C++14's 0bnnn
binary literals), except that, in the plain text form of this document,
the operator "^" stands for exponentiation, and,
in the HTML and PDF versions, subtraction and negation are rendered as
a hyphen ("-", as are various dashes).</t>
      </section>
    </section>
    <section anchor="sec-packed-cbor">
      <name>Packed CBOR</name>
      <t>This section describes the packing tables, their structure, and how
they are referenced.</t>
      <section anchor="sec-packing-tables">
        <name>Packing Tables</name>
        <t>At any point within a data item making use of Packed CBOR, there is a
Current Set of packing tables that applies.</t>
        <t>There are three packing tables in a Current Set:</t>
        <ul spacing="normal">
          <li>Shared item table</li>
          <li>Prefix table</li>
          <li>Suffix table</li>
        </ul>
        <t>Without any table setup, all these tables are empty arrays.
Table setup can cause these arrays to be non-empty, where the elements are
(potentially themselves packed) data items.
Each of the tables is indexed by an unsigned integer (starting
from 0).
Such an index may be derived from information in tags and their
content as well as from CBOR simple values.</t>
      </section>
      <section anchor="sec-referencing-shared-items">
        <name>Referencing Shared Items</name>
        <t>Shared items are stored in the shared item table of the Current Set.</t>
        <t>The shared data items are referenced by using the reference data items
in <xref target="tab-shared"/>.  When reconstructing the original data item, such a
reference is replaced by the referenced data item, which is then
recursively unpacked.</t>
        <table anchor="tab-shared">
          <name>Referencing Shared Values</name>
          <thead>
            <tr>
              <th align="left">reference</th>
              <th align="left">table index</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Simple value 0-15</td>
              <td align="left">0-15</td>
            </tr>
            <tr>
              <td align="left">Tag 6(unsigned integer N)</td>
              <td align="left">16 + 2*N</td>
            </tr>
            <tr>
              <td align="left">Tag 6(negative integer N)</td>
              <td align="left">16 - 2*N - 1</td>
            </tr>
          </tbody>
        </table>
        <t>As examples in CBOR diagnostic notation (<xref section="8" sectionFormat="of" target="STD94"/>),
the first 22 elements of the shared item table are referenced by
<tt>simple(0)</tt>, <tt>simple(1)</tt>, ... <tt>simple(15)</tt>, <tt>6(0)</tt>, <tt>6(-1)</tt>, <tt>6(1)</tt>,
<tt>6(-2)</tt>, <tt>6(2)</tt>, <tt>6(-3)</tt>.
(The alternation between unsigned and negative integers for even/odd
table index values -- "zigzag encoding" -- makes systematic use of
shorter integer encodings first.)</t>
        <t>Taking into account the encoding of these referring data items, there
are 16 one-byte references, 48 two-byte references, 512 three-byte
references, 131072 four-byte references, etc.
As CBOR integers can grow to very large (or very negative) values,
there is no practical limit to how many shared items might be used in
a Packed CBOR item.</t>
        <t>Note that the semantics of Tag 6 depend on its tag content: An integer
turns the tag into a shared item reference, whereas a string or
container (map or array) turns it into a prefix reference (see
<xref target="tab-prefix"/>).
Note also that the tag content of Tag 6 may itself be packed, so it
may need to be unpacked to make this determination.</t>
      </section>
      <section anchor="sec-referencing-affix-items">
        <name>Referencing Affix Items</name>
        <t>Prefix items are stored in the prefix table of the Current Set;
suffix items are stored in the suffix table of the Current Set.
We collectively call these items affix items; when referencing, which
of the tables is actually used depends on whether a prefix or a suffix
reference was used.</t>
        <table anchor="tab-prefix">
          <name>Referencing Prefix Values</name>
          <thead>
            <tr>
              <th align="left">prefix reference</th>
              <th align="right">table index</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Tag 6(suffix)</td>
              <td align="right">0</td>
            </tr>
            <tr>
              <td align="left">Tag 225-255(suffix)</td>
              <td align="right">1-31</td>
            </tr>
            <tr>
              <td align="left">Tag 28704-32767(suffix)</td>
              <td align="right">32-4095</td>
            </tr>
            <tr>
              <td align="left">Tag 1879052288-2147483647(suffix)</td>
              <td align="right">4096-268435455</td>
            </tr>
          </tbody>
        </table>
        <table anchor="tab-suffix">
          <name>Referencing Suffix Values</name>
          <thead>
            <tr>
              <th align="left">suffix reference</th>
              <th align="right">table index</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Tag 216-223(prefix)</td>
              <td align="right">0-7</td>
            </tr>
            <tr>
              <td align="left">Tag 27647-28671(prefix)</td>
              <td align="right">8-1023</td>
            </tr>
            <tr>
              <td align="left">Tag 1811940352-1879048191(prefix)</td>
              <td align="right">1024-67108863</td>
            </tr>
          </tbody>
        </table>
        <t>Affix data items are referenced by using the data items in
<xref target="tab-prefix"/> and <xref target="tab-suffix"/>.
The tag number indicates the table used (prefix or suffix) and a table
index (an unsigned integer); the tag content contains a "rump item".
When reconstructing the original data item, such a
reference is replaced by a data item constructed from the referenced
affix data item (affix, which might need to be recursively unpacked
first) "concatenated" with the tag content (rump, again possibly
recursively unpacked).</t>
        <ul spacing="normal">
          <li>For a rump of type array and map, the affix also needs to be an
array or a map.
For an array, the elements from the prefix are prepended to the rump
array, while the elements from a suffix are appended.
For a map, the entries in the affix are added to those of the rump;
prefix and suffix references differ in how entries with identical
keys are combined: for prefix references, an entry in the rump with
the same key as an entry in the affix overrides the one in the
affix, while for suffix references, an entry in the affix overrides
an entry in the rump that has the same key.</li>
        </ul>
        <aside>
          <t>NOTE:
  One application of the rule for prefix references is to supply
  default values out of a dictionary, which can then be overridden by
  the entries in the map supplied as the rump value.
  Note that this pattern provides no way to remove a map entry from
  the prefix table entry.</t>
        </aside>
        <ul spacing="normal">
          <li>For a rump of one of the string types, the affix also needs to be one
of the string types; the bytes of the strings are concatenated as
specified (prefix + rump, rump + suffix).
The result of the concatenation gets the type of the rump; this way
a single affix can be used to build both byte and text strings,
depending on what type of rump is being used.</li>
        </ul>
        <t>As a contrived (but short) example, if the prefix table is <tt>["foobar",
"foob", "fo"]</tt>, the following prefix references will all unpack to
<tt>"foobart"</tt>: <tt>6("t")</tt>, <tt>224("art")</tt>, <tt>225("obart")</tt> (the last example
is not an optimization).</t>
        <!-- 2<sup>28</sup>2<sup>12</sup>+2<sup>5</sup>+2<sup>0</sup> -->

<t>Taking into account the encoding, there is one single-byte prefix
reference, 31 (2<sup>5</sup>-2<sup>0</sup>) two-byte references, 4064
(2<sup>12</sup>-2<sup>5</sup>) three-byte references, and 26843160
(2<sup>28</sup>-2<sup>12</sup>) five-byte references for prefixes.
268435455 (2<sup>28</sup>) is an artificial limit, but should be high
enough that there, again, is no practical limit to how many prefix
items might be used in a Packed CBOR item.
The numbers for suffix references are one quarter of those, except
that there is no single-byte reference and 8 two-byte references.</t>
        <aside>
          <t>Rationale:
Experience suggests that prefix packing might be more
likely than suffix packing.  Also for this reason, there is no intent
to spend a 1+0 tag value for suffix packing.</t>
        </aside>
      </section>
      <section anchor="sec-discussion">
        <name>Discussion</name>
        <t>This specification uses up a large number of Simple Values and Tags,
in particular one of the rare one-byte tags and two thirds of the one-byte
simple values.  Since the objective is compression, this is warranted
only based on a consensus that this specific format could be
useful for a wide area of applications, while maintaining reasonable
simplicity in particular at the side of the consumer.</t>
        <t>A maliciously crafted Packed CBOR data item might contain a reference
loop.  A consumer/decompressor <bcp14>MUST</bcp14> protect against that.</t>
        <aside>
          <t>Different strategies for decoding/consuming Packed CBOR are available.<br/>
For example:</t>
          <ul spacing="normal">
            <li>the decoder can decode and unpack the packed item, presenting an
unpacked data item to the application.  In this case, the onus of
dealing with loops is on the decoder.  (This strategy generally has
the highest memory consumption, but also the simplest interface to
the application.)  Besides avoiding getting stuck in a reference
loop, the decoder will need to control its resource allocation, as
data items can "blow up" during unpacking.</li>
            <li>the decoder can be oblivious of Packed CBOR.  In this case, the onus
of dealing with loops is on the application, as is the entire onus
of dealing with Packed CBOR.</li>
            <li>hybrid models are possible, for instance: The decoder builds a data
item tree directly from the Packed CBOR as if it were oblivious, but
also provides accessors that hide (resolve) the packing.  In this
specific case, the onus of dealing with loops is on the accessors.</li>
          </ul>
          <t>In general, loop detection can be handled in a similar way in which
loops of symbolic links are handled in a file system: A system-wide
limit (often 31 or 40 indirections for symbolic links) is applied to
any reference chase.</t>
        </aside>
        <aside>
          <t>NOTE:
The present specification does nothing to help with the packing of CBOR
sequences <xref target="RFC8742"/>; maybe such a specification should be added.</t>
        </aside>
      </section>
    </section>
    <section anchor="sec-table-setup">
      <name>Table Setup</name>
      <t>The packing references described in <xref target="sec-packed-cbor"/> assume that
packing tables have been set up.</t>
      <t>By default, all three tables are empty (zero-length arrays).</t>
      <t>Table setup can happen in one of two ways:</t>
      <ul spacing="normal">
        <li>By the application environment, e.g., a media type.  These can
define tables that amount to a static dictionary that can be used in
a CBOR data item for this application environment.
Note that, without this information, a data item that uses such a
static dictionary can be decoded at the CBOR level, but not fully
unpacked.
The table setup mechanisms provided by this document are defined in
such a way that an unpacker can at least recognize if this is the
case.</li>
        <li>By one or more tags enclosing the packed content.
These can be defined to add to the packing tables that already apply
to the tag.  Usually, the semantics of the tag will be to prepend
items to one of the tables.
Note that it may be useful to leave a particular efficiency tier
alone and only prepend to a higher tier; e.g., a tag could insert
shared items at table index 16 and shift anything that was already
there further down in the array while leaving index 0 to 15 alone.
Explicit additions by tag can combine with application-environment
supplied tables that apply to the entire CBOR data item.</li>
      </ul>
      <t>For table setup, the present specification only defines a single tag,
which operates by prepending to the (by default empty) tables.</t>
      <aside>
        <t>We could also define a tag for dictionary referencing (or include that
in the basic packed CBOR), but the desirable details are likely to vary
considerably between applications.  A URI-based reference would be
easy to add, but might be too inefficient when used in the likely
combination with an <tt>ni:</tt> URI <xref target="RFC6920"/>.</t>
      </aside>
      <section anchor="sec-basic-packed-cbor">
        <name>Basic Packed CBOR</name>
        <t>A predefined tag for packing table setup is defined in CDDL <xref target="RFC8610"/> as in <xref target="fig-cddl"/>:</t>
        <figure anchor="fig-cddl">
          <name>Packed CBOR in CDDL</name>
          <sourcecode type="cddl"><![CDATA[
Basic-Packed-CBOR = #6.51([[*shared-item], [*prefix-item],
                           [*suffix-item], rump])
rump = any
prefix-item = any
suffix-item = any
shared-item = any
]]></sourcecode>
        </figure>
        <t>(This assumes the allocation of tag number 51 for this tag.)</t>
        <t>The arrays given as the first, second, and third element of the
content of the tag 51 are prepended to the tables for shared items,
prefixes, and suffixes that apply to the entire tag (by default empty
tables).</t>
        <t>The original CBOR data item can be reconstructed by recursively
replacing shared, prefix, and suffix references encountered in the
rump by their expansions.</t>
        <t>Packed item references in the newly constructed (low-numbered) parts
of the table need to be interpreted in the number space of that table
(which includes the, now higher-numbered, inherited parts), while
references in any existing, inherited (higher-numbered) part continue
to use the (more limited) number space of the inherited table.</t>
      </section>
    </section>
    <section anchor="sec-iana-considerations">
      <name>IANA Considerations</name>
      <t>In the registry "<xref section="CBOR Tags" relative="#cbor-tags" sectionFormat="bare" target="IANA.cbor-tags"/>" <xref target="IANA.cbor-tags"/>,
IANA is requested to allocate the tags defined in <xref target="tab-tag-values"/>.</t>
      <table anchor="tab-tag-values">
        <name>Values for Tag Numbers</name>
        <thead>
          <tr>
            <th align="right">Tag</th>
            <th align="left">Data Item</th>
            <th align="left">Semantics</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">6</td>
            <td align="left">integer (for shared); text string, byte string, array, map (for prefix)</td>
            <td align="left">Packed CBOR: shared/prefix</td>
            <td align="left">draft-ietf-cbor-packed</td>
          </tr>
          <tr>
            <td align="right">225-255</td>
            <td align="left">text string, byte string, array, map</td>
            <td align="left">Packed CBOR: prefix</td>
            <td align="left">draft-ietf-cbor-packed</td>
          </tr>
          <tr>
            <td align="right">28704-32767</td>
            <td align="left">text string, byte string, array, map</td>
            <td align="left">Packed CBOR: prefix</td>
            <td align="left">draft-ietf-cbor-packed</td>
          </tr>
          <tr>
            <td align="right">1879052288-2147483647</td>
            <td align="left">text string, byte string, array, map</td>
            <td align="left">Packed CBOR: prefix</td>
            <td align="left">draft-ietf-cbor-packed</td>
          </tr>
          <tr>
            <td align="right">216-223</td>
            <td align="left">text string, byte string, array, map</td>
            <td align="left">Packed CBOR: suffix</td>
            <td align="left">draft-ietf-cbor-packed</td>
          </tr>
          <tr>
            <td align="right">27647-28671</td>
            <td align="left">text string, byte string, array, map</td>
            <td align="left">Packed CBOR: suffix</td>
            <td align="left">draft-ietf-cbor-packed</td>
          </tr>
          <tr>
            <td align="right">1811940352-1879048191</td>
            <td align="left">text string, byte string, array, map</td>
            <td align="left">Packed CBOR: suffix</td>
            <td align="left">draft-ietf-cbor-packed</td>
          </tr>
        </tbody>
      </table>
      <t>In the registry "<xref section="CBOR Simple Values" relative="#simple" sectionFormat="bare" target="IANA.cbor-simple-values"/>" <xref target="IANA.cbor-simple-values"/>,
IANA is requested to allocate the simple values defined in <xref target="tab-simple-values"/>.</t>
      <table anchor="tab-simple-values">
        <name>Simple Values</name>
        <thead>
          <tr>
            <th align="right">Value</th>
            <th align="left">Semantics</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0-15</td>
            <td align="left">Packed CBOR: shared</td>
            <td align="left">draft-ietf-cbor-packed</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="sec-security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations of <xref target="STD94"/> apply.</t>
      <t>Loops in the Packed CBOR can be used as a denial of service attack,
see <xref target="sec-discussion"/>.</t>
      <t>As the unpacking is deterministic, packed forms can be used as signing
inputs.  (Note that if external dictionaries are added to cbor-packed,
this requires additional consideration.)</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="STD94" target="https://www.rfc-editor.org/info/rfc8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049.  It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="IANA.cbor-tags" target="https://www.iana.org/assignments/cbor-tags">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="IANA.cbor-simple-values" target="https://www.iana.org/assignments/cbor-simple-values">
          <front>
            <title>Concise Binary Object Representation (CBOR) Simple Values</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC8610" target="https://www.rfc-editor.org/info/rfc8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz">
              <organization/>
            </author>
            <author fullname="C. Vigano" initials="C." surname="Vigano">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049).  Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="STD63" target="https://www.rfc-editor.org/info/rfc3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau">
              <organization/>
            </author>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems.  The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo.  UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values.  This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
        <reference anchor="RFC7049" target="https://www.rfc-editor.org/info/rfc7049">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="October" year="2013"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.  These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
        <reference anchor="RFC8742" target="https://www.rfc-editor.org/info/rfc8742">
          <front>
            <title>Concise Binary Object Representation (CBOR) Sequences</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes the Concise Binary Object Representation (CBOR) Sequence format and associated media type "application/cbor-seq".  A CBOR Sequence consists of any number of encoded CBOR data items, simply concatenated in sequence.</t>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation.  This specification defines and registers "+cbor-seq" as a structured syntax suffix for CBOR Sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8742"/>
          <seriesInfo name="DOI" value="10.17487/RFC8742"/>
        </reference>
        <reference anchor="RFC6920" target="https://www.rfc-editor.org/info/rfc6920">
          <front>
            <title>Naming Things with Hashes</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell">
              <organization/>
            </author>
            <author fullname="D. Kutscher" initials="D." surname="Kutscher">
              <organization/>
            </author>
            <author fullname="C. Dannewitz" initials="C." surname="Dannewitz">
              <organization/>
            </author>
            <author fullname="B. Ohlman" initials="B." surname="Ohlman">
              <organization/>
            </author>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <author fullname="P. Hallam-Baker" initials="P." surname="Hallam-Baker">
              <organization/>
            </author>
            <date month="April" year="2013"/>
            <abstract>
              <t>This document defines a set of ways to identify a thing (a digital object in this case) using the output from a hash function.  It specifies a new URI scheme for this purpose, a way to map these to HTTP URLs, and binary and human-speakable formats for these names. The various formats are designed to support, but not require, a strong link to the referenced object, such that the referenced object may be authenticated to the same degree as the reference to it.  The reason for this work is to standardise current uses of hash outputs in URLs and to support new information-centric applications and other uses of hash outputs in protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6920"/>
          <seriesInfo name="DOI" value="10.17487/RFC6920"/>
        </reference>
        <reference anchor="RFC1951" target="https://www.rfc-editor.org/info/rfc1951">
          <front>
            <title>DEFLATE Compressed Data Format Specification version 1.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch">
              <organization/>
            </author>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.  This memo provides information for the Internet community.  This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1951"/>
          <seriesInfo name="DOI" value="10.17487/RFC1951"/>
        </reference>
      </references>
    </references>
    <section anchor="sec-examples">
      <name>Examples</name>
      <t>The (JSON-compatible) CBOR data structure depicted in
<xref target="fig-example-in"/>, 400 bytes of binary CBOR, could lead to a packed
CBOR data item depicted in <xref target="fig-example-out"/>, ~309 bytes.  Note that
this particular example does not lend itself to prefix compression.</t>
      <figure anchor="fig-example-in">
        <name>Example original CBOR data item</name>
        <sourcecode type="json"><![CDATA[
{ "store": {
    "book": [
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
]]></sourcecode>
      </figure>
      <figure anchor="fig-example-out">
        <name>Example packed CBOR data item</name>
        <sourcecode type="cbor-diag"><![CDATA[
51(["price", "category", "author", "title", "fiction", 8.95, "isbn"],
   /  0          1         2         3         4       5      6   /
   [], [],
   [{"store": {
      "book": [
        {simple(1): "reference", simple(2): "Nigel Rees",
         simple(3): "Sayings of the Century", simple(0): simple(5)},
        {simple(1): simple(4), simple(2): "Evelyn Waugh",
         simple(3): "Sword of Honour", simple(0): 12.99},
        {simple(1): simple(4), simple(2): "Herman Melville",
         simple(3): "Moby Dick", simple(6): "0-553-21311-3",
         simple(0): simple(5)},
        {simple(1): simple(4), simple(2): "J. R. R. Tolkien",
         simple(3): "The Lord of the Rings",
         simple(6): "0-395-19395-8", simple(0): 22.99}],
      "bicycle": {"color": "red", simple(0): 19.95}}}])
]]></sourcecode>
      </figure>
      <t>The (JSON-compatible) CBOR data structure below has been packed with shared
item and (partial) prefix compression only.</t>
      <figure anchor="fig-example-in2">
        <name>Example original CBOR data item</name>
        <sourcecode type="json"><![CDATA[
{
  "name": "MyLED",
  "interactions": [
    {
      "links": [
        {
          "href":
           "http://192.168.1.103:8445/wot/thing/MyLED/rgbValueRed",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "number"
        }
      },
      "name": "rgbValueRed",
      "writable": true,
      "@type": [
        "Property"
      ]
    },
    {
      "links": [
        {
          "href":
           "http://192.168.1.103:8445/wot/thing/MyLED/rgbValueGreen",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "number"
        }
      },
      "name": "rgbValueGreen",
      "writable": true,
      "@type": [
        "Property"
      ]
    },
    {
      "links": [
        {
          "href":
           "http://192.168.1.103:8445/wot/thing/MyLED/rgbValueBlue",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "number"
        }
      },
      "name": "rgbValueBlue",
      "writable": true,
      "@type": [
        "Property"
      ]
    },
    {
      "links": [
        {
          "href":
           "http://192.168.1.103:8445/wot/thing/MyLED/rgbValueWhite",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "number"
        }
      },
      "name": "rgbValueWhite",
      "writable": true,
      "@type": [
        "Property"
      ]
    },
    {
      "links": [
        {
          "href":
           "http://192.168.1.103:8445/wot/thing/MyLED/ledOnOff",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "boolean"
        }
      },
      "name": "ledOnOff",
      "writable": true,
      "@type": [
        "Property"
      ]
    },
    {
      "links": [
        {
          "href":
"http://192.168.1.103:8445/wot/thing/MyLED/colorTemperatureChanged",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "number"
        }
      },
      "name": "colorTemperatureChanged",
      "@type": [
        "Event"
      ]
    }
  ],
  "@type": "Lamp",
  "id": "0",
  "base": "http://192.168.1.103:8445/wot/thing",
  "@context":
   "http://192.168.1.102:8444/wot/w3c-wot-td-context.jsonld"
}
]]></sourcecode>
      </figure>
      <figure anchor="fig-example-out2">
        <name>Example packed CBOR data item</name>
        <sourcecode type="cbordiag"><![CDATA[
51([/shared/["name", "@type", "links", "href", "mediaType",
            /  0       1       2        3         4 /
    "application/json", "outputData", {"valueType": {"type":
         /  5               6               7 /
    "number"}}, ["Property"], "writable", "valueType", "type"],
               /   8            9           10           11 /
   /prefix/ ["http://192.168.1.10", 6("3:8445/wot/thing"),
              / 6                        225 /
   225("/MyLED/"), 226("rgbValue"), "rgbValue",
     / 226             227           228     /
   {simple(6): simple(7), simple(9): true, simple(1): simple(8)}],
     / 229 /
   /suffix/ [],
   /rump/ {simple(0): "MyLED",
           "interactions": [
   229({simple(2): [{simple(3): 227("Red"), simple(4): simple(5)}],
    simple(0): 228("Red")}),
   229({simple(2): [{simple(3): 227("Green"), simple(4): simple(5)}],
    simple(0): 228("Green")}),
   229({simple(2): [{simple(3): 227("Blue"), simple(4): simple(5)}],
    simple(0): 228("Blue")}),
   229({simple(2): [{simple(3): 227("White"), simple(4): simple(5)}],
    simple(0): "rgbValueWhite"}),
   {simple(2): [{simple(3): 226("ledOnOff"), simple(4): simple(5)}],
    simple(6): {simple(10): {simple(11): "boolean"}}, simple(0):
    "ledOnOff", simple(9): true, simple(1): simple(8)},
   {simple(2): [{simple(3): 226("colorTemperatureChanged"),
    simple(4): simple(5)}], simple(6): simple(7), simple(0):
    "colorTemperatureChanged", simple(1): ["Event"]}],
     simple(1): "Lamp", "id": "0", "base": 225(""),
     "@context": 6("2:8444/wot/w3c-wot-td-context.jsonld")}])
]]></sourcecode>
      </figure>
    </section>
    <section numbered="false" anchor="sec-acknowledgements">
      <name>Acknowledgements</name>
      <t>CBOR packing was originally invented with the rest of CBOR, but did
not make it into <xref target="RFC7049"/>, the predecessor of <xref target="STD94"/>.
Various attempts to come up with a specification over the years didn't
proceed.
In 2017, <contact fullname="Sebastian Käbisch"/> proposed
investigating compact representations of W3C Thing Descriptions, which
prompted the author to come up with essentially the present design.</t>
      <!--  LocalWords:  CBOR extensibility IANA uint sint IEEE endian
 -->
<!--  LocalWords:  signedness endianness prepended decompressor
 -->
<!--  LocalWords:  prepend
 -->

</section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
