<?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.7 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-packed-12" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title abbrev="Packed CBOR">Packed CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-packed-12"/>
    <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>
    <author initials="M." surname="Gütschow" fullname="Mikolai Gütschow">
      <organization abbrev="TU Dresden">TUD Dresden University of Technology</organization>
      <address>
        <postal>
          <street>Helmholtzstr. 10</street>
          <city>Dresden</city>
          <code>D-01069</code>
          <country>Germany</country>
        </postal>
        <email>mikolai.guetschow@tu-dresden.de</email>
      </address>
    </author>
    <date year="2024" month="March" day="02"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 67?>

<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 (-12) updates the IANA "Values for Tag
Numbers" table, sorting it and cleaning up the "Data Item" column.</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 105?>

<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, 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>Original data item:</dt>
          <dd>
            <t>A CBOR data item that is intended to be expressed by a packed data
item; the result of all reconstructions.</t>
          </dd>
          <dt>Packed data item:</dt>
          <dd>
            <t>A CBOR data item that involves packed references (<em>packed CBOR</em>).</t>
          </dd>
          <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>Rump:</dt>
          <dd>
            <t>The data item contained in an argument reference that is combined
with the argument to yield the reconstruction.</t>
          </dd>
          <dt>Straight reference:</dt>
          <dd>
            <t>An argument reference that uses the argument as the left-hand side
and the rump as the right-hand side.</t>
          </dd>
          <dt>Inverted reference:</dt>
          <dd>
            <t>An argument reference that uses the rump as the left-hand side
and the argument as the right-hand side.</t>
          </dd>
          <dt>Function tag:</dt>
          <dd>
            <t>A tag used in an argument reference for the argument (straight
references) or the rump (inverted references), causing the
application of a function indicated by the function tag in order 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>Active set (of packing tables):</dt>
          <dd>
            <t>The packing tables in effect at the data item under consideration.</t>
          </dd>
          <dt>Reconstruction:</dt>
          <dd>
            <t>The result of applying a packed reference in the context of given
packing tables; we speak of the <em>reconstruction of a packed reference</em>
as that result.</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 an
<em>active set</em> of packing tables that applies.</t>
        <t>There are two packing tables in an active 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 active 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(rump)</td>
              <td align="right">0</td>
            </tr>
            <tr>
              <td align="left">Tag 224..255(rump)</td>
              <td align="right">0..31</td>
            </tr>
            <tr>
              <td align="left">Tag 28704..32767(rump)</td>
              <td align="right">32..4095</td>
            </tr>
            <tr>
              <td align="left">Tag 1879052288..2147483647(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(rump)</td>
              <td align="right">0..7</td>
            </tr>
            <tr>
              <td align="left">Tag 27647..28671(rump)</td>
              <td align="right">8..1023</td>
            </tr>
            <tr>
              <td align="left">Tag 1811940352..1879048191(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 needing to be
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.
In order to be able to remove a map entry from the left-hand-side
map, as a special case, any members to be replaced with a value of
<tt>undefined</tt> (0xf7) from the right-hand-side map are instead removed,
and right-hand-side members with the value <tt>undefined</tt> are never
filled in into the concatenated map.</t>
          </li>
        </ul>
        <aside>
          <t>NOTES:</t>
          <ul spacing="normal">
            <li>
              <t>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.</t>
            </li>
            <li>
              <t>Special casing the member value <tt>undefined</tt> makes it impossible to
use this construct for updating maps by insertion of or
replacement with actual <tt>undefined</tt> member values; <tt>undefined</tt> as a
member value on the left-hand-side map stays untouched though.
This exception is similar to the one JSON Merge Patch <xref target="RFC7396"/> makes
for <tt>null</tt> values, which are however much more commonly used and
therefore more problematic.</t>
            </li>
          </ul>
        </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>
        </ul>
        <ul spacing="normal" anchor="implicit-join">
          <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, respectively,
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 reconstructions.</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 three 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>
        <sourcecode type="cbor-diag"><![CDATA[
113([[106("packed.example")],
  [6(["https://", "/foo.html"]),
   6(["coap://", "/bar.cbor"]),
   6(["mailto:support@", ""])]
])
]]></sourcecode>
        <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>
        <sourcecode type="cbor-diag"><![CDATA[
113([["packed.example"],
  [216(105(["https://", "/foo.html"])),
   216(105(["coap://", "/bar.cbor"])),
   216("mailto:support@")]
])
]]></sourcecode>
        <t>A packed form of an array with many URIs that reference SenML items
from the same place could be:</t>
        <sourcecode type="cbor-diag"><![CDATA[
113([[105(["coaps://[2001::db8::1]/s/", ".senml"])],
  [6("temp-freezer"),
   6("temp-fridge"),
   6("temp-ambient")]
])
]]></sourcecode>
        <t>Note that for these examples, the implicit join semantics for mixed
string-array concatenation as defined in <xref target="implicit-join"/> actually
obviate the need for an explicit join/ijoin tag; the examples do serve
to demonstrate the explicit usage of the tag.</t>
      </section>
      <section anchor="record">
        <name>Record Function Tag</name>
        <t>Tag 114 ('r') defines the "record" function, which combines
an array of keys with an array of values into a map.</t>
        <t>The record function expects an array as its left-hand side,
whose items are treated as key items for the resulting map,
and an array of equal or shorter length as its right-hand side,
whose items are treated as value items for the resulting map.</t>
        <t>The map is constructed by grouping key and value items
with equal position in the provided arrays into pairs that constitute the resulting map.</t>
        <t>The value item array <bcp14>MUST NOT</bcp14> be longer than the key item array.</t>
        <t>The value item array <bcp14>MAY</bcp14> be shorter than the key item array, in which
case the one or more unmatched value items towards the end are treated as <em>absent</em>.
Additionally, value items that are the CBOR simple value <tt>undefined</tt>
(simple(23), encoding 0xf7) are also treated as absent.
Key items whose matching value items are absent are not included in the resulting map.</t>
        <t>For an example, we assume this unpacked data item:</t>
        <sourcecode type="cbor-diag"><![CDATA[
[{"key0": false, "key1": "value 1", "key2": 2},
 {"key0": true, "key1": "value -1", "key2": -2},
 {"key1": "", "key2": 0}]
]]></sourcecode>
        <t>A straightforward packed form of this using the record function tag could be:</t>
        <sourcecode type="cbor-diag"><![CDATA[
113([[114(["key0", "key1", "key2"])],
  [6([false, "value 1", 2]),
   6([true, "value -1", -2]),
   6([undefined, "", 0])]
])
]]></sourcecode>
        <t>A slightly more concise packed form can be achieved by manipulating the key item order
(recall that the order of key/value pairs in maps carries no semantics):</t>
        <sourcecode type="cbor-diag"><![CDATA[
113([[114(["key1", "key2", "key0"])],
  [6(["value 1", 2, false]),
   6(["value -1", -2, true]),
   6(["", 0])]
])
]]></sourcecode>
      </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); any except integer (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">concatenation item (text string, byte string, array, or map)</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">array of concatenation item (text string, byte string, array, or map)</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">114</td>
              <td align="left">array</td>
              <td align="left">Packed CBOR: record function</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">216..223</td>
              <td align="left">function tag or concatenation item (text string, byte string, array, or map)</td>
              <td align="left">Packed CBOR: inverted</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">224..255</td>
              <td align="left">any</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">27647..28671</td>
              <td align="left">function tag or concatenation item (text string, byte string, array, or map)</td>
              <td align="left">Packed CBOR: inverted</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">28704..32767</td>
              <td align="left">any</td>
              <td align="left">Packed CBOR: straight</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">1811940352..1879048191</td>
              <td align="left">function tag or concatenation item (text string, byte string, array, or map)</td>
              <td align="left">Packed CBOR: inverted</td>
              <td align="left">draft-ietf-cbor-packed</td>
            </tr>
            <tr>
              <td align="right">1879052288..2147483647</td>
              <td align="left">any</td>
              <td align="left">Packed CBOR: straight</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">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references 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="RFC7396">
          <front>
            <title>JSON Merge Patch</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="J. Snell" initials="J." surname="Snell"/>
            <date month="October" year="2014"/>
            <abstract>
              <t>This specification defines the JSON merge patch format and processing rules. The merge patch format is primarily intended for use with the HTTP PATCH method as a means of describing a set of modifications to a target resource's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7396"/>
          <seriesInfo name="DOI" value="10.17487/RFC7396"/>
        </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 920?>

<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 be packed into the CBOR data item depicted
in <xref target="fig-example-out"/>, 308 bytes, only employing item sharing.
With support for argument sharing and the record function tag 114,
the data item can be packed into 298 bytes as depicted in <xref target="fig-example-out-record"/>.
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, 400 bytes</name>
        <sourcecode type="cbor-diag"><![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 with item sharing only, 308 bytes</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>
      <figure anchor="fig-example-out-record">
        <name>Example packed CBOR data item using item sharing and the record function tag, 298 bytes</name>
        <sourcecode type="cbor-diag"><![CDATA[
113([[114(["category", "author",
           "title", simple(1), "isbn"]),
    /  0                       /
      "price", "fiction", 8.95],
    /  1        2         3    /
     {"store": {
       "book": [
           6(["reference", "Nigel Rees",
              "Sayings of the Century", simple(3)]),
           6([simple(2), "Evelyn Waugh",
              "Sword of Honour", 12.99]),
           6([simple(2), "Herman Melville",
              "Moby Dick", simple(3), "0-553-21311-3"]),
           6([simple(2), "J. R. R. Tolkien",
               "The Lord of the Rings", 22.99, "0-395-19395-8"])],
       "bicycle": {"color": "red", simple(1): 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, 1210 bytes</name>
        <sourcecode type="cbor-diag"><![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, 505 bytes</name>
        <sourcecode type="cbor-diag"><![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>
      <t>This work was supported in part by the German Federal Ministry of
Education and Research (BMBF) within the project Concrete Contracts.</t>
      <!--  LocalWords:  CBOR extensibility IANA uint sint IEEE endian
 -->
<!--  LocalWords:  signedness endianness prepended decompressor
 -->
<!--  LocalWords:  prepend
 -->

</section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA9V96XobR5Lg/3qKHPiHALsAEuAhkrI8pg631aNrJbq9vWqN
VAAKYFmFKnQdpGCa/e1D7APsj3mM/bX9JvskG1deVQWK8ni325xpiwSqMiMj
447IyOFwGFycqL0gqJIqjU/UN4FSL6PZh3iuHj548SqIptMihifcz+b5LItW
8PC8iBbVMImrxXA2zYvhmh4aplEVl1UQfCii1Ty/zN7l6yrJs/IExo7qKn+X
zN+ti3iRfDxRZTwbwpPx5jIv5ifqSVbFRRZXw0c4dDCLKnikmgczeD3Oyro8
UVVRx0FZFXG0gucfn30XBBdxVsc4+rLI6/UJQ6nUKkrSE4WQfYswjvJiic8k
1Xk95c+Hl8sdB/IgAPDO8wKHGipe48OoKKs4Uw/yYhVlGXyjFAx0on7Ikou4
KJPq7/9RqQdFvIKHzv7bE3oAwYsB9Jd5WS2i2bna29vd39+l72ZJtTmRF/iD
fA7zPBpOjvYOjuWTOqsKeOoPMU66oQ/X53kGz321fzzcn4yHk/HR8HDveDKm
L2NZazTNv61+TmSpeg3Pkg95GiXqD3//X1U5O88v7SrOfnikHhVxOQfozYo2
Kl+os3h2nuVpvuTpNSGc/aCf91b6fZyuzvO0+hk+GKmxu1T3cb3W3fHu4Q1r
leWsGO7Rso4Z7m+rejjn4UbzOAiCDHelArBxy16fPTreP6EBhidqmpTBF/j7
/RP16ruHR8f7OOGT0+enI9ryKloiNcF/vY/LZLVO4+FFlNYxfM9/whM4xOF4
F3A8n6dBkGSLxtSHeyeqrhZH7qR7h5Njfvfu7v7xCaA8Wcrfe8eHsMC4WOrB
7+5PkB3+yn8eHk9grizhv8bHB2Ngt3iBrGWehwGioogQZaevHgwf/9eXZvFR
MaVfqwgmgO05r6r1yc7OOgb2AhaZjZgLRkm+g8yyM02WiyKajc6rVUovzmGi
E7WI0jLmgVg8nBbTpCqiYjN8/HEN9JhV6nm9mgLVMJEY9sEfJr6XOKd6MZsl
PHIxO1Gv1/EsWSTA3iAXFGBSvYqXCZAOfwDUh1CpM9gcNTncV1E2h38PgmA4
HAIl4oMzEDBv/h1+H0fDt0CW57F6mGezpIzVgyQDCNWL6U/xrIKRQdaA8Kh4
7D6OHDrvIjIVUoe6fx/3UR3vDxR/Ox2+1Q9OcZKkVBFiJqKFMAGoy/Mc5pzH
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

-->

</rfc>
