<?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.19 (Ruby 3.3.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-packed-13" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.0 -->
  <front>
    <title abbrev="Packed CBOR">Packed CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-packed-13"/>
    <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="September" 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 recipient 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 recipient.</t>
      <t><cref anchor="status">The present version (<tt>-13</tt>) is a refresh of the implementation
draft <tt>-12</tt> with minor editorial improvements.</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 recipient 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 recipient.</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 <xref target="BCP14"/> (<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"/> <cref anchor="update">➔ possibly update to</cref> <xref target="I-D.ietf-cbor-edn-literals"/>).
<!-- 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 the protocol's 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 their equivalence to the unpacked CBOR
data item represented by them.</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 anchor="sec-combined-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>
        <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
          <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
            <front>
              <title>Key words for use in RFCs to Indicate Requirement Levels</title>
              <author fullname="S. Bradner" initials="S." surname="Bradner"/>
              <date month="March" year="1997"/>
              <abstract>
                <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
          </reference>
          <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
            <front>
              <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
              <author fullname="B. Leiba" initials="B." surname="Leiba"/>
              <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>
        </referencegroup>
        <reference anchor="I-D.ietf-cbor-edn-literals">
          <front>
            <title>CBOR Extended Diagnostic Notation (EDN)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="1" month="September" year="2024"/>
            <abstract>
              <t>   The Concise Binary Object Representation (CBOR) (STD 94, RFC 8949) 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.

   In addition to the binary interchange format, CBOR from the outset
   (RFC 7049) defined a text-based "diagnostic notation" in order to be
   able to converse about CBOR data items without having to resort to
   binary data.  RFC 8610 extended this into what is known as Extended
   Diagnostic Notation (EDN).

   This document consolidates the definition of EDN, sets forth a
   further step of its evolution, and is intended to serve as a single
   reference target in specifications that use EDN.

   It specifies an extension point for adding application-oriented
   extensions to the diagnostic notation.  It then defines two such
   extensions that enhance EDN with text representations of epoch-based
   date/times and of IP addresses and prefixes (RFC 9164).

   A few further additions close some gaps in usability.  The document
   modifies one extension originally specified in Appendix G.4 of RFC
   8610 to enable further increasing usability.  To facilitate tool
   interoperation, this document specifies a formal ABNF grammar, and it
   adds media types.


   // The present revision -12 reflects the branch "roll-up" in the
   // repository, an attempt to contain the entire specification of EDN
   // in this document, instead of describing updates to the existing
   // documents RFC 8949 and RFC 8610.  While the WG hasn't taken a
   // decision to follow this updated editorial approach, the feedback
   // has been sufficiently positive that the author believes it is not
   // misleading to make this revision available as the current WG
   // Internet-Draft as well.  That said, this is still a snapshot.  The
   // editorial work on the branch "roll-up" is not complete.  Content
   // will continue to move between sections.  The exact reflection of
   // this document being a replacement for both Section 8 of RFC 8949
   // and Appendix G of RFC 8610 needs to be recorded in the metadata
   // and in abstract and introduction.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-edn-literals-12"/>
        </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 922?>

<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:
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
rWV0iSY4tDsLzTpdPgcmfI8JJVmymby2lkHwbH6H5VLeBMfXq3HGDnaNbQFr
Bxxh9Iy+0K3RmMRpfjUggVnbLxJZYMWSkZiUzSW27K+XKkc8XUUmddaQh81Q
AuZuAzeZjB/bjLsN1tSKKJulBwhyJW6iX6LYQplKni5REs8YGS1zOWVxArFN
MNtAtyEvkjEJRjqe6QpU+3hLXXFzxrCGFi+EqOkF3MFkxrivm86fgPw6Tzt1
lMBJjtnsY078Np++XERFpa2/8R7i0h/2aLKKg/ndyQZLWMHn79ksZtJqxwNN
X7ztzPN8EhWdUC3vHR8fz+H/RvdCBR933l2Ao+0kIGwBZ8NXdPwkWCf4Qoxi
ZKILmaHqXIwxPtKpOhQpGY2Ouh38mAIpoxF8w4/pYKyT/ndhw/M993DIe1wv
ZFEciCfrpPYtX6cRELEgxIiJzCv57Pleu2PK7O/whExZrrXAQDQHvNPk+dL0
7BGEwTK/iik5QF+x52M8fUccWj/UcfRdFEsqxQ1L9sifJj1KrpaBvDZNwGaE
wGSPqYjiZsZdc5wHZjYhIFZtBLjOZwoWsxjrgaMCK2ApEcop8dEJp8T5r+GI
//qC/zzy/trnvzgf+tFgFDm+iywvtHBL8WwNbSQoBAAxQGTb7CPWg6NRnEpc
6hbiDRV4Y10PxIv+hQdkrz2Qdbh/fBh0/bWaV4/MqybU5b3M5+LAPxse7+tB
NPrMIHrUHgjky8YgTC0NU6gcBNbxq43M518w8lBhOUKiA1+hEhHCCSi1hCGD
OMs3i6UJ81AqGS3R8A7BMymkbw+eqbbgGdIgawBemDG1uqV4Rm5uCs8JZZhc
iyjQSayaY6KJC1UCC7QA61KDFei4C61hSqDr63GEovom+Eq9jvhEWjwOnn5Y
g+NDL5ebxSIuK8mgNGNpWuGY5WORUJAm72NKArtRE7NGnedS6gxDbKZgA2N8
otjMkigjWaFXVVJUMVLDL/aJXznU72HRJNAwjvbY1Sjs9fmaqE13Y/6XtEFJ
2XfQm2STthi1DTOh0AlzVzNjoFqpqjG3plB4XgQZ6JZauB9eNPP2ZQ58ngG0
hkY9S1CDDAvg8L3Br1jQKlrfeTn4sLIl0QmmjqkgRypwp/l6u3Nl8K5RabAz
oGmZiYxtsYqZa8wAdXBpBDZcWJhugU0o3rgwLxN0S52YVKqMVnQiAA+OPLPV
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
XuKzcxB5nL//v9LG5qzRsQAA

-->

</rfc>
