<?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-cde-11" category="bcp" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="CBOR CDE">CBOR Common Deterministic Encoding (CDE)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-11"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2025" month="May" day="12"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <abstract>
      <?line 75?>

<t>CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
its Section 4.2, providing some flexibility for application specific
decisions.
To facilitate Deterministic Encoding to be offered as a selectable
feature of generic encoders, the present document defines a
CBOR Common Deterministic Encoding (CDE) that can be shared by a
large set of applications with potentially diverging detailed
requirements.
It also defines the term "Basic Serialization", which stops short of the
potentially more onerous requirements that make CDE fully
deterministic, while employing most of its reductions of the
variability needing to be handled by decoders.</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-cde/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Concise Binary Object Representation Maintenance and Extensions (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/draft-ietf-cbor-cde"/>.</t>
    </note>
  </front>
  <middle>
    <?line 93?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
its Section 4.2, providing some flexibility for application specific
decisions.
To facilitate Deterministic Encoding to be offered as a selectable
feature of generic encoders, the present document defines a
CBOR Common Deterministic Encoding (CDE) that can be shared by a
large set of applications with potentially diverging detailed
requirements.
It also defines the term "Basic Serialization", which stops short of the
potentially more onerous requirements that make CDE fully
deterministic, while employing most of its reductions of the
variability needing to be handled by decoders.</t>
      <section anchor="structure-of-this-document">
        <name>Structure of This Document</name>
        <t>After introductory material (this introduction and <xref target="choi"/>), <xref target="dep"/>
defines the CBOR Common Deterministic Encoding (CDE).
<xref target="cddl-support"/> defines Concise Data Definition Language (CDDL) support for indicating the use of CDE.
This is followed by the conventional sections for
<xref format="title" target="seccons"/> (<xref format="counter" target="seccons"/>),
<xref format="title" target="sec-iana"/> (<xref format="counter" target="sec-iana"/>),
and <xref format="title" target="sec-combined-references"/> (<xref format="counter" target="sec-combined-references"/>).</t>
        <t>For use as background material, <xref target="models"/> introduces terminology for
the layering of models used to describe CBOR.</t>
        <t>Instead of giving rise to the definition of application-specific,
non-interoperable variants of CDE, this document identifies
Application-level Deterministic Representation (ALDR) rules as a
concept that is separate from CDE itself (<xref target="aldr"/>) and therefore out of
scope for this document.
ALDR rules are situated at the application-level, i.e., on top of the
CDE, and address requirements on deterministic representation of
application data that are specific to an application or a set of
applications.
ALDR rules are often provided as part of a specification for a CBOR-based
protocol, or, if needed, can be provided by referencing a shared "ALDR
ruleset" that is defined in a separate document.</t>
        <t>The informative <xref target="impcheck"/> provides brief checklists that implementers
can use to check their CDE implementations.
<xref target="ps"/> provides a checklist for implementing Preferred Serialization.
<xref target="bs"/> introduces "Basic Serialization", a slightly more restricted form
of Preferred Serialization that may be used by encoders to hit a sweet
spot for maximizing interoperability with partial (e.g., constrained)
CBOR decoder implementations.
<xref target="cde"/> further restricts Basic Serialization to arrive at CDE.</t>
        <t><xref target="examples"/> provides a few examples for CBOR data items in CDE
encoding, as well as a few failing examples.</t>
      </section>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The conventions and definitions of <xref target="STD94"/> apply.
<xref target="models"/> provides additional discussion of the terms information
model, data model, and serialization.</t>
        <ul spacing="normal">
          <li>
            <t>The term "CBOR Application" ("application" for short) is not
explicitly defined in <xref target="STD94"/>; this document uses it in the same sense
as it is used there, specifically for applications that use CBOR as an
interchange format and use (often generic) CBOR encoders/decoders to
serialize/ingest the CBOR form of their application data to be
exchanged.</t>
          </li>
          <li>
            <t>Similarly, "CBOR Protocol" is used as in <xref target="STD94"/> for the protocol that
governs the interchange of data in CBOR format for a specific
application or set of applications.</t>
          </li>
          <li>
            <t>"Representation" stands for the process, and its result, of building
the representation format out of (information-model level) application
data.</t>
          </li>
          <li>
            <t>"Serialization" is used for the subset of this process, and its
result, that represents ("serializes") data in CBOR generic data model
form into encoded data items.  "Encoding" is often used as a synonym
when the focus is on that.</t>
          </li>
        </ul>
        <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?>

</section>
    </section>
    <section anchor="choi">
      <name>Encoding Choices in CBOR</name>
      <t>In many cases, CBOR provides more than one way to encode a data item,
i.e., to serialize it into a sequence of bytes.
This flexibility can provide convenience for the generator of the
encoded data item, but handling the resulting variation can also put
an onus on the decoder.
In general, there is no single perfect encoding choice that is optimal for all
applications.
Choosing the right constraints on these encoding choices is one
element of application protocol design.
Having predefined sets of such choices is a useful way to reduce
variation between applications, enabling generic implementations.</t>
      <t>Section <xref target="RFC8949" section="4.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> provides a recommendation for a
<em>Preferred Serialization</em>.
This recommendation is useful for most CBOR applications, and it is a
good choice for most applications.
Its main constraint is to choose the shortest <em>head</em> (Section <xref target="RFC8949" section="3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>) that preserves the value of a data item.</t>
      <t>Preferred Serialization allows indefinite length encoding (Section <xref target="RFC8949" section="3.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>), which does not express the length of a string,
an array, or a map in its head.  Supporting both definite length and
indefinite length encoding is an additional onus on the decoder; many
applications therefore choose not to use indefinite length encoding at
all.
We call Preferred Serialization with this additional constraint
<em>Basic Serialization</em>.
Basic Serialization is a common choice for applications that need to
further reduce the variability that needs to be handled by decoders,
potentially maximizing interoperability with partial (e.g.,
constrained) CBOR decoder implementations.</t>
      <t>These constraints still allow some variation. In particular, there is
more than one serialization for data items that contain maps: The
order of serialization of map entries is ignored in CBOR (as it is in
JSON), so maps with more than one entry have all permutations of these
entries as valid Basic Serializations.
<em>Deterministic Serialization</em> builds on Basic Serialization by
defining a common (namely, lexicographic) order for the entries in a map.
For many applications, ensuring this common order is an additional
onus on the generator that is not actually needed, so they do not
choose Deterministic Serialization.
However, if the objective is minimal effort for the consuming
application, deterministic map ordering can be useful even outside the
main use cases for Deterministic Serialization that are further
discussed in <xref section="2" sectionFormat="of" target="I-D.bormann-cbor-det"/>.</t>
      <t><xref target="tab-constraints"/> summarizes the increasingly restrictive sets of
encoding choices that have been given names in this section.</t>
      <?v3xml2rfc table_borders="full" ?>

<table anchor="tab-constraints">
        <name>Constraints on the Serialization of CBOR</name>
        <thead>
          <tr>
            <th align="left">Set of Encoding Choices</th>
            <th align="left">Most Important Constraint</th>
            <th align="left">Applications</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Preferred</td>
            <td align="left">shortest "head" variant</td>
            <td align="left">most</td>
          </tr>
          <tr>
            <td align="left">Basic</td>
            <td align="left">+ definite lengths only</td>
            <td align="left">many</td>
          </tr>
          <tr>
            <td align="left">
              <em>Deterministic</em> ("CDE")</td>
            <td align="left">+ common map order</td>
            <td align="left">specific</td>
          </tr>
        </tbody>
      </table>
      <t>Note that the objective to have a deterministic serialization for a
specific application data item can only be fulfilled if the
application itself does not generate multiple different CBOR data
items that represent that same (equivalent) application data item.
We speak of the need for Application-level Deterministic
Representation (ALDR), and we may want to aid achieving this by
the application defining rules for ALDR (see also <xref target="aldr"/>).
Where Deterministic Representation is not actually needed,
application-level representation rules of course can still be useful
to amplify the benefits of Preferred or Basic Serialization.</t>
    </section>
    <section anchor="dep">
      <name>CBOR Common Deterministic Encoding (CDE)</name>
      <t>This specification defines the <em>CBOR Common Deterministic Encoding</em>
(CDE) based on the <em>Core Deterministic Encoding
Requirements</em> defined for CBOR in
Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
      <t>Note that this specific set of requirements is elective — in
principle, other variants of deterministic encoding can be defined
(and have been, now being phased out, as detailed in Section <xref target="RFC8949" section="4.2.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).
In many applications of CBOR today, deterministic encoding is not used
at all, as its restriction of choices can create some additional
performance cost and code complexity.</t>
      <t><xref target="STD94"/>'s "Core Deterministic Encoding Requirements" are designed to
provide well-understood and
easy-to-implement rules while maximizing coverage, i.e., the subset of
CBOR data items that are fully specified by these rules, and also
placing minimal burden on implementations.</t>
      <t>As discussed in <xref target="choi"/>, CDE combines the constraints of Preferred
Serialization with a constraint added by Basic Serialization and
another constraint added by CDE itself.
While many CBOR implementations do set out to provide Preferred
Serialization, there is less of a practical requirement to fully
conform, as generic CBOR decoders do not normally check for Preferred
Serialization.
However, an application that relies on deterministic representation,
during ingestion of an encoded CBOR data item will often need to
employ a "CDE-checking decoder", i.e., a CBOR decoder configured to
also check that all CDE constraints are satisfied (see also
<xref target="impcheck"/>).
Here, small deviations from CDE, including deviations from Preferred
Serialization, turn into interoperability problems; hence the
additional attention of the present document on these constraints.</t>
      <section anchor="psconstr">
        <name>CDE Constraints from Preferred Serialization</name>
        <t>Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> picks up on the interaction of extensibility
(CBOR tags) and deterministic encoding.
CBOR itself uses some tags to increase the range of its basic
generic data types, e.g., tags 2/3 extend the range of basic major
types 0/1 in a seamless way.
Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> recommends handling this transition the same
way as with the transition between different integer representation
lengths in the basic generic data model, i.e., by mandating the
Preferred Serialization for all integers (Section <xref target="RFC8949" section="3.4.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>; see also <xref target="exa-int"/> and <xref target="exa-pref"/>).</t>
        <ol spacing="normal" type="1" group="1"><li>
            <t>By adopting the encoding constraints from Preferred Serialization,
CDE turns this
recommendation into a mandate: Integers that can be represented by
basic major type 0 and 1 are encoded using the deterministic
encoding defined for them, and integers outside this range are
encoded using the Preferred Serialization (Section <xref target="RFC8949" section="3.4.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>) of tag 2 and 3 (i.e., no leading zero bytes).</t>
          </li>
        </ol>
        <t>Most tags capture more specific application semantics and therefore
may be harder to define a deterministic encoding for.
While the deterministic encoding of their tag internals is often
covered by the <em>Core Deterministic Encoding Requirements</em>, the mapping
of diverging platform application data types onto the tag contents may
require additional attention to perform it in a deterministic way; see
<xref section="3.2" sectionFormat="of" target="I-D.bormann-cbor-det"/> for
more explanation as well as examples.
As the CDE would continually
need to address additional issues raised by the registration of new
tags, this specification recommends that new tag registrations address
deterministic encoding in the context of CDE.
Note that not in all cases the tag's deterministic encoding constraints
will be confined to its definition of Preferred Serialization.</t>
        <t>A particularly difficult field to obtain deterministic encoding for is
floating point numbers, partially because they themselves are often
obtained from processes that are not entirely deterministic between platforms.
See <xref section="3.2.2" sectionFormat="of" target="I-D.bormann-cbor-det"/> for more details.
Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> presents a number of choices that needed to
be made to obtain the CBOR Common Deterministic Encoding (CDE).
Here, CDE entirely recurs to Preferred Serialization and
does <em>not</em> itself define any additional constraints.</t>
        <t>However, this BCP responds to a perceived need to clarify some of the
Preferred Serialization constraints.
Specifically, CDE specifies (in the order of the bullet list at the end of Section <xref target="RFC8949" section="4.2.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>):</t>
        <ol spacing="normal" type="1" group="1"><li>
            <t>Besides the mandated use of Preferred Serialization, there is no further
specific action for the two different zero values, e.g., an encoder
that is asked by an application to represent a negative floating
point zero will generate 0xf98000.</t>
          </li>
          <li>
            <t>There is no attempt to mix integers and floating point numbers,
i.e., all floating point values are encoded as the preferred
floating-point representation that accurately represents the value,
independent of whether the floating point value is, mathematically,
an integral value (choice 2 of the second bullet).</t>
          </li>
          <li>
            <t>Apart from finite and infinite numbers, <xref target="IEEE754"/> floating point
values include NaN (not a number) values <xref target="I-D.bormann-cbor-numbers"/>.
In CDE, there is no special handling of NaN values, except a
clarification that the
Preferred Serialization rules also apply to NaNs (with zero or
non-zero payloads), using the canonical encoding of NaNs as defined
in Section 6.2.1 of <xref target="IEEE754"/>.
Specifically, this means that shorter forms of encodings for a NaN
are used when that can be achieved by only removing trailing zeros
in the NaN payload (example serializations are available in
<xref section="A.1.2" sectionFormat="of" target="I-D.bormann-cbor-numbers"/>).
Further clarifying a "should"-level statement in Section 6.2.1 of
<xref target="IEEE754"/>, the CBOR encoding always uses a leading bit of 1 in the
significand to encode a quiet NaN; the use of signaling NaNs by
application protocols is <bcp14>NOT RECOMMENDED</bcp14> but when presented by an
application these are encoded by using a leading bit of 0.  </t>
            <t>
Typically, most applications that employ NaNs in their storage and
communication interfaces will only use a single NaN value, quiet,
non-negative NaN with payload 0,
which therefore deterministically encodes as 0xf97e00.</t>
          </li>
          <li>
            <t>There is no special handling of subnormal values.</t>
          </li>
          <li>
            <t>CDE does not presume
equivalence of basic floating point values with floating point
values using other representations (e.g., tag 4/5).
Such equivalences and related deterministic representation rules
can be added at the ALDR level if desired, e.g., by stipulating
additional equivalences and deterministically choosing exactly one
representation for each such equivalence, and by restricting in
general the set of data item values actually used by an
application.</t>
          </li>
        </ol>
        <t>The main intent here is to preserve the basic generic data model, so
applications (in their ALDR rules or by referencing a separate ALDR
ruleset document, see
<xref target="aldr"/>) can
make their own decisions within that data model.
E.g., an application's ALDR rules can decide that it only ever allows a
single NaN value that would be encoded as 0xf97e00, so a CDE
implementation focusing on this application would not even need to
provide processing for other NaN values.
Basing the definition of both CDE and ALDR rules on the
generic data model of CBOR also means that there is no effect on the
Concise Data Definition Language (CDDL)
<xref target="RFC8610"/>, except where the data description is documenting specific
encoding decisions for byte strings that carry embedded CBOR (see
<xref target="cddl-support"/>).</t>
      </section>
      <section anchor="additional-cde-constraint-from-basic-serialization">
        <name>Additional CDE Constraint from Basic Serialization</name>
        <t>In addition to the encoding constraints from Preferred Serialization,
CDE adds the constraint of not using indefinite length encoding from
Basic Serialization.
In many encoders, the use of indefinite length encoding is controlled
by its configuration and can simply be switched off.</t>
        <t>Some encoders turn to indefinite length encoding for arrays and maps
with 256 or more elements/entries, to use the slightly smaller
serialization size indefinite length encoding offers for these cases.
Since leaving out support for indefinite length encoding is a common
form of partial implementation, this may reduce interoperability.
(Indefinite length encoding may also be used conditionally to avoid
having to compute the total size ahead of time if the platform uses
some form of chunking.)
As CDE uses definite length encoding exclusively, such behavior
needs to be turned off for CDE.</t>
      </section>
      <section anchor="additional-cde-constraint-from-cde-itself">
        <name>Additional CDE Constraint from CDE Itself</name>
        <t>In line with Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>, CDE adds the constraint
of map ordering to those from Basic Serialization.
In some implementations, where platform representations of maps
preserve ordering, this can be achieved using a generic CBOR encoder by
pre-ordering all maps to be encoded, as long as that generic encoder
also preserves the ordering in maps.
In implementations without these properties, a specialized CBOR
encoder may need to be employed.</t>
        <t>Map ordering is a deterministic encoding constraint specific to maps,
major type 5, that goes beyond maps' constraints for preferred
serialization.
In the definition of a tag being employed, there may also be some
deterministic encoding constraints that are not covered by the tag's
constraints for Preferred Serialization (see <xref target="psconstr"/>).</t>
      </section>
    </section>
    <section anchor="cddl-support">
      <name>CDDL support</name>
      <t>CDDL defines the structure of CBOR data items at the data model level;
it enables being specific about the data items allowed in a particular
place.
It does not specify encoding, but CBOR protocols can specify the use
of CDE (or simply Basic Serialization).
For instance, it allows the specification of a floating point data item
as "float16"; this means the application data model only foresees data
that can be encoded as <xref target="IEEE754"/> binary16.
Note that specifying "float32" for a floating point data item enables
all floating point values that can be represented as binary32; this
includes values that can also be represented as binary16 and that will
be so represented in Basic Serialization.</t>
      <t><xref target="RFC8610"/> defines control operators to indicate that the contents of a
byte string carries a CBOR-encoded data item (<tt>.cbor</tt>) or a sequence of
CBOR-encoded data items (<tt>.cborseq</tt>).</t>
      <t>CDDL specifications may want to specify that the data items should be
encoded in Common CBOR Deterministic Encoding.
The present specification adds two CDDL control operators that can be used
for this.</t>
      <t>The control operators <tt>.cde</tt> and <tt>.cdeseq</tt> are exactly like <tt>.cbor</tt> and
<tt>.cborseq</tt> except that they also require the encoded data item(s) to be
encoded according to CDE.</t>
      <t>For example, a byte string of embedded CBOR that is to be encoded
according to CDE can be formalized as:</t>
      <artwork><![CDATA[
leaf = #6.24(bytes .cde any)
]]></artwork>
      <t>More importantly, if the encoded data item also needs to have a
specific structure, this can be expressed by the right-hand side
(instead of using the most general CDDL type <tt>any</tt> here).</t>
      <t>(Note that the <tt>.cdeseq</tt> control operator does not enable specifying
different deterministic encoding requirements for the elements of the
sequence.  If a use case for such a feature becomes known, it could be
added, or the CBOR sequence could be constructed with <tt>.join</tt> (<xref section="3.1" sectionFormat="of" target="RFC9741"/>).)</t>
      <t>Obviously, specifications that document ALDR rules can define related control operators
that also embody the processing required by those ALDR rules,
and are encouraged to do so.</t>
    </section>
    <section anchor="seccons">
      <name>Security Considerations</name>
      <t>The security considerations in Section <xref target="RFC8949" section="10" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> apply.
The use of deterministic encoding can mitigate issues arising out of
the use of non-preferred serializations specially crafted by an attacker.
However, this effect only accrues if the decoder actually checks that
deterministic encoding was applied correctly.
More generally, additional security properties of deterministic
encoding can rely on this check being performed properly.</t>
    </section>
    <section anchor="sec-iana">
      <name>IANA Considerations</name>
      <t><cref anchor="to-be-removed">RFC Editor: please replace RFCXXXX with the RFC
number of this RFC and remove this note.</cref></t>
      <t>This document requests IANA to register the contents of
<xref target="tbl-iana-reqs"/> into the registry
"<xref section="CDDL Control Operators" relative="#cddl-control-operators" sectionFormat="bare" target="IANA.cddl"/>" of the
<xref target="IANA.cddl"/> registry group:</t>
      <?v3xml2rfc table_borders="light" ?>

<table anchor="tbl-iana-reqs">
        <name>New control operators to be registered</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">.cde</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.cdeseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
    </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="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="IEEE Std" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="IANA.cddl" target="https://www.iana.org/assignments/cddl">
          <front>
            <title>Concise Data Definition Language (CDDL)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <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>
        <reference anchor="I-D.bormann-cbor-det">
          <front>
            <title>CBOR: On Deterministic Encoding and Representation</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="21" month="January" year="2025"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2.  The present document provides additional
   information about use cases, deployment considerations, and
   implementation choices for Deterministic Encoding and Representation.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-04"/>
        </reference>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>dCBOR: A Deterministic CBOR Application Profile</title>
            <author fullname="Wolf McNally" initials="W." surname="McNally">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Christopher Allen" initials="C." surname="Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Laurence Lundblade" initials="L." surname="Lundblade">
              <organization>Security Theory LLC</organization>
            </author>
            <date day="7" month="February" year="2025"/>
            <abstract>
              <t>   The purpose of determinism is to ensure that semantically equivalent
   data items are encoded into identical byte streams.  CBOR (RFC 8949)
   defines "Deterministically Encoded CBOR" in its Section 4.2, but
   leaves some important choices up to the application developer.  The
   CBOR Common Deterministic Encoding (CDE) Internet Draft builds on
   this by specifying a baseline for application profiles that wish to
   implement deterministic encoding with CBOR.  The present document
   provides an application profile "dCBOR" that can be used to help
   achieve interoperable deterministic encoding based on CDE for a
   variety of applications wishing an even narrower and clearly defined
   set of choices.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-12"/>
        </reference>
        <reference anchor="I-D.bormann-cbor-numbers">
          <front>
            <title>On Numbers in CBOR</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>   The Concise Binary Object Representation (CBOR), as defined in STD 94
   (RFC 8949), is a data representation format whose design goals
   include the possibility of extremely small code size, fairly small
   message size, and extensibility without the need for version
   negotiation.

   Among the kinds of data that a data representation format needs to be
   able to carry, numbers have a prominent role, but also have inherent
   complexity that needs attention from protocol designers and
   implementers of CBOR libraries and of the applications that use them.

   This document gives an overview over number formats available in CBOR
   and some notable CBOR tags registered, and it attempts to provide
   information about opportunities and potential pitfalls of these
   number formats.


   // This is a rather drafty initial revision, pieced together from
   // various components, so it has a higher level of redundancy than
   // ultimately desired.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-numbers-01"/>
        </reference>
        <reference anchor="UAX-15" target="https://unicode.org/reports/tr15/">
          <front>
            <title>Unicode Normalization Forms</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
          <refcontent>Unicode Standard Annex</refcontent>
        </reference>
        <reference anchor="RFC8392">
          <front>
            <title>CBOR Web Token (CWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="May" year="2018"/>
            <abstract>
              <t>CBOR Web Token (CWT) is a compact means of representing claims to be transferred between two parties. The claims in a CWT are encoded in the Concise Binary Object Representation (CBOR), and CBOR Object Signing and Encryption (COSE) is used for added application-layer security protection. A claim is a piece of information asserted about a subject and is represented as a name/value pair consisting of a claim name and a claim value. CWT is derived from JSON Web Token (JWT) but uses CBOR rather than JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8392"/>
          <seriesInfo name="DOI" value="10.17487/RFC8392"/>
        </reference>
        <reference anchor="RFC9581">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Time, Duration, and Period</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="B. Gamari" initials="B." surname="Gamari"/>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <date month="August" year="2024"/>
            <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.</t>
              <t>In CBOR, one point of extensibility is the definition of CBOR tags. RFC 8949 defines two tags for time: CBOR tag 0 (RFC 3339 time as a string) and tag 1 (POSIX time as int or float). Since then, additional requirements have become known. The present document defines a CBOR tag for time that allows a more elaborate representation of time, as well as related CBOR tags for duration and time period. This document is intended as the reference document for the IANA registration of the CBOR tags defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9581"/>
          <seriesInfo name="DOI" value="10.17487/RFC9581"/>
        </reference>
        <reference anchor="RFC9679">
          <front>
            <title>CBOR Object Signing and Encryption (COSE) Key Thumbprint</title>
            <author fullname="K. Isobe" initials="K." surname="Isobe"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="O. Steele" initials="O." surname="Steele"/>
            <date month="December" year="2024"/>
            <abstract>
              <t>This specification defines a method for computing a hash value over a CBOR Object Signing and Encryption (COSE) Key. It specifies which fields within the COSE Key structure are included in the cryptographic hash computation, the process for creating a canonical representation of these fields, and how to hash the resulting byte sequence. The resulting hash value, referred to as a "thumbprint", can be used to identify or select the corresponding key.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9679"/>
          <seriesInfo name="DOI" value="10.17487/RFC9679"/>
        </reference>
        <referencegroup anchor="STD96" target="https://www.rfc-editor.org/info/std96">
          <reference anchor="RFC9052" target="https://www.rfc-editor.org/info/rfc9052">
            <front>
              <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
              <author fullname="J. Schaad" initials="J." surname="Schaad"/>
              <date month="August" year="2022"/>
              <abstract>
                <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
                <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="96"/>
            <seriesInfo name="RFC" value="9052"/>
            <seriesInfo name="DOI" value="10.17487/RFC9052"/>
          </reference>
          <reference anchor="RFC9338" target="https://www.rfc-editor.org/info/rfc9338">
            <front>
              <title>CBOR Object Signing and Encryption (COSE): Countersignatures</title>
              <author fullname="J. Schaad" initials="J." surname="Schaad"/>
              <date month="December" year="2022"/>
              <abstract>
                <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. CBOR Object Signing and Encryption (COSE) defines a set of security services for CBOR. This document defines a countersignature algorithm along with the needed header parameters and CBOR tags for COSE. This document updates RFC 9052.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="96"/>
            <seriesInfo name="RFC" value="9338"/>
            <seriesInfo name="DOI" value="10.17487/RFC9338"/>
          </reference>
        </referencegroup>
        <reference anchor="RFC7493">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
        <reference anchor="RFC9741">
          <front>
            <title>Concise Data Definition Language (CDDL): Additional Control Operators for the Conversion and Processing of Text</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="March" year="2025"/>
            <abstract>
              <t>The Concise Data Definition Language (CDDL), standardized in RFC 8610, provides "control operators" as its main language extension point. RFCs have added to this extension point in both an application-specific and a more general way.</t>
              <t>The present document defines a number of additional generally applicable control operators for text conversion (bytes, integers, printf-style formatting, and JSON) and for an operation on text.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9741"/>
          <seriesInfo name="DOI" value="10.17487/RFC9741"/>
        </reference>
        <reference anchor="I-D.bormann-dispatch-modern-network-unicode">
          <front>
            <title>Modern Network Unicode</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="2" month="March" year="2025"/>
            <abstract>
              <t>   BCP18 (RFC 2277) has been the basis for the handling of character-
   shaped data in IETF specifications for more than a quarter of a
   century now.  It singles out UTF-8 (STD63, RFC 3629) as the “charset”
   that MUST be supported, and pulls in the Unicode standard with that.

   Based on this, RFC 5198 both defines common conventions for the use
   of Unicode in network protocols and caters for the specific
   requirements of the legacy protocol Telnet.  In applications that do
   not need Telnet compatibility, some of the decisions of RFC 5198 can
   be cumbersome.

   The present specification defines “Modern Network Unicode” (MNU),
   which is a form of RFC 5198 Network Unicode that can be used in
   specifications that require the exchange of plain text over networks
   and where just mandating UTF-8 may not be sufficient, but there is
   also no desire to import all of the baggage of RFC 5198.

   As characters are used in different environments, MNU is defined in a
   one-dimensional (1D) variant that is useful for identifiers and
   labels, but does not use a structure of text lines.  A 2D variant is
   defined for text that is a sequence of text lines, such as plain text
   documents or markdown format.  Additional variances of these two base
   formats can be used to tailor MNU to specific areas of application.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-dispatch-modern-network-unicode-06"/>
        </reference>
      </references>
    </references>
    <?line 518?>

<section anchor="models">
      <name>Information Model, Data Model and Serialization</name>
      <t>This appendix is informative.</t>
      <t>For a good understanding of this document, it is helpful to understand the difference between an information model, a data model and serialization.</t>
      <?v3xml2rfc table_borders="full" ?>

<table anchor="layers">
        <name>A three-layer model of information representation</name>
        <thead>
          <tr>
            <th align="left"> </th>
            <th align="left">Abstraction Level</th>
            <th align="left">Example</th>
            <th align="left">Standards</th>
            <th align="left">Implementation Representation</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Information Model</td>
            <td align="left">Top level; conceptual</td>
            <td align="left">The temperature of something</td>
            <td align="left"> </td>
            <td align="left"> </td>
          </tr>
          <tr>
            <td align="left">Data Model</td>
            <td align="left">Realization of information in data structures and data types</td>
            <td align="left">A floating-point number representing the temperature</td>
            <td align="left">CDDL</td>
            <td align="left">API input to CBOR encoder library, output from CBOR decoder library</td>
          </tr>
          <tr>
            <td align="left">Serialization</td>
            <td align="left">Actual bytes encoded for transmission</td>
            <td align="left">Encoded CBOR of a floating-point number</td>
            <td align="left">CBOR</td>
            <td align="left">Encoded CBOR in memory or for transmission</td>
          </tr>
        </tbody>
      </table>
      <t>CBOR does not provide facilities for expressing information models.
They are mentioned here for completeness and to provide some context.</t>
      <t>CBOR defines a palette of basic data items that can be grouped into
data types such as the usual integer or floating-point numbers, text or
byte strings, arrays and maps, and certain special "simple values"
such as Booleans and <tt>null</tt>.
Extended data types may be constructed from these basic types.
These basic and extended types are used to construct the data model of a CBOR protocol.
One notation that is often used for describing the data model of a CBOR protocol is CDDL <xref target="RFC8610"/>.
The various types of data items in the data model are serialized per RFC 8949 <xref target="STD94"/> to create encoded CBOR data items.</t>
      <section anchor="data-model-encoding-variants-and-interoperability-with-partial-implementations">
        <name>Data Model, Encoding Variants and Interoperability with Partial Implementations</name>
        <t>In contrast to JSON, CBOR-related documents explicitly discuss the data model separately from its serialization.
Both JSON and CBOR allow variation in the way some data items can be serialized:</t>
        <ul spacing="normal">
          <li>
            <t>In JSON, the number 1 can be serialized in several different ways
(<tt>1</tt>, <tt>0.1e1</tt>, <tt>1.0</tt>, <tt>100e-2</tt>) — while it may seem obvious to use
<tt>1</tt> for this case, this is less clear for <tt>1000000000000000000000000000000</tt> vs. <tt>1e+30</tt> or <tt>1e30</tt>.
(As its serialization also doubles as a human-readable interface, JSON
also allows the introduction of blank space for readability.)
The lack of an agreed data model for JSON led to the need for a complementary
specification documenting an interoperable subset <xref target="RFC7493"/>.</t>
          </li>
          <li>
            <t>The CBOR standard addresses constrained environments, both by being
concise and by limiting variation, but also by conversely allowing
certain data items in the data model to be serialized in multiple
ways, which may ease implementation on low-resource platforms.
On the other hand, constrained environments may further save
resources by only partially implementing the decoder functionality,
e.g., by not implementing all those variations.</t>
          </li>
        </ul>
        <t>To deal with this encoding variation provided for certain data items,
CBOR defines a <em>Preferred Serialization</em> (Section <xref target="RFC8949" section="4.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).
<em>Partial CBOR implementations</em> are more likely to interoperate if their
encoder uses Preferred Serialization and the decoder implements
decoding at least the Preferred Serialization as well.
A specific protocol for a constrained application may specify
restrictions that allow, e.g., some fields to be of fixed length,
guaranteeing interoperability even with partial implementations
optimized for this application.</t>
        <t>Another encoding variation is provided by indefinite-length encoding
for strings, arrays, and maps, which enables these to be streamed
without knowing their length upfront (Section <xref target="RFC8949" section="3.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).
For applications that do not perform streaming of this kind, variation
can be reduced (and often performance improved) by only allowing
definite-length encoding.
The present document coins the term <em>Basic Serialization</em> for combining
definite-length-only with preferred encoding, further reducing the
variation that a decoder needs to deal with.
The Common Deterministic Encoding, CDE, finally combines basic
serialization with a deterministic ordering of entries in a map
(<xref target="tab-constraints"/>).</t>
        <t>Partial implementations of a representation format are quite common in
embedded applications.
Protocols for embedded applications often reduce the footprint of an
embedded JSON implementation by explicitly restricting the breadth of
the data model, e.g., by not using floating point numbers with 64 bits
of precision or by not using floating point numbers at all.
These data-model-level restrictions do not get in the way of using
complete implementations ("generic encoders/decoders", Section <xref target="RFC8949" section="5.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).
(Note that applications may need to complement deterministic
encoding with decisions on the deterministic representation of
application data into CBOR data items, see <xref target="aldr"/>.)</t>
        <t>The increasing constraints on encoding (unconstrained, preferred,
basic, CDE) are orthogonal to data-model-level data definitions as
provided by <xref target="RFC8610"/>.
To be useful in all applications, these constraints have been defined
for all possible data items, covering the full range of values offered
by CBOR's data types.
This ensures that these serialization constraints can be applied to
any CBOR protocol, without requiring protocol-specific modifications
to generic encoder/decoder implementations.</t>
      </section>
    </section>
    <section anchor="aldr">
      <name>Application-level Deterministic Representation</name>
      <t>This appendix is informative.</t>
      <t>CBOR application protocols are agreements about how to use CBOR for a
specific application or set of applications.</t>
      <t>For a CBOR protocol to provide deterministic representation, both the
encoding and application layer must be deterministic.
While CDE ensures determinism at the encoding layer, requirements at
the application layer may also be necessary.</t>
      <t>Application protocols make representation decisions in order to
constrain the variety of ways in which some aspect of the information
model could be represented in the CBOR data model for the application.
For instance, there are several CBOR tags that can be used to
represent a time stamp (such as tag 0, 1, 1001), each with some specific
properties.</t>
      <aside>
        <t>For example, an application protocol that needs to represent birthdate/times could specify:</t>
        <ul spacing="normal">
          <li>
            <t>At the sender’s convenience, the birthdate/time <bcp14>MAY</bcp14>
  be sent either in epoch date format (as in tag 1) or string date
  format (as in tag 0).</t>
          </li>
          <li>
            <t>The receiver <bcp14>MUST</bcp14> decode both formats.</t>
          </li>
        </ul>
        <t>While this specification is interoperable, it lacks determinism.
There is variability in the application layer akin to variability in the CBOR encoding layer when CDE is not required.</t>
        <t>To make this example application layer specification deterministic,
allow only one date format (or at least be deterministic when there is
a choice, e.g., by specifying string format for leap seconds only).</t>
      </aside>
      <t>Application protocols that need to represent a timestamp typically
choose a specific tag and further constrain its use where necessary
(e.g., tag 1001 was designed to cover a wide variety of applications
<xref target="RFC9581"/>).
Where no tag is available, the application protocol can design its own
format for some application data.
Even where a tag is available, the application data can choose to use
its definitions without actually encoding the tag (e.g., by using its
content in specific places in an "unwrapped" form).</t>
      <t>Another source of application layer variability comes from the variety
of number types CBOR offers.
For instance, the number 2 can be represented as an integer, float,
big number, decimal fraction and other.
Most protocols designs will just specify one number type to use, and
that will give determinism, but here’s an example specification that
doesn’t:</t>
      <aside>
        <t>For instance, CWT <xref target="RFC8392"/> defines an application data type "NumericDate" which
(as an application-level rule) is formed by "unwrapping" tag 1 (see
Sections <xref target="RFC8392" section="2" sectionFormat="bare"/> and <xref target="RFC8392" section="5" sectionFormat="bare"/> of <xref target="RFC8392"/>).
CWT does stop short of using deterministic encoding.
A hypothetical deterministic variant of CWT would need to make an
additional ALDR rule for NumericDate, as
the definition of tag 1 allows both integer and floating point numbers
(Section <xref target="RFC8949" section="3.4.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>), which allows multiple
application-level representations of integral numbers.
These application rules may choose to only ever use integers, or to always
use integers when the numeric value can be represented as such without
loss of information, or to always use floating point numbers, or some
of these for some application data and different ones for other
application data.</t>
      </aside>
      <t>Applications that require Deterministic Representation, and that
derive CBOR data items from application data without maintaining a
record of which choices are to be made when representing these
application data, generally make rules for these choices as part of
the application protocol.
In this document, we speak about these choices as Application-level
Deterministic Representation Rules (ALDR rules for short).</t>
      <aside>
        <t>As an example, <xref target="RFC9679"/> is intended to derive a (deterministic)
thumbprint from a COSE key <xref target="STD96"/>.
<xref section="4" sectionFormat="of" target="RFC9679"/> provides the rules that are used to construct a
deterministic application-level representation (ALDR rules).
Only certain data from a COSE key are selected to be included in that
ALDR, and, where the COSE can choose multiple representations of
semantically equivalent application data, the ALDR rules choose one of
them, potentially requiring a conversion (<xref section="4.2" sectionFormat="of" target="RFC9679"/>):</t>
        <blockquote>
          <t>Note: [<xref target="RFC9052"/>] supports both compressed and uncompressed point
   representations.  For interoperability, implementations adhering to
   this specification <bcp14>MUST</bcp14> use the uncompressed point representation.
   Therefore, the y-coordinate is expressed as a bstr.  If an
   implementation uses the compressed point representation, it <bcp14>MUST</bcp14>
   first convert it to the uncompressed form for the purpose of
   thumbprint calculation.</t>
        </blockquote>
      </aside>
      <t>CDE provides for encoding commonality between different applications
of CBOR once these application-level choices have been made.
It can be useful for an application or a group of applications to
document their choices aimed at deterministic representation of
application data in a general way, constraining the set of data items
handled (<em>exclusions</em>, e.g., no compressed point representations) and
defining further mappings (<em>reductions</em>, e.g., conversions to
uncompressed form)
that help the application(s) get by with the exclusions.
This can be done in the application protocol specification (as in
<xref target="RFC9679"/>) or as a separate document.</t>
      <aside>
        <t>An early example of a separate document is the dCBOR specification
<xref target="I-D.mcnally-deterministic-cbor"/>.
dCBOR specifies the use of CDE together with some application-level
rules, i.e., an ALDR ruleset, such as a requirement for all text
strings to be in Unicode Normalization Form C (NFC) <xref target="UAX-15"/> — this
specific requirement is an example for an <em>exclusion</em> of non-NFC data
at the application level, and it invites implementing a <em>reduction</em> by
routine normalization of text strings.</t>
      </aside>
      <t>ALDR rules (including rules specified in a ALDR ruleset document) enable
simply using implementations of the common CDE; they do not
"fork" CBOR in the sense of requiring distinct generic encoder/decoder
implementations for each application.</t>
      <t>An implementation of specific ALDR rules combined with a CDE
implementation produces well-formed,
deterministically encoded CBOR according to <xref target="STD94"/>, and existing
generic CBOR decoders will therefore be able to decode it, including
those that check for Deterministic Encoding ("CDE-checking decoders", see also
<xref target="impcheck"/>).
Similarly, generic CBOR encoders will be able to produce valid CBOR
that can be ingested by an implementation that enforces an application's
ALDR rules if the encoder was handed data model level information
from an application that simply conformed to those ALDR rules.</t>
      <t>Please note that the separation between standard CBOR processing and
the processing required by the ALDR rules is a conceptual one:
Instead of employing generic encoders/decoders, both ALDR rule
processing and standard CBOR processing can be combined into a specialized
encoder/decoder specifically designed for a particular set of ALDR
rules.</t>
      <t>ALDR rules are intended to be used in conjunction with an
application, which typically will naturally use a subset of the CBOR generic
data model, which in turn
influences which subset of the ALDR rules is used by the specific application
(in particular if the application simply references a more general
ALDR ruleset document).
As a result, ALDR rules themselves place no direct
requirement on what minimum subset of CBOR is implemented.
For instance, a set of ALDR rules might include rules for the
processing of floating point values, but there is no requirement that
implementations of that set of ALDR rules support floating point
numbers (or any other kind of number, such as arbitrary precision
integers or 64-bit negative integers) when they are used with
applications that do not use them.</t>
    </section>
    <section anchor="impcheck">
      <name>Implementers' Checklists</name>
      <t>This appendix is informative.
It provides brief checklists that implementers can use to check their
implementations.
It uses <xref target="RFC2119"/> language, specifically the keyword <bcp14>MUST</bcp14>, to highlight
the specific items that implementers may want to check.
It does not contain any normative mandates.
This appendix is informative.</t>
      <t>Notes:</t>
      <ul spacing="normal">
        <li>
          <t>This is largely a restatement of parts of Section <xref target="RFC8949" section="4" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.
The purpose of the restatement is to aid the work of implementers,
not to redefine anything.  </t>
          <t>
Preferred Serialization Encoders as well as CDE
Encoders and CDE-checking Decoders have certain properties that are expressed
using <xref target="RFC2119"/> keywords in this appendix.</t>
        </li>
        <li>
          <t>Duplicate map keys are never valid in CBOR at all (see
list item "Major type 5" in Section <xref target="RFC8949" section="3.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>)
no matter what sort of serialization is used.
Of the various strategies listed in Section <xref target="RFC8949" section="5.6" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>,
detecting duplicates and handling them as an error instead of
passing invalid data to the application is the most robust one;
achieving this level of robustness is a mark of quality of
implementation.</t>
        </li>
        <li>
          <t>Preferred serialization and CDE only affect serialization.
They do not place any requirements, exclusions, mappings or such on
the data model level.
ALDR rules such as the ALDR ruleset defined by dCBOR are different as they can affect
the data model by restricting some values and ranges.</t>
        </li>
        <li>
          <t>CBOR decoders in general (as opposed to "CDE-checking decoders" specifically
advertised as supporting CDE)
are not required to check for preferred
serialization or CDE and reject inputs that do not fulfill
their requirements.
However, in an environment that employs deterministic encoding,
employing non-checking CBOR decoders negates many of its benefits.
Decoder implementations that advertise "support" for preferred
serialization or CDE need to check the encoding and reject
input that is not encoded to the encoding specification in use.
Again, ALDR rules such as those in dCBOR may pose additional
requirements, such as requiring rejection of non-conforming inputs.  </t>
          <t>
If a generic decoder needs to be used that does not "support" CDE, a
simple (but somewhat clumsy) way to check its input for proper CDE encoding is
to re-encode the decoded data with CDE and check for bit-to-bit equality with
the original input.</t>
        </li>
      </ul>
      <section anchor="ps">
        <name>Preferred Serialization</name>
        <t>In the following, the abbreviation "ai" will be used for the 5-bit
additional information field in the first byte of an encoded CBOR data
item, which follows the 3-bit field for the major type.</t>
        <section anchor="pse">
          <name>Preferred Serialization Encoders</name>
          <ol spacing="normal" type="1"><li>
              <t>Shortest-form encoding of the argument <bcp14>MUST</bcp14> be used for all major
types.
Major type 7 is used for floating-point and simple values; floating
point values have its specific rules for how the shortest form is
derived for the argument.
The shortest form encoding for any argument that is not a floating
point value is:  </t>
              <ul spacing="normal">
                <li>
                  <t>0 to 23 and -1 to -24 <bcp14>MUST</bcp14> be encoded in the same byte as the
major type.</t>
                </li>
                <li>
                  <t>24 to 255 and -25 to -256 <bcp14>MUST</bcp14> be encoded only with an additional
byte (ai = 0x18).</t>
                </li>
                <li>
                  <t>256 to 65535 and -257 to -65536 <bcp14>MUST</bcp14> be encoded only with an
additional two bytes (ai = 0x19).</t>
                </li>
                <li>
                  <t>65536 to 4294967295 and -65537 to -4294967296 <bcp14>MUST</bcp14> be encoded
only with an additional four bytes (ai = 0x1a).</t>
                </li>
              </ul>
            </li>
            <li>
              <t>If floating-point numbers are emitted, the following apply:  </t>
              <ul spacing="normal">
                <li>
                  <t>The length of the argument indicates half (binary16, ai = 0x19),
single (binary32, ai = 0x1a) and double (binary64, ai = 0x1b)
precision encoding.
If multiple of these encodings preserve the precision of the
value to be encoded, only the shortest form of these <bcp14>MUST</bcp14> be
emitted.
That is, encoders <bcp14>MUST</bcp14> support half-precision and
single-precision floating point.</t>
                </li>
                <li>
                  <t><xref target="IEEE754"/> Infinites and NaNs, and thus NaN payloads, <bcp14>MUST</bcp14> be
supported, to the extent possible on the platform.      </t>
                  <t>
As with all floating point numbers, Infinites and NaNs <bcp14>MUST</bcp14> be
encoded in the shortest of double, single or half precision that
preserves the value:      </t>
                  <ul spacing="normal">
                    <li>
                      <t>Positive and negative infinity and zero <bcp14>MUST</bcp14> be represented in
half-precision floating point.</t>
                    </li>
                    <li>
                      <t>For NaNs, the value to be preserved includes the sign bit,
the quiet bit, and the NaN payload (whether zero or non-zero).
The shortest form is obtained by removing the rightmost N bits of the
payload, where N is the difference in the number of bits in the
significand (mantissa representation) between the original format
and the shortest format.
This trimming is performed only (preserves the value only) if all the
rightmost bits removed are zero.
(This means that a double or single quiet NaN that has a zero
NaN payload will always be represented in a half-precision quiet NaN.)</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t>If tags 2 and 3 are supported, the following apply:  </t>
              <ul spacing="normal">
                <li>
                  <t>Positive integers from 0 to 2^64 - 1 <bcp14>MUST</bcp14> be encoded as a type 0 integer.</t>
                </li>
                <li>
                  <t>Negative integers from -(2^64) to -1 <bcp14>MUST</bcp14> be encoded as a type 1 integer.</t>
                </li>
                <li>
                  <t>Leading zeros <bcp14>MUST NOT</bcp14> be present in the byte string content of tag 2 and 3.</t>
                </li>
              </ul>
              <t>
(This also applies to the use of tags 2 and 3 within other tags,
such as 4 or 5.)</t>
            </li>
          </ol>
        </section>
        <section anchor="psd">
          <name>Decoders and Preferred Serialization</name>
          <t>There are no special requirements that CBOR decoders need to meet to
be what could be called a "Preferred Serialization Decoder".</t>
          <t>Partial decoder implementations that want to accept at least Preferred
Serialization need to pay attention to at least the
following requirements:</t>
          <ol spacing="normal" type="1"><li>
              <t>Decoders <bcp14>MUST</bcp14> accept shortest-form encoded arguments (see Section <xref target="RFC8949" section="3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).</t>
            </li>
            <li anchor="arraymap-indef">
              <t>If arrays or maps are supported, both definite-length and indefinite-length arrays or maps <bcp14>MUST</bcp14> be accepted.</t>
            </li>
            <li anchor="string-indef">
              <t>If text or byte strings are supported, both definite-length and indefinite-length text or byte
strings <bcp14>MUST</bcp14> be accepted.</t>
            </li>
            <li>
              <t>If floating-point numbers are supported, the following apply:  </t>
              <ul spacing="normal">
                <li>
                  <t>Half-precision values <bcp14>MUST</bcp14> be accepted.</t>
                </li>
                <li>
                  <t>Double- and single-precision values <bcp14>SHOULD</bcp14> be accepted; leaving these out
is only foreseen for decoders that need to work in exceptionally
constrained environments.</t>
                </li>
                <li>
                  <t>If double-precision values are accepted, single-precision values
<bcp14>MUST</bcp14> be accepted.</t>
                </li>
                <li>
                  <t>Infinites and NaNs, and thus NaN payloads, <bcp14>MUST</bcp14> be accepted and
presented to the application (not necessarily in the platform
number format, if that doesn't support those values).</t>
                </li>
              </ul>
            </li>
            <li>
              <t>If big numbers (tags 2 and 3) are supported, type 0 and type 1 integers <bcp14>MUST</bcp14>
be accepted where a tag 2 or 3 would be accepted.  Leading zero bytes
in the tag content of a tag 2 or 3 <bcp14>MUST</bcp14> be ignored.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="bs">
        <name>Basic Serialization</name>
        <t>Basic Serialization further restricts Preferred Serialization by not
using indefinite length encoding.
A CBOR encoder can choose to employ Basic Serialization in order to
reduce the variability that needs to be handled by decoders,
potentially maximizing interoperability with partial (e.g.,
constrained) CBOR decoder implementations.</t>
        <section anchor="bse">
          <name>Basic Serialization Encoders</name>
          <t>The Basic Serialization Encoder requirements are identical to the
Preferred Serialization Encoder requirements, with the following additions:</t>
          <ol spacing="normal" type="1"><li>
              <t>If maps or arrays are emitted, they <bcp14>MUST</bcp14> use definite-length
encoding (never indefinite-length).</t>
            </li>
            <li>
              <t>If text or byte strings are emitted, they <bcp14>MUST</bcp14> use definite-length
encoding (never indefinite-length).</t>
            </li>
          </ol>
        </section>
        <section anchor="bsd">
          <name>Decoders and Basic Serialization</name>
          <t>There are no special requirements that CBOR decoders need to meet to
be what could be called a "Basic Serialization Decoder".</t>
          <t>Partial decoder implementations that want to accept at least Basic
Serialization need to pay attention to the requirements for partial
decoder implementations that accept Preferred Serialization, with the
following relaxations from the items <xref format="counter" target="arraymap-indef"/> and <xref format="counter" target="string-indef"/> of <xref target="psd"/>:</t>
          <ol spacing="normal" type="1"><li>
              <t>If arrays or maps are supported, definite-length arrays or maps <bcp14>MUST</bcp14> be accepted.</t>
            </li>
            <li>
              <t>If text or byte strings are supported, definite-length text or byte
strings <bcp14>MUST</bcp14> be accepted.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="cde">
        <name>CDE</name>
        <section anchor="cde-encoders">
          <name>CDE Encoders</name>
          <ol spacing="normal" type="1"><li>
              <t>CDE encoders <bcp14>MUST</bcp14> only emit CBOR that fulfills the basic
serialization rules (<xref target="bse"/>).</t>
            </li>
            <li>
              <t>CDE encoders <bcp14>MUST</bcp14> sort maps by the CBOR representation of the map
key.
The sorting is byte-wise lexicographic order of the encoded map
key data items.</t>
            </li>
            <li>
              <t>CDE encoders <bcp14>MUST</bcp14> generate CBOR that fulfills basic validity
(Section <xref target="RFC8949" section="5.3.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).  Note that this includes not
emitting duplicate keys in a major type 5 map as well as emitting
only valid UTF-8 in major type 3 text strings.  </t>
              <t>
Note also that CDE does NOT include a requirement for Unicode
normalization <xref target="UAX-15"/>; <xref section="C" sectionFormat="of" target="I-D.bormann-dispatch-modern-network-unicode"/> contains some
rationale that went into not requiring routine use of Unicode normalization
processes.</t>
            </li>
          </ol>
        </section>
        <section anchor="cde-checking-decoders">
          <name>CDE-checking Decoders</name>
          <t>The term "CDE-checking Decoder" is a shorthand for a CBOR decoder that
advertises <em>supporting</em> CDE (see the start of this appendix).</t>
          <ol spacing="normal" type="1"><li>
              <t>CDE-checking decoders <bcp14>MUST</bcp14> follow the rules for decoders that
accept Basic Serialization (<xref target="bsd"/>) and <bcp14>MUST</bcp14> check the input for
keeping the Basic Serialization constraints.</t>
            </li>
            <li>
              <t>CDE-checking decoders <bcp14>MUST</bcp14> check for ordering map keys and for basic
validity of the CBOR encoding (see Section <xref target="RFC8949" section="5.3.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>, which includes a check against duplicate map keys
and invalid UTF-8).</t>
            </li>
          </ol>
          <t>To be called a CDE-checking decoder, it <bcp14>MUST NOT</bcp14> present to the application
a decoded data item that fails one of these checks (except maybe via
special diagnostic channels with no potential for confusion with a
correctly CDE-decoded data item).</t>
        </section>
      </section>
    </section>
    <section anchor="examples">
      <name>Encoding Examples</name>
      <t>The following three tables provide examples of CDE-encoded CBOR data
items, each giving Diagnostic Notation (EDN <xref target="I-D.ietf-cbor-edn-literals"/>), the encoded data
item in hexadecimal, and a comment.</t>
      <t>Implementers that want to use these examples as test input may be
interested in the file <tt>example-table-input.csv</tt> in the github
repository <tt>cbor-wg/draft-ietf-cbor-cde</tt>.</t>
      <section anchor="exa-int">
        <name>Integer Value Examples</name>
        <?v3xml2rfc table_borders="light" ?>

<table anchor="tab-example-int">
          <name>Integer Value Examples</name>
          <thead>
            <tr>
              <th align="left">EDN</th>
              <th align="left">CBOR (hex)</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">00</td>
              <td align="left">Smallest unsigned immediate int</td>
            </tr>
            <tr>
              <td align="left">-1</td>
              <td align="left">20</td>
              <td align="left">Largest negative immediate int</td>
            </tr>
            <tr>
              <td align="left">23</td>
              <td align="left">17</td>
              <td align="left">Largest unsigned immediate int</td>
            </tr>
            <tr>
              <td align="left">-24</td>
              <td align="left">37</td>
              <td align="left">Smallest negative immediate int</td>
            </tr>
            <tr>
              <td align="left">24</td>
              <td align="left">1818</td>
              <td align="left">Smallest unsigned one-byte int</td>
            </tr>
            <tr>
              <td align="left">-25</td>
              <td align="left">3818</td>
              <td align="left">Largest negative one-byte int</td>
            </tr>
            <tr>
              <td align="left">255</td>
              <td align="left">18ff</td>
              <td align="left">Largest unsigned one-byte int</td>
            </tr>
            <tr>
              <td align="left">-256</td>
              <td align="left">38ff</td>
              <td align="left">Smallest negative one-byte int</td>
            </tr>
            <tr>
              <td align="left">256</td>
              <td align="left">190100</td>
              <td align="left">Smallest unsigned two-byte int</td>
            </tr>
            <tr>
              <td align="left">-257</td>
              <td align="left">390100</td>
              <td align="left">Largest negative two-byte int</td>
            </tr>
            <tr>
              <td align="left">65535</td>
              <td align="left">19ffff</td>
              <td align="left">Largest unsigned two-byte int</td>
            </tr>
            <tr>
              <td align="left">-65536</td>
              <td align="left">39ffff</td>
              <td align="left">Smallest negative two-byte int</td>
            </tr>
            <tr>
              <td align="left">65536</td>
              <td align="left">1a00010000</td>
              <td align="left">Smallest unsigned four-byte int</td>
            </tr>
            <tr>
              <td align="left">-65537</td>
              <td align="left">3a00010000</td>
              <td align="left">Largest negative four-byte int</td>
            </tr>
            <tr>
              <td align="left">4294967295</td>
              <td align="left">1affffffff</td>
              <td align="left">Largest unsigned four-byte int</td>
            </tr>
            <tr>
              <td align="left">-4294967296</td>
              <td align="left">3affffffff</td>
              <td align="left">Smallest negative four-byte int</td>
            </tr>
            <tr>
              <td align="left">4294967296</td>
              <td align="left">1b0000000100000000</td>
              <td align="left">Smallest unsigned eight-byte int</td>
            </tr>
            <tr>
              <td align="left">-4294967297</td>
              <td align="left">3b0000000100000000</td>
              <td align="left">Largest negative eight-byte int</td>
            </tr>
            <tr>
              <td align="left">18446744073709551615</td>
              <td align="left">1bffffffffffffffff</td>
              <td align="left">Largest unsigned eight-byte int</td>
            </tr>
            <tr>
              <td align="left">-18446744073709551616</td>
              <td align="left">3bffffffffffffffff</td>
              <td align="left">Smallest negative eight-byte int</td>
            </tr>
            <tr>
              <td align="left">18446744073709551616</td>
              <td align="left">c249010000000000000000</td>
              <td align="left">Smallest unsigned bigint</td>
            </tr>
            <tr>
              <td align="left">-18446744073709551617</td>
              <td align="left">c349010000000000000000</td>
              <td align="left">Largest negative bigint</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="exa-flt">
        <name>Floating Point Value Examples</name>
        <?v3xml2rfc table_borders="light" ?>

<table anchor="tab-example-flt">
          <name>Floating Point Value Examples</name>
          <thead>
            <tr>
              <th align="left">EDN</th>
              <th align="left">CBOR (hex)</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0.0</td>
              <td align="left">f90000</td>
              <td align="left">Zero</td>
            </tr>
            <tr>
              <td align="left">-0.0</td>
              <td align="left">f98000</td>
              <td align="left">Negative zero</td>
            </tr>
            <tr>
              <td align="left">Infinity</td>
              <td align="left">f97c00</td>
              <td align="left">Infinity</td>
            </tr>
            <tr>
              <td align="left">-Infinity</td>
              <td align="left">f9fc00</td>
              <td align="left">-Infinity</td>
            </tr>
            <tr>
              <td align="left">NaN</td>
              <td align="left">f97e00</td>
              <td align="left">NaN</td>
            </tr>
            <tr>
              <td align="left">NaN</td>
              <td align="left">f97e01</td>
              <td align="left">NaN with non-zero payload</td>
            </tr>
            <tr>
              <td align="left">5.960464477539063e-8</td>
              <td align="left">f90001</td>
              <td align="left">Smallest positive 16-bit float (subnormal)</td>
            </tr>
            <tr>
              <td align="left">0.00006097555160522461</td>
              <td align="left">f903ff</td>
              <td align="left">Largest positive subnormal 16-bit float</td>
            </tr>
            <tr>
              <td align="left">0.00006103515625</td>
              <td align="left">f90400</td>
              <td align="left">Smallest non-subnormal positive 16-bit float</td>
            </tr>
            <tr>
              <td align="left">65504.0</td>
              <td align="left">f97bff</td>
              <td align="left">Largest positive 16-bit float</td>
            </tr>
            <tr>
              <td align="left">1.401298464324817e-45</td>
              <td align="left">fa00000001</td>
              <td align="left">Smallest positive 32-bit float (subnormal)</td>
            </tr>
            <tr>
              <td align="left">1.1754942106924411e-38</td>
              <td align="left">fa007fffff</td>
              <td align="left">Largest positive subnormal 32-bit float</td>
            </tr>
            <tr>
              <td align="left">1.1754943508222875e-38</td>
              <td align="left">fa00800000</td>
              <td align="left">Smallest non-subnormal positive 32-bit float</td>
            </tr>
            <tr>
              <td align="left">3.4028234663852886e+38</td>
              <td align="left">fa7f7fffff</td>
              <td align="left">Largest positive 32-bit float</td>
            </tr>
            <tr>
              <td align="left">5.0e-324</td>
              <td align="left">fb0000000000000001</td>
              <td align="left">Smallest positive 64-bit float (subnormal)</td>
            </tr>
            <tr>
              <td align="left">2.225073858507201e-308</td>
              <td align="left">fb000fffffffffffff</td>
              <td align="left">Largest positive subnormal 64-bit float</td>
            </tr>
            <tr>
              <td align="left">2.2250738585072014e-308</td>
              <td align="left">fb0010000000000000</td>
              <td align="left">Smallest non-subnormal positive 64-bit float</td>
            </tr>
            <tr>
              <td align="left">1.7976931348623157e+308</td>
              <td align="left">fb7fefffffffffffff</td>
              <td align="left">Largest positive 64-bit float</td>
            </tr>
            <tr>
              <td align="left">-0.0000033333333333333333</td>
              <td align="left">fbbecbf647612f3696</td>
              <td align="left">Arbitrarily selected number</td>
            </tr>
            <tr>
              <td align="left">10.559998512268066</td>
              <td align="left">fa4128f5c1</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">10.559998512268068</td>
              <td align="left">fb40251eb820000001</td>
              <td align="left">Next in succession</td>
            </tr>
            <tr>
              <td align="left">295147905179352830000.0</td>
              <td align="left">fa61800000</td>
              <td align="left">2<sup>68</sup> (diagnostic notation truncates precision)</td>
            </tr>
            <tr>
              <td align="left">2.0</td>
              <td align="left">f94000</td>
              <td align="left">Number without a fractional part</td>
            </tr>
            <tr>
              <td align="left">-5.960464477539063e-8</td>
              <td align="left">f98001</td>
              <td align="left">Largest negative subnormal 16-bit float</td>
            </tr>
            <tr>
              <td align="left">-5.960464477539062e-8</td>
              <td align="left">fbbe6fffffffffffff</td>
              <td align="left">Adjacent to largest negative subnormal 16-bit float</td>
            </tr>
            <tr>
              <td align="left">-5.960464477539064e-8</td>
              <td align="left">fbbe70000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">-5.960465188081798e-8</td>
              <td align="left">fab3800001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.0000609755516052246</td>
              <td align="left">fb3f0ff7ffffffffff</td>
              <td align="left">Adjacent to largest subnormal 16-bit float</td>
            </tr>
            <tr>
              <td align="left">0.000060975551605224616</td>
              <td align="left">fb3f0ff80000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.000060975555243203416</td>
              <td align="left">fa387fc001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.00006103515624999999</td>
              <td align="left">fb3f0fffffffffffff</td>
              <td align="left">Adjacent to smallest 16-bit float</td>
            </tr>
            <tr>
              <td align="left">0.00006103515625000001</td>
              <td align="left">fb3f10000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">0.00006103516352595761</td>
              <td align="left">fa38800001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">65503.99999999999</td>
              <td align="left">fb40effbffffffffff</td>
              <td align="left">Adjacent to largest 16-bit float</td>
            </tr>
            <tr>
              <td align="left">65504.00000000001</td>
              <td align="left">fb40effc0000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">65504.00390625</td>
              <td align="left">fa477fe001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">1.4012984643248169e-45</td>
              <td align="left">fb369fffffffffffff</td>
              <td align="left">Adjacent to smallest subnormal 32-bit float</td>
            </tr>
            <tr>
              <td align="left">1.4012984643248174e-45</td>
              <td align="left">fb36a0000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">1.175494210692441e-38</td>
              <td align="left">fb380fffffbfffffff</td>
              <td align="left">Adjacent to largest subnormal 32-bit float</td>
            </tr>
            <tr>
              <td align="left">1.1754942106924412e-38</td>
              <td align="left">fb380fffffc0000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">1.1754943508222874e-38</td>
              <td align="left">fb380fffffffffffff</td>
              <td align="left">Adjacent to smallest 32-bit float</td>
            </tr>
            <tr>
              <td align="left">1.1754943508222878e-38</td>
              <td align="left">fb3810000000000001</td>
              <td align="left">-"-</td>
            </tr>
            <tr>
              <td align="left">3.4028234663852882e+38</td>
              <td align="left">fb47efffffdfffffff</td>
              <td align="left">Adjacent to largest 32-bit float</td>
            </tr>
            <tr>
              <td align="left">3.402823466385289e+38</td>
              <td align="left">fb47efffffe0000001</td>
              <td align="left">-"-</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="exa-bad">
        <name>Failing Examples</name>
        <?v3xml2rfc table_borders="light" ?>

<table anchor="tab-example-bad">
          <name>Failing Examples</name>
          <thead>
            <tr>
              <th align="left">EDN</th>
              <th align="left">CBOR (hex)</th>
              <th align="left">Comment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">{"b":0,"a":1}</td>
              <td align="left">a2616200616101</td>
              <td align="left">Incorrect map key ordering</td>
            </tr>
            <tr>
              <td align="left">[4, 5]</td>
              <td align="left">98020405</td>
              <td align="left">Array length not in preferred encoding</td>
            </tr>
            <tr>
              <td align="left">255</td>
              <td align="left">1900ff</td>
              <td align="left">Integer not in preferred encoding</td>
            </tr>
            <tr>
              <td align="left">-18446744073709551617</td>
              <td align="left">c34a00010000000000000000</td>
              <td align="left">Bigint with leading zero bytes</td>
            </tr>
            <tr>
              <td align="left">10.5</td>
              <td align="left">fa41280000</td>
              <td align="left">Not in preferred encoding</td>
            </tr>
            <tr>
              <td align="left">NaN</td>
              <td align="left">fa7fc00000</td>
              <td align="left">Not in preferred encoding</td>
            </tr>
            <tr>
              <td align="left">65536</td>
              <td align="left">c243010000</td>
              <td align="left">Integer value too small for bigint</td>
            </tr>
            <tr>
              <td align="left">(_ h'01', h'0203')</td>
              <td align="left">5f4101420203ff</td>
              <td align="left">Indefinite length encoding</td>
            </tr>
            <tr>
              <td align="left">(Not CBOR)</td>
              <td align="left">f818</td>
              <td align="left">Simple values 24..31 not in use</td>
            </tr>
            <tr>
              <td align="left">(Not CBOR)</td>
              <td align="left">fc</td>
              <td align="left">Reserved (ai = 28..30)</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="exa-pref">
      <name>Examples for Preferred Serialization of Integers</name>
      <t>This appendix looks at the set of encoded CBOR data items that
represent the integer number <tt>1</tt>.
Preferred Serialization chooses one of them (<tt>0x01</tt>), which is then
always used to encode the number.
The CDE encoding constraints include those of preferred serialization.
A CDE-checking decoder checks that no other serialization is being
used in the encoded data item being decoded.</t>
      <?v3xml2rfc table_borders="full" ?>

<table anchor="tbl-ser-1">
        <name>Serializations of integer number 1</name>
        <thead>
          <tr>
            <th align="left">Serialization of integer number 1</th>
            <th align="left">Preferred?</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">0x01</td>
            <td align="left">yes (shortest mt0)</td>
          </tr>
          <tr>
            <td align="left">0x1801, 0x190001, 0x1a00000001, 0x1b0000000000000001</td>
            <td align="left">no (mt0, but not shortest argument)</td>
          </tr>
          <tr>
            <td align="left">0xc24101</td>
            <td align="left">no (could use mt0)</td>
          </tr>
          <tr>
            <td align="left">0xc2420001, 0xc243000001, etc.</td>
            <td align="left">no (could use mt0, uses leading zeros)</td>
          </tr>
          <tr>
            <td align="left">0xc25f41004101ff, and similar</td>
            <td align="left">no (could use mt0, uses leading zeros)</td>
          </tr>
        </tbody>
      </table>
      <t>For the integer number 100000000000000000000 (1 with 20 decimal
zeros), the only <em>basic</em> serialization is:</t>
      <artwork><![CDATA[
C2                       # tag(2)
   49                    # bytes(9)
      056BC75E2D63100000 #
]]></artwork>
      <t>(Note that, in addition to this serialization, there are multiple
serializations that would also count as <em>preferred</em> serializations, as
the preferred serialization constraint by itself does not exclude
indefinite length encoding of the byte string that is the content of
tag 2.)</t>
    </section>
    <section numbered="false" anchor="list-of-tables">
      <name>List of Tables</name>
      <ol spacing="compact" type="1"><li>
          <t><xref target="tab-constraints">Constraints on the Serialization of CBOR</xref></t>
        </li>
        <li>
          <t><xref target="tbl-iana-reqs">New control operators to be registered</xref></t>
        </li>
        <li>
          <t><xref target="layers">A three-layer model of information representation</xref></t>
        </li>
        <li>
          <t><xref target="tab-example-int">Integer Value Examples</xref></t>
        </li>
        <li>
          <t><xref target="tab-example-flt">Floating Point Value Examples</xref></t>
        </li>
        <li>
          <t><xref target="tab-example-bad">Failing Examples</xref></t>
        </li>
        <li>
          <t><xref target="tbl-ser-1">Serializations of integer number 1</xref></t>
        </li>
      </ol>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>An early version of this document was based on the work of <contact fullname="Wolf McNally"/> and <contact fullname="Christopher Allen"/> as documented in <xref target="I-D.mcnally-deterministic-cbor"/>, which
serves as an example for an ALDR ruleset document.
We would like to explicitly acknowledge that this work has
contributed greatly to shaping the concept of a CBOR Common
Deterministic Encoding and the use of ALDR rules/rulesets on top of that.
<contact fullname="Mikolai Gütschow"/> proposed adding <xref target="choi"/>.
<contact fullname="Anders Rundgren"/> provided most of the initial text that turned into
<xref target="examples"/>.</t>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="L." surname="Lundblade" fullname="Laurence Lundblade">
        <organization>Security Theory LLC</organization>
        <address>
          <email>lgl@securitytheory.com</email>
        </address>
      </contact>
      <t>Laurence provided most of the text that became <xref target="models"/> and <xref target="impcheck"/>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
53hODWzRAAA=

-->

</rfc>
