<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.38 (Ruby 3.2.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-packed-09" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="Packed CBOR">Packed CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-packed-09"/>
    <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="2023" month="July" day="10"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 61?>

<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 decompress 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><cref anchor="status">The present version (-09) provides two table setup tags (common,
split setup) and discusses behavior in case of references to
unpopulated table entries during unpacking.</cref></t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-cbor-packed/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        CBOR Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cbor-wg/cbor-packed"/>.</t>
    </note>
  </front>
  <middle>
    <?line 103?>

<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 decompress 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>argument sharing: application of a function with two arguments, one of which is shared.
Data items (strings, containers) that share a prefix
or suffix (affix), or more generally data items that can be
constructed from a function taking a shared argument and a rump data item,
can be replaced by a reference to the shared argument plus a rump data
item.
For strings and the default "concatenation" function, the processing
required during consumption is similar to
following the argument 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>
        <?line -18?>

<dl>
          <dt>Packed reference:</dt>
          <dd>
            <t>A shared item reference or an argument 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>Argument reference:</dt>
          <dd>
            <t>A reference that combines a shared argument with a rump item as
defined in <xref target="sec-referencing-argument-items"/>.</t>
          </dd>
          <dt>Affix:</dt>
          <dd>
            <t>Prefix or suffix, used as an argument in an argument reference
employing the default function "concatenation".</t>
          </dd>
          <dt>Function reference:</dt>
          <dd>
            <t>An argument reference that uses a tag for argument, rump, or both,
causing the application of a function to reconstruct the data item.</t>
          </dd>
          <dt>Packing tables:</dt>
          <dd>
            <t>The pair of a shared item table and an argument 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 (more precisely: Unicode
scalar values), encoded in UTF-8 <xref target="STD63"/>.</t>
        <t>Where arithmetic is explained, this document uses the notation
familiar from the programming language C<!-- (including C++14's 0bnnn
binary literals) -->, except that ".." denotes a range that includes
both ends given, in the HTML and PDF versions, subtraction and
negation are rendered as a hyphen ("-", as are various dashes), and
superscript notation denotes exponentiation.
For example, 2 to the power of 64 is notated: 2<sup>64</sup>.
In the plain-text version of this specification, superscript notation
is not available and therefore is rendered by a surrogate notation.
That notation is not optimized for this RFC; it is unfortunately
ambiguous with C's exclusive-or and requires circumspection
from the reader of the plain-text version.</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 two packing tables in a Current Set:</t>
        <ul spacing="normal">
          <li>Shared item table</li>
          <li>Argument table</li>
        </ul>
        <t>Without any table setup, these two 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>
        <t>Table setup mechanisms (see <xref target="sec-table-setup"/>) may include all
information needed for table setup within the packed CBOR data item, or
they may refer external information.  This information may be
immutable, or may be intended to potentially grow over time.
This raises the question of how a reference to a new item should be
handled when the unpacker uses an older version of the external
information.</t>
        <t>If, during unpacking, an index is used that references an item that is
unpopulated in (e.g., outside the size of) the table in use, this <bcp14>MAY</bcp14> be treated as an
error by the unpacker and abort the unpacking.
Alternatively, the unpacker <bcp14>MAY</bcp14> provide the special value
<tt>1112(undefined)</tt> (the simple value &gt;undefined&lt; as per <xref section="5.7" sectionFormat="of" target="STD94"/>, enclosed in the tag 1112) to the application and leave the
error handling to the application.
An unpacker <bcp14>SHOULD</bcp14> document which of these two alternatives has been
chosen.
CBOR based protocols that include the use of packed CBOR
<bcp14>MAY</bcp14> require that unpacking errors are tolerated in some positions.</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 straight (prefix) reference (see
<xref target="tab-straight"/>).
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-argument-items">
        <name>Referencing Argument Items</name>
        <t>The argument table serves as a common table that can be used for argument
references, i.e., for concatenation as well as references involving a
function tag.</t>
        <t>When referencing an argument, a distinction is made between straight
and inverted references; if no function tag is involved, a straight
reference combines a prefix out of the argument table with the rump
data item, and an inverted reference combines a rump data item with a
suffix out of the argument table.</t>
        <table anchor="tab-straight">
          <name>Straight Referencing (e.g., Prefix) Arguments</name>
          <thead>
            <tr>
              <th align="left">straight reference</th>
              <th align="right">table index</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Tag 6(straight rump)</td>
              <td align="right">0</td>
            </tr>
            <tr>
              <td align="left">Tag 224..255(straight rump)</td>
              <td align="right">0..31</td>
            </tr>
            <tr>
              <td align="left">Tag 28704..32767(straight rump)</td>
              <td align="right">32..4095</td>
            </tr>
            <tr>
              <td align="left">Tag 1879052288..2147483647(straight rump)</td>
              <td align="right">4096..268435455</td>
            </tr>
          </tbody>
        </table>
        <table anchor="tab-inverted">
          <name>Inverted Referencing (e.g., Suffix) Arguments</name>
          <thead>
            <tr>
              <th align="left">inverted reference</th>
              <th align="right">table index</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Tag 216..223(inverted rump)</td>
              <td align="right">0..7</td>
            </tr>
            <tr>
              <td align="left">Tag 27647..28671(inverted rump)</td>
              <td align="right">8..1023</td>
            </tr>
            <tr>
              <td align="left">Tag 1811940352..1879048191(inverted rump)</td>
              <td align="right">1024..67108863</td>
            </tr>
          </tbody>
        </table>
        <t>Argument data items are referenced by using the reference data items
in <xref target="tab-straight"/> and <xref target="tab-inverted"/>.</t>
        <t>The tag number of the reference indicates a table index (an unsigned integer) leading
to the "argument"; the tag content of the reference is the "rump item".</t>
        <t>When reconstructing the original data item, such a reference is
replaced by a data item constructed from the argument data item found
in the table (argument, which might need to be recursively unpacked
first) and the rump data item (rump, again possibly recursively
unpacked).</t>
        <t>Separate from the tag used as a reference, a tag ("function tag") may
be involved to supply a function to be used in resolving the
reference.  It is crucial not to confuse reference tag and, if
present, function tag.</t>
        <t>A straight reference uses the argument as the provisional left-hand
side and the rump data item as the right-hand side.
An inverted reference uses the rump data item as the provisional
left-hand side and the argument as the right-hand side.</t>
        <t>In both cases, the provisional left-hand side is examined.  If it is a
tag ("function tag"), it is "unwrapped": The function tag's tag number
is established as the function to be applied, and the tag content is
kept as the unwrapped left-hand side.
If the provisional left-hand side is not a tag, it is kept as the
unwrapped left-hand side, and the function to be applied is
concatenation, as defined below.
The right-hand side is taken as is as the unwrapped right-hand side.</t>
        <t>If a function tag was given, the reference is replaced by the result
of applying the unpacking function to be computed to the left and
right-hand sides.
The unpacking function is defined by the definition of the tag number
supplied.
If that definition does not define an unpacking function, the result
of the unpacking is not valid.</t>
        <t>If no function tag was given, the reference is replaced by the
left-hand side "concatenated" with the right-hand side, where
concatenation is defined as in <xref target="sec-concatenation"/>.</t>
        <t>As a contrived (but short) example, if the argument table is
<tt>["foobar", h'666f6f62', "fo"]</tt>, each of the following straight (prefix)
references will unpack to <tt>"foobart"</tt>: <tt>6("t")</tt>, <tt>225("art")</tt>,
<tt>226("obart")</tt> (the byte string h'666f6f62' == 'foob' is concatenated
into a text string, and the last example is not an optimization).</t>
        <t>Note that table index 0 of the argument table can be referenced both
with tag 6 and tag 224,
however tag 6 with an integer content is used for shared item
references (see <xref target="tab-shared"/>), so to combine index 0 with an integer
rump, tag 224 needs to be used.</t>
        <!-- 2<sup>28</sup>2<sup>12</sup>+2<sup>5</sup>+2<sup>0</sup> -->

<t>Taking into account the encoding and ignoring the less optimal tag
224, there is one single-byte straight (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 straight references.
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 inverted (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 straight (prefix) packing might be more
likely than inverted (suffix) packing.  Also for this reason, there is no intent
to spend a 1+0 tag value for inverted packing.</t>
        </aside>
      </section>
      <section anchor="sec-concatenation">
        <name>Concatenation</name>
        <t>The concatenation function is defined as follows:</t>
        <ul spacing="normal">
          <li>If both left-hand side and right-hand side are arrays, the result of
the concatenation is an array with all elements of the
left-hand-side array followed by the elements of the right-hand side
array.</li>
          <li>If both left-hand side and right-hand side are maps, the result of
the concatenation is a map that is initialized with a copy of the
left-hand-side map, and then filled in with the members of the
right-hand side map, replacing any existing members that have the
same key.</li>
        </ul>
        <aside>
          <t>NOTE:
  One application of the rule for straight 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 data item.
  Note that this pattern provides no way to remove a map entry from
  the prefix table entry.</t>
        </aside>
        <ul spacing="normal">
          <li>If both left-hand side and right-hand side are one of the string
types (not necessarily the same), the bytes of the left-hand side
are concatenated with the bytes of the right-hand side.
Byte strings concatenated with text strings need to contain valid
UTF-8 data.
The result of the concatenation gets the type of the unwrapped rump
data item; this way a single argument table entry can be used to
build both byte and text strings, depending on what type of rump is
being used.</li>
          <li>If one side is one of the string types, and the other side is an
array, the result of the concatenation is equivalent to the
application of the "join" function (<xref target="join"/>) to the string as the
left-hand side and the array as the right-hand side.
The original right-hand side of the concatenation determines the
string type of the result.</li>
          <li>Other type combinations of left-hand side and right-hand side are
not valid.</li>
        </ul>
      </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, both 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>
          <t>By one or more <em>table-building</em> tags enclosing the packed content.
Each tag is usually defined to build an augmented table by adding to
the packing tables that already apply to the tag, and to apply the
resulting augmented table when unpacking the tag content.
Usually, the semantics of the tag will be to prepend items to one or
more of the tables.
(The specific behavior of any such tag, in the presence of a table
applying to it, needs to be carefully specified.)  </t>
          <t>
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.  </t>
          <t>
Packed item references in the newly constructed (low-numbered) parts
of the table are usually 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>
        </li>
      </ul>
      <t>Where external information is used in a table setup mechanism that is
not immutable, care needs to be taken so that, over time, references
to existing table entries stay valid (i.e., the information is only
extended)), and that a maximum size of this
information is given.  This allows an unpacker to recognize references
to items that are not yet defined in the version of the external
reference that it uses, providing backward and possibly limited
(degraded) forward compatibility.</t>
      <t>For table setup, the present specification only defines two simple
table-building tags,
which operate by prepending to the (by default empty) tables.</t>
      <aside>
        <t>Additional tags can be defined for dictionary referencing (possible combining that
with Basic Packed CBOR mechanisms).
The desirable details are likely to vary
considerably between applications.
A URI-based reference would be
easy to define, 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>Two tags are predefined by this specification for packing table setup.
They are 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.113([[*shared-and-argument-item], rump])
Split-Basic-Packed-CBOR =
                    #6.1113([[*shared-item], [*argument-item], rump])
rump = any
shared-and-argument-item = any
argument-item = any
shared-item = any
]]></sourcecode>
        </figure>
        <t>(This assumes the allocation of tag numbers 113 ('q') and 1113 for
these tags.)</t>
        <t>The array given as the first element of the content of tag 113
("Basic-Packed-CBOR") is prepended to both the tables for shared items
and arguments that apply to the entire tag (by default empty tables).
The arrays given as the first and second element of the content of the
tag 1113 ("Split-Basic-Packed-CBOR") are prepended to the tables for
shared items and arguments that apply to the entire tag (by default
empty tables).
As discussed in the introduction to this section, references
in the supplied new arrays use the new number space (where inherited
items are shifted by the new items given), while the inherited items
themselves use the inherited number space (so their semantics do not
change by the mere action of inheritance).</t>
        <t>The original CBOR data item can be reconstructed by recursively
replacing shared and argument references encountered in the rump by
their expansions.</t>
      </section>
    </section>
    <section anchor="sec-function-tags">
      <name>Function Tags</name>
      <t>Function tags that occur in an argument or a rump supply the semantics
for reconstructing a data item from their tag content and the
non-dominating rump or argument, respectively.
The present specification defines a pair of function tags.</t>
      <section anchor="join">
        <name>Join Function Tags</name>
        <t>Tag 106 ('j') defines the "join" unpacking function, based on the
concatenation function (<xref target="sec-concatenation"/>).</t>
        <t>The join function expects an item that can be concatenated as its
left-hand side, and an array of such items as its right-hand side.
Joining works by sequentially applying the concatenation function to
the elements of the right-hand-side array, interspersing the left-hand
side as the "joiner".</t>
        <t>An example in functional notation: <tt>join(", ", ["a", "b", "c"])</tt>
returns <tt>"a, b, c"</tt>.</t>
        <t>For a right-hand side of one or more elements, the first element
determines the type of the result when text strings and byte
strings are mixed in the argument.
For a right-hand side of one element, the joiner is not used, and that
element returned.
For a right-hand side of zero elements, a neutral element is generated
based on the type of the joiner
(empty text/byte string for a text/byte string, empty array for an array, empty map for a map).</t>
        <t>For an example, we assume this unpacked data item:</t>
        <sourcecode type="cbor-diag"><![CDATA[
["https://packed.example/foo.html",
 "coap:://packed.example/bar.cbor",
 "mailto:support@packed.example"]
]]></sourcecode>
        <t>A packed form of this using straight references could be:</t>
        <artwork><![CDATA[
113([[106("packed.example")],
  [6(["https://", "/foo.html"]),
   6(["coap://", "/bar.cbor"]),
   6(["mailto:support@", ""])]
])
]]></artwork>
        <t>Tag 105 ('i') defines the "ijoin" unpacking function, which is exactly
like that of tag 106, except that the left-hand side and right-hand
side are interchanged ('i').</t>
        <t>A packed form of the first example using inverted references and the ijoin tag could be:</t>
        <artwork><![CDATA[
113([["packed.example"],
  [216(105(["https://", "/foo.html"]),
   216(105(["coap://", "/bar.cbor"]),
   216("mailto:support@")]
])
]]></artwork>
        <t>A packed form of an array with many URIs that reference SenML items
from the same place could be:</t>
        <artwork><![CDATA[
113([[105(["coaps://[2001::db8::1]/s/", ".senml"])],
  [6("temp-freezer"),
   6("temp-fridge"),
   6("temp-ambient")]
])
]]></artwork>
      </section>
    </section>
    <section anchor="sec-tag-validity-tag-equivalence-principle">
      <name>Tag Validity: Tag Equivalence Principle</name>
      <t>In <xref section="5.3.2" sectionFormat="of" target="STD94"/>, the validity of tags is defined in terms
of type and value of their tag content.
The CBOR Tag registry <xref target="IANA.cbor-tags"/> <xref section="9.2" sectionFormat="of" target="STD94"/> allows
recording the "data item" for a registered tag, which is usually an
abbreviated description of the top-level data type allowed for the tag
content.</t>
      <t>In other words, in the registry, the validity of a tag of a given tag
number is described in terms of the top-level structure of the data
carried in the tag content.
The description of a tag might add further constraints for the data
item.
But in any case, a tag definition can only specify validity based on
the structure of its tag content.</t>
      <t>In Packed CBOR, a reference tag might be "standing in" for the actual
tag content of an outer tag, or for a structural component of that.
In this case, the formal structure of the outer tag's content before
unpacking usually no longer fulfills the validity conditions of the
outer tag.</t>
      <t>The underlying problem is not unique to Packed CBOR.
For instance, <xref target="RFC8746"/> describes tags 64..87 that "stand in" for CBOR
arrays (the native form of which has major type 4).
For the other tags defined in this specification, which require some
array structure of the tag content, a footnote was added:</t>
      <blockquote>
        <t>[...] The second element of the outer array in the data item is a
   native CBOR array (major type 4) or Typed Array (one of tag 64..87)</t>
      </blockquote>
      <t>The top-down approach to handle the "rendezvous" between the outer and
inner tags does not support extensibility: any further Typed Array
tags being defined do not inherit the exception granted to tag number
64..87; they would need to formally update all existing tag
definitions that can accept typed arrays or be of limited use with
these existing tags.</t>
      <t>Instead, the tag validity mechanism needs to be extended by a
bottom-up component: A tag definition needs to be able to declare that
the tag can "stand in" for, (is, in terms of tag validity, equivalent
to) some structure.</t>
      <t>E.g., tag 64..87 could have declared their equivalence to the CBOR major
type 4 arrays they stand in for.</t>
      <aside>
        <t>Note that not all domain extensions to tags can be addressed using
the equivalence principle: E.g., on a data model level, numbers with
arbitrary exponents (<xref target="ARB-EXP"/>, tags 264 and 265) are strictly a
superset of CBOR's predefined fractional types, tags 4 and 5.
They could not simply declare that they are equivalent to tags 4 and 5
as a tag requiring a fractional value may have no way to handle the
extended range of tag 264 and 265.</t>
      </aside>
      <section anchor="sec-tag-equivalence">
        <name>Tag Equivalence</name>
        <t>A tag definition <bcp14>MAY</bcp14> declare Tag Equivalence to some existing
structure for the tag, under some conditions defined by the new tag
definition.
This, in effect, extends all existing tag definitions that accept the
named structure to accept the newly defined tag under the conditions
given for the Tag Equivalence.</t>
        <t>A number of limitations apply to Tag Equivalence, which therefore
should be applied deliberately and sparingly:</t>
        <ul spacing="normal">
          <li>Tag Equivalence is a new concept, which may not be implemented by an
existing generic decoder.  A generic decoder not implementing tag
equivalence might raise tag validity errors where Tag Equivalence
says there should be none.</li>
          <li>A CBOR protocol <bcp14>MAY</bcp14> specify the use of Tag Equivalence, effectively
limiting its full use to those generic encoders that implement it.
Existing CBOR protocols that do not address Tag Equivalence
implicitly have a new variant that allows Tag Equivalence
(e.g., to support Packed CBOR with an existing protocol).
A CBOR protocol that does address Tag Equivalence <bcp14>MAY</bcp14> be explicit
about what kinds of Tag Equivalence it supports (e.g., only the
reference tags employed by Packed CBOR and certain table setup tags).</li>
          <li>There is currently no way to express Tag Equivalence in CDDL.
For Packed CBOR, CDDL would typically be used to describe the
unpacked CBOR represented by it; further restricting the Packed CBOR
is likely to lead to interoperability problems.
(Note that, by definition, there is no need to describe Tag
Equivalence on the receptacle side; only for the tag that declares
Tag Equivalence.)</li>
          <li>The registry "<xref section="CBOR Tags" relative="#cbor-tags" sectionFormat="bare" target="IANA.cbor-tags"/>" <xref target="IANA.cbor-tags"/>
currently does not have a way to record any equivalence claimed
for a tag.  A convention would be to alert to Tag Equivalence in the
"Semantics (short form)" field of the registry.<cref anchor="todo">Needs to be done for the tag registrations here.</cref></li>
        </ul>
      </section>
      <section anchor="sec-tag-equivalence-of-packed-cbor-tags">
        <name>Tag Equivalence of Packed CBOR Tags</name>
        <t>The reference tags in this specification declare their equivalence to
the unpacked shared items or function results they represent.</t>
        <t>The table setup tags 113 and 1113 declare its equivalence to the unpacked CBOR
data item represented by it.</t>
      </section>
    </section>
    <section anchor="sec-iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="sec-cbor-tags-registry">
        <name>CBOR Tags Registry</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, tag (for straight)</td>
              <td align="left">Packed CBOR: shared/straight</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">105</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: ijoin function</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">106</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: join function</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">113</td>
              <td align="left">array (shared-and-argument-items, rump)</td>
              <td align="left">Packed CBOR: table setup</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">224..255</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: straight</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">1112</td>
              <td align="left">undefined (0xf7)</td>
              <td align="left">Packed CBOR: reference error</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">1113</td>
              <td align="left">array (shared-items, argument-items, rump)</td>
              <td align="left">Packed CBOR: table setup</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, tag</td>
              <td align="left">Packed CBOR: straight</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, tag</td>
              <td align="left">Packed CBOR: straight</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, tag</td>
              <td align="left">Packed CBOR: inverted</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, tag</td>
              <td align="left">Packed CBOR: inverted</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, tag</td>
              <td align="left">Packed CBOR: inverted</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sec-cbor-simple-values-registry">
        <name>CBOR Simple Values Registry</name>
        <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>
    <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">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <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>
          </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>
          </front>
        </reference>
        <reference anchor="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"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <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">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <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">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <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">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau"/>
            <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">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <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">
          <front>
            <title>Concise Binary Object Representation (CBOR) Sequences</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <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">
          <front>
            <title>Naming Things with Hashes</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="D. Kutscher" initials="D." surname="Kutscher"/>
            <author fullname="C. Dannewitz" initials="C." surname="Dannewitz"/>
            <author fullname="B. Ohlman" initials="B." surname="Ohlman"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="P. Hallam-Baker" initials="P." surname="Hallam-Baker"/>
            <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">
          <front>
            <title>DEFLATE Compressed Data Format Specification version 1.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <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>
        <reference anchor="RFC8746">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Typed Arrays</title>
            <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR), as defined in RFC 7049, 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>This document makes use of this extensibility to define a number of CBOR tags for typed arrays of numeric data, as well as additional tags for multi-dimensional and homogeneous arrays. It is intended as the reference document for the IANA registration of the CBOR tags defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8746"/>
          <seriesInfo name="DOI" value="10.17487/RFC8746"/>
        </reference>
        <reference anchor="ARB-EXP" target="http://peteroupc.github.io/CBOR/bigfrac.html">
          <front>
            <title>Arbitrary-Exponent Numbers</title>
            <author initials="P." surname="Occil" fullname="Peter Occil">
              <organization/>
            </author>
            <date/>
          </front>
          <refcontent>Specification for Registration of CBOR Tags 264 and 265</refcontent>
        </reference>
      </references>
    </references>
    <?line 820?>

<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, so
it uses the simple common-table setup form (tag 113).</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.95
      },
      { "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[
113([["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 and employs the split-table
setup form (tag 1113).</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[
1113([/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 /
   /argument/ ["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 /
   /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 part of the original proposal that turned into 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 did not
proceed.
In 2017, <contact fullname="Sebastian Käbisch"/> proposed
investigating compact representations of W3C Thing Descriptions, which
prompted the author to come up with what turned into 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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
MwV1fpbPbNFuznMUKVqC423MgywCMaO+KoQNT/GbPYg21o6ZGFlT7toichmV
rVawMVfe89i++se11CwRdCDhNmVzpvGunp72wipSLqaKtUuntFAELu6UfkR+
oU1BkQ+R+mIeUIY70RC84JuZTl6d4O+84JGLXMKiYm+cKLb9hUXeSRjJm1vs
K2TBeVfr2vlaTricm7ZDVTLylj4UO9KzHKNGYwZY0w3CRqMyu5ym3YnTBiBG
y3BRLZo9a6mvnYT5Vk+tNQ6cIqoZigFp+devexT3lTXLPeFh9oSHFRyIspFR
P/fUhpx+0181b+0KP3CgnsHVkI9CG4mxZpfVwAR7W3X9MsslLaB2oefGI1bB
Vba9auSVaWnYmEietHLBfVElor7hrvqrHVc6NbeDD8IAjYhU0fJcowL0+cnZ
WuIcotaXcKtL9M+2eOTQBiqHXCXqveY1UQh2ECu5TcDFYppxo8ZQ2mpjO4lz
NykRB2J2+qocr2It4+IHdB4VQeVeYgC6tBYmdkR77O1hWShHYstGdoaNRZi3
W5yILVUS4m1ZdrXSI9nWR7r10lNSiKEICyDSm1VpqqhrWaYt2F4pL8uWoYFw
nKnnr1nv/We1g4ie8oF29zNXNhHpNtSC1gPUTQQqtEl5G6y2q2SidScoqJmi
Io3Pa7hXQ+xRoTM9StfKMvMKnTwrvtTe7UKMQTkrEfssKbjivPkuox7Tw4U9
pzeTfoViUqtUJJBbV6S5Pfuaj8DD4MSpmCwk6aW3uHesxRnJuhAXXWN43Vsw
ZClp9aUzsug6KxvruPqJYCOvgbEZbrRR4RophHM4m69vVFP7XiqyvBrB6c4T
fOHZRWt2ObAvmFF9bOTWV4WwiGcrOS3wpWyXJ8CVVEQJoIKnKf16uiG1d995
/9559vJqO8439L5qOv2dlkAAKv3cpjp7VpnFnRlDMEAKdrwlEYgpCXt+p0oh
KtUeULiCwEK63ooWqIFVUlQtwlmtfhqm89Ilw7p8fJ/t2B4ZbmlCw7h4t6x7
+Orfqnye85un+MPEPPUMwzlcAB+xhfd2wdK+RKMJS1jXLumrn+m4JI5Fg9da
/SzPVNm3D9lAc4QeJFnhPNevUUC0Xw1GxwmuyVDjTWTI9boUuZ0d4rjFNg2Y
rO53ts9usPKJinDutn5bQdl4nRjO5brXN+qLHXeR7Z3+16HdvsDBB4q5QbFw
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
orfL7/8XPvGHjEOdAAA=

-->

</rfc>
