<?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.30 (Ruby 3.4.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-packed-15" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="Packed CBOR">Packed CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-packed-15"/>
    <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="May" day="12"/>
    <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">This revision -15 is intended to serve as the input for the 2025-05-14
CBOR interim meeting; it still has the tunables A/B/C to be tuned.</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 employ
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"/>.
In this specification, the term "argument" is not used in the specific
sense assigned to it in Section <xref target="RFC8949" section="3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>, but in its
general sense as an argument of a function.</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>
      <t><cref anchor="resolve">To be resolved before publication:</cref></t>
      <t>To enable discussion of CBOR resources allocated to Packed CBOR, the
packed references are described in terms of three specification
parameters: <tt>A</tt>, <tt>B</tt>, and <tt>C</tt>.
These specification parameters enable creating a precise specification
while the quantitative allocation discussion is ongoing.
They will be replaced by specific chosen numbers when the present
specification is finalized (<xref target="sec-allocation"/>).</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..(A-1)</td>
              <td align="left">0..(A-1)</td>
            </tr>
            <tr>
              <td align="left">Tag 6(unsigned integer N)</td>
              <td align="left">A + 2×N</td>
            </tr>
            <tr>
              <td align="left">Tag 6(negative integer N)</td>
              <td align="left">A − 2×N − 1</td>
            </tr>
          </tbody>
        </table>
        <t>As examples, <cref anchor="A16">assuming <tt>A=16</tt></cref>,
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>
        <!-- (+ 512 -24 -24)464 -->
<!-- (+ 131072 -512 )130560 -->

<t>Taking into account the encoding of these referring data items, there
are A one-byte references, 48 two-byte references, 464 three-byte
references, 130560 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 an array of an
integer and a data item turns it
into an argument reference (<xref target="sec-referencing-argument-items"/>).
All other forms of arguments for Tag 6 are reserved for future updates
to the present specification.
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 (256-<tt>B</tt>)..255(rump)</td>
              <td align="right">0..(B-1)</td>
            </tr>
            <tr>
              <td align="left">Tag 6([N, rump]) (N ≥ 0)</td>
              <td align="right">B + N</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 (256-<tt>B</tt>-<tt>C</tt>)..(256-<tt>B</tt>-1)(rump)</td>
              <td align="right">0..(C-1)</td>
            </tr>
            <tr>
              <td align="left">Tag 6([-N-1, rump]) (N ≥ 0)</td>
              <td align="right">C + N</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 <cref anchor="B32">assuming <tt>B=32</tt></cref>, 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>224("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>
        <!-- 2<sup>28</sup>2<sup>12</sup>+2<sup>5</sup>+2<sup>0</sup> -->

<!-- (- 65536 256)65280 -->

<t>Taking into account the encoding, there are <tt>B</tt> two-byte references,
24 three-byte references, 224 four-byte references, 65280 four-byte
references, etc.
The numbers for inverted (suffix) references are the same, except that
there are <tt>C</tt> two-byte references.
(As CBOR integers can grow to very large (or very negative) values,
there is no practical limit to how argument items might be used in
a Packed CBOR item.)</t>
      </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 number of Simple Values and Tags,
in particular one of the rare one-byte tags and a good chunk 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 removeInRFC="true" anchor="sec-allocation">
        <name>Allocation</name>
        <t><cref anchor="resolve_1">To be resolved before publication:</cref></t>
        <t>To enable discussion of CBOR resources (tags and simple values)
allocated to Packed CBOR, the representation of packed references is
described in terms of three specification parameters: <tt>A</tt>, <tt>B</tt>, and
<tt>C</tt>.</t>
        <t>These specification parameters allow the current specification to be precise
while the quantitative allocation discussion is ongoing.
They will be replaced by specific chosen numbers when the present
specification is finalized.</t>
        <t>The sense of the WG has been to be more conservative in allocating
CBOR resources to Packed CBOR than the previous draft of this document
was.</t>
        <t><tt>A</tt> is the number of 1+0 simple values allocated to shared item
references.
During early development of CBOR, when the bit allocation and thus the
ranges of simple values were originally defined, a range of 16
allocations was kept aside for item sharing.
The allocations for 1+0 simple values were therefore performed from
the top of the range down, i.e., with the block of
false/true/null/undefined being originally assigned to 24..27 (after
the introduction of indefinite length encoding, 20..23).
No further allocation has been performed in this space in the 12 years
since.</t>
        <t>Given that indefinite length encoding effectively took away 4 possible
1+0 simple values, it appears conservative to reduce <tt>A</tt> to <tt>A=12</tt>.</t>
        <t><tt>B</tt> is the number of 1+1 tags allocated to straight argument
references, and <tt>C</tt> is the number of 1+1 tags allocated to inverted
argument references.
A rationale for choosing <tt>C</tt> &lt; <tt>B</tt> might be that straight (prefix)
packing might be more likely than inverted (suffix) packing, hence the
choices of the previous draft were comparable to setting <tt>B=32</tt> and <tt>C=8</tt>.</t>
        <t>This draft proposes to conservatively set <tt>B=8</tt>, but to stay at <tt>C=8</tt>,
as inverted references seem to occur more often than previously
thought.</t>
        <t>Note the nature of Packed CBOR means that all these allocations can be
used for pretty much unlimited purposes by simply defining another
table-building tag.</t>
      </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 item 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>
      <t>For all assignments described in this section, the "reference" column
is the present draft, i.e., draft-ietf-cbor-packed.</t>
      <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>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">6</td>
              <td align="left">int (for shared); [int, any] (for argument)</td>
              <td align="left">Packed CBOR: shared/argument</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>
            </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>
            </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>
            </tr>
            <tr>
              <td align="right">114</td>
              <td align="left">array</td>
              <td align="left">Packed CBOR: record function</td>
            </tr>
            <tr>
              <td align="right">(256-<tt>B</tt>-<tt>C</tt>)..(256-<tt>B</tt>-1)</td>
              <td align="left">function tag or concatenation item (text string, byte string, array, or map)</td>
              <td align="left">Packed CBOR: inverted</td>
            </tr>
            <tr>
              <td align="right">(256-<tt>B</tt>)..255</td>
              <td align="left">any</td>
              <td align="left">Packed CBOR: straight</td>
            </tr>
            <tr>
              <td align="right">1112</td>
              <td align="left">undefined (0xf7)</td>
              <td align="left">Packed CBOR: reference error</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>
            </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>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0..(A-1)</td>
              <td align="left">Packed CBOR: shared</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 1022?>

<section anchor="sec-examples">
      <name>Examples</name>
      <t><cref anchor="resolve_2">To be resolved before publication:</cref> align reference items with the final settings of the
parameters <tt>A</tt>, <tt>B</tt>, <tt>C</tt>.  In particular, check the byte numbers...</t>
      <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, 302 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": [
           224(["reference", "Nigel Rees",
              "Sayings of the Century", simple(3)]),
           224([simple(2), "Evelyn Waugh",
              "Sword of Honour", 12.99]),
           224([simple(2), "Herman Melville",
              "Moby Dick", simple(3), "0-553-21311-3"]),
           224([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, 507 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", 224("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": 224("2:8444/wot/w3c-wot-td-context.jsonld")}])
]]></sourcecode>
      </figure>
    </section>
    <section numbered="false" anchor="sec-list-of-figures">
      <name>List of Figures</name>
      <ol spacing="compact" type="1"><li>
          <t><xref target="fig-cddl">Packed CBOR in CDDL</xref></t>
        </li>
        <li>
          <t><xref target="fig-example-in">Example original CBOR data item, 400 bytes</xref></t>
        </li>
        <li>
          <t><xref target="fig-example-out">Example packed CBOR data item with item sharing only, 308 bytes</xref></t>
        </li>
        <li>
          <t><xref target="fig-example-out-record">Example packed CBOR data item using item sharing and the record function tag, 302 bytes</xref></t>
        </li>
        <li>
          <t><xref target="fig-example-in2">Example original CBOR data item, 1210 bytes</xref></t>
        </li>
        <li>
          <t><xref target="fig-example-out2">Example packed CBOR data item, 507 bytes</xref></t>
        </li>
      </ol>
    </section>
    <section numbered="false" anchor="sec-list-of-tables">
      <name>List of Tables</name>
      <ol spacing="compact" type="1"><li>
          <t><xref target="tab-shared">Referencing Shared Values</xref></t>
        </li>
        <li>
          <t><xref target="tab-straight">Straight Referencing (e.g., Prefix) Arguments</xref></t>
        </li>
        <li>
          <t><xref target="tab-inverted">Inverted Referencing (e.g., Suffix) Arguments</xref></t>
        </li>
        <li>
          <t><xref target="tab-tag-values">Values for Tag Numbers</xref></t>
        </li>
        <li>
          <t><xref target="tab-simple-values">Simple Values</xref></t>
        </li>
      </ol>
    </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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
yyzCPAFmxRdxBMtMPBnFbOdOEql3i2tlfCenSl8f7N73vCRf6JdJSRUc3yWL
NWamXh+tM9M/+gbrVqSA+kaNhvp9SwvSs65tVNpTY3jm7tEJedVJ1p7a8wb4
hI9Ub/GR1kYF3PTU/ieHla5Rn+9tak4nXq6eOrgLNpxa0EDHuKcOPwW4t6NN
SMY9f4vphopP7fA7r1nyCadwcEYGjE5ZHJwfSDt9YlKR/JckX/0tX8Wij02P
U/O+vMNb/cJkVrWMcCIXs9RHMNlYvKvtuTvyqMv74c0IUkwMQH5aCuDrePoh
y6+AeS24mV6jdBxPn8Hf406W40HisgBJ8cDySWq8bqoizdbzxS+RaQxCPf04
JO/q/2fJjPqj423FdI8z/nx9PcBBTPU5lVnxTXVSoK6x7tvmugzVPwIF4001
UYV9tiq5amYZ4wWmctl3rZH3pVTu0G1FCAU1UQWIpzFm3r7I9Hh3dB+rX69P
YuBpVRJl+h/+/K8w4fTi5ubG3GqDKRCXcUmZMYgM03+h3nMB4P5x7yn2T4eH
nrkSa3MbM04NkMdy4SxFMxqruKrjMcgojjF7xly9g10yaWckuUJ6eOA2SR3V
9+yp/y7GPJhUv6IEnQJTP9Xz2dq7e+sdjB8V0wvdffLqyXc9AsW1eMIrWTFj
aYo3BOAfFWpM1KxAff27wUDrl/k0Sn/Esvcjzac5KDXVlOy1xozcEv/nxfPn
z7F7UoJFR4PBN22j8K1XGWYl8ZP0p2tG7F92unUQeZx//7/NLqe8OcEAAA==

-->

</rfc>
