<?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.7.4 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-packed-10" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.0 -->
  <front>
    <title abbrev="Packed CBOR">Packed CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-packed-10"/>
    <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="2024" month="January" day="09"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 60?>

<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 (-10) fixes references, an example, and
various nits and typos.</cref></t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-cbor-packed/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        CBOR Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cbor-wg/cbor-packed"/>.</t>
    </note>
  </front>
  <middle>
    <?line 101?>

<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>
          <t>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.</t>
        </li>
        <li>
          <t>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.</t>
        </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 and Conventions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<dl>
          <dt>Packed reference:</dt>
          <dd>
            <t>A shared item reference or an argument reference.</t>
          </dd>
          <dt>Shared item reference:</dt>
          <dd>
            <t>A reference to a shared item as defined in <xref target="sec-referencing-shared-items"/>.</t>
          </dd>
          <dt>Argument reference:</dt>
          <dd>
            <t>A reference that combines a shared argument with a rump item as
defined in <xref target="sec-referencing-argument-items"/>.</t>
          </dd>
          <dt>Affix:</dt>
          <dd>
            <t>Prefix or suffix, used as an argument in an argument reference
employing the default function "concatenation".</t>
          </dd>
          <dt>Function reference:</dt>
          <dd>
            <t>An argument reference that uses a tag for argument, rump, or both,
causing the application of a function to reconstruct the data item.</t>
          </dd>
          <dt>Packing tables:</dt>
          <dd>
            <t>The pair of a shared item table and an argument table.</t>
          </dd>
          <dt>Current set:</dt>
          <dd>
            <t>The packing tables in effect at the data item under consideration.</t>
          </dd>
          <dt>Expansion:</dt>
          <dd>
            <t>The result of applying a packed reference in the context of given
Packing tables.</t>
          </dd>
        </dl>
        <t>The definitions of <xref target="STD94"/> apply.
Specifically: The term "byte" is used in its now customary sense as a synonym for
"octet"; "byte strings" are CBOR data items carrying a sequence of
zero or more (binary) bytes, while "text strings" are CBOR data items carrying a
sequence of zero or more Unicode code points (more precisely: Unicode
scalar values), encoded in UTF-8 <xref target="STD63"/>.</t>
        <t>Where arithmetic is explained, this document uses the notation
familiar from the programming language C<!-- (including C++14's 0bnnn
binary literals) -->, except that ".." denotes a range that includes
both ends given, in the HTML and PDF versions, subtraction and
negation are rendered as a hyphen ("-", as are various dashes), and
superscript notation denotes exponentiation.
For example, 2 to the power of 64 is notated: 2<sup>64</sup>.
In the plain-text version of this specification, superscript notation
is not available and therefore is rendered by a surrogate notation.
That notation is not optimized for this RFC; it is unfortunately
ambiguous with C's exclusive-or and requires circumspection
from the reader of the plain-text version.</t>
        <t>Examples of CBOR data items are shown
in CBOR Extended Diagnostic Notation (Section <xref target="RFC8949" section="8" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> in
conjunction with <xref section="G" sectionFormat="of" target="RFC8610"/>).
<!-- mention edn-literal here if that completes faster -->
        </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>
            <t>Shared item table</t>
          </li>
          <li>
            <t>Argument table</t>
          </li>
        </ul>
        <t>Without any table setup, these two tables are empty arrays.
Table setup can cause these arrays to be non-empty, where the elements are
(potentially themselves packed) data items.
Each of the tables is indexed by an unsigned integer (starting
from 0).
Such an index may be derived from information in tags and their
content as well as from CBOR simple values.</t>
        <t>Table setup mechanisms (see <xref target="sec-table-setup"/>) may include all
information needed for table setup within the packed CBOR data item, or
they may refer to external information.  This information may be
immutable, or it may be intended to potentially grow over time.
This raises the question of how a reference to a new item should be
handled when the unpacker uses an older version of the external
information.</t>
        <t>If, during unpacking, an index is used that references an item that is
unpopulated in (e.g., outside the size of) the table in use, this <bcp14>MAY</bcp14> be treated as an
error by the unpacker and abort the unpacking.
Alternatively, the unpacker <bcp14>MAY</bcp14> provide the special value
<tt>1112(undefined)</tt> (the simple value &gt;undefined&lt; as per Section <xref target="RFC8949" section="5.7" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>, enclosed in the tag 1112) to the application and leave the
error handling to the application.
An unpacker <bcp14>SHOULD</bcp14> document which of these two alternatives has been
chosen.
CBOR based protocols that include the use of packed CBOR
<bcp14>MAY</bcp14> require that unpacking errors are tolerated in some positions.</t>
      </section>
      <section anchor="sec-referencing-shared-items">
        <name>Referencing Shared Items</name>
        <t>Shared items are stored in the shared item table of the Current Set.</t>
        <t>The shared data items are referenced by using the reference data items
in <xref target="tab-shared"/>.  When reconstructing the original data item, such a
reference is replaced by the referenced data item, which is then
recursively unpacked.</t>
        <table anchor="tab-shared">
          <name>Referencing Shared Values</name>
          <thead>
            <tr>
              <th align="left">reference</th>
              <th align="left">table index</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Simple value 0..15</td>
              <td align="left">0..15</td>
            </tr>
            <tr>
              <td align="left">Tag 6(unsigned integer N)</td>
              <td align="left">16 + 2*N</td>
            </tr>
            <tr>
              <td align="left">Tag 6(negative integer N)</td>
              <td align="left">16 - 2*N - 1</td>
            </tr>
          </tbody>
        </table>
        <t>As examples,
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 is used to derive 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 used to indicate 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 indicated unpacking function with the left-hand side
as its first argument and the right-hand side as its second.
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.
The preferred encoding uses tag 6 if that is not necessary.</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><tt>-</tt>2<sup>0</sup>) two-byte references, 4064
(2<sup>12</sup><tt>-</tt>2<sup>5</sup>) three-byte references, and 26843160
(2<sup>28</sup><tt>-</tt>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>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </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>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Other type combinations of left-hand side and right-hand side are
not valid.</t>
          </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>
              <t>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.</t>
            </li>
            <li>
              <t>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.</t>
            </li>
            <li>
              <t>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.</t>
            </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 set to a value permitting some 20 to 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>
          <t>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.</t>
        </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 along in the array while leaving index 0 to 15 alone.
Explicit additions by tag can combine with application-environment
supplied tables that apply to the entire CBOR data item.  </t>
          <t>
Packed item references in the newly constructed (low-numbered) parts
of the table are usually interpreted in the number space of that table
(which includes the, now higher-numbered, inherited parts), while
references in any existing, inherited (higher-numbered) part continue
to use the (more limited) number space of the inherited table.</t>
        </li>
      </ul>
      <t>Where external information is used in a table setup mechanism that is
not immutable, care needs to be taken so that, over time, references
to existing table entries stay valid (i.e., the information is only
extended)), and that a maximum size of this
information is given.  This allows an unpacker to recognize references
to items that are not yet defined in the version of the external
reference that it uses, providing backward and possibly limited
(degraded) forward compatibility.</t>
      <t>For table setup, the present specification only defines two simple
table-building tags,
which operate by prepending to the (by default empty) tables.</t>
      <aside>
        <t>Additional tags can be defined for dictionary referencing (possible combining that
with Basic Packed CBOR mechanisms).
The desirable details are likely to vary
considerably between applications.
A URI-based reference would be
easy to define, but might be too inefficient when used in the likely
combination with an <tt>ni:</tt> URI <xref target="RFC6920"/>.</t>
      </aside>
      <section anchor="sec-basic-packed-cbor">
        <name>Basic Packed CBOR</name>
        <t>Two tags are predefined by this specification for packing table setup.
They are defined in CDDL <xref target="RFC8610"/> as in <xref target="fig-cddl"/>:</t>
        <figure anchor="fig-cddl">
          <name>Packed CBOR in CDDL</name>
          <sourcecode type="cddl"><![CDATA[
Basic-Packed-CBOR = #6.113([[*shared-and-argument-item], rump])
Split-Basic-Packed-CBOR =
                    #6.1113([[*shared-item], [*argument-item], rump])
rump = any
shared-and-argument-item = any
argument-item = any
shared-item = any
]]></sourcecode>
        </figure>
        <t>(This assumes the allocation of tag numbers 113 ('q') and 1113 for
these tags.)</t>
        <t>The array given as the first element of the content of tag 113
("Basic-Packed-CBOR") is prepended to both the tables for shared items
and arguments that apply to the entire tag (by default empty tables).
The arrays given as the first and second element of the content of the
tag 1113 ("Split-Basic-Packed-CBOR") are prepended to the tables for
shared items and arguments that apply to the entire tag (by default
empty tables).
As discussed in the introduction to this section, references
in the supplied new arrays use the new number space (where inherited
items are shifted by the new items given), while the inherited items
themselves use the inherited number space (so their semantics do not
change by the mere action of inheritance).</t>
        <t>The original CBOR data item can be reconstructed by recursively
replacing shared and argument references encountered in the rump by
their expansions.</t>
      </section>
    </section>
    <section anchor="sec-function-tags">
      <name>Function Tags</name>
      <t>Function tags that occur in an argument or a rump supply the semantics
for reconstructing a data item from their tag content and the
non-dominating rump or argument, respectively.
The present specification defines a pair of function tags.</t>
      <section anchor="join">
        <name>Join Function Tags</name>
        <t>Tag 106 ('j') defines the "join" unpacking function, based on the
concatenation function (<xref target="sec-concatenation"/>).</t>
        <t>The join function expects an item that can be concatenated as its
left-hand side, and an array of such items as its right-hand side.
Joining works by sequentially applying the concatenation function to
the elements of the right-hand-side array, interspersing the left-hand
side as the "joiner".</t>
        <t>An example in functional notation: <tt>join(", ", ["a", "b", "c"])</tt>
returns <tt>"a, b, c"</tt>.</t>
        <t>For a right-hand side of one or more elements, the first element
determines the type of the result when text strings and byte
strings are mixed in the argument.
For a right-hand side of one element, the joiner is not used, and that
element returned.
For a right-hand side of zero elements, a neutral element is generated
based on the type of the joiner
(empty text/byte string for a text/byte string, empty array for an array, empty map for a map).</t>
        <t>For an example, we assume this unpacked data item:</t>
        <sourcecode type="cbor-diag"><![CDATA[
["https://packed.example/foo.html",
 "coap:://packed.example/bar.cbor",
 "mailto:support@packed.example"]
]]></sourcecode>
        <t>A packed form of this using straight references could be:</t>
        <artwork><![CDATA[
113([[106("packed.example")],
  [6(["https://", "/foo.html"]),
   6(["coap://", "/bar.cbor"]),
   6(["mailto:support@", ""])]
])
]]></artwork>
        <t>Tag 105 ('i') defines the "ijoin" unpacking function, which is exactly
like that of tag 106, except that the left-hand side and right-hand
side are interchanged ('i').</t>
        <t>A packed form of the first example using inverted references and the ijoin tag could be:</t>
        <artwork><![CDATA[
113([["packed.example"],
  [216(105(["https://", "/foo.html"]),
   216(105(["coap://", "/bar.cbor"]),
   216("mailto:support@")]
])
]]></artwork>
        <t>A packed form of an array with many URIs that reference SenML items
from the same place could be:</t>
        <artwork><![CDATA[
113([[105(["coaps://[2001::db8::1]/s/", ".senml"])],
  [6("temp-freezer"),
   6("temp-fridge"),
   6("temp-ambient")]
])
]]></artwork>
      </section>
    </section>
    <section anchor="sec-tag-validity-tag-equivalence-principle">
      <name>Tag Validity: Tag Equivalence Principle</name>
      <t>In Section <xref target="RFC8949" section="5.3.2" sectionFormat="bare"/> of RFC 8949 <xref 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"/> as defined in Section <xref target="RFC8949" section="9.2" sectionFormat="bare"/> of RFC 8949 <xref 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>
            <t>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.</t>
          </li>
          <li>
            <t>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).</t>
          </li>
          <li>
            <t>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.)</t>
          </li>
          <li>
            <t>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></t>
          </li>
        </ul>
      </section>
      <section anchor="sec-tag-equivalence-of-packed-cbor-tags">
        <name>Tag Equivalence of Packed CBOR Tags</name>
        <t>The reference tags in this specification declare their equivalence to
the unpacked shared items or function results they represent.</t>
        <t>The table setup tags 113 and 1113 declare its equivalence to the unpacked CBOR
data item represented by it.</t>
      </section>
    </section>
    <section anchor="sec-iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="sec-cbor-tags-registry">
        <name>CBOR Tags Registry</name>
        <t>In the registry "<xref section="CBOR Tags" relative="#cbor-tags" sectionFormat="bare" target="IANA.cbor-tags"/>" <xref target="IANA.cbor-tags"/>,
IANA is requested to allocate the tags defined in <xref target="tab-tag-values"/>.</t>
        <table anchor="tab-tag-values">
          <name>Values for Tag Numbers</name>
          <thead>
            <tr>
              <th align="right">Tag</th>
              <th align="left">Data Item</th>
              <th align="left">Semantics</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">6</td>
              <td align="left">integer (for shared); text string, byte string, array, map, tag (for straight)</td>
              <td align="left">Packed CBOR: shared/straight</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">105</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: ijoin function</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">106</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: join function</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">113</td>
              <td align="left">array (shared-and-argument-items, rump)</td>
              <td align="left">Packed CBOR: table setup</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">224..255</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: straight</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">1112</td>
              <td align="left">undefined (0xf7)</td>
              <td align="left">Packed CBOR: reference error</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">1113</td>
              <td align="left">array (shared-items, argument-items, rump)</td>
              <td align="left">Packed CBOR: table setup</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">28704..32767</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: straight</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">1879052288..2147483647</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: straight</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">216..223</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: inverted</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">27647..28671</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: inverted</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">1811940352..1879048191</td>
              <td align="left">text string, byte string, array, map, tag</td>
              <td align="left">Packed CBOR: inverted</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sec-cbor-simple-values-registry">
        <name>CBOR Simple Values Registry</name>
        <t>In the registry "<xref section="CBOR Simple Values" relative="#simple" sectionFormat="bare" target="IANA.cbor-simple-values"/>" <xref target="IANA.cbor-simple-values"/>,
IANA is requested to allocate the simple values defined in <xref target="tab-simple-values"/>.</t>
        <table anchor="tab-simple-values">
          <name>Simple Values</name>
          <thead>
            <tr>
              <th align="right">Value</th>
              <th align="left">Semantics</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0..15</td>
              <td align="left">Packed CBOR: shared</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="sec-security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations of <xref target="STD94"/> apply.</t>
      <t>Loops in the Packed CBOR can be used as a denial of service attack,
see <xref target="sec-discussion"/>.</t>
      <t>As the unpacking is deterministic, packed forms can be used as signing
inputs.  (Note that if external dictionaries are added to cbor-packed,
this requires additional consideration.)</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <referencegroup anchor="STD94" target="https://www.rfc-editor.org/info/std94">
          <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
            <front>
              <title>Concise Binary Object Representation (CBOR)</title>
              <author fullname="C. Bormann" initials="C." surname="Bormann"/>
              <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
              <date month="December" year="2020"/>
              <abstract>
                <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
                <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="94"/>
            <seriesInfo name="RFC" value="8949"/>
            <seriesInfo name="DOI" value="10.17487/RFC8949"/>
          </reference>
        </referencegroup>
        <reference anchor="IANA.cbor-tags" target="https://www.iana.org/assignments/cbor-tags">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANA.cbor-simple-values" target="https://www.iana.org/assignments/cbor-simple-values">
          <front>
            <title>Concise Binary Object Representation (CBOR) Simple Values</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <referencegroup anchor="STD63" target="https://www.rfc-editor.org/info/std63">
          <reference anchor="RFC3629" 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"/>
              <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>
        </referencegroup>
        <reference anchor="RFC7049">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="October" year="2013"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
        <reference anchor="RFC8742">
          <front>
            <title>Concise Binary Object Representation (CBOR) Sequences</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes the Concise Binary Object Representation (CBOR) Sequence format and associated media type "application/cbor-seq". A CBOR Sequence consists of any number of encoded CBOR data items, simply concatenated in sequence.</t>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation. This specification defines and registers "+cbor-seq" as a structured syntax suffix for CBOR Sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8742"/>
          <seriesInfo name="DOI" value="10.17487/RFC8742"/>
        </reference>
        <reference anchor="RFC6920">
          <front>
            <title>Naming Things with Hashes</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="D. Kutscher" initials="D." surname="Kutscher"/>
            <author fullname="C. Dannewitz" initials="C." surname="Dannewitz"/>
            <author fullname="B. Ohlman" initials="B." surname="Ohlman"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="P. Hallam-Baker" initials="P." surname="Hallam-Baker"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>This document defines a set of ways to identify a thing (a digital object in this case) using the output from a hash function. It specifies a new URI scheme for this purpose, a way to map these to HTTP URLs, and binary and human-speakable formats for these names. The various formats are designed to support, but not require, a strong link to the referenced object, such that the referenced object may be authenticated to the same degree as the reference to it. The reason for this work is to standardise current uses of hash outputs in URLs and to support new information-centric applications and other uses of hash outputs in protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6920"/>
          <seriesInfo name="DOI" value="10.17487/RFC6920"/>
        </reference>
        <reference anchor="RFC1951">
          <front>
            <title>DEFLATE Compressed Data Format Specification version 1.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1951"/>
          <seriesInfo name="DOI" value="10.17487/RFC1951"/>
        </reference>
        <reference anchor="RFC8746">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Typed Arrays</title>
            <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR), as defined in RFC 7049, is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.</t>
              <t>This document makes use of this extensibility to define a number of CBOR tags for typed arrays of numeric data, as well as additional tags for multi-dimensional and homogeneous arrays. It is intended as the reference document for the IANA registration of the CBOR tags defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8746"/>
          <seriesInfo name="DOI" value="10.17487/RFC8746"/>
        </reference>
        <reference anchor="ARB-EXP" target="http://peteroupc.github.io/CBOR/bigfrac.html">
          <front>
            <title>Arbitrary-Exponent Numbers</title>
            <author initials="P." surname="Occil" fullname="Peter Occil">
              <organization/>
            </author>
            <date/>
          </front>
          <refcontent>Specification for Registration of CBOR Tags 264 and 265</refcontent>
        </reference>
      </references>
    </references>
    <?line 827?>

<section anchor="sec-examples">
      <name>Examples</name>
      <t>The (JSON-compatible) CBOR data structure depicted in
<xref target="fig-example-in"/>, 400 bytes of binary CBOR, could lead to a packed
CBOR data item depicted in <xref target="fig-example-out"/>, ~309 bytes.  Note that
this particular example does not lend itself to prefix compression, so
it uses the simple common-table setup form (tag 113).</t>
      <figure anchor="fig-example-in">
        <name>Example original CBOR data item</name>
        <sourcecode type="json"><![CDATA[
{ "store": {
    "book": [
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
]]></sourcecode>
      </figure>
      <figure anchor="fig-example-out">
        <name>Example packed CBOR data item</name>
        <sourcecode type="cbor-diag"><![CDATA[
113([["price", "category", "author", "title", "fiction", 8.95,
                                                             "isbn"],
    /  0          1         2         3         4         5    6   /
     {"store": {
       "book": [
         {simple(1): "reference", simple(2): "Nigel Rees",
          simple(3): "Sayings of the Century", simple(0): simple(5)},
         {simple(1): simple(4), simple(2): "Evelyn Waugh",
          simple(3): "Sword of Honour", simple(0): 12.99},
         {simple(1): simple(4), simple(2): "Herman Melville",
          simple(3): "Moby Dick", simple(6): "0-553-21311-3",
          simple(0): simple(5)},
         {simple(1): simple(4), simple(2): "J. R. R. Tolkien",
          simple(3): "The Lord of the Rings",
          simple(6): "0-395-19395-8", simple(0): 22.99}],
       "bicycle": {"color": "red", simple(0): 19.95}}}])
]]></sourcecode>
      </figure>
      <t>The (JSON-compatible) CBOR data structure below has been packed with shared
item and (partial) prefix compression only and employs the split-table
setup form (tag 1113).</t>
      <figure anchor="fig-example-in2">
        <name>Example original CBOR data item</name>
        <sourcecode type="json"><![CDATA[
{
  "name": "MyLED",
  "interactions": [
    {
      "links": [
        {
          "href":
           "http://192.168.1.103:8445/wot/thing/MyLED/rgbValueRed",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "number"
        }
      },
      "name": "rgbValueRed",
      "writable": true,
      "@type": [
        "Property"
      ]
    },
    {
      "links": [
        {
          "href":
           "http://192.168.1.103:8445/wot/thing/MyLED/rgbValueGreen",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "number"
        }
      },
      "name": "rgbValueGreen",
      "writable": true,
      "@type": [
        "Property"
      ]
    },
    {
      "links": [
        {
          "href":
           "http://192.168.1.103:8445/wot/thing/MyLED/rgbValueBlue",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "number"
        }
      },
      "name": "rgbValueBlue",
      "writable": true,
      "@type": [
        "Property"
      ]
    },
    {
      "links": [
        {
          "href":
           "http://192.168.1.103:8445/wot/thing/MyLED/rgbValueWhite",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "number"
        }
      },
      "name": "rgbValueWhite",
      "writable": true,
      "@type": [
        "Property"
      ]
    },
    {
      "links": [
        {
          "href":
           "http://192.168.1.103:8445/wot/thing/MyLED/ledOnOff",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "boolean"
        }
      },
      "name": "ledOnOff",
      "writable": true,
      "@type": [
        "Property"
      ]
    },
    {
      "links": [
        {
          "href":
"http://192.168.1.103:8445/wot/thing/MyLED/colorTemperatureChanged",
          "mediaType": "application/json"
        }
      ],
      "outputData": {
        "valueType": {
          "type": "number"
        }
      },
      "name": "colorTemperatureChanged",
      "@type": [
        "Event"
      ]
    }
  ],
  "@type": "Lamp",
  "id": "0",
  "base": "http://192.168.1.103:8445/wot/thing",
  "@context":
   "http://192.168.1.102:8444/wot/w3c-wot-td-context.jsonld"
}
]]></sourcecode>
      </figure>
      <figure anchor="fig-example-out2">
        <name>Example packed CBOR data item</name>
        <sourcecode type="cbordiag"><![CDATA[
1113([/shared/["name", "@type", "links", "href", "mediaType",
            /  0       1       2        3         4 /
    "application/json", "outputData", {"valueType": {"type":
         /  5               6               7 /
    "number"}}, ["Property"], "writable", "valueType", "type"],
               /   8            9           10           11 /
   /argument/ ["http://192.168.1.10", 6("3:8445/wot/thing"),
              / 6                        225 /
   225("/MyLED/"), 226("rgbValue"), "rgbValue",
     / 226             227           228     /
   {simple(6): simple(7), simple(9): true, simple(1): simple(8)}],
     / 229 /
   /rump/ {simple(0): "MyLED",
           "interactions": [
   229({simple(2): [{simple(3): 227("Red"), simple(4): simple(5)}],
    simple(0): 228("Red")}),
   229({simple(2): [{simple(3): 227("Green"), simple(4): simple(5)}],
    simple(0): 228("Green")}),
   229({simple(2): [{simple(3): 227("Blue"), simple(4): simple(5)}],
    simple(0): 228("Blue")}),
   229({simple(2): [{simple(3): 227("White"), simple(4): simple(5)}],
    simple(0): "rgbValueWhite"}),
   {simple(2): [{simple(3): 226("ledOnOff"), simple(4): simple(5)}],
    simple(6): {simple(10): {simple(11): "boolean"}}, simple(0):
    "ledOnOff", simple(9): true, simple(1): simple(8)},
   {simple(2): [{simple(3): 226("colorTemperatureChanged"),
    simple(4): simple(5)}], simple(6): simple(7), simple(0):
    "colorTemperatureChanged", simple(1): ["Event"]}],
     simple(1): "Lamp", "id": "0", "base": 225(""),
     "@context": 6("2:8444/wot/w3c-wot-td-context.jsonld")}])
]]></sourcecode>
      </figure>
    </section>
    <section numbered="false" anchor="sec-acknowledgements">
      <name>Acknowledgements</name>
      <t>CBOR packing was part of the original proposal that turned into CBOR, but did
not make it into <xref target="RFC7049"/>, the predecessor of RFC 8949 <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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

-->

</rfc>
