<?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.5.26 (Ruby 3.1.0) -->
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-packed-04" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.1 -->
  <front>
    <title abbrev="Packed CBOR">Packed CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-packed-04"/>
    <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="February" day="13"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>The Concise Binary Object Representation (CBOR, RFC 8949) 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 unpack the compressed form to make use of 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>(TO DO, expand on text from abstract here; move references here and
neuter them in the abstract as per <xref section="4.3" sectionFormat="of" target="RFC7322"/>.)</t>
      <t>The specification defines a transformation from a Packed CBOR data
item to the original CBOR data item; it does not define an algorithm
for an actual packer.  Different packers can differ in the amount of
effort they invest in arriving at a minimal packed form.</t>
      <t>Packed CBOR can employ 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 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 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 content: An integer
turns the tag into a shared item reference, a string or container (map
or array) into a prefix reference (see <xref target="tab-prefix"/>).</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"/>.
Each of these implies the table used (prefix or
suffix), a table index (an unsigned integer) and 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, and the
elements from a suffix are appended to the rump array.
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:
  Not sure that we want to use the efficiencies of overriding,
  but having default values supplied out of a dictionary to be
  overridden by a rump sounds rather handy.
  Note that there is no way to remove a map entry from the table.</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 half of the one-byte
simple values.  Since the objective is compression, this is warranted
if and only if there is 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>ISSUE:
The present specification does nothing to help with the packing of CBOR
sequences <xref target="RFC8742"/>; maybe it should.</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="RFC7322" target="https://www.rfc-editor.org/info/rfc7322">
          <front>
            <title>RFC Style Guide</title>
            <author fullname="H. Flanagan" initials="H." surname="Flanagan">
              <organization/>
            </author>
            <author fullname="S. Ginoza" initials="S." surname="Ginoza">
              <organization/>
            </author>
            <date month="September" year="2014"/>
            <abstract>
              <t>This document describes the fundamental and unique style conventions and editorial policies currently in use for the RFC Series.  It captures the RFC Editor's basic requirements and offers guidance regarding the style and structure of an RFC.  Additional guidance is captured on a website that reflects the experimental nature of that guidance and prepares it for future inclusion in the RFC Style Guide.  This document obsoletes RFC 2223, "Instructions to RFC Authors".</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7322"/>
          <seriesInfo name="DOI" value="10.17487/RFC7322"/>
        </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="CBORdiag"><![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>
