<?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-12" category="bcp" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="CBOR CDE">CBOR Common Deterministic Encoding (CDE)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-12"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2025" month="July" day="07"/>
    <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 documents the
Best Current Practice for
CBOR Common Deterministic Encoding (CDE), which 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 94?>

<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 documents the
Best Current Practice for
CBOR Common Deterministic Encoding (CDE), which 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 routinely 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 adds constraints to 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; <xref target="exa-pref"/> examines
preferred serialization of the number <tt>1</tt> in more detail.
For reference by implementers, <xref target="encode-f16"/> shows an implementation
that encodes a floating point number as "half precision" binary16.</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 documents the <em>CBOR Common Deterministic Encoding</em>
(CDE) Best Current Practice that is
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 need 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 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="12" month="May" 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 -17 is
   // intended to fully address the WGLC comments.  It is intended for
   // use as a reference document for the CBOR WG interim meeting on
   // 2025-05-14.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-edn-literals-17"/>
        </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="7" month="July" 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-02"/>
        </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 523?>

<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
these 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 anchor="encode-f16">
      <name>Example Code for Encoding into 16-bit Floating Point</name>
      <t>Appendix <xref target="RFC8949" section="D" sectionFormat="bare">Half-Precision</xref> of RFC 8949 <xref target="STD94"/> provides example C and
Python code for decoding 16-bit ("Half Precision", binary16) floating point
numbers.
Providing this code was considered important at the time to aid in
the creation of generic decoders.</t>
      <t>Given that CDE implementations that support floating point Numbers not
only need to decode, but also to encode their 16-bit format, this
appendix provides example C code to convert a floating point number
that is in 64-bit form ("Double Precision", binary64) into binary16.</t>
      <t>If such a conversion is not possible (i.e., there is no 16-bit
representation for the 64-bit value given), the function
<tt>try_float16_encode</tt> returns <tt>-1</tt>.
Otherwise it returns a two-byte integer (range <tt>0x0000</tt> to <tt>0xFFFF</tt>)
that, prefixed with <tt>0xF9</tt>, is suitable to encode the value.</t>
      <figure anchor="half-encode">
        <name>Example C Code for a Half-Precision Encoder</name>
        <sourcecode type="c"><![CDATA[
/* returns 0..0xFFFF if float16 encoding possible, -1 otherwise.
   b64 is a binary64 floating point as an unsigned long. */
int try_float16_encode(unsigned long b64) {
  unsigned long s16 = b64 >> 48 & 0x8000;
  unsigned long mant = b64 & 0xfffffffffffffUL;
  unsigned long exp = b64 >> 52 & 0x7ff;
  if (exp == 0 && mant == 0)    /* f64 denorms are out of range */
    return s16;                 /* so handle 0.0 and -0.0 only */
  if (exp >= 999 && exp < 1009) { /* f16 denorm, exp16 = 0 */
    if (mant & ((1UL << (1051 - exp)) - 1))
      return -1;                /* bits lost in f16 denorm */
    return s16 + ((mant + 0x10000000000000UL) >> (1051 - exp));
  }
  if (mant & 0x3ffffffffffUL)   /* bits lost in f16 */
    return -1;
  if (exp >= 1009 && exp <= 1038) /* normalized f16 */
    return s16 + ((exp - 1008) << 10) + (mant >> 42);
  if (exp == 2047)              /* Inf, NaN */
    return s16 + 0x7c00 + (mant >> 42);
  return -1;
}
]]></sourcecode>
      </figure>
    </section>
    <section numbered="false" anchor="list-of-figures">
      <name>List of Figures</name>
      <dl spacing="compact" indent="11">
        <dt><xref target="half-encode"/>:</dt>
        <dd>
          <t><xref format="title" target="half-encode"/></t>
        </dd>
      </dl>
    </section>
    <section numbered="false" anchor="list-of-tables">
      <name>List of Tables</name>
      <dl spacing="compact" indent="11">
        <dt><xref target="tab-constraints"/>:</dt>
        <dd>
          <t><xref format="title" target="tab-constraints"/></t>
        </dd>
        <dt><xref target="tbl-iana-reqs"/>:</dt>
        <dd>
          <t><xref format="title" target="tbl-iana-reqs"/></t>
        </dd>
        <dt><xref target="layers"/>:</dt>
        <dd>
          <t><xref format="title" target="layers"/></t>
        </dd>
        <dt><xref target="tab-example-int"/>:</dt>
        <dd>
          <t><xref format="title" target="tab-example-int"/></t>
        </dd>
        <dt><xref target="tab-example-flt"/>:</dt>
        <dd>
          <t><xref format="title" target="tab-example-flt"/></t>
        </dd>
        <dt><xref target="tab-example-bad"/>:</dt>
        <dd>
          <t><xref format="title" target="tab-example-bad"/></t>
        </dd>
        <dt><xref target="tbl-ser-1"/>:</dt>
        <dd>
          <t><xref format="title" target="tbl-ser-1"/></t>
        </dd>
      </dl>
    </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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
wjXcN7JI4kdMDfqbvaIBNOjiWOiTU0PeB4cb5937Us+huqfy9h5jzBc9yPUG
mF5yCNdjwMQQjVUSUq7IYNRcQtMo+lCrp4Mdop/Zewu87tTOv3NnnwoxHyrT
41WslVCZUkfWvqykkY03mqlClsJBwQH3wMbVz+nQPFQ/DKomVaM/k87oZS3l
KQKKZGVBW2qFLmdr15iCYyGZaZ1H2GZxMa7UB5JWzBy5JoW+1ot1uK8NTsJe
VtZo5e7CsrVUERvArRmTtZ3Ws34kXUscLWLe2w4RjRQIbMUv0uPUSRpos427
1umWrOJRPx7T/0ajca8vmf/MXnl7Nr/ZhfUQcEi42n6T7D4siuschYzf1VIX
8lYcj8PumG51s4xYIgofH2CVpYJNNXT2fFwKppTwn+3+89//d+k3JhZ/SDhI
/MPlP3P8jk1QmiPNWLci4KfbAk1W+boUUTa60s0d4BhzzowmXeAZuXiq8dyI
pJmY5CSoUYu6i7mHtfAUIRt5CyAzxfiNmm65dMiZ/hw4gs8hIBSW6pLn7jcb
VURqkkbyIeO85paHw0IreZyrmrhvj/iXTVBerFWtc8hsEXzLhDXfRnA9VCRu
L1Z90aQzADxYkzH26tzDVMJpG9JES5v9ghiXTaYn5jXSp0G3WispDfzoxB49
YNz97hCX8Ium4zr1CPFUplbL9MRMvITORNijUeQdK4EvC0xcUm0tu4q88iKQ
IIfevf5VIn5pimtQnMeLfBaPFDO9b87rSJcX0tihdEV+/Qa6WMqUZA7My0sl
so48UAqvq+lPw+gpm7bCk75iMuZ13BlMOzWLNzFsD+AydG3GgsVWzS01NVm2
rA4qswbU4yz3vAHrRNus06SdfX69g2BecMLhpucZ1updqjXxFtT2aUhSc4y7
35wH1HV1xoqnXKNOS767rMHBzbOTAxmLpgIYkpB1fdIgs5W+1Wehxf3MTeCW
zV5sYyjdRhw2y4Fq/d/PENAmbQ906C1Zj4L9AZHNcuQWpD4b0q7udN7MgVEz
bkpLA/qX3JIiLXN6rsKdkgdFhoPM4z++ZdX22r8drSZIrGIZd16STU663BNi
Jh2RyFE3qb9gbJ/9Ou3JrWicWEKIY7Ahw9UPTH2mDOeNuRxNWrwcc6YUr4ow
BovkMByu1XO36gkaHmrPdBlf3WxxQtKoLHzM9ChFGjANriVXyoGY9ZJx6mXa
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
7RUQELPQZo00kM3Ko2H/H5erM6kk2gAA

-->

</rfc>
