<?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.15 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-packed-07" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.1 -->
  <front>
    <title abbrev="Packed CBOR">Packed CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-packed-07"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2022" month="July" day="24"/>
    <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 (-07) adds the concept of Tag Equivalence as
initially discussed at the CBOR Interim meeting 12 in 2022 and
further in PR #6, for discussion before 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 bit arithmetic is explained, this document uses the notation
familiar from the programming language C (including C++14's 0bnnn
binary literals), except that, in the plain text form of this document,
the operator "^" stands for exponentiation, and,
in the HTML and PDF versions, subtraction and negation are rendered as
a hyphen ("-", as are various dashes).</t>
      </section>
    </section>
    <section anchor="sec-packed-cbor">
      <name>Packed CBOR</name>
      <t>This section describes the packing tables, their structure, and how
they are referenced.</t>
      <section anchor="sec-packing-tables">
        <name>Packing Tables</name>
        <t>At any point within a data item making use of Packed CBOR, there is a
Current Set of packing tables that applies.</t>
        <t>There are 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 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 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" target="https://www.rfc-editor.org/info/rfc8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049.  It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="IANA.cbor-tags" target="https://www.iana.org/assignments/cbor-tags">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags</title>
            <author>
              <organization abbrev="IANA">Internet Assigned Numbers Authority</organization>
            </author>
            <date day="19" month="September" year="2013"/>
          </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 abbrev="IANA">Internet Assigned Numbers Authority</organization>
            </author>
            <date day="19" month="September" year="2013"/>
          </front>
        </reference>
        <reference anchor="RFC8610" target="https://www.rfc-editor.org/info/rfc8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz">
              <organization/>
            </author>
            <author fullname="C. Vigano" initials="C." surname="Vigano">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049).  Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="STD63" target="https://www.rfc-editor.org/info/rfc3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau">
              <organization/>
            </author>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems.  The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo.  UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values.  This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
        <reference anchor="RFC7049" target="https://www.rfc-editor.org/info/rfc7049">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="October" year="2013"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.  These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
        <reference anchor="RFC8742" target="https://www.rfc-editor.org/info/rfc8742">
          <front>
            <title>Concise Binary Object Representation (CBOR) Sequences</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes the Concise Binary Object Representation (CBOR) Sequence format and associated media type "application/cbor-seq".  A CBOR Sequence consists of any number of encoded CBOR data items, simply concatenated in sequence.</t>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation.  This specification defines and registers "+cbor-seq" as a structured syntax suffix for CBOR Sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8742"/>
          <seriesInfo name="DOI" value="10.17487/RFC8742"/>
        </reference>
        <reference anchor="RFC6920" target="https://www.rfc-editor.org/info/rfc6920">
          <front>
            <title>Naming Things with Hashes</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell">
              <organization/>
            </author>
            <author fullname="D. Kutscher" initials="D." surname="Kutscher">
              <organization/>
            </author>
            <author fullname="C. Dannewitz" initials="C." surname="Dannewitz">
              <organization/>
            </author>
            <author fullname="B. Ohlman" initials="B." surname="Ohlman">
              <organization/>
            </author>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <author fullname="P. Hallam-Baker" initials="P." surname="Hallam-Baker">
              <organization/>
            </author>
            <date month="April" year="2013"/>
            <abstract>
              <t>This document defines a set of ways to identify a thing (a digital object in this case) using the output from a hash function.  It specifies a new URI scheme for this purpose, a way to map these to HTTP URLs, and binary and human-speakable formats for these names. The various formats are designed to support, but not require, a strong link to the referenced object, such that the referenced object may be authenticated to the same degree as the reference to it.  The reason for this work is to standardise current uses of hash outputs in URLs and to support new information-centric applications and other uses of hash outputs in protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6920"/>
          <seriesInfo name="DOI" value="10.17487/RFC6920"/>
        </reference>
        <reference anchor="RFC1951" target="https://www.rfc-editor.org/info/rfc1951">
          <front>
            <title>DEFLATE Compressed Data Format Specification version 1.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch">
              <organization/>
            </author>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.  This memo provides information for the Internet community.  This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1951"/>
          <seriesInfo name="DOI" value="10.17487/RFC1951"/>
        </reference>
        <reference anchor="RFC8746" target="https://www.rfc-editor.org/info/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 didn't
proceed.
In 2017, <contact fullname="Sebastian Käbisch"/> proposed
investigating compact representations of W3C Thing Descriptions, which
prompted the author to come up with 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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
kFWSAAA=

-->

</rfc>
