<?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.24 (Ruby 3.4.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-packed-14" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title abbrev="Packed CBOR">Packed CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-packed-14"/>
    <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="2025" month="March" day="03"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 68?>

<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 set of CBOR tags
and simple values that enable a simple transformation of an original
CBOR data item into a Packed 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>-14</tt>) adds additional stand-in items to the previously updated implementation
draft <tt>-13</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 107?>

<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 set of CBOR tags
and simple values that enable a simple transformation of an original
CBOR data item into a Packed 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>Stand-in item:</dt>
          <dd>
            <t>A data item (a tag or a simple value) defined by an
application protocol to stand in for a more complex data item.
Stand-in items are fundamentally independent of Packed CBOR but can
be employed by the application protocol as part of a Packed CBOR
argument reference.</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,
container (map or array), tag, or simple value 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.</t>
        <t anchor="use-standin">The right-hand side is examined whether it is a stand-in item
(<xref target="sec-standin"/>), in which case item the stand-in item stands for is
taken as the unwrapped right-hand-side; if the right-hand side is not
a stand-in item, it 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-standin">
      <name>Additional Stand-in Items</name>
      <t>Application specifications that employ Packed CBOR may also enable the
use of additional "stand-in" items (tags or simple values) beyond the
reference items defined by Packed CBOR.
These are data items used in place of original representation items
such as strings or arrays, where the tag or simple value is defined to
stand for a data item that can actually be used in the position of the stand-in
item.
Examples would be tags such as 21 to 23 (base64url, base64, uppercase
hex: Section <xref target="RFC8949" section="3.4.5.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>) or 108 (lowercase hex: <xref section="2.1" sectionFormat="of" target="I-D.bormann-cbor-notable-tags"/>), which stand for
text string items but internally employ more compact byte string
representations that may also be more natural as application data items.</t>
      <t>These additional stand-in items are fundamentally independent of
Packed CBOR, but they also can be used as the right-hand-side of
reference items (see <xref target="use-standin"/>).</t>
      <t>Note that application specifications need to be explicit about which
stand-in items are provided for; otherwise, inconsistent
interpretations at different places in a system can lead to check/use
vulnerabilities.</t>
    </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
unless mitigated, 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="8" month="January" year="2025"/>
            <abstract>
              <t>   This document formalizes and consolidates the definition of the
   Extended Diagnostic Notation (EDN) of the Concise Binary Object
   Representation (CBOR), addressing implementer experience.

   Replacing EDN's previous informal descriptions, it updates RFC 8949,
   obsoleting its Section 8, and RFC 8610, obsoleting its Appendix G.

   It also specifies and uses registry-based extension points, using one
   to support text representations of epoch-based dates/times and of IP
   addresses and prefixes.


   // (This cref will be removed by the RFC editor:) The present
   // revision (–16) addresses the first half of the WGLC comments,
   // except for the issues around the specific way how to best achieve
   // pluggable ABNF grammars for application-extensions.  It is
   // intended for use as a reference document for the mid-WGLC CBOR WG
   // interim meeting on 2025-01-08.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-edn-literals-16"/>
        </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="I-D.bormann-cbor-notable-tags">
          <front>
            <title>Notable CBOR Tags</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="12" month="February" year="2025"/>
            <abstract>
              <t>   The Concise Binary Object Representation (CBOR, 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 CBOR, one point of extensibility is the definition of CBOR tags.
   RFC 8949's original edition, RFC 7049, defined a basic set of 16 tags
   as well as a registry that can be used to contribute additional tag
   definitions [IANA.cbor-tags].  Since RFC 7049 was published, at the
   time of writing some 190 definitions of tags and ranges of tags have
   been added to that registry.

   The present document provides a roadmap to a large subset of these
   tag definitions.  Where applicable, it points to an IETF standards or
   standard development document that specifies the tag.  Where no such
   document exists, the intention is to collect specification
   information from the sources of the registrations.  After some more
   development, the present document is intended to be useful as a
   reference document for the IANA registrations of the CBOR tags the
   definitions of which have been collected.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-notable-tags-12"/>
        </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 961?>

<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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

-->

</rfc>
