<?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.21 (Ruby 3.2.0) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-packed-08" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="Packed CBOR">Packed CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-packed-08"/>
    <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="January" day="23"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>The Concise Binary Object Representation (CBOR, RFC 8949 == STD 94) is a data
format whose design goals include the possibility of extremely small
code size, fairly small message size, and extensibility without the
need for version negotiation.</t>
      <t>CBOR does not provide any forms of data compression.
CBOR data items, in particular when generated from legacy data models,
often allow considerable gains in compactness when applying data
compression.
While traditional data compression techniques such as DEFLATE (RFC 1951) can work well for CBOR encoded data items, their disadvantage is
that the receiver needs to 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 (-08) is a refresh update to -07, which added
the concept of Tag Equivalence as initially discussed at the CBOR
Interim meeting 12 in 2022 and at IETF 114.</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>
    <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>
        <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>
      </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>For table setup, the present specification only defines a single
table-building 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.113([[*shared-item], [*argument-item], rump])
rump = any
argument-item = any
shared-item = any
]]></sourcecode>
        </figure>
        <t>(This assumes the allocation of tag number 113 ('q') for this tag.)</t>
        <t>The arrays given as the first and second element of the
content of the tag 113 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 tag 113 declares 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-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">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">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">
              <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>
          </front>
          <format target="http://www.iana.org/assignments/cbor-tags" type="TXT"/>
        </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>
          <format target="http://www.iana.org/assignments/cbor-simple-values" type="TXT"/>
        </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">
              <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">
          <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">
          <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">
          <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">
          <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">
          <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">
          <front>
            <title>Naming Things with Hashes</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell">
              <organization/>
            </author>
            <author fullname="D. Kutscher" initials="D." surname="Kutscher">
              <organization/>
            </author>
            <author fullname="C. Dannewitz" initials="C." surname="Dannewitz">
              <organization/>
            </author>
            <author fullname="B. Ohlman" initials="B." surname="Ohlman">
              <organization/>
            </author>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <author fullname="P. Hallam-Baker" initials="P." surname="Hallam-Baker">
              <organization/>
            </author>
            <date month="April" year="2013"/>
            <abstract>
              <t>This document defines a set of ways to identify a thing (a digital object in this case) using the output from a hash function.  It specifies a new URI scheme for this purpose, a way to map these to HTTP URLs, and binary and human-speakable formats for these names. The various formats are designed to support, but not require, a strong link to the referenced object, such that the referenced object may be authenticated to the same degree as the reference to it.  The reason for this work is to standardise current uses of hash outputs in URLs and to support new information-centric applications and other uses of hash outputs in protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6920"/>
          <seriesInfo name="DOI" value="10.17487/RFC6920"/>
        </reference>
        <reference anchor="RFC1951">
          <front>
            <title>DEFLATE Compressed Data Format Specification version 1.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch">
              <organization/>
            </author>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.  This memo provides information for the Internet community.  This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1951"/>
          <seriesInfo name="DOI" value="10.17487/RFC1951"/>
        </reference>
        <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">
              <organization/>
            </author>
            <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>
    <section anchor="sec-examples">
      <name>Examples</name>
      <t>The (JSON-compatible) CBOR data structure depicted in
<xref target="fig-example-in"/>, 400 bytes of binary CBOR, could lead to a packed
CBOR data item depicted in <xref target="fig-example-out"/>, ~309 bytes.  Note that
this particular example does not lend itself to prefix compression.</t>
      <figure anchor="fig-example-in">
        <name>Example original CBOR data item</name>
        <sourcecode type="json"><![CDATA[
{ "store": {
    "book": [
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
]]></sourcecode>
      </figure>
      <figure anchor="fig-example-out">
        <name>Example packed CBOR data item</name>
        <sourcecode type="cbor-diag"><![CDATA[
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.</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[
113([/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 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 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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
yAH4ZfyOCVVhrJbOcsXkhL5qYKht3UvanWU8pReId+P6DoISmqOtl5siHA40
o3v4LRYnqOBJWYfZebxZlqYD0UlUljLmOx7svhhWfueZiD6490RsCewT1jp+
94WbHZDVKhhcRiJzHI2QsuQgmAckuBflZWQUaGK8B60cCfDKjGheBhLurqlZ
kgyLy1IMoGhCurOdRbHVTLqqvWpsQfgGIr3EyNLltiELIIhZ7M2YT4lUYa+R
O/NK14v3IJwYITDAiqh7cwMPVh1f+EJQBdiewpasgjbrO97hbwN6bLOmd6CP
LsirS9JsmS22ptJApNFWxS1Ulf+D2rCGnGaYVYSIznffn190+vKvef6CP796
8t++f/rqyWN8Pv/tg2fP/IdInzj/7Yvvnz2uPlVvPnrx3XdPnj+Wl+mqqV2K
Ot89+ENH7OzOi5cXT188f/CsI8It1GZgTsI7cUECvUz7Ac6Ki8gZU4zoh49e
/p//PTokVfkvpCvHo9Ep6Ur5cjK6T6qVLVqZDbumX6ERIiIjG7O6gRcwjddJ
SV5FH+ZCcZldpwZmDqH289fADFl2X02m69HhN3oBC65ddDirXWSc7V7ZeVmQ
2HKpZRqPzdr1Bqbr8D74Q+27w3tw0ZOzZ9Cz6Az2oAgZVjEV7wrD7jI1oeu8
7QUZq6GDwqHjGv8IkecV6wzk2QFL3ttbyIOduXfmYPmcrSZsFe0KX1YqKi4V
BhI4H4TCvRvCAVWBqV+yHqm0SB9mASi2hilQWxviIqPCywlMJ529EmmIaZr6
W3erjoK24QUZBBAQQZ6RiFx9rM84YG0HASkKaFN40X2nWqZdJDvfKT7vGKnW
YYKqRBdgY1OCfG8ZJ9x/fkb0YQA/X6WRHm1ythZJ4FXDhIMDr2QmIhARNwAx
G1IreeX7qiH35P2arF82zmRAEvjANyBz/m/szMkKj2qEwZqw7/npBbk5qQY+
K4CGImZVoSGAiWdvbgaThOhGphhGPkBDpoVAAYFtOpNtaTvQKUxCNGdSwrQm
D35TlNkKYRdENNm1ITxu0yzdso0ddTKyQMrOlzKG0/kdFqeNqAJtcp7rOgtS
7MLY8+gnm2fe8ulOOMrTMxiuYNeL9qnDi//IwaNgcFMb/Ps04aAM/2edkaAn
i43vkLhHjAlY0YeigrBE4lrChGSbuQgAYef7i28HJ0AuwoDMlT9AdhNc8D3I
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
LiC3nLyveNjR/vDDACoQApfgylUswThwmSeycpyKESzAi75zYD7BXy05Jkm7
KdE3y41BM/jehFFI/bXVCzhRV+IoWP9eWKclOYbm5X549Na1DVKikTtIyMq7
9KnndjCtKtiubRUE4jPbzSC5M0bQmhTHDKPXHbT1LNDXUyIMOtbePMu4k2en
H6FEL16f7T4ziXPucsrPoJ9qmZ1BRmZ5+Zv6o503bIXAyKp6mPlj71JH35ZD
d9kZgTtiQ8m8foMuHq9JWHU7jWl6cuu4W60LXFCt5k2PO0fiAV6U3vcrCe43
FoTn6PabiEwwXosIzCMSmElTYCZ3S0x/AJZARvyY62NU+4htReuqN1LYzXQ3
sn6Rz6uzcBFlPRPAhq1I95ysYkV2oOUUlU+J8pICj7x9T5r7IVfHo+MuYeqX
NqV67ENbg6d29ibYlp3V1otruFqLHALV+JUncm7T756pzeRj+lwVwuWrv0CK
Dmos7vV4f390djabnJydjd7sFbyOIelsXqqj0A7NtB7Mc2tJ6HQc2bmryWxh
GxfRcwGHOBok+HukeLlDcrM15EuSKtMEHfK+/uU/TgZUh4yPhgfDcXXQWKTs
lU6llFo0G4OhHxdXD0MUgnCkLksorm4AiSnjOvTSNnDr3i1BUG+pzB2vHFCn
IUjS9QxnS6ZZPnO6tONFXUdFpQzNRiKHxjwDujhHnGov74QtCwmzr2ul1tl6
wJFZEaSyPC28EseHvYnIrw24lIIHbkPm43FumbvoFN+dP4i/hPHUOk8asX/G
8y5svtdF2Mc1QquapFKuO1vQWK7AoW3lZjMfJBP7NuYuNm7JvkPmMHq4KV3A
RtJRMk5Qhg4jjkMl2qezWr3TopEWaFSLaBwHFrw2uszWD7b4oEEH2byZCLWO
h5gkLu151DgABcg2pVQcc6MobZKpoJD2RxZdOlVr0EubudSymZwSaNkGP/a9
ws864WYtUaUgHDGmmVlmKQqd55slat+KOqnAZ65aLsHq9sOrQc0docRmXecZ
ObMrbxZxx2K4rbXk6LdB9rOPUAZLS2KwoMEKmP34cDg8uS9iU9DrcSsN8cW9
5ar0VE7zOxEsPHcZ4wjvnzMtbDnsydylrw7iaUKB0tITR4bS3jKmyFZWJt7F
e7DLIBTSNiW6+kgsGJm3M4TUftzQNeQEzR9fD4fDN5xfaY1N6EbKbMpOQf/i
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
AesrUxTqkwAA

-->

</rfc>
