<?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.27 (Ruby 3.4.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-cde-09" category="bcp" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <?v3xml2rfc table_borders="light"?>
  <front>
    <title abbrev="CBOR CDE">CBOR Common Deterministic Encoding (CDE)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-09"/>
    <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="April" day="01"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <abstract>
      <?line 75?>

<t>CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
its Section 4.2, providing some flexibility for application specific
decisions.
To facilitate Deterministic Encoding to be offered as a selectable
feature of generic encoders, the present document defines a
CBOR Common Deterministic Encoding (CDE) Profile that can be shared by a
large set of applications with potentially diverging detailed
requirements.
It also defines "Basic Serialization", which stops short of the
potentially more onerous requirements that make CDE fully
deterministic, while employing most of its reductions of the
variability needing to be handled by decoders.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-cbor-cde/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Concise Binary Object Representation Maintenance and Extensions (CBOR) Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cbor-wg/draft-ietf-cbor-cde"/>.</t>
    </note>
  </front>
  <middle>
    <?line 93?>

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

</section>
    </section>
    <section anchor="choi">
      <name>Encoding Choices in CBOR</name>
      <t>In many cases, CBOR provides more than one way to encode a data item,
i.e., to serialize it into a sequence of bytes.
This flexibility can provide convenience for the generator of the
encoded data item, but handling the resulting variation can also put
an onus on the decoder.
In general, there is no single perfect encoding choice that is optimal for all
applications.
Choosing the right constraints on these encoding choices is one
element of application protocol design.
Having predefined sets of such choices is a useful way to reduce
variation between applications, enabling generic implementations.</t>
      <t>Section <xref target="RFC8949" section="4.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/> provides a recommendation for a
<em>Preferred Serialization</em>.
This recommendation is useful for most CBOR applications, and it is a
good choice for most applications.
Its main constraint is to choose the shortest <em>head</em> (Section <xref target="RFC8949" section="3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>) that preserves the value of a data item.</t>
      <t>Preferred Serialization allows indefinite length encoding (Section <xref target="RFC8949" section="3.2" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>), which does not express the length of a string,
an array, or a map in its head.  Supporting both definite length and
indefinite length encoding is an additional onus on the decoder; many
applications therefore choose not to use indefinite length encoding at
all.
We call Preferred Serialization with this additional constraint
<em>Basic Serialization</em>.
Basic Serialization is a common choice for applications that need to
further reduce the variability that needs to be handled by decoders,
potentially maximizing interoperability with partial (e.g.,
constrained) CBOR decoder implementations.</t>
      <t>These constraints still allow some variation. In particular, there is
more than one serialization for data items that contain maps: The
order of serialization of map entries is ignored in CBOR (as it is in
JSON), so maps with more than one entry have all permutations of these
entries as valid Basic Serializations.
<em>Deterministic Serialization</em> builds on Basic Serialization by
defining a common (namely, lexicographic) order for the entries in a map.
For many applications, ensuring this common order is an additional
onus on the generator that is not actually needed, so they do not
choose Deterministic Serialization.
However, if the objective is minimal effort for the consuming
application, deterministic map ordering can be useful even outside the
main use cases for Deterministic Serialization that are further
discussed in <xref section="2" sectionFormat="of" target="I-D.bormann-cbor-det"/>.</t>
      <t><xref target="tab-constraints"/> summarizes the increasingly restrictive sets of
encoding choices that have been given names in this section.</t>
      <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 Profile (CDE)</name>
      <t>This specification defines the <em>CBOR Common Deterministic Encoding
Profile</em> (CDE) based on the <em>Core Deterministic Encoding
Requirements</em> defined for CBOR in
Section <xref target="RFC8949" section="4.2.1" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
      <t>Note that this specific set of requirements is elective — in
principle, other variants of deterministic encoding can be defined
(and have been, now being phased out, as detailed in Section <xref target="RFC8949" section="4.2.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>).
In many applications of CBOR today, deterministic encoding is not used
at all, as its restriction of choices can create some additional
performance cost and code complexity.</t>
      <t><xref target="STD94"/>'s core 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>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"/>).</t>
      <ol spacing="normal" type="1" group="1"><li>
          <t>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.</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; these need to
be made to obtain the CBOR Common Deterministic Encoding Profile (CDE).
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 that the
preferred serialization rules also apply to NaNs (with zero or
non-zero payloads), using the canonical encoding of NaNs as defined
in Section 6.2.1 of <xref target="IEEE754"/>.
Specifically, this means that shorter forms of encodings for a NaN
are used when that can be achieved by only removing trailing zeros
in the NaN payload (example serializations are available in
<xref section="A.1.2" sectionFormat="of" target="I-D.bormann-cbor-numbers"/>).
Further clarifying a "should"-level statement in Section 6.2.1 of
<xref target="IEEE754"/>, the CBOR encoding always uses a leading bit of 1 in the
significand to encode a quiet NaN; the use of signaling NaNs by
application protocols is <bcp14>NOT RECOMMENDED</bcp14> but when presented by an
application these are encoded by using a leading bit of 0.  </t>
          <t>
Typically, most applications that employ NaNs in their storage and
communication interfaces will only use a single NaN value, quiet 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 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.</t>
    </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>
      <table anchor="tbl-iana-reqs">
        <name>New control operators to be registered</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">.cde</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
          <tr>
            <td align="left">.cdeseq</td>
            <td align="left">[RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <referencegroup anchor="STD94" target="https://www.rfc-editor.org/info/std94">
          <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
            <front>
              <title>Concise Binary Object Representation (CBOR)</title>
              <author fullname="C. Bormann" initials="C." surname="Bormann"/>
              <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
              <date month="December" year="2020"/>
              <abstract>
                <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
                <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="94"/>
            <seriesInfo name="RFC" value="8949"/>
            <seriesInfo name="DOI" value="10.17487/RFC8949"/>
          </reference>
        </referencegroup>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="IEEE Std" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="IANA.cddl" target="https://www.iana.org/assignments/cddl">
          <front>
            <title>Concise Data Definition Language (CDDL)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
          <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
            <front>
              <title>Key words for use in RFCs to Indicate Requirement Levels</title>
              <author fullname="S. Bradner" initials="S." surname="Bradner"/>
              <date month="March" year="1997"/>
              <abstract>
                <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
          </reference>
          <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
            <front>
              <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
              <author fullname="B. Leiba" initials="B." surname="Leiba"/>
              <date month="May" year="2017"/>
              <abstract>
                <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
          </reference>
        </referencegroup>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-cbor-edn-literals">
          <front>
            <title>CBOR Extended Diagnostic Notation (EDN)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="8" month="January" year="2025"/>
            <abstract>
              <t>   This document formalizes and consolidates the definition of the
   Extended Diagnostic Notation (EDN) of the Concise Binary Object
   Representation (CBOR), addressing implementer experience.

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

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


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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-edn-literals-16"/>
        </reference>
        <reference anchor="I-D.bormann-cbor-det">
          <front>
            <title>CBOR: On Deterministic Encoding and Representation</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="21" month="January" year="2025"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2.  The present document provides additional
   information about use cases, deployment considerations, and
   implementation choices for Deterministic Encoding and Representation.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-12"/>
        </reference>
        <reference anchor="I-D.bormann-cbor-numbers">
          <front>
            <title>On Numbers in CBOR</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="8" month="January" year="2025"/>
            <abstract>
              <t>   The Concise Binary Object Representation (CBOR), as defined in STD 94
   (RFC 8949), is a data representation format whose design goals
   include the possibility of extremely small code size, fairly small
   message size, and extensibility without the need for version
   negotiation.

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

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


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

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

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

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

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

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

<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>
      <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 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 and Decoders as well as CDE
Encoders and 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 decoders" specifically
advertised as supporting CDE)
are not required to check for preferred
serialization or CDE and reject inputs that do not fulfill
their requirements.
However, in an environment that employs deterministic encoding,
employing non-checking CBOR decoders negates many of its benefits.
Decoder implementations that advertise "support" for preferred
serialization or CDE need to check the encoding and reject
input that is not encoded to the encoding specification in use.
Again, ALDR rules such as those in dCBOR may pose additional
requirements, such as requiring rejection of non-conforming inputs.  </t>
          <t>
If a generic decoder needs to be used that does not "support" CDE, a
simple (but somewhat clumsy) way to check for proper CDE encoding is
to re-encode the decoded data 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 will always represent a double or single quiet NaN with a zero
NaN payload 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>Preferred Serialization Decoders</name>
          <t>There are no special requirements that CBOR decoders need to meet to
be a Preferred Serialization Decoder.
Partial decoder implementations 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>
              <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>
            <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>Basic Serialization Decoders</name>
          <t>The Basic Serialization Decoder requirements are identical to the
Preferred Serialization Decoder requirements.</t>
        </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 fulfilling 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-decoders">
          <name>CDE Decoders</name>
          <t>The term "CDE 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 decoders <bcp14>MUST</bcp14> follow the rules for preferred (and thus basic)
serialization decoders (<xref target="psd"/>).</t>
            </li>
            <li>
              <t>CDE 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>
              <t>
To be called a CDE 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>
            </li>
          </ol>
        </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="integer-value-examples">
        <name>Integer Value Examples</name>
        <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="floating-point-value-examples">
        <name>Floating Point Value Examples</name>
        <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="failing-examples">
        <name>Failing Examples</name>
        <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">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 shortest encoding</td>
            </tr>
            <tr>
              <td align="left">NaN</td>
              <td align="left">fa7fc00000</td>
              <td align="left">Not in shortest 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 numbered="false" anchor="list-of-tables">
      <name>List of Tables</name>
      <ol spacing="compact" type="1"><li>
          <t><xref target="tab-constraints">Constraints on the Serialization of CBOR</xref></t>
        </li>
        <li>
          <t><xref target="tbl-iana-reqs">New control operators to be registered</xref></t>
        </li>
        <li>
          <t><xref target="layers">A three-layer model of information representation</xref></t>
        </li>
        <li>
          <t><xref target="tab-example-int">Integer Value Examples</xref></t>
        </li>
        <li>
          <t><xref target="tab-example-flt">Floating Point Value Examples</xref></t>
        </li>
        <li>
          <t><xref target="tab-example-bad">Failing Examples</xref></t>
        </li>
      </ol>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>An early version of this document was based on the work of <contact fullname="Wolf McNally"/> and <contact fullname="Christopher Allen"/> as documented in <xref target="I-D.mcnally-deterministic-cbor"/>, which
serves as an example for an ALDR ruleset document.
We would like to explicitly acknowledge that this work has
contributed greatly to shaping the concept of a CBOR Common
Deterministic Encoding and the use of ALDR rules/rulesets on top of that.
<contact fullname="Mikolai Gütschow"/> proposed adding <xref target="choi"/>.
<contact fullname="Anders Rundgren"/> provided most of the initial text that turned into
<xref target="examples"/>.</t>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="L." surname="Lundblade" fullname="Laurence Lundblade">
        <organization>Security Theory LLC</organization>
        <address>
          <email>lgl@securitytheory.com</email>
        </address>
      </contact>
      <t>Laurence provided most of the text that became <xref target="models"/> and <xref target="impcheck"/>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
